Я работаю над личным проектом с использованием кривых Безье. Я видел много реализаций, которые обрабатывают квадратичные и кубические кривые по отдельности, но я хочу создать более обобщенный алгоритм, в котором я могу добавлять и удалять контрольные точки, увеличивая и уменьшая степень (порядок) кривой.
Это не часть моего основного вопроса, но если кто-то знает пример обобщенного алгоритма, на который я могу взглянуть, я буду благодарен, если они укажут мне это направление.
Прежде всего, я понимаю, что любое преобразование из кривой низкого порядка в кривую высокого порядка является приближением, а не эквивалентом. Я доволен "достаточно близко" в вычислительном отношении.
Во-вторых, я также понимаю, что при переходе от кривой более высокого порядка к кривой более низкого порядка происходит потеря информации. Это неизбежно, поскольку кривая более высокого порядка имеет больше «изгибов» на кривой, которые кривая более низкого порядка просто не может аппроксимировать.
Меня устраивают эти ограничения, поскольку необходимо иметь возможность добавлять и вычитать контрольные точки внутри кривой для достижения желаемой функциональности.
Мой первый вопрос связан с вопросом, заданным примерно 5 лет назад: Преобразование квадратичной кривой в кубическую кривую
Квадратичная кривая имеет три (3) контрольных точки:
Vector3 Start;
Vector3 Control1;
Vector3 End;
При преобразовании в куб вводим четвертую контрольную точку ...
Vector3 Control2;
... «Между» Control1 и End. Затем мы устанавливаем Control1 и Control2 соответственно:
Control2 = new Vector3(
End.x + ((2.0f / 3.0f) * (Control1.x - End.x)),
End.y + ((2.0f / 3.0f) * (Control1.y - End.y)),
End.z + ((2.0f / 3.0f) * (Control1.z - End.z))
);
Control1 = new Vector3(
Start.x + ((2.0f / 3.0f) * (Control1.x - Start.x)),
Start.y + ((2.0f / 3.0f) * (Control1.y - Start.y)),
Start.z + ((2.0f / 3.0f) * (Control1.z - Start.z))
);
Я не уверен, что это правильно. В этом примере был установлен только компонент «x». Я просто экстраполировал из него «y» и «z». Если это неверно, я был бы признателен за то, чтобы узнать, что правильно.
В этом примере рассматривается только преобразование квадратичных кривых в кубические. Управляющим значением при установке координат является (2.0f / 3.0f). Итак, означает ли это, что преобразование из кубической в квартальную будет (2.0f / 4.0f) или (3.0f / 4.0f) или что-то совсем другое? Какова должным образом обобщенная функция этого преобразования для кривой произвольного порядка?
Мой проект также будет работать со сплайнами. Я использую метод от края до края для построения моих сплайнов, где край определяется как произвольно упорядоченная кривая от 1 (линия) до n, где первый и последний Vector3 в списке контрольных точек являются начальной и конечной точками ребро и соединяющиеся ребра разделяют конечную точку предыдущего ребра с начальной точкой следующего.
В отличие от кривых Безье, я не добавляю и не вычитаю контрольные точки. Вместо этого я разделяю и комбинирую края. Какой был бы хороший метод разделения кривой на две кривые более низкого порядка с порядком не ниже 2, приближающимся к исходной кривой? Точно так же, что было бы хорошим методом для объединения двух кривых в одну кривую высокого порядка?
Я понимаю, что это много, о чем нужно спросить в одном посте, но мне показалось, что лучше объединить все в одной теме, а не разделять ее.
Спасибо за любую помощь!