Visual C# 贝塞尔曲线绘制问题

Visual C# bezier drawing problems

我在开发的绘图应用程序中遇到问题,贝塞尔曲线无法正常工作。

我有这个代码行:

g.DrawBezier(pen, points[i - 1], points[i], points[i], points[i + 1]);

它的工作做得很好,但出于某种原因,它还画了一条额外的线,这非常无用...

如您所见,由于某种原因,一条糟糕的线出现在样条曲线的顶部。

有人可以帮帮我吗?

for (int i = 0; i < points.Count - 1; i++) {
    pen.Color = colors[i];
    pen.Width = widths[i];
    if (visible[i] == true) {
        g.DrawBezier(pen, points[i - 1], points[i], points[i], points[i + 1]);
        if (spoints == true) {
            g.DrawEllipse(new Pen(Color.LimeGreen, 5), points[i].X - 1, points[i].Y - 1, 2, 2);
            if (spositions == true) {
                g.DrawString(points[i].X.ToString() + ", " + points[i].Y.ToString(), new Font("Courier", 8), pen.Brush, points[i]);
            }
        }
    }
    if (sskeleton == true)
    {
        g.DrawLine(new Pen(Color.Magenta, 1), points[i].X, points[i].Y, points[i + 1].X, points[i + 1].Y);
    }
}

我认为这是正在发生的事情。

说积分是

List<Point> points = new List<Point>() {
    new Point(50, 50),
    new Point(150, 150),
    new Point(150, 250),
    new Point(300, 300),
    new Point(400, 300)};

绘制第一条贝塞尔曲线

绿点是实际点。请注意,曲线实际上并没有经过第二个点。

绘制下一条曲线。 这条曲线从第二点开始(不是最后一条曲线经过的地方)。

最终剧情:

DrawBezier 函数中的中间两点是控制点,因此曲线不能保证通过这两点。 https://msdn.microsoft.com/en-us/library/a7h66bsy(v=vs.110).aspx

也许您想要完成的事情可以用 DrawBeziers 来完成。 https://msdn.microsoft.com/en-us/library/ds101091(v=vs.110).aspx

另一种选择是在最后一条曲线的终点(而不是最后一条曲线的控制点)开始下一条贝塞尔曲线。

如果您想要一条通过所有点的曲线,请尝试 DrawCurve(pen, points)。