2D математика географические направления - PullRequest
0 голосов
/ 29 ноября 2009

Я пытаюсь проверить местоположение точки (px, py) на 2D-графике относительно отрезка (lx1, ly1) (lx2, ly2), используя логику направлений Север-Юго-Восток-Запад. Логика, которую я реализовал, - нарисовать перпендикуляр на отрезке линии от точки.

, если перпендикуляр находится на линии, что означает его юг.

Если точка справа означает восток.

Если точка слева означает запад.

Если перпендикуляр от линии в прямом направлении будет означать север.

Если перпендикуляр удален от линии в обратном направлении, будет означать Юг.

Моя проблема в том, что эта логика хорошо выглядит на бумаге, но становится очень трудно решить, является ли она случаем NW, NE, SW или SE. Может кто-нибудь предложить мне, как вычислить эту логику ?? Я использую C ++, но алгоритм на любом языке очень поможет.

Я использую конечную точку отрезка для расчета отношения Север-Юго-Восток-Запад.

Приветствия

Ответы [ 3 ]

1 голос
/ 29 ноября 2009

сочувствую ndim. Вычислить направление от одной точки к другой легко. Я не понимаю, какой контекст потребует от вас указания направления от линии. Это картографическое приложение? Есть ли дорога, и примерно на полпути вдоль отрезка дороги у вас есть какое-то отклонение в сторону?

1 голос
/ 29 ноября 2009
  • delta_x = x2 - x1
  • delta_y = y2 - y1
  • distance = sqrt (delta_x^2 + delta_y^2)
  • tan (theta) = delta_y / delta_x
  • theta = arctan (delta_y / delta_x) ;; но не делите на ноль!
  • умножить theta на 180/PI, чтобы получить градусы

градусы против часовой стрелки от положительной стороны оси x. В конце концов вам нужно будет выполнить небольшое количество алгебры, чтобы переориентировать градусы так, чтобы 0 был направлен вверх (а не вправо) и работал по часовой стрелке. Но перед этим:

Проблема в том, что arctan (1 / -1) совпадает с arctan (-1 / 1). То есть , вы получите -PI/4 радиан или -45 градусов как для верхнего левого угла (требуется смещение на 180 градусов), так и для нижнего правого (как есть). Вам нужно будет выполнить тесты на знак delta_y против delta_x, чтобы увидеть, нужно ли корректировать результат arctan.

Перед тем, как кодировать свое решение, обязательно проверяйте кодовые тесты, чтобы убедиться, что вызываемые вами функции дают ожидаемые значения.

0 голосов
/ 29 ноября 2009

Семантика того, что на самом деле означает "север", "NE" или "восток" отрезка, неясна.

Такие направления, как "север", "восток" или "NE", обычно используются для описания местоположения одной точки относительно другой (базовой) точки. Какую точку на отрезке вы используете в качестве этой базовой точки?

РЕДАКТИРОВАТЬ: Теперь, когда вы говорите, что хотите использовать конечную точку (x2,y2) в качестве центральной точки для компаса, точка (x,y) будет расположена относительно компаса путем изучения вектора дельты (x-x2,y-y2).

Простой способ рассуждения о методе использует atan2() для дельта-вектора и учитывает угол, возвращаемый atan2().

Тем не менее, было бы также неплохо просто сравнить аргументы atan2() друг с другом и определить результирующий угол наклона. Это в основном позволяет избежать вызова atan2() во время выполнения за счет того, что вам нужно выполнить некоторые вычисления во время (или до) компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...