Seite 1 von 1

Reflektion eines Balles

Verfasst: 22.12.2010 12:39
von kreeph
Hallo, ich habe ein Programm geschrieben. Ein Ball wird bewegt in einem Fenster über die Edition von x- und y-Bewegungsvariablen. (In jeder Schleife wird die x- bzw. y-Position des Balles entsprechend dieser Variablen verschoben.)
Bisher habe ich bei Kollision mit den Wänden immer die jeweilige Variable mit -1 multipliziert, um so den Ball abprallen zu lassen.
Nun möchte ich ihn an einer schrägen Geraden abprallen lassen.
Hierfür muss ich jedoch die Bewegung umstellen, ich muss den Einfallwinkel berechnen, und die Bewegung schließlich vom Ausfallwinkel abhängig machen.

Nun wollte ich fragen, wie dies möglich ist.

Die totale Geschwindigkeit meines Balles kann ich mittels (x²+y²)^0,5 berechnen. Diese soll nach der Reflektion schließlich beibehalten werden. Von meiner Geraden ist lediglich die Steigung angegeben. Die Steigung der Ballbewegung ist folglich y/x.
Ich kann jedoch beim besten Willen keinen Weg finden, anhand des Ausfallwinkels wieder die Werte für x und y zu ermitteln.

Ich hoffe ihr könnt mir helfen, und eventuell Tipps geben, falls ich die Bewegung komplett umstellen müsste.

Danke im Vorraus,
kreeph

Re: Reflektion eines Balles

Verfasst: 22.12.2010 13:13
von gnasen
Ich habe zwar mit Physik nichts am Hut, aber ich denke du wirst einfach die Bewegungsgeschwindigkeit in einen Vektor "v" speichern. Trifft der Ball nun auf ein Hinderniss, so ist diese Näherungsweise eine Gerade, also ebenfalls ein Vektor im Raum.
Nun würde ich den orthogonalen Vektor dieser Hindernisgerade bestimmen, und den Bewegungsvektor anhand dieses orthogonalen Vektors spiegeln.
Müsste also theoretisch nur ein wenig rumgerechne mit Vektoren sein ;)

Re: Reflektion eines Balles

Verfasst: 22.12.2010 13:30
von kreeph
ja, so habe ich mir das auch gedacht :)
nur ist dieses "rumgerechne" gerade mein problem: ich weiß nicht, wie ich dei Bewegung in einem Vektor angebe, bzw, wie ich diese dann spiegeln kann.

Re: Reflektion eines Balles

Verfasst: 22.12.2010 13:46
von DrShrek
Nimmst doch einfach den Chipmunk4PB Wrapper:
http://www.purebasic.fr/german/viewtopi ... 11&t=23073

Re: Reflektion eines Balles

Verfasst: 22.12.2010 14:08
von STARGÅTE
Also:

BewegungsVektor -> BewegungWinkel:

Code: Alles auswählen

Angle = ATan2(Vector2D\x, Vector2D\y)
Speed = Sqr( Vector2D\x*Vector2D\x + Vector2D\y*Vector2D\y )
BewegungWinkel -> BewegungsVektor:

Code: Alles auswählen

Vector2D\x = Cos(Angle)*Speed : Vector2D\y = Sin(Angle)*Speed
Speed wäre hierbei die Länge des Vektors, die ja bei einer drehung unverändert bleibt

Für eine Reflexion an einer Wand gilt:
Einfallswinkel = Ausfallswinkel in Bezug auf das Einfallslot der Wand.
Wenn du eine Wand hast, hast du ja auch ein Ausdehnungsvektor (x,y), dessen Winkel du auch berechnen kannst.
Aus dem Winkel der Wand, kommst du dann leicht auf das Lot (+-90°) und kannst somit leicht Einfallswinkel und Ausfallswinkel bestimmen.
Dann "ein paar Winkel" addieren und Ergebnis ist der neue Winkel ...

Re: Reflektion eines Balles

Verfasst: 22.12.2010 22:25
von Spirit
Man könnte auch einfach das Reflexionsgesetz in Vektorform nutzen:

Code: Alles auswählen

n_dot_v = nx * vx + ny * vy

rx = vx - 2 * n_dot_v * nx
ry = vy - 2 * n_dot_v * ny
(vx, vy) ist der Richtungsvektor des Balles, (rx, ry) der reflektierte Richtungsvektor und (nx, ny) der Normalenvektor der Gerade.

Re: Reflektion eines Balles

Verfasst: 22.12.2010 23:01
von DrShrek
Habe mal eine Exe mit dem Chipmunk4PB Wrapper generiert:
Weil aber Kreise zu einfach sind habe ich gleich mal 10 Quader verwendet.

In 10 min alles implementiert ;-)

http://www.morty-productions.de/icesoft ... Bounce.zip