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

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

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

вот код

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

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

Да, вы можете найти угол между 3 точками (0.0,0.0),(0.5,0.5),(1.0,0.0). Может быть, посмотрите здесь: math.stackexchange.com/questions/361412/…

Blorgbeard 27.05.2019 23:59
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
142
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

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

Три поверхности?

Yves Daoust 28.05.2019 14:00

Три грани. Исправленный.

V13 30.05.2019 03:11
Ответ принят как подходящий

Да, есть.

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

Обратите внимание, что np.dot(ba, bc) равно 0, когда угол b прямой. Вам не нужно вычислять сам угол (или норму векторов).

Michael Doubez 28.05.2019 13:09

Самый простой способ — проверить, равен ли скалярное произведение векторов 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 °).

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

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

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

с α = cos²δ, где δ — угловой допуск.

Спасибо! есть ли руководство по установке значения δ?

user10449636 28.05.2019 14:57

@singularli: это зависит от качества ваших данных и вашего приложения.

Yves Daoust 28.05.2019 16:05

Это справедливое замечание. Используя число с плавающей запятой, вы не можете гарантировать, что вектор ортогонален. В этом случае, я думаю, мы перейдем к дробной арифметике.

Michael Doubez 28.05.2019 20:54

@MichaelDoubez: что вы подразумеваете под дробная арифметика?

Yves Daoust 28.05.2019 20:55

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

Michael Doubez 28.05.2019 21:15

Я использую плавание в своей оплачиваемой работе, но диапазон значений известен, и мы можем заставить его работать. В случае определения того, являются ли векторы ортогональными, вы можете утверждать, что компьютер не может дать 100% точность, если у вас неточное представление. Даже при сравнении эпсилон, как вы предлагаете, вы можете получить ложные срабатывания.

Michael Doubez 28.05.2019 22:41

Другие вопросы по теме