У меня проблема. Предположим, что у нас есть одна кубическая кривая безье, определяемая четырьмя контрольными точками. Предположим теперь, что кривая вырезается из точки, и каждый отрезок снова представляется с использованием кубических кривых Безье. Итак, теперь, если нам даны два таких безьеров B1 и B2, есть ли способ узнать, могут ли они быть объединены, чтобы сформировать другую кривую Безье B? Это упрощает геометрию, объединяя две кривые и уменьшая количество контрольных точек.
Присоединение кривых Безье
Ответ 1
Некоторые мысли об этой проблеме. Я полагаю, что была начальная кривая Безье P0
- P3
с контрольными точками P1
и P2
Позвольте сделать два подразделения при параметрах ta и tb. Теперь у нас есть две подкуры (желтые) - P0
- PA3
и PB0
- P3
. Синий интервал теряется. PA1
и PB2
- известные контрольные точки. Нам нужно найти неизвестные P1
и P2
.
Некоторые уравнения
Начальная кривая:
C = P0*(1-t)^3+3*P1(1-t)^2*t+3*P2*(1-t)*t^2+P3*t^3
Endpoints:
PA3 = P0*(1-ta)^3+3*P1*(1-ta)^2*ta+3*P2*(1-ta)*ta^2+P3*ta^3
PB0 = P0*(1-tb)^3+3*P1*(1-tb)^2*tb+3*P2*(1-tb)*tb^2+P3*tb^3
Контрольные точки малых кривых
PA1 = P0*(1-ta)+P1*ta => P1*ta = PA1 – P0*(1-ta)
PB2 = P2*(1-tb)+P3*tb => P2(1-tb) = PB2 – P3*tb
Теперь заменим неизвестные точки в уравнении PA3:
**PA3***(1-tb) = **P0***(1-ta)^3*(1-tb)+3*(1-ta)^2*(1-tb)*(**PA1** – **P0***(1-ta))+3*(1-ta)*ta^2*( **PB2** – **P3***tb)+**P3***ta^3*(1-tb)
(некоторые знаки умножения были потеряны из-за форматирования SO)
Это векторное уравнение, оно содержит два скалярных уравнения для двух неизвестных ta
и tb
PA3X*(1-tb) = P0X*(1-ta)^3*(1-tb)+3*(1-ta)^2*(1-tb)*(PA1X – P0X*(1-ta))+3*(1-ta)*ta^2*( PB2X – P3X*tb)+P3X*ta^3*(1-tb)
PA3Y*(1-tb) = P0Y*(1-ta)^3*(1-tb)+3*(1-ta)^2*(1-tb)*(PA1Y – P0Y*(1-ta))+3*(1-ta)*ta^2*( PB2Y – P3Y*tb)+P3Y*ta^3*(1-tb)
Эта система может быть решена как численно, так и аналитически (на самом деле Maple решает ее с очень-очень большой кубической формулой :()
Если у нас есть точки с некоторой ошибкой, имеет смысл построить переопределенную систему уравнений для некоторых точек (PA3
, PB0
, PA2
, PB1
) и решить ее численно, чтобы минимизировать отклонения.
Ответ 2
Здесь вы найдете довольно простое решение: https://math.stackexchange.com/a/879213/65203.
Когда вы разделяете Безье, векторы, образованные двумя последними управляющими точками первой секции и первые две контрольные точки второй секции, являются коллинеарными, а отношение их длин приводит к значению параметра при расщеплении. Проверка того, что общая контрольная точка соответствует этому значению параметра, является легкой задачей (чтобы избежать случайной коллинеарности).