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!

EDIT : O vector utilizado não é normalizada. Você pode representar qualquer vetor usando um par de pontos. Basta fingir que a origem do vector é (0,0).

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top