@anatoly60

Как определить кривизну линии?

Есть набор точек в двухмерном пространстве, через которые проходит линия. Как определить что линяя не прямая, т.е. определить некий коэффициент кривизны?

tFyBXM4.png
  • Вопрос задан
  • 3080 просмотров
Пригласить эксперта
Ответы на вопрос 5
gbg
@gbg
Любые ответы на любые вопросы
Посчитать коэффициент корелляции Пирсена между X и У этой линии. Чем ближе его модуль к 1, тем больше это похоже на прямую.
Ответ написан
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Может по-простецки сравнить расстояние между начальной и конечной точками с суммой длин всех отрезков ломаной между ними? Если эти значения близки -- значит издалека выглядит как прямая. Если нет -- значит кривая, и чем сильнее разница, тем кривее.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Пусть (x0, y0) и (x1, y1) крайние точки отрезка. Тогда коэффициенты общего уравнения прямой
Аx+By+C = 0
можно определить как
A = y1-y0; B = x0-x1; C = x1y0-x0y1
Расстояние от точки (x, y) до прямой
L = |Ax+By+C|/sqtr(A2+B2)
Дальше остаётся определить метрику отклонения, например среднее расстояние от промежуточных точек до отрезка, делённое на длину отрезка
Ответ написан
Комментировать
Mrrl
@Mrrl
Заводчик кардиганов
Если надо проверить среднее отклонение от прямой, то можно посчитать матрицу ковариации:
xm=sum(x[i])/N; ym=sum(y[i])/N;
a=sum((x[i]-xm)^2); b=sum((x[i]-xm)*(y[i]-ym)); c=sum((y[i]-y0)^2);
и посчитать отношение собственных значений:
R=(a+c-sqrt((a-c)^2+4*b^2)/(a+c+sqrt((a-c)^2+4*b^2).
Если R достаточно мало (скажем, меньше 0.01), то считаем, что это прямая.

Если надо проверить, прямая это или дуга, то берём крайние точки (x0,y0) и (xn,yn). Пусть dx=xn-x0,dy=yn-y0.
Считаем для всех точек
z[i]=((x[i]-x0)*dx+(y[i]-y0)*dy)/sqrt(dx^2+dy^2), w[i]=((x[i]-x0)*dy-(y[i]-y0)*dx)/sqrt(dx^2+dy^2),
Теперь приближаем зависимость w(z) параболой (по методу наименьших квадратов): w=A*z^2+B*z+C. Величина A пропорциональна кривизне дуги, по которой идут точки.
Ответ написан
Комментировать
@anatoly60 Автор вопроса
Всем огромное спасибо за идеи и предложения. В настоящий момент я решил последовательно считать угол между 3мя точками. Для линии слева угол между любыми тремя точками будет близким к 180.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы