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
Reflektion eines Balles
Re: Reflektion eines Balles
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
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

pb 4.51
Re: Reflektion eines Balles
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.

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.
Ich benutze PureBasic 3.30
Re: Reflektion eines Balles
Nimmst doch einfach den Chipmunk4PB Wrapper:
http://www.purebasic.fr/german/viewtopi ... 11&t=23073
http://www.purebasic.fr/german/viewtopi ... 11&t=23073
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Re: Reflektion eines Balles
Also:
BewegungsVektor -> BewegungWinkel:
BewegungWinkel -> BewegungsVektor:
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 ...
BewegungsVektor -> BewegungWinkel:
Code: Alles auswählen
Angle = ATan2(Vector2D\x, Vector2D\y)
Speed = Sqr( Vector2D\x*Vector2D\x + Vector2D\y*Vector2D\y )
Code: Alles auswählen
Vector2D\x = Cos(Angle)*Speed : Vector2D\y = Sin(Angle)*Speed
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 ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: Reflektion eines Balles
Man könnte auch einfach das Reflexionsgesetz in Vektorform nutzen:
(vx, vy) ist der Richtungsvektor des Balles, (rx, ry) der reflektierte Richtungsvektor und (nx, ny) der Normalenvektor der Gerade.
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
Re: Reflektion eines Balles
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
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
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...