Frage

Ich versuche, ein Dreieck (gleichschenkliges Dreieck), um auf dem Bildschirm und in der gleichen Zeit drehen leicht, ihn zu bewegen, wenn ein Benutzer eine Richtungstaste (wie rechts oder links) drückt.

Ich mag die Nase (oben Punkt) des Dreiecks auf das Dreieck zu allen Zeiten führen. (Wie die alten Asteroiden Spiel).

Mein Problem ist mit der Mathematik dahinter. Bei jedem X Zeitintervall, mag ich das Dreieck in „irgendeiner Richtung“ zu bewegen, ich brauche Hilfe bei der Suche diese Richtung (x und y-Schritte / Dekremente).

kann ich den Mittelpunkt (Centroid) des Dreiecks finden, und ich habe die oberste eine y Punkte x, so habe ich eine Linie Vektor mit zu arbeiten, aber nicht die geringste Ahnung, „wie“ mit ihm zu arbeiten .

Ich denke, es hat etwas mit den alten Sin und Cos Methoden und der Menge (Winkel), dass das Dreieck gedreht wurde, zu tun, aber ich bin ein bisschen rostig auf dem Zeug.

Jede Hilfe wird sehr geschätzt.

War es hilfreich?

Lösung

Die Arcustangens (inverser Tangens) vy / vx, wo vx und vy die Komponenten Ihres (centroid-> tip) Vektor sind, gibt Ihnen die Winkel der Vektor zeigt.

Die klassische arctangent gibt Ihnen einen Winkel bis -90 ° normalisiert

Zum Glück, Ihre Standard-Bibliothek sollte eine atan2 () Funktion proive die vx und vy separat als Parameter nimmt, und gibt Ihnen einen Winkel zwischen 0 ° und 360 ° oder -180 ° und + 180 ° Grad. Es wird auch mit dem speziellen Fall behandeln, in denen vx = 0, was in einer Division durch Null ergeben würde, wenn Sie nicht vorsichtig sind.

Siehe http://www.arctangent.net/atan.html oder einfach nur suchen für "Arcustangens".

Edit:. Ich habe gebrauchten Grad in meinem Beitrag für Klarheit, aber Java und viele andere Sprachen / Bibliotheken arbeiten in Radianten wo 180 ° = π

Sie können auch nur hinzufügen, Vx und Vy auf die Punkte des Dreiecks, um es in der „Vorwärts“ -Richtung zu bewegen, aber darauf achten, dass der Vektor normiert (vx² + vy² = 1), sonst wird die Geschwindigkeit auf Ihrem Dreiecks abhängen Größe.

Andere Tipps

@ Mark:

Ich habe versucht, eine Grundierung auf Vektoren zu schreiben, Koordinaten, Punkte und Winkel in diesem Antwortfeld zweimal, aber meine Meinung geändert beiden Male weil es zu lange dauern würde, und ich bin sicher, es gibt viele Tutorials erklären Sachen besser als ich jemals kann.

Ihr Schwerpunkt und „Spitze“ Koordinaten nicht Vektoren; das heißt, es gibt nichts von ihnen zu denken als Vektoren gewonnen werden soll.

Der Vektor Sie wollen, vForward = pTIP - pCentroid kann durch Subtraktion der Koordinaten der „Spitze“ Ecke vom Schwerpunkt Punkt berechnet werden. Die atan2 () dieses Vektors, das heißt atan2 (Tipy-centy, tipx-centX), gibt Ihnen den Winkel Ihr Dreieck "gegenüber".

Wie für das, was es ist relativ zu, es spielt keine Rolle. Ihre Bibliothek wird wahrscheinlich die Konvention verwenden, die die zunehmende X-Achse (---> rechts / Ost-Richtung auf vermutlich alle 2D-Diagramme Sie gesehen haben) 0 ° oder 0π. Die zunehmende Y (oben, Nord) Richtung 90 ° oder (1/2) π entsprechen.

Es scheint mir, dass Sie den Drehwinkel des Dreiecks speichern müssen und möglicherweise ist es die aktuelle Geschwindigkeit.

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

Beachten Sie, dass Winkel in Radiant, nicht Grad!

Radiant = Degrees * RadiansInACircle / GradImVollkreis

RadiansInACircle = 2 * Pi

DegressInACircle = 360

Für die Positionen der Scheitelpunkte, die jeweils in einem bestimmten Abstand und Winkel vom Zentrum entfernt. Fügen Sie den aktuellen Drehwinkel vor dieser Berechnung zu tun. Es ist die gleiche Mathematik wie für die Bewegung herauszufinden.

Hier ist etwas mehr:

Vektoren repräsentieren Verschiebung. Verschiebung, Übersetzung, Bewegung oder was auch immer Sie es nennen wollen, ist ohne Ausgangspunkt sinnlos, deshalb habe ich oben in Bezug auf die „Vorwärts“ Vektor bezeichnet „vom Schwerpunkt“, und das ist, warum die „Schwerpunktvektor“, der Vektor mit die x / y-Komponenten des Schwerpunktes machen Sinn nicht. Diese Komponenten geben Ihnen die Verschiebung des Schwerpunktes vom Ursprung. Mit anderen Worten, pOrigin + vCentroid = pCentroid. Wenn Sie vom 0-Punkt zu starten, dann einen Vektor fügen die die Verschiebung des Schwerpunktes, können Sie den Schwerpunkt Punkt.

Beachten Sie, dass:

Vektor + Vektor = Vektor
(Addition von zwei Verschiebungen gibt Ihnen eine dritte, unterschiedliche Verschiebung)

Punkt + Vektor = Punkt
(Bewegen / Verschieben einen Punkt gibt Ihnen einen weiteren Punkt)

Punkt + Punkt = ???
(Hinzufügen von zwei Punkten ist nicht sinnvoll, aber:)

Punkt - Punkt = vektor-illustration (Die Differenz von zwei Punkten ist die Verschiebung zwischen ihnen)

Nun können diese Verschiebungen in (mindestens) zwei verschiedene Arten betrachtet werden. Die Sie bereits vertraut sind mit dem rechteckiger (x, y) System, wobei die beiden Komponenten eines Vektors die Verschiebung in der x- und y-Richtung darstellen. verwenden Sie können jedoch auch polar Koordinaten (r, Θ). Hier Θ repräsentiert die Richtung der Verschiebung (in Winkeln relativ zu einem willkürlichen Nullwinkel) und r den Abstand.

Nehmen Sie das (1, 1) Vektor, zum Beispiel. Es stellt eine Bewegung eine Einheit nach rechts und eine Einheit nach oben in dem Koordinatensystem wir zu sehen alle gewohnt sind. Das polare Äquivalent dieses Vektors wäre (1,414, 45 °); die gleiche Bewegung, sondern als „Verschiebung von 1,414 Einheiten im 45 ° -Winkel Richtung dargestellt. (auch hier ein günstiges Polarkoordinatensystem, wo die Ost-Richtung 0 ° und Winkel Erhöhung gegen den Uhrzeigersinn.)

Die Beziehung zwischen polaren und kartesischen Koordinaten sind:

Θ = atan2 (y, x)
r = sqrt (x² + y²) (jetzt tun Sie sehen, wo das rechte Dreieck kommt?)

und umgekehrt

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

Da nun ein Liniensegment gezeichnet von Ihrem Dreieck Schwerpunkt auf die „Spitze“ Ecke würde stellt die Richtung Ihr Dreieck „nach,“ wenn wir einen Vektor parallel zu dieser Linie zu erhalten waren (zB vForward = pTIP -. pCentroid ), die Vektors Θ-Koordinate des Winkel entsprechen würde, dass Ihr Dreieck steht vor

Nehmen Sie die (1, 1) Vektor wieder. Wenn dies vForward war, dann hätte das bedeutet, dass Ihre „Spitze“ Punkt der x- und y-Koordinaten beide 1 mehr waren als die von Ihrem Schwerpunkt. Nehmen wir an, der Schwerpunkt liegt auf (10, 10). Das bringt die „Spitze“ Ecke bei (11, 11). (Beachten Sie, pTIP = pCentroid + vForward durch Addieren von "+ pCentroid" auf beiden Seiten der vorstehenden Gleichung). Nun, in der Richtung dieses Dreieck gegenüber? 45 °, nicht wahr? Das ist die Θ-Koordinate unseres (1, 1) Vektor!

hält den Schwerpunkt am Ursprung. verwenden Sie den Vektor vom Schwerpunkt auf die Nase als Richtungsvektor. http://en.wikipedia.org/wiki/Coordinate_rotation#Two_dimensions wird diese drehen Vektor. die beiden anderen Punkte aus diesem Vektor konstruieren. übersetzt die drei Punkte, wo sie auf dem Bildschirm sind und zeichnen.

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

kann ich sehen, dass ich die gemeinsame 2d Drehung Formeln meines Dreieck anwenden muß mein Ergebnis zu bekommen, nur Im mit den Beziehungen zwischen den verschiedenen Komponenten hier ein wenig Mühe hat.

aib , erklärte:

  

Die Arcustangens (inverse Tangens)   vy / vx, wo vx und vy sind die   Komponenten des (centroid-> tip)   Vektor, gibt Ihnen den Winkel des Vektors   zugewandt ist.

Ist vx und vy die x- und y-Koordinaten des centriod oder der Spitze? Ich denke Im verwirrt in Bezug auf die Terminologie eines „Vektor“ bekommen hier. Ich hatte den Eindruck, dass ein Vektor war nur ein Punkt in 2d (in diesem Fall) Raum, die Richtung dargestellt.

Also in diesem Fall, wie ist der Vektor der centroid-> Spitze berechnet? Ist es nur die centriod?

meyahoocomlorenpechtel angegeben:

  

Es scheint mir, dass Sie speichern müssen   der Drehwinkel des Dreiecks und   möglicherweise ist es die aktuelle Geschwindigkeit.

Was ist der Drehwinkel relativ zu? Der Ursprung des Dreiecks, oder das Spiel-Fenster selbst? Auch für zukünftige Umdrehungen ist der Winkel der Winkel von der letzten Drehung oder die ursprüngliche Position des Dreiecks?

Danke alle für die Hilfe so weit, ich schätze es wirklich!

Sie wollen die obersten Eckpunkt der Schwerpunkt sein, um den gewünschten Effekt zu erzielen.

Als erstes würde ich mit dem Schwerpunkt beginnt anstatt berechnen sie. Sie kennen die Position des Schwerpunkts und der Drehwinkel des Dreiecks, ich würde das die Orte der verticies zu berechnen verwenden. (Ich entschuldige mich im Voraus für alle Syntaxfehler, habe ich begonnen, nur in Java plätschern.)

// Ausgangspunkt

double tip_x = 10;
double tip_y = 10;

should be

double center_x = 10;
double center_y = 10;

// Dreieck Details

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

sollte ein Array von 3 Winkel, Abstand Paare werden.

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

Beachten Sie, dass ich bin Subtraktionseinheit der Y-Abstand. Sie wird durch die Tatsache gestolpert, dass Platz auf dem Bildschirm invertiert wird. In unseren Köpfen erhöht Y wie Sie gehen nach oben -. Aber Bildschirmkoordinaten nicht funktionieren auf diese Weise

Die Mathematik ist viel einfacher, wenn Sie Dinge wie Position und Drehwinkel verfolgen, anstatt den Drehwinkel abgeleitet wird.

Auch in Ihrem letzten Stück Code sind Sie die Position durch den Drehwinkel zu verändern. Das Ergebnis wird sein, dass Ihr Schiff jeden Aktualisierungszyklus durch den Drehwinkel dreht. Ich denke, das Ziel so etwas wie Asteroids, nicht eine Katze jagt es ist Schwanz!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top