ну, все зависит от того, как вы определяете извилистость.есть статья в Википедии о извилистости , которая может пролить свет на эту тему.
интересное предложение в статье говорит нам, что: "roughness (or tortuosity) could be measured by relative change of curvature"
.это хорошая отправная точка.
Ваша полилиния состоит из соседних отрезков.Вы можете вычислить угол между каждым соседним отрезком.Используя эту информацию, вы можете получить представление о извилистости вашей полилинии.например, пусть seg(n)
будет отрезком линии между точкой n
и точкой n+1
:
tortuosity = sum(abs(angle(seg(n), seg(n+1))) for n in 1 to number of segment)
(вычисление угла между двумя отрезками линии оставлено в качестве упражнения, ноне требуется степень по математике)
вышеупомянутая мера не масштабируется: чем больше у вас очков, тем выше может быть значение.Вы можете легко масштабировать этот результат в соответствии с количеством имеющихся у вас отрезков:
unit_tortuosity = tortuosity / (n * pi)
(максимальный угол между двумя отрезками равен pi
, отрегулируйте функцию angle()
, чтобы онавозвращает результат между 0
и pi
. Таким образом, ваша извилистость будет не более n*pi
, следовательно, вышеупомянутый коэффициент масштабирования, который позволяет иметь значение между 0
и 1
, при этом 0
представляет собой совершенно прямуюломаная)