You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

49 lines
1.8 KiB
Plaintext

Was meint ihr zu der Lösung?
r = Winkel zw. Zentrum und Kollisionspunkt
v = Geschwindigkeitsvektor der Kugel
alpha = einfallswinkel (zw. r und v)
beta = winkel, um den v gedreht werden muss
rx = this._x - zentrum._x;
ry = this._y - zentrum._y;
vx = geschw.x;
vy = geschw.y;
cosalpha = (rx * vx + ry * vy) / (Math.sqrt(rx*rx+ry*ry)*Math.sqrt(vx*vx+vy*vy));
alpha = Math.acos(cosalpha);
beta = Math.PI - 2 * alpha;
nvx = Math.cos(beta) * vx - Math.sin(beta) * vy;
nvy = Math.sin(beta) * vx + Math.cos(beta) * vy;
--------------------
Hi,
eigentlich ist es ganz simpel:
du denkst dir am Kollisionspunkt am Kreis eine Tangente. Diese hat einen Winkel. Bei der Kollision gilt üblicherweise Eingangswinkel=Ausgangswinkel. Das ist ja recht einfach zu berechnen...
Schwieriger ist es indes herauszufinden, wo genau die Kugel den Kreis trifft, d.h., welchen Winkel deine Tangente hat.
Da du in diesem Fall einen Kreis mit bekannter Größe verwendest, dürfte auch das nicht so schwierig sein:
zunächst berechnest du den Abstand der Kugel zum Zentrum mit
da = Math.sqrt(x*x+y*y);
wenn dieser Abstand größer oder gleich dem Radius ist, ermittelst du den Winkel der Kugel zum Zentrum mit:
dw = Math.atan2(dy,dx);
// dy und dx sind die Differenzen der Position der Kugel und des Zentrums)
Die Tangente steht lotrecht auf diesem Winkel.
Zuletzt brauchst du noch den Richtungswinkel der Kugel. Hierzu nimmst du wieder Math.atan2, diesmal aber nicht mit dem Abstand zum Zentrum sondern mit dem Abstand zur vorherigen Position der Kugel:
w = Math.atan2(_y-lastY,_x-lastX);
lastX und lastY musst du einfach in jeder Iteration deines Skripts speichern.
Jetzt hast du sowohl den Winkel der Kugel als auch den Winkel der Tangente, quasi deiner Spiegelfläche. Damit solltest du dann zurechtkommen, oder?!
Grüße
Sascha