【问题标题】:Canvas line strokethickness with double value creates moire effect具有双值的帆布线条笔画粗细创建云纹效果
【发布时间】:2012-06-13 19:47:19
【问题描述】:

我正在尝试绘制波形。 我有一个预先计算好的要绘制的数据点数量(例如 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;
}

【问题讨论】:

  • 你可以将画布设置为静态大小,然后将画布放在另一个容器中并允许容器缩放吗?我不确定这是否能解决问题或只是换一个问题。
  • 这不能解决我的问题,因为我也在画布上“绘制”文本,我不想让它扭曲。

标签: wpf canvas drawing double line


【解决方案1】:

为避免波纹,您应该设置 SnapToDevicePixels="True"。 Check it out here

【讨论】:

  • 消除了云纹图案(谢谢!)。不幸的是,它引入了另一个问题,可以在我的示例代码中看到:每 x 行一条线没有捕捉到下一个像素,从而产生一个像素的间隙。我想到的另一个策略是通过“每 x 行创建/删除一行”来重新计算我的数据输入,这样我就有了和像素一样多的数据点
  • @RichardCook 据我所知我没有解决这个问题,我使用它的项目已经进入冰箱,如果你有修复,尽管发布它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
相关资源
最近更新 更多