2010-05-17 3 views
2

Я пытаюсь выяснить, если линия, определяемая двумя точками, больше или равна 90 градусам по сравнению с горизонтальной. Вот код, который я использовалЯвляется ли линия, образованная двумя точками больше 45 градусов от horzontal

bool moreThan90 = false; 
double angle = Math.Atan((double)(EndingLocation.Y - Location.Y)/(double)(EndingLocation.X - Location.X)); 
if (angle >= Math.PI/2.0 || angle <= -Math.PI/2.0) 
    moreThan90 = true; 

ли я сделать это правильно или есть лучше встроенной функции в .Net, которая будет найти это?

EDIT - На самом деле я испортил свой вопрос, чтобы сказать 45 с горизонтали не 90. Однако ответы дали мне точку, в которой я могу это понять (на самом деле мне просто нужно было указать на Atan2).

+1

Вы имеете в виду: «Ли линия, определяемая точками x и y, пересекает горизонтальную линию под углом более 90 градусов?» Если да, ответ будет да (нарисуйте несколько примеров, чтобы убедиться в этом), если линия не вертикальная или горизонтальная. Это должно привести вас к уточнению вашего вопроса. –

+0

Я знаю, что математика правильная, мне было интересно, есть ли более эффективная встроенная функция, которая более эффективна (я ненавижу делать деление с плавающей запятой, если мне не нужно). –

+0

@Scott Chamerlain взгляните на мой ответ, это невозможно без какого-либо разделения, если вы каждый раз используете горизонтальную ось X-Axis. – msarchet

ответ

7

линия, которая более чем на 90 градусов от горизонтали будет иметь EndLocation.x при меньшем х значение, чем Location.x.

Так что вам не нужны все Атан нонсенс, это должно быть достаточно:

if (EndingLocation.X < Location.X) 
    moreThan90 = true; 

EDIT:

Кажется, что OP имел в виду 45 градусов не 90, что означает, что выше упрощение больше не держит. Для этого было бы лучше использовать atan2 (как Slaks указал) Но в духе не используя загар:

if (Math.Abs(EndingLocation.X - Location.X) > Math.Abs(EndingLocation.Y - Location.Y) && 
    EndingLocation.X < Location.X) 
    moreThan45 = true; 

Обратите внимание, что вам нужно только 2-ой чек, если вы хотите только строки, которые указывают справа

+0

Неправильно. Это более разрешительно, чем 'Atan' – SLaks

+0

@SLaks, но это правильно. Предполагая, что вы используете горизонтальную ось X-Axis и @Scott Chamberlain, он предпочел бы не делать разделение с плавающей запятой, если ему это не нужно. – msarchet

+0

Прежде чем спускать, я предлагаю вам подумать - или нарисуйте диаграмму. Я прав – pheelicks

3

Вы должны позвонить Math.Atan2, как это:

double angle = Math.Atan2(EndingLocation.Y - Location.Y, 
          EndingLocation.X - Location.X); 

if (Math.Abs(angle) >= Math.PI/2.0) 
    moreThan90 = true; 
3

Я бы не подумал, что существует библиотечный метод для поиска угла между двумя векторами, вы делаете это правильно (математика правильная), и быстрый взгляд вокруг 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 градусов без необходимости выполнения каких-либо вычислений с плавающей запятой.

Смежные вопросы