Сплайн Безье
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [18.97.9.169] |
|
|
правила раздела Алгоритмы

Сплайн Безье
|
Сообщ.
#1
,
|
|
|
|
Имеется сегмент сплайна Безье: 2 вершины и 2 управляющие точки.
При добавлении новой вершины в сегмент (разбивке сегмента на 2), нужно каким-то образом пересчитать положение управляющих точек так, чтобы форма кривой не изменилась. Кто-нибудь знает как это делается? |
|
Сообщ.
#2
,
|
|
|
|
Точки исходной кривой P0, P1, P2, P3
если мы режем ее в точке PP с параметром t, то P0'=P0 P3'=PP P1'=P0+t*(P1-P0) (лежит на отрезке P0P1, делит его в отношении t:1-t) PX(вспомогательная) - на отрезке P1P2, делит его так же P2' - на отрезке P1'PX, делит его так же аналогично для второй кривой, только отношение обратное |
|
Сообщ.
#3
,
|
|
|
|
Спасибо, MBo.
Когда новая вершина добавляется примерно посередине сегмента, твои формулы отлично работают. Но: если добавить точку достаточно близко к P0, P2' попадает не на отрезок P1'P3', а на его продолжение за точку P3'. В результате кривая приобретает излом. Или я чего-то не понимаю? :-) |
|
Сообщ.
#4
,
|
|
|
|
Писал навскидку, мог наврать. Вот выдержка (FP - к.т. исх. кривой)
tt := 1 - t; t0 := tt * tt * tt; t1 := 3 * tt * tt * t; t2 := 3 * tt * t * t; t3 := t * t * t; Curve1.CPt[0] := FP[0]; xx := Round(FP[0].x * t0 + FP[1].x * t1 + FP[2].x * t2 + FP[3].x * t3); yy := Round(FP[0].y * t0 + FP[1].y * t1 + FP[2].y * t2 + FP[3].y * t3); Curve1.CPt[3] := Point(xx, yy); Curve1.CPt[1] := Point(Round(FP[0].x * tt + FP[1].x * t), Round(FP[0].y * tt + FP[1].y * t)); xx := Round((FP[1].x * tt + FP[2].x * t)); yy := Round((FP[1].y * tt + FP[2].y * t)); Curve1.CPt[2] := Point(Round(Curve1.CPt[1].x * tt + xx * t), Round(Curve1.CPt[1].y * tt + yy * t)); |