【发布时间】: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);
}
【问题讨论】:
-
奇数。能多给点代码吗?
-
当然。虽然有很多。你能说得更具体点吗?
-
剪掉一些实际上用所有线设置等绘制贝塞尔曲线的东西。最好是编译。
-
我已编辑以显示我正在使用的贝塞尔算法。尽管出于显而易见的原因,很难将其转换为可编译的形式。
-
哎呀。忘记了一个函数。固定。