如何绘制贝塞尔曲线 C#
How to draw Bezier-Curve C#
我需要绘制贝塞尔曲线。但问题是我的代码带来了这个输出:
但它应该是这样的:
我怎样才能 "delete" 剩下的几行。我不知道如何只在他最好的折线级别上绘制控制多边形。
private void pb_Bezier_Paint(object sender, PaintEventArgs e)
{
Point P1 = new Point(10, 300);
Point P2 = new Point(180, 50);
Point P3 = new Point(320, 300);
ZeichneBezier(6, P1, P2, P3, e);
}
private void ZeichneBezier(int n, Point P1, Point P2, Point P3, PaintEventArgs pva)
{
Graphics g = pva.Graphics;
Pen kpStift = new Pen(Color.Black, 3);
Pen bkStift = new Pen(Color.Red, 2);
for(int i = n; i >= 0; i--)
{
if(i==0)
{
g.DrawLine(bkStift, P1, P2);
g.DrawLine(bkStift, P2, P3);
}
else
{
Point P12 = new Point((P1.X + P2.X)/2,(P1.Y + P2.Y)/2);
Point P23 = new Point((P2.X + P3.X)/2,(P2.Y + P3.Y)/2);
Point P123 = new Point((P12.X + P23.X)/2,(P12.Y + P23.Y)/2);
ZeichneBezier(n-1, P1, P12, P123, pva);
ZeichneBezier(n-1, P123, P23, P3, pva);
}
}
也许这个...
private void pb_Bezier_Paint(object sender, PaintEventArgs e)
{
Point P1 = new Point(10, 300);
Point P2 = new Point(180, 50);
Point P3 = new Point(320, 300);
ZeichneBezier(6, P1, P2, P3, e, true);
}
private void ZeichneBezier(int n, Point P1, Point P2, Point P3, PaintEventArgs pva, bool initial)
{
Graphics g = pva.Graphics;
Pen bkStift = new Pen(Color.Red, 2);
Pen kpStift = new Pen(Color.Black, 3);
if(initial)
{
g.DrawLine(kpStift, P1, P2);
g.DrawLine(kpStift, P2, P3);
}
if (n > 0)
{
Point P12 = new Point((P1.X + P2.X) / 2, (P1.Y + P2.Y) / 2);
Point P23 = new Point((P2.X + P3.X) / 2, (P2.Y + P3.Y) / 2);
Point P123 = new Point((P12.X + P23.X) / 2, (P12.Y + P23.Y) / 2);
ZeichneBezier(n - 1, P1, P12, P123, pva, false);
ZeichneBezier(n - 1, P123, P23, P3, pva, false);
}
else
{
g.DrawLine(bkStift, P1, P2);
g.DrawLine(bkStift, P2, P3);
}
}
您的 for 循环似乎不是必需的并且会降低您的性能。
我添加了一个参数 "bool initial" 来决定何时绘制黑线。
只有在 pb_Bezier_Paint 事件处理程序中第一次调用 ZeichneBezier 才能绘制线条。
我需要绘制贝塞尔曲线。但问题是我的代码带来了这个输出:
但它应该是这样的:
我怎样才能 "delete" 剩下的几行。我不知道如何只在他最好的折线级别上绘制控制多边形。
private void pb_Bezier_Paint(object sender, PaintEventArgs e)
{
Point P1 = new Point(10, 300);
Point P2 = new Point(180, 50);
Point P3 = new Point(320, 300);
ZeichneBezier(6, P1, P2, P3, e);
}
private void ZeichneBezier(int n, Point P1, Point P2, Point P3, PaintEventArgs pva)
{
Graphics g = pva.Graphics;
Pen kpStift = new Pen(Color.Black, 3);
Pen bkStift = new Pen(Color.Red, 2);
for(int i = n; i >= 0; i--)
{
if(i==0)
{
g.DrawLine(bkStift, P1, P2);
g.DrawLine(bkStift, P2, P3);
}
else
{
Point P12 = new Point((P1.X + P2.X)/2,(P1.Y + P2.Y)/2);
Point P23 = new Point((P2.X + P3.X)/2,(P2.Y + P3.Y)/2);
Point P123 = new Point((P12.X + P23.X)/2,(P12.Y + P23.Y)/2);
ZeichneBezier(n-1, P1, P12, P123, pva);
ZeichneBezier(n-1, P123, P23, P3, pva);
}
}
也许这个...
private void pb_Bezier_Paint(object sender, PaintEventArgs e)
{
Point P1 = new Point(10, 300);
Point P2 = new Point(180, 50);
Point P3 = new Point(320, 300);
ZeichneBezier(6, P1, P2, P3, e, true);
}
private void ZeichneBezier(int n, Point P1, Point P2, Point P3, PaintEventArgs pva, bool initial)
{
Graphics g = pva.Graphics;
Pen bkStift = new Pen(Color.Red, 2);
Pen kpStift = new Pen(Color.Black, 3);
if(initial)
{
g.DrawLine(kpStift, P1, P2);
g.DrawLine(kpStift, P2, P3);
}
if (n > 0)
{
Point P12 = new Point((P1.X + P2.X) / 2, (P1.Y + P2.Y) / 2);
Point P23 = new Point((P2.X + P3.X) / 2, (P2.Y + P3.Y) / 2);
Point P123 = new Point((P12.X + P23.X) / 2, (P12.Y + P23.Y) / 2);
ZeichneBezier(n - 1, P1, P12, P123, pva, false);
ZeichneBezier(n - 1, P123, P23, P3, pva, false);
}
else
{
g.DrawLine(bkStift, P1, P2);
g.DrawLine(bkStift, P2, P3);
}
}
您的 for 循环似乎不是必需的并且会降低您的性能。
我添加了一个参数 "bool initial" 来决定何时绘制黑线。
只有在 pb_Bezier_Paint 事件处理程序中第一次调用 ZeichneBezier 才能绘制线条。