Geometry 如何测量一组线段是否更“精确”;“曲线”;比另一个好?

Geometry 如何测量一组线段是否更“精确”;“曲线”;比另一个好?,geometry,Geometry,是否有任何快速算法可以为一组相互连接的线段生成“曲线分数” 例如,在下图中: 与(b)相比,线段(a)应更少“弯曲”。我找到了一个解决方案我用Python编写了算法,可以问任何问题 我不确定它是否一直有效 我正在计算每个段之间的角度,并求其绝对值之和。 以下是完整的代码: import matplotlib.pyplot as plt import numpy as np lineA_x = [3, 1, 2, 4] lineA_y = [6, 4, 2, 1] lineB_x = [

是否有任何快速算法可以为一组相互连接的线段生成“曲线分数”

例如,在下图中:


与(b)相比,线段(a)应更少“弯曲”。

我找到了一个解决方案
我用Python编写了算法,可以问任何问题

我不确定它是否一直有效

我正在计算每个段之间的角度,并求其绝对值之和。
以下是完整的代码:

import matplotlib.pyplot as plt
import numpy as np 


lineA_x = [3, 1, 2, 4]
lineA_y = [6, 4, 2, 1]

lineB_x = [10, 8, 9, 8]
lineB_y = [6, 4, 2, 1]

plt.plot(lineA_x, lineA_y)
plt.plot(lineB_x, lineB_y)
plt.savefig("my_fig.png")

theta_A = 0
for i in range(1, len(lineA_x) - 1):
    a = np.array([lineA_x[i] - lineA_x[i - 1], lineA_y[i] - lineA_y[i - 1]])
    b = np.array([lineA_x[i + 1] - lineA_x[i], lineA_y[i + 1] - lineA_y[i]])


    # np.sum(a * b ): produit scalaire
    theta_A += np.abs(np.arccos(np.sum(a * b) / (np.linalg.norm(a) * np.linalg.norm(b))))

theta_B = 0
for i in range(1, len(lineB_x) - 1):
    a = np.array([lineB_x[i] - lineB_x[i - 1], lineB_y[i] - lineB_y[i - 1]])
    b = np.array([lineB_x[i + 1] - lineB_x[i], lineB_y[i + 1] - lineB_y[i]])


    # np.sum(a * b ): produit scalaire
    theta_B += np.abs(np.arccos(np.sum(a * b) / (np.linalg.norm(a) * np.linalg.norm(b))))

print("Theta A:", theta_A)
print("theta_B:", theta_B)

if (theta_A > theta_B):
    print("A > B")
elif (theta_B > theta_A):
    print("B > A")
else:
    print("A = B")
重要的部分只有这一部分(重复两次,请原谅我…)

以下是程序的输出:

Theta A: 1.8925468811915391
theta_B: 2.498091544796509
B > A
所使用的行(如两个数组所述):

所以它输出的B比A更弯曲

我将每个片段编码在两个数组中,一个用于x,一个用于y,只是为了使工作更容易一点
您使用的坐标系并不重要(它必须是正交的)。

我不认为我的解决方案是最优的,如果你有任何新的见解,我会很高兴听到你

Theta A: 1.8925468811915391
theta_B: 2.498091544796509
B > A