Vra

Ek probeer om te maak'n driehoek (gelykbenige driehoek) om te beweeg rondom die skerm en op dieselfde tyd effens draai dit wanneer'n gebruiker druk'n rigting sleutel (soos regs of links).

Ek wil graag die neus (bo-punt) van die driehoek om te lei van die driehoek ten alle tye.(Soos dat die ou spel asteroïdes).

My probleem is met die wiskunde agter dit.By elke X tyd interval, ek wil die driehoek om te beweeg in "sommige rigting", ek het hulp nodig om hierdie rigting (x en y inkremente/decrements).

Ek kan vind die sentrum punt (Sentroïed van die driehoek, en ek het die top mees x'n y punte, so ek het'n lyn vektor om te werk met, maar nie'n idee as om die "hoe" om te werk met dit.

Ek dink dit het iets te doen met die ou Sonde en Cos metodes en die bedrag (hoek) dat die driehoek is gedraai, maar ek is'n bietjie verroes op daardie dinge.

Enige hulp word opreg waardeer.

Was dit nuttig?

Oplossing

Die arctustangens (inverse tangens) van vy / vx, waar vx en vy is die komponente van jou (centroid-> punt) vektor, gee jou die hoek van die vektor in die gesig staar.

Die klassieke arctustangens gee jou 'n hoek genormaliseer tot -90 °

Gelukkig jou standaard biblioteek moet 'n funksie atan2 () wat vx en vy apart neem as parameters, en keer terug jy 'n hoek tussen 0 ° en 360 °, of -180 ° en + 180 ° grade proive. Dit sal ook baie met die spesiale geval waar vx = 0, wat sal lei tot 'n deling deur nul as jy nie versigtig is nie.

http://www.arctangent.net/atan.html of net soek vir "arctustangens".

Edit:. Ek gebruik grade in my post vir duidelikheid, maar Java en baie ander tale / biblioteke werk in radiale waar 180 ° = π

Jy kan ook net byvoeg vx en vy om punte die driehoek se om dit te laat beweeg in die "vorentoe" rigting, maar maak seker dat die vektor is genormaliseer (vx² + vy² = 1), anders sal die spoed sal afhang van jou driehoek se grootte.

Ander wenke

@Mark:

Ek het probeer om te skryf 'n primer op vektore, koördinate, punte en hoeke in hierdie antwoord boks twee keer, maar verander my gedagtes op beide geleenthede omdat dit te lank sou neem en ek is seker daar is baie tutoriale daar buite te verduidelik dinge beter as wat ek ooit kan.

Jou swaartepunt en "wenk" koördinate is nie vektore; dit wil sê, daar is niks te wen uit te dink van hulle as draers.

Die vektor wat jy wil, vForward = pTip - pCentroid, kan bereken deur die koördinate van die "tip" hoek van die swaartepunt punt. Die atan2 () van hierdie vektor, dit wil sê atan2 (tipY-centY, tipX-centX), gee jou die hoek van jou driehoek "in die gesig staar".

As vir wat dit is relatief tot, dit maak nie saak. Jou biblioteek sal waarskynlik gebruik maak van die konvensie dat die verhoging van X-as (---> die reg / oos rigting op vermoedelik al die 2D grafieke wat jy gesien het) is 0 ° of 0π. Die verhoging van Y (top, noord) rigting sal stem ooreen met 90 ° of (1/2) π.

Dit lyk vir my dat jy nodig het om die rotasie hoek van die driehoek te stoor en moontlik is dit die huidige spoed.

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

Let daarop dat hoek in radiale, nie-grade!

Radiale = Grade * RadiansInACircle / DegreesInACircle

RadiansInACircle = 2 * Pi

DegressInACircle = 360

Vir die plekke van die hoekpunte, elke is geleë op 'n sekere afstand en hoek van die sentrum. Voeg die huidige rotasie hoek voordat jy hierdie berekening. Dit is dieselfde wiskunde as vir uitzoeken die beweging.

Hier is'n paar meer:

Vektore verteenwoordig verplasing.Verplasing, vertaling, beweging of wat ook al jy wil om dit te noem, is betekenisloos sonder'n begin punt, wat is die rede waarom ek verwys na die "vorentoe" vektor bo as "van die sentroïed," en dit is die rede waarom die "sentroïed vektor," die vektor met die x/y komponente van die sentroïed punt nie sin maak nie.Dié komponente gee jou die verplasing van die sentroïed punt vanaf die oorsprong.In ander woorde, pOrigin + vCentroid = pCentroid.As jy die begin van die 0 punt, en voeg dan'n vektor wat die sentroïed punt se verplasing, kry jy die sentroïed punt.

Let daarop dat:

vektor + vektor = vektor
(byvoeging van twee verplasings gee jou'n derde, verskillende verplasing)

punt + vektor = punt
(beweeg/verskuiwing van'n punt gee jou'n ander punt)

punt + punt = ???
(die toevoeging van twee punte nie sin maak nie;maar:)

punt - punt = vektor
(die verskil van twee punte is die verplasing tussen hulle)

Nou, hierdie verplasings kan gesien word in (ten minste) twee verskillende maniere.Die een wat jy reeds vertroud is met die vierkantige (x, y) stelsel, waar die twee komponente van'n vektor verteenwoordig die verplasing in die x-en y-rigtings, onderskeidelik.Egter, jy kan ook gebruik polar koördinate, (r, Θ).Hier, Θ verteenwoordig die rigting van die verplasing (in die hoeke met betrekking tot'n arbitary nul hoek) en r, die afstand.

Neem die (1, 1) vektor, byvoorbeeld.Dit verteenwoordig'n beweging van een eenheid na regs en een eenheid opwaarts in die koördinaat stelsel ons is al gebruik om te sien.Die polêre ekwivalent van hierdie vektor sou wees (1.414, 45°);dieselfde beweging, maar verteenwoordig as'n "verplasing van 1.414 eenhede in die 45°-hoek rigting.(Weer, met behulp van'n gerieflike polar koördinaat stelsel waar die Ooste rigting is 0° en hoeke verhoog anti-kloksgewys.)

Die verhouding tussen pool-en reghoekige koördinate is:

Θ = atan2(y, x)
r = sqrt(x2+y2) (nou het jy sien waar die reg driehoek kom in?)

en aan die ander kant,

x = r * cos(Θ)
y = r * sonde(Θ)

Nou, aangesien'n lyn segment getrek uit jou driehoek se sentroïed van die "tip" hoek sou verteenwoordig die rigting van jou driehoek is "in die gesig staar," as ons was om te kry'n vektor parallel met die lyn (bv. vForward = pTip - pCentroid), dat vektor se Θ-koördinaat sou ooreenstem met die hoek wat jou driehoek in die gesig staar.

Neem die (1, 1) vektor weer.As dit was vForward, dan sou beteken het dat jou "punt" punt se x-en y-koördinate was beide 1 meer as dié van jou sentroïed.Kom ons sê die sentroïed is op (10, 10).Wat sit die "tip" hoek oor by (11, 11).(Onthou, pTip = pCentroid + vForward deur die toevoeging van "+ pCentroid" aan beide kante van die vorige vergelyking.) Nou in watter rigting is die driehoek in die gesig staar?45°, reg?Dit is die Θ-koördinaat van ons (1, 1) vektor!

hou die swaartepunt by die oorsprong. gebruik die vektor van die swaartepunt van die neus as die rigting vektor. http://en.wikipedia.org/wiki/Coordinate_rotation#Two_dimensions sal hierdie draai vektor. bou die ander twee punte van hierdie vektor. vertaal die drie punte na die plek waar hulle op die skerm en trek.

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

Ek kan sien dat ek nodig het om die algemene 2d rotasie formules van toepassing op my driehoek om my resultaat te kry, Im net 'n bietjie van die moeilikheid met die verhoudings tussen die verskillende komponente hier.

AIB , verklaar dat:

  

Die arctustangens (inverse tangens) van   vy / vx, waar vx en vy is die   komponente van jou (centroid-> punt)   vektor, gee jou die hoek die vektor   in die gesig staar.

Is vx en vy die x en y koördinatestelsel van die centriod of die wenk? Ek dink Im kry verward oor die terminologie van 'n "vektor" hier. Ek was onder die indruk dat 'n Vektor is net 'n punt in 2d (in hierdie geval) ruimte daardie rigting verteenwoordig.

So in hierdie geval, hoe is die vektor van die centroid-> punt bereken? Is dit net die centriod?

meyahoocomlorenpechtel gestel:

  

Dit lyk vir my dat jy nodig het om te stoor   die rotasie hoek van die driehoek en   moontlik dis huidige spoed.

Wat is die rotasie hoek met betrekking tot? Die oorsprong van die driehoek, of die spel venster self? Ook vir toekomstige rotasies, is die hoek van die hoek van die laaste rotasie of die oorspronklike posisie van die driehoek?

Dankie almal vir die hulp so ver, ek waardeer dit regtig!

jy sal wil hê dat die boonste toppunt na die swaartepunt ten einde die gewenste effek te bereik nie.

In die eerste plek sou ek begin met die swaartepunt eerder as te bereken nie. Jy weet die posisie van die swaartepunt en die hoek van rotasie van die driehoek, sou ek dit gebruik om die plekke van die verticies bereken. (Ek vra om verskoning by voorbaat vir enige sintaksfoute, het ek net begin om ploeteraars in Java.)

// beginpunt

double tip_x = 10;
double tip_y = 10;

should be

double center_x = 10;
double center_y = 10;

// driehoek besonderhede

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

moet 'n verskeidenheid van 3 hoek wees, afstand pare.

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

Let daarop dat ek aftrek die Y afstand. Jy word deur die feit dat die skerm ruimte omgekeerde geskakel. In ons gedagtes verhoog Y as jy optrek -. Maar skerm koördinate nie werk op die manier

Die wiskunde is 'n baie makliker as jy dinge te spoor as posisie en rotasie hoek eerder as afleiding van die rotasie hoek.

Ook in jou finale stuk kode wat jy wysiging van die plek deur die rotasie hoek. Die gevolg sal wees dat jou skip draai deur die rotasie hoek elke update siklus. Ek dink die doel is iets soos asteroïdes, nie 'n kat jaag dis stert!

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top