Існуючі відповіді не враховують, що кінцеві точки є довільними (а не даними). Таким чином, при вимірюванні прямолінійної кривої немає сенсу використовувати кінцеві точки (наприклад, для обчислення очікуваної довжини, кута, положення). Простим прикладом може бути пряма лінія з обома кінцями. Якщо ми вимірюємо, використовуючи відстань від кривої та пряму між кінцевими точками, це буде досить великим, оскільки пряма, яку ми провели, зміщується від прямої між кінцевими точками.
Як ми можемо сказати, наскільки пряма крива? Припускаючи, що крива досить гладка, ми хочемо знати, наскільки в середньому дотична до кривої змінюється. Для рядка це буде нуль (оскільки дотична постійна).
Якщо дозволити позиції в момент часу 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, інтегрований по кривій.
Зважаючи на те, що у нас, швидше за все, є дискретні точки даних, а не крива, ми повинні використовувати кінцеві різниці для наближення похідних. Отже, Da (t) стає (a(t+h)-a(t))/h
. І, a (t) стає ((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), щоб регулювати, наскільки прямі певні криві.