Как нарисовать кривую, не зная 4 точки? - PullRequest
3 голосов
/ 03 сентября 2011

В соответствии с примером кода в Каире , следующим кодом

double x=25.6,  y=128.0;
double x1=102.4, y1=230.4,
       x2=153.6, y2=25.6,
       x3=230.4, y3=128.0;

cairo_move_to (cr, x, y);
cairo_curve_to (cr, x1, y1, x2, y2, x3, y3);

cairo_set_line_width (cr, 10.0);
cairo_stroke (cr);

cairo_set_source_rgba (cr, 1, 0.2, 0.2, 0.6);
cairo_set_line_width (cr, 6.0);
cairo_move_to (cr,x,y);   cairo_line_to (cr,x1,y1);
cairo_move_to (cr,x2,y2); cairo_line_to (cr,x3,y3);
cairo_stroke (cr);

может генерировать кривую и две розовые линии.

enter image description here

Но для этого нужно 4 балла, (x, y), (x1, y1), (x2, y2), (x3, y3)

Если у меня есть только x, y и x3, y3 (начальная и конечная точки кривой), Есть ли математическая формула для генерации этих розовых линий, не зная x1, y1 и x2, y2?

Редактировать

Это для случая, когда я генерирую кривую следующим образом.

cairo_move_to (cr, x, y);
cairo_curve_to (cr, x, y3, x3, y, x3, y3);

Ответы [ 3 ]

6 голосов
/ 03 сентября 2011

Просто наберите очки:

  • начните с двух известных вам точек (x 1 , y 1 ) и (x 3 , y 3 ):

enter image description here

  • соединить две строки:

enter image description here

  • создать P 2 как среднее между P 1 и P 3 :

enter image description here

  • теперь вращается P 3 90 & deg; по часовой стрелке:

enter image description here

  • сделать то же самое с P 4 , создать его на полпути между P 1 и P 3

enter image description here

  • повернуть P 4 90 & deg; по часовой стрелке:

enter image description here

  • Теперь у вас есть четыре точки и вы можете нарисовать кривую Безье:

enter image description here


Средняя точка может быть рассчитана как:

P mid = (x 1 + x 3 ) / 2, (y 1 + у 3 ) / 2

double x1=25.6,  y1=128.0;
double x3=153.6, y3=25.6;

double xm = (x1+x3)/2;
double ym = (y1+y3)/2;

//rotate Pm by 90degrees around p1 to get p2
double x2 = -(ym-y1) + y1;
double y2 =  (xm-x1) + x1;

//rotate Pm by 90degrees around p3 to get p4
double x4 = -(ym-y3) + y3;
double y4 =  (xm-x3) + x3;
1 голос
/ 03 сентября 2011

Розовые линии представляют векторы вылета из двух конечных точек.Без этих векторов «кривая» между двумя точками - это просто прямая линия (если у вас нет другой информации, которая ее определяет).

Если у вас нет (x1, y1) и (x2,y2), вы можете просто использовать (x3, y3) в качестве конечной точки для розовой линии от (x, y) и наоборот.Они окажутся прямо над вашей черной линией, где они и должны быть для прямой линии.

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

1 голос
/ 03 сентября 2011

Нет, если вы не предоставите какое-то ограничение, которое можно использовать для определения местоположения розовых линий. Сами по себе две конечные точки могут определять только отрезок прямой линии.

...