Используя scipy's interpolate.splprep
функция получает параметрический шлиц на параметре u
, но домен u
не линейный интеграл шлица, это - кусочное линейное соединение входных координат. Я попробовал integrate.splint
, но это просто передает отдельным интегралам u
. Очевидно, я могу численно интегрировать набор Декартовых дифференциальных расстояний, но я задавался вопросом, был ли закрытый метод формы для получения длины шлица или сегмента шлица (использующий scipy или numpy), что я пропускал.
Править: Я ищу решение закрытой формы или очень быстрый способ сходиться к ответу машины точности. Я почти разочаровался в числовых находящих корень методах, и теперь, прежде всего, после ответа закрытой формы. Если кто-либо имеет опыт при интеграции эллиптических функций или может указать на меня на хороший ресурс (кроме Вольфрама), Который был бы большим.
Я собираюсь попробовать Максимумы, чтобы попытаться получить неопределенный интеграл того, чему я верю, функция для одного сегмента шлица: Я осуществил кросспостинг этого на MathOverflow
Поскольку оба x и y являются кубическими параметрическими функциями, не существует замкнутого решения в терминах простых функций. Численное интегрирование - это лучший способ. Либо интегрирование выражения длины дуги, либо просто добавление длин отрезков линии - зависит от требуемой точности и от того, сколько усилий вы хотите приложить.
Точный и быстрый метод «сложения отрезков линии»:
Использование рекурсивного деления (разновидность алгоритма де Кастельо) для генерации точек может дать вам очень точное представление с минимальным количеством точек. Подразделяйте подразделения только в том случае, если они не соответствуют критериям. Обычно критерии основаны на длине, соединяющей контрольные точки (корпус или клетка). Для кубической, обычно сравнивая близость P0P1 + P1P2 + P2P3 к P0P3, где P0, P1, P2 и P3 - контрольные точки. точки, которые определяют ваш Безье.
Вы можете найти здесь код Delphi: текст ссылки
Преобразование в Python должно быть относительно простым. Он будет генерировать точки. Код уже вычисляет длину сегментов, чтобы проверить критерии. Вы можете просто накапливать эти значения длины по пути.
Вы можете интегрировать функцию sqrt(x'(u)**2+y'(u)**2)
поверх u
, где вычисляются производные x'
и y'
ваших координат с scipy.interpolate.splev. Интеграция может быть выполнена с одной из рутин из scipy.integration (quad
точно [Clenshaw-Curtis], romberg
обычно быстрее). Это должно быть точнее, и, вероятно, быстрее, чем суммирование множества малых расстояний (что эквивалентно интегрированию с правилом прямоугольника).