Кривая Нюрба (2D) Параметризация фиксированной длины - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть класс, который представляет 2D-кривую Nurbs

класс Nurbs2D {...};

Членами данных являются контрольные точки (std :: vector of Point2D), вектор узла (std :: vector of double), веса (std :: vector of double), степень (подразумевается на основе количества контрольных точек и узла вектор)

API: я могу построить кривую, параметризованную между t0 и t1. Я также могу вычислить Point2D с заданным параметром t (t0 <= t <= t1). </p>

Учитывая параметр ti, я хочу оценить следующий параметр ti + 1, чтобы расстояние по кривой от ti до ti + 1 было равно Di (учитывая Di в пределах допуска dt). Требуются две функции: одна для вычисления длины от ti до ti + 1, а другая для оценки ti + 1 с учетом ti, Di и dt.

Код на C ++ будет действительно полезен. Я рассчитываю на скорость, а не на точность, так как допуск настройки dt приведёт результаты в соответствие.

1 Ответ

0 голосов
/ 03 сентября 2018

Расчет длины дуги кривой NURBS довольно сложен. Вам необходимо интегрировать длину дифференциала между двумя заданными значениями параметров. Это становится грязным даже для простых квадратичных B-сплайнов, как вы можете видеть в этом вопросе .

Поскольку вы не сосредотачиваетесь на точности, вероятно, достаточно приблизить длину численно. Один из ответов на вопрос Math.SE указывает на схему подразделения, которую вы можете использовать. Вы можете распространить это на NURBS. Тем не менее, более простой подход может быть таким же подходящим для вашего приложения: просто оцените кривую в нескольких равномерно распределенных точках выборки в интересующем интервале. Затем вычислите длину полилинии этой выборки. Этот подход может быть улучшен путем изменения плотности выборки на основе кривизны. Но единый подход может работать достаточно хорошо для вас. Точность коррелирует с количеством используемых образцов.

Чтобы получить точку, которая на dl единицу длины опережает текущую точку t, вы можете сделать что-то похожее: выберите небольшой шаг dt и оцените точки в этом интервале (т. Е. t, t + dt, t + 2dt, t + 3dt ...) при измерении длины полилинии, пока не будет достигнута целевая длина. Если вы стреляете по цели в последний интервал, вы можете уменьшить dt для этой последней части, пока не достигнете требуемой точности.

...