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)。
我在开发的绘图应用程序中遇到问题,贝塞尔曲线无法正常工作。
我有这个代码行:
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)。