Интерполяция последовательности точек

Учитывая произвольную последовательность точек в пространстве, как вы можете произвести плавную непрерывную интерполяцию между ними?

2D и 3D решения приветствуются. Также приветствуются решения, которые создают список точек с произвольной степенью детализации, и решения, которые создают контрольные точки для кривых Безье.

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
0
2 916
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Вы смотрели команду Unix сплайн? Можно ли заставить это делать то, что вы хотите?

Что ж, это интересное место для поиска решения! Спасибо. Я проверю это.

Nick Retallack 20.09.2008 12:46

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

На первом году учебы в университете я написал небольшой инструмент для этого в 2D, и вы можете найди это на этой странице, он называется решателем Лагранжа. На странице Википедии также есть образец реализации.

Вот как это работает: у вас есть полином p(x) порядка n, где n - количество набранных вами очков. Он имеет вид a_n x^n + a_(n-1) x^(n-1) + ...+ a_0, где _ - нижний индекс, ^ - мощность. Затем вы превращаете это в систему одновременных уравнений:

p(x_1) = y_1
p(x_2) = y_2
...
p(x_n) = y_n

Вы преобразовываете вышеуказанное в расширенную матрицу и решаете коэффициенты a_0 ... a_n. Затем у вас есть многочлен, который проходит через все точки, и теперь вы можете интерполировать между точками.

Однако обратите внимание, что это может не соответствовать вашим целям, поскольку не дает возможности отрегулировать кривизну и т. д. - вы застряли с одним решением, которое нельзя изменить.

К сожалению, полиномиальная интерполяция Лагранжа или другие формы не работают с произвольным набором точек. Они работают только на множестве, где в одном измерении, например. Икс

xi <xi+1

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

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

Существует несколько алгоритмов интерполяции (и исключения) между произвольным (но окончательным) набором точек. Вы должны проверить числовые рецепты, они также включают реализации этих алгоритмов на C++.

Погуглите "ортогональная регрессия".

В то время как методы наименьших квадратов пытаются минимизировать вертикальное расстояние между аппроксимирующей линией и каждым f (x), ортогональная регрессия минимизирует перпендикулярные расстояния.

Дополнение

При наличии зашумленных данных стоит попробовать и маститый алгоритм RANSAC.

В мире 3D-графики популярны NURBS. Дополнительную информацию легко найти в Google.

Ответ принят как подходящий

Шпонка Catmull-Rom гарантированно проходит через все контрольные точки. Я считаю, что это удобнее, чем пытаться настроить промежуточные контрольные точки для других типов шлицев.

Этот PDF Кристофер Твигг содержит хорошее краткое введение в математику сплайна. Лучшее итоговое предложение:

Catmull-Rom splines have C1 continuity, local control, and interpolation, but do not lie within the convex hull of their control points.

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

Вот другой пример с некоторым загружаемым кодом DirectX.

Голосование за это. Несколько лет назад я использовал Catmull в видеоигре, и это сработало.

Jim Buck 25.09.2008 20:03

Это именно то, для чего был разработан Catmull-Rom (в частности, чтобы сплайн движения проходил через контрольные точки).

Jared Updike 26.11.2008 23:00

Вам следует взглянуть на B-шлицы. Их преимущество перед кривыми Безье состоит в том, что каждая часть зависит только от локальных точек. Таким образом, перемещение точки не влияет на удаленные части кривой, где «далеко» определяется параметром сплайна.

Проблема с полиномом Лангранжа состоит в том, что добавление точки может иметь экстремальные эффекты на кажущихся произвольными участках кривой; нет такой "локальности", как описано выше.

Я придумал ту же проблему и на днях реализовал ее с друзьями. Мне нравится делиться примером проекта на github.

PathInterpolation screenshot

https://github.com/johnjohndoe/PathInterpolation
Не стесняйтесь раскошелиться.

Другие вопросы по теме