Как вернуть все точки кривой Безье?

Я опубликовал предыдущий вопрос о создании кривой Безье, основанной только на начальной и конечной точках, и благодаря ответам я смог создать кривую Безье, используя имеющуюся у меня информацию.

Это код, который позволяет мне рисовать нужные мне типы кривых на форме.

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 в Общее.

Спасибо.


person Frustrated Guy    schedule 28.10.2010    source источник
comment
Пожалуйста, не используйте теги в заголовке.   -  person Brian Rasmussen    schedule 28.10.2010


Ответы (3)


Что вы хотите сделать, так это преобразовать кривую Безье (на первый взгляд кубическую) в Polyline

Используйте уравнение на этой странице ... Значение t должно быть между _3 _... Рассчитайте все значения Bx(t) и By(t), используя уравнение для значений t с шагом "0, 0.01, 0.02....1" (конвертируйте их, конечно, в integers). Чем меньше ваши приращения, тем точнее будут ваши точки.

Вот пример C алгоритма DeCasteljau (почти такая же процедура, но немного оптимизированная Я считаю) :)

person st0le    schedule 28.10.2010

Идеальный алгоритм построения гладкой кривой Безье с оптимальным количеством точек описан Максимом Шеманаревым на странице Anti-Grain Geometry: Адаптивное подразделение кривых Безье.

person Ivan Z    schedule 15.04.2013

Это может помочь, если вы используете производные lerp или float t между draw bezier. Я обнаружил, что это помогает с точностью; учитывая количество вычислений с плавающей запятой.

person Jamie Nicholl-Shelley    schedule 22.01.2015