Существующие ответы не учитывают, что конечные точки являются произвольными (а не заданными). Таким образом, при измерении прямолинейности кривой не имеет смысла использовать конечные точки (например, для вычисления ожидаемой длины, угла, положения). Простым примером будет прямая линия с обоими концами. Если мы измеряем с использованием расстояния от кривой и прямой линии между конечными точками, это будет довольно большим, поскольку нарисованная нами прямая линия смещена от прямой линии между конечными точками.
Как мы скажем, насколько прямая кривая? Предполагая, что кривая достаточно гладкая, мы хотим знать, насколько в среднем изменяется касательная к кривой. Для линии это будет ноль (поскольку касательная постоянна).
Если мы примем положение в момент времени t (x (t), y (t)), то касательная будет (Dx (t), Dy (t)), где Dx (t) - производная от x в момент времени t (на этом сайте отсутствует поддержка TeX). Если кривая не параметризована длиной дуги, мы нормализуем ее делением на || (Dx (t), Dy (t)) ||. Таким образом, у нас есть единичный вектор (или угол) касательной к кривой в момент времени t. Таким образом, угол a (t) = (Dx (t), Dy (t)) / || (Dx (t), Dy (t)) ||
Затем нас интересует || Da (t) || ^ 2, интегрированное вдоль кривой.
Учитывая, что у нас, скорее всего, есть дискретные точки данных, а не кривая, мы должны использовать конечные разности для аппроксимации производных. Итак, Да (т) становится (a(t+h)-a(t))/h
. И, (т) становится ((x(t+h)-x(t))/h,(y(t+h)-y(t))/h)/||((x(t+h)-x(t))/h,(y(t+h)-y(t))/h)||
. Затем мы получаем S путем суммирования h||Da(t)||^2
для всех точек данных и, возможно, нормализации по длине кривой. Скорее всего, мы используем h=1
, но это действительно просто произвольный масштабный коэффициент.
Повторим, S будет нулем для линии и чем больше, тем больше она отклоняется от линии. Для преобразования в нужный формат используйте 1/(1+S)
. Учитывая, что масштаб является несколько произвольным, можно умножить S на некоторое положительное число (или преобразовать его другим способом, например, использовать bS ^ c вместо S), чтобы отрегулировать, насколько прямолинейны определенные кривые.