Pregunta

Estoy desarrollando un videojuego independiente, y he estado operando bajo la suposición de que debido a que el joystick de mi controlador tiene un rango de movimiento circular, devuelve "circular". coordenadas; es decir, coordenadas cartesianas limitadas a un área circular (de radio 1). De hecho, las coordenadas son "cuadrado"; Por ejemplo, la posición de la barra superior derecha se registra como x = 1, y = 1. Cuando convierto las coordenadas de cartesiano a polar, la magnitud puede superar 1, lo que tiene el efecto de que el jugador puede moverse más rápido en diagonal que en vertical u horizontal.

Entonces, para aclarar, quiero registrar la posición de una barra de control analógica en términos de dirección y magnitud, donde la magnitud está entre 0 y 1. La barra de control devuelve coordenadas en un plano cuadrado, por lo que simplemente convierte las coordenadas de De cartesiano a polar no es suficiente. Creo que necesito convertir la coordenada espacio , pero eso está presionando los límites de mi cerebro de mono.

¿Fue útil?

Solución

Ver Mapeando un cuadrado a un círculo . También hay una buena visualización para el mapeo. Obtienes:

xCircle = xSquare * sqrt(1 - 0.5*ySquare^2)
yCircle = ySquare * sqrt(1 - 0.5*xSquare^2)

Otros consejos

La asignación no es única. Hay muchas otras soluciones a esta pregunta.

Por ejemplo, esta asignación también funcionará

  

u = x & # 8730; (x & # 178; + y & # 178; - x & # 178; y & # 178;) / & # 8730; (x & # 178; + y & # 178;)

     

v = y & # 8730; (x & # 178; + y & # 178; - x & # 178; y & # 178;) / & # 8730; (x & # 178; + y & # 178;)

donde (u, v) son coordenadas de disco circulares y (x, y) son coordenadas cuadradas.

Una imagen vale más que mil palabras, así que aquí hay algunas imágenes para ilustrar la no unicidad del mapeo y su inverso.

 grupo circular de Brady


 Boston Celtics al cuadrado

Para una implementación en C ++ de esta otra asignación, vaya a
http://squircular.blogspot.com/2015/09/fg-squircle -mapping.html
Consulte http://squircular.blogspot.com para obtener más imágenes de los resultados del mapeo.

Consulte también " Métodos analíticos para cuadrar el disco " para un documento que discute diferentes ecuaciones de mapeo con pruebas y derivaciones.

Divida cada valor por la magnitud para normalizar todos los valores a un vector unitario, por ejemplo

magn = sqrt(x * x + y * y);
newx = magn > 1.0 ? x / magn : x;
newy = magn > 1.0 ? y / magn : y;

Sin embargo, esto puede tener el efecto de recortar la magnitud en lugar de normalizar los valores interiores. Es decir, obtendrá el mismo valor para un controlador empujado "completamente". en la esquina superior izquierda y un controlador casi empujado completamente en la misma dirección.

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