2009-10-25 26 views
7

Estoy desarrollando un videojuego independiente, y he estado operando bajo la suposición de que, debido a que el pulgar en mi controlador tiene un rango circular de movimiento, devuelve coordenadas "circulares"; es decir, coordenadas cartesianas limitadas a un área circular (de radio 1). De hecho, las coordenadas son "cuadradas"; por ejemplo, la posición del thumbstick superior derecho se registra como x = 1, y = 1. Cuando convierto las coordenadas de cartesiana a polar, la magnitud puede exceder 1, lo que tiene el efecto de que el jugador puede moverse más rápido en diagonal que vertical u horizontalmente.¿Cómo puedo convertir coordenadas en un cuadrado a coordenadas en un círculo?

Por lo tanto, para aclarar, quiero registrar la posición de un thumbstick analógico en términos de una dirección y magnitud, donde la magnitud está entre 0 y 1. El thumbstick devuelve las coordenadas en un plano cuadrado, simplemente convirtiendo las coordenadas de cartesiano a polar no es suficiente. Creo que necesito convertir las coordenadas espacio, pero eso está presionando los límites de mi cerebro de mono.

+0

¿Se ocupa el cuadrado "entero" o devuelve las coordenadas que se encuentran dentro de algo que ya parece un círculo? P.ej.asegúrese de que puede (o no puede) tomar la magnitud sqrt. –

+0

¿Qué (x, y) obtienes con el palo hacia arriba? Además, ¿su barra analógica o interruptores? ¿Puedes obtener valores como (0.5,0.5)? – Nosredna

+0

Sí, las coordenadas se distribuyen en un cuadrado, incluidas las esquinas. – Metaphile

Respuesta

15

Ver Mapping a Square to a Circle. También hay una buena visualización para el mapeo. Obtendrá:

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

Según la visualización, creo que esto es exactamente lo que quiero. ¡Gracias! – Metaphile

0

Divide cada valor por la magnitud para normalizar todos los valores a un vector unitario, p. Ej.

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 la saturación de la magnitud en lugar de la normalización de los valores interiores .. Es decir, obtendrá el mismo valor para un controlador empujado "totalmente" en la parte superior izquierda y un controlador casi empujado completamente en la misma dirección.

+1

Definitivamente no quiero recortar la magnitud. Ya tengo una zona muerta. Los dos juntos reducirían significativamente el rango de movimiento efectivo del palo. Creo que Eemeli tiene la idea correcta. – Metaphile

8

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

Por ejemplo, este mapeo también trabajará

u = x √ (x² + Y $ ² $ - x²y²)/√

v = y √ (x² + Y $ ² $) (X $ ² $ + Y $ ² $ - x²y²)/√ (x² + y $ ² $)

donde (u, v) son coordenadas disco circular y (x, y) son coordenadas cuadrados.

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

circular Brady bunch


squared Boston Celtics

For a C++ implementation de esta otra asignación, vaya a
http://squircular.blogspot.com/2015/09/fg-squircle-mapping.html
Ver http://squircular.blogspot.com para más imágenes de los resultados del mapeo.

Ver también "Analytical Methods for Squaring the Disc" para un documento que discute diferentes ecuaciones de mapeo con pruebas y derivaciones.

+0

Agradable. ¿Cómo generó las figuras (idioma/biblioteca)? – Praxeolitic

+1

Escribí un programa simple de procesamiento de imágenes en C++ que usa diferentes ecuaciones de mapeo por píxel. Ver el enlace al enlace de código de muestra. Libpng es útil para leer y escribir archivos PNG –

Cuestiones relacionadas