Присоединение кривых Безье

У меня проблема. Предположим, что у нас есть одна кубическая кривая безье, определяемая четырьмя контрольными точками. Предположим теперь, что кривая вырезается из точки, и каждый отрезок снова представляется с использованием кубических кривых Безье. Итак, теперь, если нам даны два таких безьеров B1 и B2, есть ли способ узнать, могут ли они быть объединены, чтобы сформировать другую кривую Безье B? Это упрощает геометрию, объединяя две кривые и уменьшая количество контрольных точек.

Ответ 1

Некоторые мысли об этой проблеме. Я полагаю, что была начальная кривая Безье P0 - P3 с контрольными точками P1 и P2

enter image description here

Позвольте сделать два подразделения при параметрах 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.

Когда вы разделяете Безье, векторы, образованные двумя последними управляющими точками первой секции и первые две контрольные точки второй секции, являются коллинеарными, а отношение их длин приводит к значению параметра при расщеплении. Проверка того, что общая контрольная точка соответствует этому значению параметра, является легкой задачей (чтобы избежать случайной коллинеарности).