簡體   English   中英

如何沿貝塞爾曲線返回所有點?

[英]How to return all points along a bezier curve?

我發布了一個關於僅基於起點和終點生成貝塞爾曲線的先前問題,並且我能夠感謝其中的答案使用我擁有的信息創建貝塞爾曲線。

這是允許我在表單上繪制我想要的曲線類型的代碼。

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 或谷歌中找到類似的解決方案一般的。

謝謝。

您要做的是將貝塞爾曲線(從其外觀看,立方)轉換為Polyline

使用這個公式在網頁 ...價值t應介於0 to 1 ...計算的所有值Bx(t)By(t)通過使用對於t值的公式中的增量"0, 0.01, 0.02....1" (當然,將它們轉換為integers )增量越小,點將越精確。

這是DeCasteljau算法的C示例(幾乎相同的過程,但是我認為它有些優化):)

Maxim Shemanarev在“反谷物幾何”頁面: Bezier曲線的自適應細分中描述了用於創建具有最佳點數的平滑Bezier曲線的完美算法。

如果在繪制貝塞爾曲線之間使用lerp或float t導數可能會有所幫助。 我發現它有助於提高准確性; 考慮浮動計算的數量。

我知道這是一篇舊帖子,但是,在發現當前的答案都沒有令人滿意的情況下,希望其他人能從以下內容中得到一些用處:

using System.Collections.Generic;
using System.Drawing;
    
public List<Point> CubicBezierToPoints(Point P0, Point P1, Point P2, Point P3, double step = 0.01)
{
    var pointList = new List<Point>();
    for (var t = 0.00; t <= 1; t += step)
    {
        var x = Math.Pow(1 - t, 3) * P0.X + 3 * Math.Pow(1 - t, 2) * t * P1.X +
                3 * (1 - t) * Math.Pow(t, 2) * P2.X + Math.Pow(t, 3) * P3.X;
        var y = Math.Pow(1 - t, 3) * P0.Y + 3 * Math.Pow(1 - t, 2) * t * P1.Y +
                3 * (1 - t) * Math.Pow(t, 2) * P2.Y + Math.Pow(t, 3) * P3.Y;
        pointList.Add(new Point((int)x,(int)y));
    }
    return pointList;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM