Определить общую ориентацию 2D вектора - PullRequest
2 голосов
/ 19 июня 2009

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

Учитывая вектор 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).

Ответы [ 3 ]

7 голосов
/ 19 июня 2009

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

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

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

0 голосов
/ 19 июня 2009

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

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

0 голосов
/ 19 июня 2009

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

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