Winkel zwischen zwei Objekten

skee

Mitglied
Hallo,
ich hab da ein Problem, an dem ich fast verzweifle:

http://h2flow.de/rpg_test/

Wenn man das blaue Quadrat innerhalb des durchsichtigen Kreises bewegt, möchte ich, dass sich das rote Kästchen immer so dreht, dass es in Richtung des Blauen "schaut".

Ich hab im Netz schon ein bisschen gesucht, und folgendes gefunden:
a=_root.spieler._x-_x;
b=_y-_root.spieler._y;

_root.test_anzeige.btext.text=b;
_root.test_anzeige.atext.text=a;
B = 90;

bm = Math.PI/180; // 1° = Math.PI/180 (Bogenmaß) -> Math.sin etc erwartet als Parameter das Bogenmaß und nicht den Winkel!
sinA = Math.sin(bm * B)/b * a; //ausrechnen des von sin ?
A = Math.asin(sinA)/bm; // ausrechnen von ? zum Winkel in °.
_root.test_anzeige.Atext.text=A;
_rotation=A;

Das wird im roten Kästchen ausgeführt, wenn das blaue den Kreis betritt.

Und, wie man erkennt, funktioniert die Verfolgung nur innerhalb eines kleinen Bereiches.

Hat jemand eine Ahnung warum? Leider kapier ich es nicht wirklich...

Mir gehts erstmal um den Bereich im oberen Teil des Kreises. Für den unteren Teil muss man ja dann immer nur 180 addieren/subtrahieren..

Also, wär super, wenn ihr mir da weiterhelfen könntet.

Skee
 
Hi,

Du solltest zur Berechnung den Arcustangens verwenden:
Code:
var ang = Math.atan(delta_y / delta_x);

Zudem ist eine Quadrantenkorrektur nötig (wo die anschlägt, habe ich nicht mehr im Kopf, aber Du kannst es durch Ausprobieren feststellen).

Gruß
.
 
Naja man kann einen Vektor von dem einen Objekt zum anderen aufstellen und dann den Winkel vom diesem zum Koordinatensystem errechnen. Das wäre evtl. eine transparntere Rechnung als die mit den ganzen sinussen (ist das der Plural?) usw.

Wie der Zufall so spiet benutze ich das in meinem bld veröffentlichten Tutorial und kann dir deswegen recht aufwandsfrei ein Beispiel posten:

Code:
beta = Math.acos(richtung[1] / (Math.sqrt(Math.pow(richtung[0],2) + Math.pow(richtung[1],2)) * Math.sqrt(Math.pow(0,2) + Math.pow(1,2))));

In deinem Beispiel muss richtung[1] = meinMc._x - dasDrehding._x sein und richtung[2] analog für _y.

Gruß
.
 
Math.pow(0,2) ist de facto gleich 0². Dass das auch Null ist weiß ich, wenn man es dazu schreibt mag es aber Nachvollziehbarer für jemanden sein, der sich nciht so gut auskennt (man kann nachvollziehen, was wo in die Formel eingesetzt wurde).

acos liefert Werte im Bogenmaß, man muss sie noch *180/PI rechnen und hat ne Gradzahl. Nix mit nem halben Vollkreis.

Jahre lang hab ich darauf gewartet, Tobias Menzel verbessern zu dürfen.
 
acos liefert Werte im Bogenmaß
Das ist mir klar - alle Winkelfunktionen arbeiten im Bogenmaß.

wenn man es dazu schreibt mag es aber Nachvollziehbarer für jemanden sein
allerdings kannst Du die gesamte zweite Wurzelfunktion in Deinem Beispiel mit 1 ersetzen.

Jahre lang hab ich darauf gewartet, Tobias Menzel verbessern zu dürfen.
Schmarn, das lässt Du Dir doch nie entgehen. ^^

Generell: Zeig mir ein funktionierendes Beispiel mit acos (und nur einer Winkelfunktion), mit dem Du aus kartesischen Polarkoodinaten im Vollkreis machst, dann gebe ich zu, dass Dein Ansatz genauso sinnvoll ist.

Gruß
.
 
Herr Menzel,
mir ist schon klar, dass der gesamte hintere Term durch eine 1 ersetzt werden kann - udn wie bereits gesagt steht er dort nur für die Nachvollziehbarkeit des Tranfers von der Formel zu ActionScript.

Anbei ein Beispiel.
 

Anhänge

Gut: Wenn Du Delta-Y und den Abstand nimmst, kannst Du es auch mit der Umkehrfunktion des Sinus oder Cosinus machen, da hatte ich mich getäuscht. ;) Da dort Delta-X nicht einfließt, musst Du diese Koordinate allerdings von Hand prüfen.

Gruß
.
 
Zurück