Come posso convertire le coordinate su un quadrato in coordinate su un cerchio?
-
06-07-2019 - |
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.
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.
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.