Domanda

Sto sviluppando un videogioco indipendente e ho operato supponendo che, poiché la levetta sul mio controller ha un raggio di movimento circolare, restituisce "circolare". coordinate; cioè, coordinate cartesiane vincolate ad un'area circolare (di raggio 1). In effetti, le coordinate sono "quadrate"; ad esempio, la posizione della levetta in alto a destra viene registrata come x = 1, y = 1. Quando converto le coordinate da cartesiane a polari, la magnitudine può superare 1, il che ha l'effetto di far muovere il giocatore in diagonale più velocemente di quanto non possano in verticale o in orizzontale.

Quindi, per chiarire, voglio registrare la posizione di una levetta analogica in termini di direzione e magnitudine, dove la magnitudine è compresa tra 0 e 1. La levetta restituisce le coordinate su un piano quadrato, quindi è sufficiente convertire le coordinate da Da cartesiano a polare non è sufficiente. Penso di dover convertire le coordinate spazio , ma questo sta spingendo i limiti del mio cervello di scimmia.

È stato utile?

Soluzione

Vedi Mappatura di un quadrato su un cerchio . C'è anche una bella visualizzazione per la mappatura. Ottieni:

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

Altri suggerimenti

La mappatura non è unica. Esistono molte altre soluzioni a questa domanda.

Ad esempio, anche questa mappatura funzionerà

  

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;)

dove (u, v) sono coordinate circolari del disco e (x, y) sono coordinate quadrate.

Un'immagine vale più di mille parole, quindi ecco alcune immagini per illustrare la non unicità della mappatura e il suo inverso.

 mazzo Brady circolare


 squadrato Boston Celtics

Per un'implementazione C ++ di questa altra mappatura, vai a
http://squircular.blogspot.com/2015/09/fg-squircle -mapping.html
Vedi http://squircular.blogspot.com per altre immagini dei risultati della mappatura.

Vedi anche " Metodi analitici per la quadratura del disco " per un documento che discute diverse equazioni di mappatura con prove e derivazioni.

Dividi ogni valore per grandezza per normalizzare tutti i valori in un vettore unitario, ad es.

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

Tuttavia, questo potrebbe avere l'effetto di ritagliare l'intensità invece di normalizzarla per i valori interni. Cioè, otterrai lo stesso valore per un controller premuto "completamente". in alto a sinistra e un controller quasi ha spinto completamente nella stessa direzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top