2016-04-22 2 views
1

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

Используя алгоритм De Boor, я могу оценить позиции на кривой и получить касательное значение для этих позиций. Пока все хорошо.

Теперь как измерить (/ приблизительную) длину дуги вдоль пути B-сплайна?

+0

Привет, приветствуем переполнение стека. Кривая обучения для нового пользователя не крутая как таковая, но выяснение того, как использовать стек, не всегда очевидно. Пожалуйста, займите несколько минут и посмотрите здесь [ask], и также важно посмотреть здесь .. [mcve] .. Также, если ответ действительно для вас, нажмите на галочку слева от ответа, чтобы вопрос отмечен как ответ – Claudius

+0

De Boor делает все просто, но опускает любую информацию о самой кривой, кроме того, что она дает. Если вам действительно нужен какой-то аналитический способ вместо использования ответа Codor (который будет очень хорошо работать в каждом приложении реального мира), вам действительно нужно вычислить базовые функции, а затем использовать интеграцию аналитических кривых по каждому сегменту полинома. – Aziuth

+0

Да, вам нужно вычислить определенный интеграл от t = t_start до t = t_end of | d point (t)/dt | dt –

ответ

2

В цифровой форме это может быть сделано путем создания некоторых эквидистантных точек в слоте сплайна, измерьте Euclidean distances между ними и суммируйте эти расстояния. Чем больше точек используется, тем точнее будет аппроксимация.

+0

Я не думаю, что они должны быть равноудаленными, хотя это, вероятно, даст вам самый точный ответ за определенное количество очков. Например.достаточно повторить пару соседних точек, эвклидово расстояние которых максимально, и создать новую точку, значение параметра которой находится на полпути между ними (TTBOMK это вообще * не будет * ставит новую точку на равное расстояние вдоль кривая от двух других). –

+0

Действительно, я сделал это. Это довольно тяжело, если я хочу с минимальной точностью. (Опять же) Я надеялся найти особое свойство любого алго, чтобы получить хорошее приближение. – Gav

0

The arc-length of a parametric curve является

⌠₁ ________________ 
⎮ √ dx(t)² + dy(t)² dt 
⌡₀ 

Или, интеграл от длины его касательных по всей кривой. Для t < - (0, 1); равномерная параметризация.

Прежде всего вам нужно преобразовать кривую bspline в составную сплайновую сплайну. Это делается путем вставки «узелки» (алгоритм Boehm) в http://www.infogoaround.org/JBook/bstobez.html

Для кривых Безье, можно вычислить тангенс в каждой точке очень легко. И используйте алгоритм численного интегрирования, такой как Gauss-Legendre quadrature для интеграции длины касательной.

Адрес demo in javasript с использованием кода paper.js.

Обратите внимание, что алгоритм очень точен (в пределах области математики с плавающей запятой, приведенная выше ссылка на Википедию имеет лучший пример). Так как N-точечная квадратура Гаусса-Лежандра является точной для многочлена степени 2N-1. Величина ошибки в демонстрации во многом объясняется тем, что круги не могут быть представлены как равномерные кривые Безье точно, поэтому наши кривые являются всего лишь приближением для начала.

+0

Большое спасибо. Звучит интересно. Я буду переваривать и проверять это. Я вернусь к этому для реакции. Еще раз спасибо. – Gav

Смежные вопросы