Я бы не подумал, что существует библиотечный метод для поиска угла между двумя векторами, вы делаете это правильно (математика правильная), и быстрый взгляд вокруг msdn и google не предоставил мне ничего. Я бы использовал версию SLaks для вызова метода Math.Atan
.
Интересно отметить, что вы используете «горизонтальный» в качестве плоскости, чтобы определить, превышает ли угол более 90 градусов. Если endLocation.x < Location.X ваш угол всегда будет «больше», чем 90 градусов, если вы измеряете положительную ось X.
Редактировать: Оригинальный вопрос был изменен на 45 градусов.
В следующем разделе обсуждается, как это сделать, не делая деления с плавающей запятой на комментарий, сделанный OP.
Чтобы узнать, есть ли у нас угол 45 градусов, мы знаем несколько вещей, не имея при этом необходимости называть ATan
по очкам.
первый наклон под углом в 45 градусов равен 1. Таким образом, если
Math.Abs((EndLocation.y - location.y)/(EndLocation.X - Location.X)) > 1
У вас есть угол, который> 45 градусов, однако, как перестановки угла в 45 градусов происходит в 4 раза по кругу , Нам нужно проверить несколько вещей.
Если EndLocation.X < Location.X
, то угол больше 45 градусов. Это означает все углы, оставшиеся от оси Y (90 - 270).Чтобы определить, превышает ли угол более 45 градусов, нам нужно знать только, является ли абсолютное значение наклона больше 1. Это всегда будет верно для следующего.
Math.Abs(EndLocation.Y - Location.Y) > Math.Abs(EndLocation.X - Location.X)
.
Так с, если заявление что-то вроде следующего
If (EndLocation.X < Location.X) OrElse (Math.Abs(EndLocation.Y - Location.Y) > Math.Abs(EndLocation.X - Location.X) Then AngleGreaterThan45 = True.
Мы можем определить, если угол больше 45 градусов без необходимости выполнения каких-либо вычислений с плавающей запятой.
Вы имеете в виду: «Ли линия, определяемая точками x и y, пересекает горизонтальную линию под углом более 90 градусов?» Если да, ответ будет да (нарисуйте несколько примеров, чтобы убедиться в этом), если линия не вертикальная или горизонтальная. Это должно привести вас к уточнению вашего вопроса. –
Я знаю, что математика правильная, мне было интересно, есть ли более эффективная встроенная функция, которая более эффективна (я ненавижу делать деление с плавающей запятой, если мне не нужно). –
@Scott Chamerlain взгляните на мой ответ, это невозможно без какого-либо разделения, если вы каждый раз используете горизонтальную ось X-Axis. – msarchet