2012-06-13 26 views
1

我想绘制一个波形。 我有一个预先计算好的数据点数量(例如1000)。 我想用波形填充画布控件的全部宽度。 因此我必须重新计算绘制的每个数据点的宽度。画布线条重叠带双值创建莫尔效应

为此,我尝试将StrokeThickness设置为总宽度除以数据点的nr。 (例如0.35629)和每0.35629像素打印0.35629像素宽的线。

这会产生不希望的莫尔效应。

对我来说,StrokeThickness是一个双倍的感觉很奇怪,因为WPF将如何绘制一个0.35629像素宽的线?

下面的代码示例显示我的意思。上半场没问题,下半场有莫尔效应。

这是要走的路吗还是我需要另一种方法?

for (int i = 0; i < 500; i++) 
{ 
    Line line = new Line(); 
    line.X1 = i; 
    line.X2 = i; 
    line.Y1 = 0; 
    line.Y2 = 100; 
    line.Stroke = new SolidColorBrush(Colors.Black); 
    line.StrokeThickness = 1; 
    this.demoCanvas.Children.Add(line); 
} 

const double canvasWidth = 525; 
const double nrOfDatapoints = 500d; 
const double pixelsPerPoint = canvasWidth/nrOfDatapoints ; 
double x = 500; 
for (int i = 0; i < nrOfDatapoints; i++) 
{ 
    Line line = new Line(); 
    line.X1 = x; 
    line.X2 = x; 
    line.Y1 = 0; 
    line.Y2 = 100; 
    line.Stroke = new SolidColorBrush(Colors.Black); 
    line.StrokeThickness = pixelsPerPoint; 
    this.demoCanvas.Children.Add(line); 
    x += pixelsPerPoint; 
} 
+0

您可以将画布设置为静态大小,然后将画布放入另一个容器并允许容器缩放它吗?我不确定这是否会解决问题,或者只是做出不同的问题。 – CodingGorilla

+0

这并不能解决我的问题,因为我也在画布上“绘画”文本,我不想让它变形。 –

回答

4

为了避免莫尔条纹,你应该设置SnapToDevicePixels =“True”。 Check it out here

+0

摆脱了莫尔条纹(谢谢!)。 不幸的是,它引入了另一个问题,可以在我的示例代码中看到:每个x行一行都没有对齐下一个像素,从而创建一个像素的间隙。 我想到的另一个策略是通过“每x行创建/删除一行”来重新计算我的数据输入,所以我拥有尽可能多的数据点,因为我有像素 –

+0

@sjorsmiltenburg:你有没有解决过这个问题? –

+0

@RichardCook据我所知,我没有解决这个问题,我使用这个项目已经去了冰箱,如果你有一个修复,但随时张贴它虽然 –