Есть ли способ проверить, является ли угол под прямым углом программно? - PullRequest
0 голосов
/ 28 мая 2019

я строю угол в питоне

i

вот код

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

есть ли способ проверить,угол под прямым углом программно?

Ответы [ 5 ]

6 голосов
/ 28 мая 2019

Самый простой способ - проверить, равняется ли точечное произведение векторов 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 голос
/ 28 мая 2019

Другие ответы на самом деле не заботятся ни о возможных неточностях и ошибках усечения, ни об эффективности.

Вместо точного сравнения с 90 ° (или 0 ° в случае точечного продукта) лучше проверить небольшую разность углов до 90 ° (соответственно 0 °).

Также целесообразно избегать делений, квадратных корней и тригонометрических функций. Метод перекрестных продуктов является одним из наиболее привлекательных.

Рассчитать перекрестное произведение сторон угла и их квадратов длины и сравнить с предварительно вычисленным допуском:

(ABx . BCy - ABy . BCx)² ≥ α.(ABx² + ABy²).(BCx² + BCy²)

с α = cos²δ, где δ - допуск на угол.

0 голосов
/ 28 мая 2019

Вы можете попытаться вычислить угол, но более простым способом может быть проверка применимости теоремы Пифагора. Для этого вам нужно рассчитать размер трех ребер, а затем проверить, является ли A^2 + B^2 ~= C^2

0 голосов
/ 28 мая 2019

Да, есть.

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
0 голосов
/ 28 мая 2019

Вы можете вычислить угол между двумя векторами следующим образом: сначала получите два вектора v1 и v2, а затем используйте np.arccos(), который возвращает угол в радианах. Преобразовать его в градусы, чтобы проверить, если это 90 градусов. Формулы для вычисления угла между двумя векторами можно найти по этой Wiki ссылке

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
...