Смотрите также: тот же вопрос на Math.SE
Как я могу найти длину дуги кривой Безье? Например, линейная кривая Безье имеет длину:
length = sqrt(pow(x[1] - x[0], 2) + pow(y[1] - y[0], 2));
Но как насчет квадратичных, кубических или n-градусных кривых Безье?
(Моя цель состояла в том, чтобы заранее оценить разрешение выборки, поэтому мне не нужно тратить время на проверку, касается ли следующая точка предыдущей.)
mathematics
graphics
beziers
heuristics
Матин Улхак
источник
источник
Ответы:
Простой способ для кубических Безье состоит в том, чтобы разбить кривую на N сегментов и суммировать длины сегментов.
Однако, как только вам понадобится длина только части кривой (например, до 30% длины), будет введена параметризация длины дуги . Я написал довольно длинный ответ на один из моих собственных вопросов о Безье с простым примером кода.
источник
1.0/t
(resolution
named), так что это для «реального времени» (которое в лучшем случае составляет 10 кадров в секунду на медленном NXT). Каждая итерация,t += resolution
и новая точка / линия рисуется. В любом случае, спасибо за идею.Хотя я согласен с ответами, которые вы уже получили, я хочу добавить простой, но мощный механизм аппроксимации, который вы можете использовать для любых кривых Безье степени: вы непрерывно делите кривую, используя подразделение де Кастельжау, до максимального расстояния от контрольных точек подкривого к базовой линии подкривого ниже некоторой постоянной эпсилона . В этом случае подкривая может быть аппроксимирована своей базовой линией.
На самом деле, я считаю, что такой подход обычно используется, когда графическая подсистема должна рисовать кривую Безье. Но не цитируйте меня по этому вопросу, у меня нет ссылок на данный момент.
На практике это будет выглядеть так: (за исключением того, что язык не имеет значения)
источник
Дуги для кривых Безье имеют только замкнутую форму для линейных и квадратичных. Для кубиков не гарантируется, что решение будет закрытым. Причина в том, что длина дуги определяется радикальным интегралом, для которого есть замкнутый только для многочленов 2-й степени.
Для справки: длина квадратичного Безье для точек (a, p) (b, q) и (c, r) равна
Где LN - натуральный логарифм, а ^ обозначает степень и √ квадратный корень.
Следовательно, должно быть проще и дешевле аппроксимировать дугу по какому-то другому правилу, например, по многоугольнику или схеме интегрирования, например по правилу Симпсона, потому что квадратные корни из LN являются дорогостоящими операциями.
источник
Я разработал выражение длины в закрытой форме для 3-точечного Безье (ниже). Я не пытался отработать закрытую форму на 4+ балла. Скорее всего, это будет трудно или сложно представить и обработать. Тем не менее, метод численного приближения, такой как алгоритм интегрирования Рунге-Кутты, будет работать достаточно хорошо, интегрируя с использованием формулы длины дуги . Мои вопросы и ответы на RK45 на MSE могут помочь с реализацией RK45.
Вот некоторые Java - код для длины дуги 3 точки Безье а, с точками
a
,b
иc
.источник