Определить общую ориентацию 2D вектора

StackOverflow https://stackoverflow.com/questions/1016039

  •  06-07-2019
  •  | 
  •  

Вопрос

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

Учитывая вектор v = (x, y), я хотел бы знать, что это «общая» ориентация. Это «вверх», «вниз», «влево» или «вправо»

Общая ориентация вектора - «Вверх», если ориентация вектора находится между 45 и 135 градусами. «Слева» от 135 до 225 градусов. «Вниз» находится между 225 и 315 градусами. «Право» составляет от 315 до 45 градусов.

Меня не особо волнуют случаи, когда угол равен точно 45, 135, 225 или 315 градусам.

Суть в том, что я не хочу использовать тригонометрию. Я уверен, что есть простое решение.

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

if(x > 0 && y > x)
    return Up
if(x > 0 && y > 0 && y < x )
    return Right

... etc ...

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

Спасибо!

РЕДАКТИРОВАТЬ : используемый вектор не нормализован. Вы можете представить любой вектор, используя пару точек. Просто представьте, что начало вектора (0,0).

Это было полезно?

Решение

Действительно, есть способ. Все, что вам нужно понять, это то, что если abs (y) > abs (x), то направление вертикальное, в противном случае направление горизонтальное. Если вертикальный, знак у будет указывать вверх / вниз, в противном случае знак х будет указывать влево / вправо. Итак:

if (abs(y) > abs(x)) {
  if (y > 0) up else down
} else {
  if (x > 0) right else left
}

45-ти углы всегда будут идти влево или вправо.

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

Я знаю, что вы сказали, что хотите избежать триггера, но когда-либо использовали функция atan2 ? Это очень легко использовать для определения угла вектора:

double ldAngle = atan2(vector.y, vector.x) * 180 / PI;

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

@ Подход Даниэля - более элегантная ИМО.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top