2010-10-28 96 views
1

我发布了一个关于仅基于开始点和结束点生成贝塞尔曲线的问题,并且我能够感谢使用我拥有的信息创建贝塞尔曲线的答案。如何沿贝塞尔曲线返回所有点?

这是允许我在窗体上绘制所需曲线类型的代码。

private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) 
{ 
    Random rnd = new Random(); 
    Point startp = new Point(rnd.Next(0, this.Width), rnd.Next(0, this.Height)); 
    Point endp = new Point(rnd.Next(0, this.Width), rnd.Next(0, this.Height)); 
    int xMod = 0; 
    int yMod = 0; 
    if (startp.X > endp.X) { 
     xMod = -1; 
    } else { 
     xMod = 1; 
    } 
    if (startp.Y > endp.Y) { 
     yMod = 1; 
    } else { 
     yMod = -1; 
    } 
    Point control1p = new Point(endp.X + (rnd.Next(20, 50) * xMod), endp.Y + (rnd.Next(20, 50) * yMod)); 
    Point control2p = new Point(endp.X + (rnd.Next(5, 20) * xMod), endp.Y + (rnd.Next(5, 20) * yMod)); 
    Point[] pts = { 
     startp, 
     control1p, 
     control2p, 
     endp 
    }; 
    Pen dashed_pen = new Pen(Color.Black, 0); 
    dashed_pen.DashStyle = Drawing2D.DashStyle.Dash; 
    for (int i = 0; i <= 2; i++) { 
     e.Graphics.DrawLine(dashed_pen, pts(i), pts(i + 1)); 
    } 
    e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality; 
    Pen bez_pen = new Pen(Color.Black, 3); 
    e.Graphics.DrawBezier(bez_pen, pts(0), pts(1), pts(2), pts(3)) 
} 

有没有办法,或有人可以帮助我返回形成曲线的所有点?我希望从这些点计算出的曲线的每个点都可以返回一组点,但我没有计算出它的运气,并且无法在stackoverflow或google中找到类似的解决方案一般。

谢谢。

+0

请不要在标题中使用标签。 – 2010-10-28 05:18:22

回答

2

你想要做的是贝塞尔曲线(从它的外观立方)转换为Polyline

使用这个page公式...的t值应该为0 to 1 ...之间计算所有值Bx(t)By(t)通过使用公式值为"0, 0.01, 0.02....1"(将它们转换为integers当然)增量值越小,您的积分越准确。

这里的DeCasteljau Algorithm的C样品(几乎相同的过程,但它有点优化我相信):)

0

如果您在draw bezier之间使用lerp或float t衍生物,它可能会有所帮助。我发现它有助于提高准确性;考虑浮点数的计算。