有没有办法以编程方式检查角度是否为直角?

时间:2019-05-27 21:55:14

标签: python computational-geometry

我在python中绘制角度

i

这是代码

x = [0,0.5,1]
y = [0,0.5,0]
plt.scatter(x,y)
plt.plot(x,y)
plt.show()

有没有办法以编程方式检查该角度是否为直角?

5 个答案:

答案 0 :(得分:6)

最简单的方法是测试向量的dot product是否为0。

对于您而言,您只需计算:

v1 = ( (x[1]-x[0]), (y[1]-y[0]) ) <- (0.5, 0.5)
v2 = ( (x[2]-x[1]), (y[2]-y[1]) ) <- (0.5, -0.5)

dot_product = v1[0]*v2[0] + v1[1]*v2[1] <- 0.5² - 0.5² = 0

答案 1 :(得分:1)

其他答案实际上并不关心可能的不准确性和截断错误,也不关心效率。

而不是精确地与90°(或点积的情况下为0°)进行比较,而是检查与90°(分别为0°)之间的小角度差是明智的。

最好避免除法,平方根和三角函数。跨产品方法是最有吸引力的方法。

计算角的边和其平方长度的叉积,并进行比较 预先计算的容差:

CSSStyleDeclaration

具有(ABx . BCy - ABy . BCx)² ≥ α.(ABx² + ABy²).(BCx² + BCy²) ,其中α = cos²δ是角度公差。

答案 2 :(得分:0)

您可以如下计算两个向量之间的角度:首先,获得两个向量v1v2,然后使用np.arccos()返回以弧度表示的角度。将其转换为度数以检查其是否为90度。可以在此Wiki link

上找到计算两个向量之间的角度的公式
import numpy as np

x = np.array([0,0.5,1])
y = np.array([0,0.5,0])

vecs = np.vstack((x, y))
v1 = vecs[:, 1] - vecs[:, 0]
v2 = vecs[:, 2] - vecs[:, 1]

angle_rad = np.arccos(np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2)))

angle_deg = np.rad2deg(angle_rad)
# 90.0

答案 3 :(得分:0)

您可以尝试计算角度,但是更简单的方法可以是检查勾股定理是否适用。为此,您需要计算三个边缘的大小,然后检查是否A^2 + B^2 ~= C^2

答案 4 :(得分:0)

是的,有。

x = [0,0.5,1]
y = [0,0.5,0]
points = [np.array(point) for point in zip(x,y)]
a, b, c = points
ba = a - b
bc = c - b
cosine_angle = np.dot(ba, bc) / (np.linalg.norm(ba) * np.linalg.norm(bc))
angle_rad = np.arccos(cosine_angle)
angle_deg = np.rad2deg(angle_rad)
print(angle_deg) # 90.0