Соединение кривых Безье - PullRequest
       54

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

12 голосов
/ 08 ноября 2011

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

Ответы [ 2 ]

5 голосов
/ 10 ноября 2011

Некоторые мысли об этой проблеме.Я предполагаю, что была начальная кривая Безье 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

Конечные точки:

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)

Thisявляется векторным уравнением, оно содержит два скалярных уравнения для двух неизвестных 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) и решить ее численно, чтобы минимизироватьотклонения.

1 голос
/ 17 апреля 2015

Здесь вы найдете довольно простое решение: https://math.stackexchange.com/a/879213/65203.

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

...