Domanda

Sto cercando di fare un triangolo (triangolo isoscele) per spostarsi all'interno dello schermo, e allo stesso tempo ruotare leggermente quando un utente preme un tasto direzionale (come a destra o a sinistra).

Vorrei il naso (punto più alto) del triangolo di condurre il triangolo in tutti i tempi.(Come il vecchio asteroids gioco).

Il mio problema è con la matematica dietro questo.Ogni X intervallo di tempo, voglio il triangolo a muoversi in "una direzione", ho bisogno di aiuto per trovare questa direzione (x e y incrementi/decrementi).

Riesco a trovare il punto del centro (Centroide) del triangolo, e io sono il più alto di x y punti, quindi ho una linea vettoriale con cui lavorare, ma non la più pallida idea di come lavorare con esso.

Credo che abbia qualcosa a che fare con il vecchio Peccato e Cos metodi e la quantità (angolo) che il triangolo è stato ruotato, ma io sono un po ' arrugginito su quella roba.

Qualsiasi aiuto è molto apprezzato.

È stato utile?

Soluzione

L'arcotangente (arcotangente) di vy/vx, dove vx e vy sono i componenti del tuo baricentro->punta) vettore, ti dà l'angolo che il vettore si trova ad affrontare.

La classica arcotangente offre un angolo normalizzato a -90° < r < +90° gradi, tuttavia, è necessario aggiungere o sottrarre 90 gradi dal risultato a seconda del segno del risultato e il segno di vx.

Per fortuna, la libreria standard dovrebbe proive una funzione atan2() che prende il vx e vy separatamente come parametri e restituisce un angolo compreso tra 0° e 360°, o -180° a +180° gradi.Si occuperà anche con il caso particolare in cui vx=0, il che comporterebbe una divisione per zero se non stavi attento.

Vedere http://www.arctangent.net/atan.html o solo la ricerca per "arctangent".

Edit:Ho usato gradi nel mio post per chiarezza, ma Java e in molte altre lingue/librerie di lavoro in radianti, dove 180° = π.

È anche possibile aggiungere vx e vy al triangolo i punti per farlo spostare in "avanti" direzione, ma assicurarsi che il vettore normalizzato (vx2 + vy2 = 1), altrimenti la velocità dipenderà dalla vostra triangolo dimensioni.

Altri suggerimenti

@ Marco:

Ho provato a scrivere un primer su vettori, coordinate, punti e angoli in questa casella di risposta due volte, ma ho cambiato idea in entrambe le occasioni perché ci vorrebbe troppo tempo e sono sicuro che ci sono molti tutorial là fuori che spiegano cose meglio che mai.

Il tuo centroide e " tip " le coordinate non sono vettori; vale a dire, non c'è nulla da guadagnare dal pensare a loro come vettori.

Il vettore desiderato, vForward = pTip - pCentroid, può essere calcolato sottraendo le coordinate del " tip " angolo dal punto centroide. L'atan2 () di questo vettore, ovvero atan2 (tipY-centY, tipX-centX), ti dà l'angolo in cui il tuo triangolo è & Quot; rivolto verso & Quot ;.

Per quanto riguarda ciò a cui è relativo, non importa. La tua libreria probabilmente utilizzerà la convenzione secondo cui l'asse X in aumento (--- & Gt; la direzione destra / est su presumibilmente tutti i grafici 2D che hai visto) è 0 & # 176; o 0 & # 960 ;. La direzione Y crescente (in alto, a nord) corrisponderà a 90 & # 176; o (1/2) & # 960 ;.

Mi sembra che sia necessario memorizzare l'angolo di rotazione del triangolo e possibilmente la sua velocità attuale.

x' = x + speed * cos(angle)
y' = y + speed * sin(angle)

Nota che l'angolo è in radianti, non in gradi!

Radianti = Gradi * RadiansInACircle / DegreesInACircle

RadiansInACircle = 2 * Pi

DegressInACircle = 360

Per le posizioni dei vertici, ognuno si trova ad una certa distanza e angolo dal centro. Aggiungi l'angolo di rotazione corrente prima di eseguire questo calcolo. È la stessa matematica usata per capire il movimento.

Eccone qualche altro:

I vettori rappresentano lo spostamento. Spostamento, traduzione, movimento o come si desidera chiamarlo, non ha senso senza un punto di partenza, ecco perché ho fatto riferimento al & Quot; forward & Quot; vettore sopra come " dal centroide, " ed è per questo che il " centroide vector, " il vettore con i componenti x / y del punto centroide non ha senso. Questi componenti ti danno lo spostamento del punto centroide rispetto all'origine. In altre parole, pOrigin + vCentroid = pCentroid. Se inizi dal punto 0, quindi aggiungi un vettore che rappresenta lo spostamento del punto centroide, ottieni il punto centroide.

Nota che:

vettore + vettore = vettore
(l'aggiunta di due spostamenti ti dà un terzo, diverso spostamento)

punto + vettore = punto
(spostare / spostare un punto ti dà un altro punto)

punto + punto = ???
(l'aggiunta di due punti non ha senso, tuttavia :)

punto - punto = vettore
(la differenza di due punti è lo spostamento tra di loro)

Ora, questi spostamenti possono essere pensati in (almeno) in due modi diversi. Quello con cui hai già familiarità è il sistema rettangolare (x, y), in cui i due componenti di un vettore rappresentano lo spostamento rispettivamente nelle direzioni xey. Tuttavia, puoi anche usare le coordinate polari , (r, & # 920;). Qui, & # 920; rappresenta la direzione dello spostamento (in angoli relativi ad un angolo zero arbitrario) er la distanza.

Prendi il vettore (1, 1), per esempio. Rappresenta un movimento di un'unità a destra e di un'unità verso l'alto nel sistema di coordinate che siamo tutti abituati a vedere. L'equivalente polare di questo vettore sarebbe (1.414, 45 & # 176;); lo stesso movimento, ma rappresentato come " spostamento di 1.414 unità nella direzione 45 & # 176; -angle. (Ancora una volta, usando un comodo sistema di coordinate polari in cui la direzione est è 0 & # 176; e gli angoli aumentano in senso antiorario.)

Le relazioni tra coordinate polari e rettangolari sono:

&

# 920; = atan2 (y, x)
r = sqrt (x & # 178; + y & # 178;) (ora vedi dove entra il triangolo giusto?)

e viceversa,

x = r * cos (& # 920;)
y = r * sin (& # 920;)

Ora, poiché un segmento di linea disegnato dal centroide del triangolo al " tip " angolo rappresenterebbe la direzione in cui il tuo triangolo è " rivolto verso, " se dovessimo ottenere un vettore parallelo a quella linea (es. vForward = pTip - pCentroid ), il vettore & # 920; -coordinate corrisponderebbe all'angolo con cui è rivolto il triangolo.

Prendi di nuovo il vettore (1, 1). Se questo fosse vForward, ciò avrebbe significato che il tuo & Quot; tip & Quot; Le coordinate x e y del punto erano entrambe 1 in più di quelle del centroide. Supponiamo che il centroide sia attivo (10, 10). Questo mette il & Quot; tip & Quot; angolo sopra a (11, 11). (Ricorda, pTip = pCentroid + vForward aggiungendo & Quot; + pCentroid & Quot; su entrambi i lati dell'equazione precedente.) Ora in quale direzione è rivolto questo triangolo? 45 & # 176 ;, giusto? Questo è il & # 920; -coordinate del nostro (1, 1) vettore!

mantieni il centroide all'origine. usa il vettore dal centroide al naso come vettore di direzione. http://en.wikipedia.org/wiki/Coordinate_rotation#Two_dimensions ruoterà questo vettore. costruire gli altri due punti da questo vettore. tradurre i tre punti nella posizione in cui si trovano sullo schermo e disegnare.

double v; // velocity
double theta; // direction of travel (angle)
double dt; // time elapsed

// To compute increments
double dx = v*dt*cos(theta);
double dy = v*dt*sin(theta);

// To compute position of the top of the triangle
double size; // distance between centroid and top
double top_x = x + size*cos(theta);
double top_y = y + size*sin(theta);

Posso vedere che devo applicare le comuni formule di rotazione 2d al mio triangolo per ottenere il mio risultato, sto solo avendo un po 'di problemi con le relazioni tra i diversi componenti qui.

aib , ha dichiarato che:

  

L'arcotangente (tangente inversa) di   vy / vx, dove vx e vy sono i file   componenti del tuo (centroide - > punta)   vettore, ti dà l'angolo il vettore   è di fronte.

Vx e Vy sono le coordinate xey del centro o della punta? Penso di essere confuso sulla terminologia di un & Quot; vector & Quot; Qui. Avevo l'impressione che un vettore fosse solo un punto nello spazio 2d (in questo caso) che rappresentava la direzione.

Quindi, in questo caso, come viene calcolato il vettore del centroide - > tip? È solo il centro?

meyahoocomlorenpechtel dichiarato:

  

Mi sembra che tu debba conservare   l'angolo di rotazione del triangolo e   forse è la velocità attuale.

Qual è l'angolo di rotazione rispetto a? L'origine del triangolo o la finestra di gioco stessa? Inoltre, per le future rotazioni, l'angolo è l'angolo dell'ultima rotazione o la posizione originale del triangolo?

Grazie a tutti per l'aiuto finora, lo apprezzo davvero!

vuoi che il vertice più alto sia il centroide per ottenere l'effetto desiderato.

In primo luogo, vorrei iniziare con il centroide piuttosto che calcolarlo. Conosci la posizione del centroide e l'angolo di rotazione del triangolo, lo userei per calcolare le posizioni dei vertici. (Mi scuso in anticipo per eventuali errori di sintassi, ho appena iniziato a dilettarmi in Java.)

// punto di partenza

double tip_x = 10;
double tip_y = 10;

should be

double center_x = 10;
double center_y = 10;

// triangolo dettagli

int width = 6; //base
int height = 9;

dovrebbe essere una matrice di 3 coppie di angoli e distanze.

angle = rotation_angle + vertex[1].angle;
dist = vertex[1].distance;    
p1_x = center_x + math.cos(angle) * dist;
p1_y = center_y - math.sin(angle) * dist;
// and the same for the other two points

Nota che sto sottraendo la distanza Y. Vieni inciampato dal fatto che lo spazio dello schermo è invertito. Nella nostra mente Y aumenta mentre sali, ma le coordinate dello schermo non funzionano in questo modo.

La matematica è molto più semplice se si tracciano le cose come posizione e angolo di rotazione piuttosto che derivare l'angolo di rotazione.

Inoltre, nel tuo ultimo pezzo di codice stai modificando la posizione in base all'angolo di rotazione. Il risultato sarà che la tua nave ruoterà in base all'angolo di rotazione ad ogni ciclo di aggiornamento. Penso che l'obiettivo sia qualcosa come gli Asteroidi, non un gatto che insegue la coda!

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