Determinar a orientação geral de um vector 2D
Pergunta
Eu tenho uma pergunta bastante simples para você .. Eu sinto que eu deveria ter encontrado a resposta há muito tempo, mas de alguma forma eu não pode envolver minha cabeça em torno deste problema trivial.
Dado um vetor v = (x, y), eu gostaria de saber a sua orientação 'geral'. Isso é 'Up', 'Down', 'esquerda' ou 'direita'
orientação geral do Um vetor é 'Up', se a orientação de um vetor é entre 45 e 135 graus. 'Esquerda' se situar entre 135 e 225 graus. 'Down' é entre 225 e 315 graus. 'Right' é entre 315 e 45 graus.
Eu realmente não me importo para os casos em que o ângulo é exatamente 45, 135, 225 ou 315 graus.
O problema é, eu não quero usar trigonometria. Tenho certeza de que há uma solução simples.
Eu acho que uma solução poderia dividir todo o círculo em oito. Aqui está o que eu tenho até agora.
if(x > 0 && y > x)
return Up
if(x > 0 && y > 0 && y < x )
return Right
... etc ...
Basicamente, eu sei que eu poderia encontrar uma solução. Estou mais interessado em sua própria abordagem a este problema.
Obrigado!
Solução
Há uma maneira, de fato. Tudo que você tem que perceber é que se abs (y)> abs (x), então a direção é vertical, caso contrário, a direção é horizontal. Se vertical, o sinal na y indicará para cima / baixo, caso contrário, o sinal em x indicará esquerda / direita. Assim:
if (abs(y) > abs(x)) {
if (y > 0) up else down
} else {
if (x > 0) right else left
}
Os ângulos 45ish sempre ir para a esquerda ou direita.
Outras dicas
Eu sei que você disse que queria evitar trig, mas você já usou o atan2 função? É super fácil de usar para determinar o ângulo de um vetor:
double ldAngle = atan2(vector.y, vector.x) * 180 / PI;
Assumindo um espaço vetorial normalizado ( Editar: que significa que seu vetor é composto por vetores unitários ) como você parece estar fazendo, a sua abordagem é local e o mais frequentemente utilizado para jogos 2D e animações. Eu verificar sua tabela de verdade, no entanto.
@ abordagem de Daniel é o mais elegante IMO.