Создайте плавную линию, чтобы соединить N точек в 3 измерениях - PullRequest
3 голосов
/ 28 июня 2011

У меня N точек в 3-мерном пространстве. Мне нужно присоединиться к ним, используя линию. Однако, если я сделаю это с помощью простой линии, она не будет гладкой и выглядит некрасиво.

Мой текущий подход состоит в том, чтобы использовать кривую Безье, используя алгоритм ДеКастеляу для 4 точек, и запустить его для каждой группы из 4 точек в моем наборе данных. Однако проблема заключается в том, что, поскольку я запускаю его, скажем, по пунктам 1-4, 5-8, 9-12 и т. Д., Отдельно, линия не является гладкой между 4-5, 8-9 и т. Д.

Я также искал другие подходы; в частности, я обнаружил эту статью о сплайнах Кэтмулла-Рома, которые кажутся даже более подходящими для моей цели, потому что кривая проходит через все контрольные точки, в отличие от кривой Безье. Так что я почти начал это реализовывать, но потом увидел на этом сайте, что формула работает "assuming uniform spacing of control points". Это не относится к моей проблеме.

Итак, мой вопрос: какой подход я должен использовать - Безье, Катмул-Ром или что-то совершенно другое? Если Безье, то как исправить негладкость между 4-5, 8-9 и т. Д.? Если Catmull-Rom, почему формула не сработает, если точки распределены неравномерно, и что мне нужно вместо этого?

РЕДАКТИРОВАТЬ: Теперь я почти уверен, что хочу сплайн Catmull-Rom, так как он проходит каждую контрольную точку, что является преимуществом для моего приложения. Поэтому основной вопрос, на который я хотел бы ответить, заключается в том, почему формула на предоставленной мной ссылке не работает для неравномерно расположенных контрольных точек?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 28 июня 2011

Пара решений:

  • Используйте B-сплайн.Это обобщение кривых Безье (кривая Безье является B-сплайном без внутренних узловых точек.)

  • Используйте кубический сплайн.Кубические сплайны особенно легко рассчитать.Кубический сплайн непрерывен в нулевой, первой и второй производных через контрольные точки.Третья производная, кубический член, страдает разрывом в контрольных точках, но очень трудно увидеть эти разрывы.

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

0 голосов
/ 28 июня 2011

Одним из решений является следующая страница в википедии: http://en.wikipedia.org/wiki/Bézier_curve, проверить обобщенный подход для N контрольных точек.

0 голосов
/ 28 июня 2011

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

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

Вы можете прочитать о них в главе 45 книги Дэвида Маккея Information Theory, Inference, and Learning Algorithms, которую можно скачать с сайта автора здесь .

...