【问题标题】:Bezier Curves in WPFWPF 中的贝塞尔曲线
【发布时间】:2012-03-30 18:35:10
【问题描述】:

我在 WPF 中绘制了一些 Bezier 曲线,并且大部分情况下它都在工作,但我在每个段之间得到了一些微弱的分离。如您所见,它们甚至出现在直线部分中,因此我认为问题不是由于分段数量不足造成的。 (此图像放大 4 倍。)

我正在使用 System.Windows.Shapes.Line 对象的集合来绘制它们。它们在代码中被实例化,如下所示:

Shapes.Line Line = new Shapes.Line();
Line.Stroke = Brush;
Line.HorizontalAlignment = Windows.HorizontalAlignment.Left;
Line.VerticalAlignment = Windows.VerticalAlignment.Center;
Line.StrokeThickness = 10;

我的理论是,这种分离是由于一条线的结束点与下一条线的开始点相同,但我不确定解决此问题的最佳方法是什么。我在这方面还很陌生,所以在我问是否有人有任何尝试过的真正解决方案来使这些微弱的分离消失之前,我不想走开。

编辑:

这是我用来生成片段的代码。 ILine 接口是我创建的,但它的点值稍后会在程序中简单地转换为 System.Windows.Shapes.Line 各自的值。

public static void FormBezier(List<ILine> Lines, Point[] pt)
{
    if (Lines.Count == 0) return;

    double t, dt, x0, y0, x1, y1;

    t = 0.0;
    dt = 1.0 / Lines.Count;
    x1 = X(t, new double[] { pt[0].X, pt[1].X, pt[2].X, pt[3].X });
    y1 = X(t, new double[] { pt[0].Y, pt[1].Y, pt[2].Y, pt[3].Y });
    t += dt;

    for(int index = 1; index < Lines.Count - 1; index++)
    {
        x0 = x1;
        y0 = y1;
        x1 = X(t, new double[] { pt[0].X, pt[1].X, pt[2].X, pt[3].X });
        y1 = X(t, new double[] { pt[0].Y, pt[1].Y, pt[2].Y, pt[3].Y });

        Lines[index].Start.X = x0;
        Lines[index].End.X = x1;
        Lines[index].Start.Y = y0;
        Lines[index].End.Y = y1;
        t += dt;
    }

    t = 1.0;
    x0 = x1;
    y0 = y1;
    x1 = X(t, new double[] { pt[0].X, pt[1].X, pt[2].X, pt[3].X });
    y1 = X(t, new double[] { pt[0].Y, pt[1].Y, pt[2].Y, pt[3].Y });
    Lines[Lines.Count - 1].Start.X = x0;
    Lines[Lines.Count - 1].End.X = x1;
    Lines[Lines.Count - 1].Start.Y = y0;
    Lines[Lines.Count - 1].End.Y = y1;
}
public static double X(double t, double[] x)
{
    return 
        x[0] * Math.Pow((1 - t), 3) + 
        x[1] * 3 * t * Math.Pow((1 - t), 2) + 
        x[2] * 3 * Math.Pow(t, 2) * (1 - t) + 
        x[3] * Math.Pow(t,  3);

}

【问题讨论】:

  • 奇数。能多给点代码吗?
  • 当然。虽然有很多。你能说得更具体点吗?
  • 剪掉一些实际上用所有线设置等绘制贝塞尔曲线的东西。最好是编译。
  • 我已编辑以显示我正在使用的贝塞尔算法。尽管出于显而易见的原因,很难将其转换为可编译的形式。
  • 哎呀。忘记了一个函数。固定。

标签: wpf shapes bezier


【解决方案1】:

粗略猜测,这可能是一个舍入错误。 WPF 中使用的单位不是像素,它们是独立于分辨率的单位。当 WPF 实际绘制某些东西时,它必须将这些单位转换为它所绘制到的任何屏幕上的真实像素。如果转换最终在实际像素之间进行一半,它将对这些像素进行着色以尝试在每个实际像素中近似半个像素。因此,您有时会在所谓的黑线周围出现灰色像素(抗锯齿)。

SnapsToDevicePixels 的属性可能会对您有所帮助。

【讨论】:

    【解决方案2】:

    很明显是绘图算法有问题。我不擅长 WPF,但您可能想看看 this 博客文章。

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      • 2013-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多