Pregunta

Tengo una pregunta bastante simple para ti ... Siento que debería haber encontrado la respuesta hace mucho tiempo, pero de alguna manera no puedo entender este problema trivial.

Dado un vector v = (x, y), me gustaría saber si es una orientación 'general'. Eso es 'Arriba', 'Abajo', 'Izquierda' o 'Derecha'

La orientación general de un vector es 'Arriba' si la orientación de un Vector está entre 45 y 135 grados. 'Izquierda' es entre 135 y 225 grados. 'Abajo' es entre 225 y 315 grados. 'Derecho' es entre 315 y 45 grados.

Realmente no me importan los casos en los que el ángulo es exactamente 45, 135, 225 o 315 grados.

El problema es que no quiero usar trigonometría. Estoy bastante seguro de que hay una solución simple.

Creo que una solución podría dividir todo el círculo en ocho. Esto es lo que tengo hasta ahora.

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

... etc ...

Básicamente, sé que podría encontrar una solución. Estoy más interesado en su propio enfoque de este problema.

¡Gracias!

EDITAR : el vector utilizado no está normalizado. Puedes representar cualquier vector usando un par de puntos. Simplemente imagine que el origen del vector es (0,0).

¿Fue útil?

Solución

Hay una manera, de hecho. Todo lo que tiene que darse cuenta es que si abs (y) > abs (x), entonces la dirección es vertical, de lo contrario la dirección es horizontal. Si es vertical, el signo en y indicará arriba / abajo, de lo contrario, el signo en x indicará izquierda / derecha. Entonces:

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

Los ángulos 45 siempre irán hacia la izquierda o hacia la derecha.

Otros consejos

Sé que dijiste que querías evitar trigonometría, pero ¿alguna vez has usado el función atan2 ? Es muy fácil de usar para determinar el ángulo de un vector:

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

Suponiendo un espacio vectorial normalizado ( Editar: lo que significa que su vector está compuesto de vectores de unidad ) como parece estar haciendo, su enfoque es perfecto y el más utilizado para juegos y animaciones en 2D. Verificaría tu tabla de verdad, sin embargo.

El enfoque de @ Daniel es la OMI más elegante.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top