如何沿贝塞尔曲线返回所有点?

时间:2010-10-28 05:04:33

标签: c# bezier

我发布了一个关于仅根据起点和终点生成贝塞尔曲线的上一个问题,我能够感谢答案,使用我的信息创建贝塞尔曲线。

这是允许我在表单上绘制我想要的曲线类型的代码。

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上找到类似的解决方案一般

感谢。

3 个答案:

答案 0 :(得分:2)

你想要做的是将Bezier曲线(从它的外观中立方体)转换为Polyline

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

这是DeCasteljau Algorithm的C样本(几乎相同的程序,但我相信它有点优化):)

答案 1 :(得分:1)

Maxim Shemanarev在Anti-Grain Geometry页面上描述了用于创建具有最佳点数的平滑Bezier曲线的完美算法:Adaptive Subdivision of Bezier Curves

答案 2 :(得分:0)

如果在绘制贝塞尔曲线之间使用lerp或float t导数,它可能会有所帮助。我发现它有助于提高准确性;考虑浮点数的数量。