LINUX.ORG.RU

Построить кривую через заданные точки

 , кривая,


0

3

Как известно, есть такие кривые безье. Задав две крайние точки, промежуточные точки в них лишь задают кривизну траектории.

Мне же нужно совсем иначе - есть набор N точек (в трехмерном пространстве). Через эти N точек нужно построить кривую линию в 3D-пространстве так, чтобы она проходила через все точки, образуя плавную форму.

Как называются функции, которые выполняют такую задачу?

man интерполяция

ados ★★★★★
()

Если N небольшое и функция не важна, бери полином N+1. Сплайны уже посоветовали. Для трехмерного пространства, наверняка, уже есть готовые решения, но если хочешь повелосипедить, фить проекции.

tyakos ★★★
()
Ответ на: комментарий от I-Love-Microsoft

Любыми сплайнами любого порядка можно «объединить» любое количество точек. Я бы использовал локальные параметрические.

Ivana
()
Ответ на: комментарий от I-Love-Microsoft

Конечно. Внутри каждого интервала это кривая третьего порядка со своими коэффициентами. В точках происходит сопряжение производных.

rymis ★★
()
Ответ на: комментарий от I-Love-Microsoft

По формулам, вестимо. Которые следуют из критериев построения.

Ivana
()
Ответ на: комментарий от I-Love-Microsoft

Разные. Составляются системы уравнений (они будут линейными) и высчитываются. Скорее всего можно сходу найти готовые библиотеки: сплайны используются повсеместно.

rymis ★★
()

Вам же просто нужно интерполировать точечные значения, правильно? (во всяком случае ваша постановка задачи звучит как обычная интерполяция) Советую воспользоваться интерполяционным многочленом Лагранжа, он элементарно составляется по известным сеточным значениям без всяких премудростей. Если не слышали о таком, просто возьмите из поисковика и радуйтесь. И не надо никаких сплайнов, не усложняйте заурядную интерполяцию.

Hasek ★★
()
Ответ на: комментарий от Hasek

Лор такой лор... Тонны бреда с уверенным тоном...

1. ТС не нужна интерполяция - он строит не функцию, а кривую

2. ТС нежна гладкость (правда, не уточнено какого порядка, потому что он не знает что это такое, но пусть хотя бы первого) - локальный Лагранж идет лесом

3. глобальный Лагранж по 50 точкам будет далек от ожиданий ТС, насколько я могу их предполагать.

Ivana
()

Все что тебе надо - это взять кривые Безье и срастить касательные на концах. Для кривой Безье касательная в начале равна

2(P_1-P_0), а в конце 2(P_2-P_0). Кривая проходит P_0 и P_2 - концы кривой.

выводится легко из формулы для кривой второго порядка.

dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 1)
Ответ на: комментарий от Ivana

ТС не нужна интерполяция - он строит не функцию, а кривую

Не понял к чему это. Вы факт существования многомерной интерполяции отрицаете? Или не знаете других способов кроме сплайнов?

ТС нужна гладкость

Почему вы считаете что полином Лагранжа не будет гладким? Это будет так только при очень большом числе точек на очень маленьком промежутке (будет сильно осциллировать), но поскольку анонсированно число 50, мне трудно представить на каком напёрстке их надо разместить, чтобы потерять гладкость.

глобальный Лагранж по 50 точкам будет далек от ожиданий ТС, насколько я могу их предполагать.

Что значит далёк от ожиданий? Точность при экстраполяции (не важно чем и как) вообще всегда ниже чем при интерполяции.

Hasek ★★
()
Ответ на: комментарий от dikiy

система уравнений выглядит как шестидиагональная разреженная матрица:

1 1 0 P_12 (=) 2*(P_2)
0 1 1 P_23 (=) 2*(P_3)
0 0 1 P_34 (=) 2*(P_4)

Это если у тебя допустим пять точек от P_1 до P_5 с соответственными точками P_ij, которые задают кривую между P_i и P_j. Решение у системы уравнений есессно не одно.

1 в матрице обозначает сразу три единички в стобик. то есть по факту матрица 9x3. Вектор неизвестных это тоже матрица, 9x3. координаты P_ij записаны как строчка. Вектор констант права это матрица 9x3 тоже.

dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 1)

На удивление, но Безье работает и для 3d. Ещё есть SP-Lines.

beastie ★★★★★
()
Ответ на: комментарий от dikiy

Я пеиемутил с размерностями, но принцип ясен, я надеюсь 😃

dikiy ★★☆☆☆
()
Ответ на: комментарий от Ivana

ТС вообще дерево. Решение задачи решили немного отложить, ввиду более срочной функциональности... Но в дальнейшем буду черпать вдохновение в ответах этой темы. Спасибо за ответы!

I-Love-Microsoft ★★★★★
() автор топика

Сплайны иногда опасная вещь, т.к. можно получить осциллирующую функцию. Проще взять и соединить их прямыми, если много точек.

Zodd ★★★★★
()
Ответ на: комментарий от kss

Я про сплайны высоких порядков вел речь)

Zodd ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.