WPF中的Bezier曲线

WPF中的Bezier曲线,wpf,shapes,bezier,Wpf,Shapes,Bezier,我在WPF中绘制了一些贝塞尔曲线,在大多数情况下,它是有效的,但我在每个片段之间得到了一些微弱的分离。正如您所看到的,它们甚至出现在直线部分,因此我不认为问题是由于段数不足。(此图像放大4倍。) 我正在使用System.Windows.Shapes.Line对象的集合来绘制它们。它们在如下代码中实例化: Shapes.Line Line = new Shapes.Line(); Line.Stroke = Brush; Line.HorizontalAlignment = Windows.Ho

我在WPF中绘制了一些贝塞尔曲线,在大多数情况下,它是有效的,但我在每个片段之间得到了一些微弱的分离。正如您所看到的,它们甚至出现在直线部分,因此我不认为问题是由于段数不足。(此图像放大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);

}
public static void FormBezier(列表行,点[]pt)
{
如果(Lines.Count==0)返回;
双t,dt,x0,y0,x1,y1;
t=0.0;
dt=1.0/行。计数;
x1=X(t,新双[]{pt[0].X,pt[1].X,pt[2].X,pt[3].X});
y1=X(t,新双[]{pt[0].Y,pt[1].Y,pt[2].Y,pt[3].Y});
t+=dt;
对于(int index=1;index
显然是绘图算法中的错误。我并不擅长WPF,但你可能想看看我的博客文章。

显然是绘图算法的错误。我并不擅长WPF,但你们可能想看看这篇博文。

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


该属性可能对您有所帮助。

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


该酒店可能会对您有所帮助。

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