2010-07-22 7 views
26

Ich erstelle ein einfaches 2D-Spiel in Javascript/Canvas. Ich muss den Winkel eines bestimmten Objekts relativ zu meiner Position herausfinden.Berechnen von Graden zwischen 2 Punkten mit inverser Y-Achse

Also: sagen, ich bin bei (10,10) und das Objekt ist bei (10,5) - das würde 90 Grad ergeben (als positive Y ist unten, negative Y ist oben) (10,10) vs (10,15) wäre 270 Grad.

Wie würde ich darüber gehen?

+0

Blickwinkel von wo? –

+0

Ich bin verwirrt, wie du den Winkel bestimmst ... siehst du die ganze Zeit in eine bestimmte Richtung? – rownage

+0

@Rownage: Wenn ich nicht missverstanden habe, ist der Punkt, um die Ausrichtung des Vektors zu bestimmen, der von einer Position zur anderen zeigt. –

Antwort

37

Angenommen, Sie befinden sich in (a, b) und das Objekt befindet sich in (c, d). Dann ist die relative Position des Objekts zu Ihnen (x, y) = (c - a, d - b).

Dann könnten Sie die Math.atan2() function verwenden, um den Winkel im Bogenmaß zu erhalten.

var theta = Math.atan2(-y, x); 

Beachten Sie, dass das Ergebnis im Bereich [-π, π] liegt. Wenn Sie nicht negative Zahlen benötigen, haben Sie

if (theta < 0) 
    theta += 2 * Math.PI; 

und konvertieren Radiant in Grad hinzufügen, multiplizieren mit 180/Math.PI.

6

Wenn Ihre Koordinaten (XME, YME) und deren Koordinaten (xThem, yThem), dann können Sie die Formel verwenden:

arctan((yMe-yThem)/(xThem-xMe))

Normalerweise würde es arctan((yThem-yMe)/(xThem-xMe)), aber in diesem Fall sein Das Vorzeichen der y-Achse ist umgekehrt.

Um das Ergebnis von Bogenmaß in Grad zu konvertieren, multiplizieren Sie es mit 180/pi.

So in JavaScript, würde dies wie folgt aussehen: Math.atan((yThem-yMe)/(xThem-xMe))*180/Math.PI

atan einen Wert zwischen -pi/2 und pi/2 gibt (dh, zwischen -90 und 90 Grad). Aber Sie können sich ansehen, in welchem ​​Quadranten sich Ihr (xThem - xMe, yMe - yThem) Vektor befindet und passen Sie ihn entsprechend an.

+2

Ich mag Kennys Antwort besser. Math.atan2 wird wissen, in welchem ​​Quadranten Sie bereits sind, so dass Ihnen der letzte Schritt erspart bleibt. –

+0

Ich fand diese Antwort immer noch nützlich, es ist eine nette Alternative, weil ich die Quadranten selbst kontrollieren möchte. – Partack

4

In juristischer Hinsicht:

function pointDirection(x1, y1, x2, y2) { 
    return Math.atan2(y2 - y1, x2 - x1) * 180/Math.PI; 
} 
1

In HTML5-Canvas der Ursprung die linke obere Ecke ist daher die y-Achse von oben nach unten wächst. Also unabhängig davon, wo Sie auf dem Einheitskreis sind die Winkel von Punkt A zu dem Zentrum (C) Sie sollten in der Tat zu berechnen tun wie

angle = Math.atan2(Cy-Ay,Ax-Cx)

und Sie werden Ihr Ergebnis im Bereich von [get - π, π].

Ich habe keine Ahnung, warum sie den Canvas-Ursprung nicht die linke untere Ecke gemacht haben.