2010-10-28 4 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

Пожалуйста, не используйте теги в заголовке. –

ответ

2

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

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

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

1

Идеальный алгоритм для создания гладкой кривой Безье с оптимальным числом точек описывается Максим Shemanarev по антисемитизму -Grain Geometry страница: Adaptive Subdivision of Bezier Curves.

0

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

Смежные вопросы