Линия, образованная двумя точками больше 45 градусов от горизонтали - PullRequest
2 голосов
/ 17 мая 2010

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

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 есть встроенная функция, которая найдет это?

РЕДАКТИРОВАТЬ - На самом деле я испортил свой вопрос, чтобы сказать 45 от горизонтали, а не 90. Однако ответы привели меня к точке, где я могу это понять (на самом деле мне просто нужно было указать на Atan2).

Ответы [ 3 ]

7 голосов
/ 17 мая 2010

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

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

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

EDIT:

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

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

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

3 голосов
/ 17 мая 2010

Я бы не подумал, что есть библиотечный метод для определения угла между двумя векторами, вы делаете это правильно (математика верна) и быстрый взгляд вокруг msdn, и Google ничего мне не предоставил. Я бы использовал версию SLaks для вызова метода Math.Atan.

Интересно отметить, поскольку вы используете «горизонталь» в качестве плоскости, чтобы определить, больше ли угол 90 градусов. Если endLocation.x

Edit: Исходный вопрос был изменен на 45 градусов.

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

Чтобы выяснить, есть ли у вас угол 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, следующим после

If (EndLocation.X < Location.X) OrElse (Math.Abs(EndLocation.Y - Location.Y) > Math.Abs(EndLocation.X - Location.X) Then AngleGreaterThan45 = True.

Мы можем определить, больше ли угол 45 градусов, без необходимости выполнять какие-либо вычисления с плавающей запятой.

3 голосов
/ 17 мая 2010

Вы должны позвонить Math.Atan2, например:

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

if (Math.Abs(angle) >= Math.PI / 2.0)
    moreThan90 = true;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...