Vektor / Winkel drehen - auf welche Weise?

Jens B.

Erfahrenes Mitglied
Einfallswinkel = Ausfallswinkel (Flash AS3)

Tag
ich arbeite grade an einer Funktion, mit der ich einen Vektor (im Anhang rot) nach dem Prinzip Einfallswinkel = Ausfallswinkel "reflektieren" kann. Das ist recht simpel, wenn man den Vektor, an dem man den Ausgangsvektor reflektieren möchte, gegeben hat - das ist bei mir aber nicht so. Ich habe einen Vektor, der rechtwinklig zu diesem "Spiegelvektor" ist (im Bild rot).

Da meine Berechnungen auf dem Winkel zur x-Achse beruhen (atan2 berechnet den Winkel zur x-Achse gegen den Uhrzeigersinn) dachte ich mir, dass ich einfach ein (PI / 2) addieren kann, um den Vektor quasi um 90° zu drehen. Soweit so gut, die Funktion lieferte aber nicht die gewünschten Ergebnisse. Also habe ich alternativ mit einer Drehmatrix den Vektor gedreht und bekomme dort verschiedene Ergebnisse, die aber auch immernoch nicht richtige Ergebnisse liefern. Wahrscheinlich sitze ich schon zu lang davor, um den Fehler zu entdecken. Hier der Code (sehr vereinfacht, damit nicht nur Flasher ihn lesen können :) )

Code:
// Ändert die Vektoren von Kugeln nach einer Kollision entsprechend dem Prinzip Einfallswinkel = Ausfallswinkel
function einfall(a, p, flag) {
	// atan2 muss man erst y, dann x übergeben...
	w1 = atan2(a.y, a.x);
	wt = atan2(p.x * sin(90) - p.y * cos(90), p.x * cos(90) - p.y * sin(90));
	w2 = atan2(p.y, p.x) + (PI / 2); 

	var w = w2+w2-w1;
	
	neu.x = sin(w);
	neu.y = cos(w);
}

Es geht also um die Zeilen mit wt und w2 - eigentlich müssten die doch gleich sein, oder sich zumindest genau um PI unterscheiden? Keine von beiden liefert richtige Ergebnisse, mit dem entsprechenden Vektor gegeben hingegen funktioniert der Code so.

Danke für eure Hilfe
jens
 

Anhänge

  • Unbenannt.jpg
    Unbenannt.jpg
    35,1 KB · Aufrufe: 75
Zuletzt bearbeitet:
Hab's. Keine Ahnung wieso, aber es funktioniert (das ist immer der beste Code). Musste einfach x und y tauschen (obwohl die Funktion auf jeden Fall erst den y-Wert braucht) und dann den nicht gedrehten Vektor nehmen. Komische Sache. Wenn irgendjemand dafür eine Erklärung hat: immer her damit.

Code:
function einfall(a, r) {
	var w1 = Math.atan2(a.vx, a.vy);
	var w2 = Math.atan2(r.vx, r.vy); 

	var w = w2+w2-w1; // w1 + (2 * ((Math.PI / 2) - (w1-w2)));

	var n = new Object();
	n.vx = Math.sin(w);
	n.vy = Math.cos(w);
	return n;
}

Für alle, die sowas irgendwann mal brauchen, hänge ich ein Beispiel an. Es ist unglaublich schlecht programmiert, da halt nur zu Testzwecken, aber kann vielleicht helfen. Wer Lust hat kann es (solange ich es auf meinem Webspace lasse) unter folgender Adresse ausprobieren: (gekürzt)
 

Anhänge

  • Untitled-1.fla
    80 KB · Aufrufe: 70
Zuletzt bearbeitet:
Jens, deine erste Berechnung war prinzipiell richtig, aber es muss am Schluss lauten:

n.vx = Math.cos(w);
n.vy = Math.sin(w);

Du hast sinus und cosinus vertauscht gehabt. Dadurch hattest du einen Vektor, bei dem x und y vertauscht waren, der also deinem ursprünglich gewünschten Vektor gegenüber an dem Vektor (1,1), der Diagonalen des Koordinatensystems, gespiegelt ist.
Dadurch, dass du in der zweiten Version deine beiden Parameter-Vektoren auch dieser Transformation unterziehst, bekommst du den Winkel für diesen gespiegelten Vektor, den du dann wieder durch die (eigentlich falsch) verwendeten sin- bzw. cos-Formeln zurückspiegelst und so den gewünschten Vektor herausbekommst.

Dies ist ein typisches Beispiel dafür, wie ein Fehler einen anderen Fehler beheben kann. ;)

Alles klar?
 

Neue Beiträge

Zurück