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