有没有办法以编程方式检查角度是否为直角?
is there a way to examine if an angle is a right angle programmatically?
我在 python
中绘制了一个角度
这是代码
x = [0,0.5,1]
y = [0,0.5,0]
plt.scatter(x,y)
plt.plot(x,y)
plt.show()
有没有办法以编程方式检查角度是否为直角?
您可以按如下方式计算两个向量之间的角度:首先,获取两个向量 v1
和 v2
然后使用 np.arccos()
其中 returns 角度以弧度为单位。将其转换为度数以检查它是否为 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
您可以尝试计算角度,但更简单的方法是检查勾股定理是否适用。为此,您需要计算三个边的大小,然后检查是否 A^2 + B^2 ~= C^2
是的,有。
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
最简单的方法是测试向量的 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
其他答案并不真正关心可能的不准确和截断错误,也不关心效率。
与其精确比较 90°(或在点积的情况下为 0°),更明智的做法是检查与 90°(分别为 0°)的小角度差异。
避免除法、平方根和三角函数也是明智的。 cross-product 方法是最有吸引力的方法之一。
计算角边的cross-product和它们的平方长度,并比较
具有预先计算的公差:
(ABx . BCy - ABy . BCx)² ≥ α.(ABx² + ABy²).(BCx² + BCy²)
with α = cos²δ
其中 δ
是角度公差。
我在 python
中绘制了一个角度这是代码
x = [0,0.5,1]
y = [0,0.5,0]
plt.scatter(x,y)
plt.plot(x,y)
plt.show()
有没有办法以编程方式检查角度是否为直角?
您可以按如下方式计算两个向量之间的角度:首先,获取两个向量 v1
和 v2
然后使用 np.arccos()
其中 returns 角度以弧度为单位。将其转换为度数以检查它是否为 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
您可以尝试计算角度,但更简单的方法是检查勾股定理是否适用。为此,您需要计算三个边的大小,然后检查是否 A^2 + B^2 ~= C^2
是的,有。
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
最简单的方法是测试向量的 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
其他答案并不真正关心可能的不准确和截断错误,也不关心效率。
与其精确比较 90°(或在点积的情况下为 0°),更明智的做法是检查与 90°(分别为 0°)的小角度差异。
避免除法、平方根和三角函数也是明智的。 cross-product 方法是最有吸引力的方法之一。
计算角边的cross-product和它们的平方长度,并比较 具有预先计算的公差:
(ABx . BCy - ABy . BCx)² ≥ α.(ABx² + ABy²).(BCx² + BCy²)
with α = cos²δ
其中 δ
是角度公差。