Нахождение длины кубического B-сплайна

Используя scipy's interpolate.splprep функция получает параметрический шлиц на параметре u, но домен u не линейный интеграл шлица, это - кусочное линейное соединение входных координат. Я попробовал integrate.splint, но это просто передает отдельным интегралам u. Очевидно, я могу численно интегрировать набор Декартовых дифференциальных расстояний, но я задавался вопросом, был ли закрытый метод формы для получения длины шлица или сегмента шлица (использующий scipy или numpy), что я пропускал.

Править: Я ищу решение закрытой формы или очень быстрый способ сходиться к ответу машины точности. Я почти разочаровался в числовых находящих корень методах, и теперь, прежде всего, после ответа закрытой формы. Если кто-либо имеет опыт при интеграции эллиптических функций или может указать на меня на хороший ресурс (кроме Вольфрама), Который был бы большим.

Я собираюсь попробовать Максимумы, чтобы попытаться получить неопределенный интеграл того, чему я верю, функция для одного сегмента шлица: Я осуществил кросспостинг этого на MathOverflow

7
задан Community 13 April 2017 в 12:57
поделиться

2 ответа

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

Точный и быстрый метод «сложения отрезков линии»:

Использование рекурсивного деления (разновидность алгоритма де Кастельо) для генерации точек может дать вам очень точное представление с минимальным количеством точек. Подразделяйте подразделения только в том случае, если они не соответствуют критериям. Обычно критерии основаны на длине, соединяющей контрольные точки (корпус или клетка). Для кубической, обычно сравнивая близость P0P1 + P1P2 + P2P3 к P0P3, где P0, P1, P2 и P3 - контрольные точки. точки, которые определяют ваш Безье.

Вы можете найти здесь код Delphi: текст ссылки

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

6
ответ дан 7 December 2019 в 01:20
поделиться

Вы можете интегрировать функцию sqrt(x'(u)**2+y'(u)**2) поверх u, где вычисляются производные x' и y' ваших координат с scipy.interpolate.splev. Интеграция может быть выполнена с одной из рутин из scipy.integration (quad точно [Clenshaw-Curtis], romberg обычно быстрее). Это должно быть точнее, и, вероятно, быстрее, чем суммирование множества малых расстояний (что эквивалентно интегрированию с правилом прямоугольника).

4
ответ дан 7 December 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: