![]() |
Ausfallswinkel berechnen und mit Canvas einzeichnen
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo und guten Abend liebe DP gemeinde,
ich habe mal wieder ein Problem was ich auch durch langes suchen und lesen der Threads hier im Forum nicht meistern konnte. Ich habe zwar einige Lösungsansätze gefunden, anscheinend bin ich auch nicht der erste mit diesem Problem, aber dennoch komme ich nicht weiter und bin auf ausführlichere Hilfe angewiesen. Es geht darum den Weg einer Kugel (Shape) vorherzusagen indem man den Ausfallswinkel berechnet wenn sie von der Bande abprallt. Anschließend soll dieser Weg als Linie mit hilfe von TCanvas eingezeichnet werden. Mein Hauptproblem bezieht sich auf die Bande welche auch durch ein Shape realisiert wurde. Ich weiß einfach nicht wie ich den Kolisionspunkt berechnen soll ab wann die Kugel die Bande berühren würde und das ganze dann als Linie einzuzeichnen wohin die Kugel dann abprallt. Ich habe hier mal ein Bildschirmfoto gemacht und in Paint etwas verdeutlicht was ich genau meine. ![]() Im Anhang habe ich auch noch meinen Source den ich bis jetzt geschrieben habe gepackt. Geschrieben ist er mit BDS2006. Ich wäre für eure Hilfe sehr dankbar und bitte euch es mir so einfach wie möglich zu erklären da ich noch neu in auf dem Gebiet bin. MfG Onkelrossi |
Re: Ausfallswinkel berechnen und mit Canvas einzeichnen
Ich hab jetzt grad nicht mehr die Zeit (Bett ruft :P ) das noch detailiert zu beschreiben, aber ich hab was in der Richtung mal vor einiger Zeit mit OpenGl in 3D gebastelt und das Stichwort, was dir eventuell helfen könnte ist "Plane Intersection".
|
Re: Ausfallswinkel berechnen und mit Canvas einzeichnen
Danke für die schnelle Antwort zu so später Stunde, aber leider bringt mich das in keinster weise weiter. Hab das Stichwort mal in die Suche eingegeben aber ohne Erfolg. Wäre für weitere Ratschläge dankbar.
MfG Onkelrossi |
Re: Ausfallswinkel berechnen und mit Canvas einzeichnen
|
Re: Ausfallswinkel berechnen und mit Canvas einzeichnen
@ede57, danke für den Link, hab mir das mal angeguckt aber werde daraus nicht schlau. Wenn ich es Compiliere dann sehe ich nur ein paar Kugeln die sich zufällig über die Form bewegen.
Ich möchte kein Billardspiel oder so Programmieren oder irgendwelche beweglichen Kugeln, sondern nur die Bewegung einer Kugel grafisch darstellen (mit einem Strich). Mein Problem ist nun das ich nicht weis wie ich den Strich weiter zeichnen soll wenn er von einer "Bande" abprallt. Zudem soll der Strich auch den Umfang der Kugel berücksichtigen. Wäre super wenn mir einer weiterhelfen könnte (Source ist ja im ersten Post zu finden). Gruß Onkelrossi |
Re: Ausfallswinkel berechnen und mit Canvas einzeichnen
Wie lang soll denn der Strich insgesamt werden? Die Kugel kann ja theoretisch beliebig oft an einer Bande abprallen.
|
Re: Ausfallswinkel berechnen und mit Canvas einzeichnen
@Uwe Raabe, danke für deine Antwort! Wäre nicht schlecht das variabel einstellen zu können aber ich dachte da so an 3-5 "Abpraller".
Gruß Onkelrossi |
Re: Ausfallswinkel berechnen und mit Canvas einzeichnen
Okay, ich nehme mal an, du hast folgendes:
:arrow: Positionsvektor: s0 :arrow: Geschwindigkeitsvektor: v :arrow: Breite und Höhe der Box: b und h Der Ursprung liegt zweckmäßigerwise in der oberen, linken Ecke der Box. Postives X nach rechts, positives Y nach unten. Vektoren werde ich fett formatieren ;) Dann kannst du jetzt eine Geradengleichung aufstellen: s(t) = s0 + t * v mit t als Parameter. Jetzt kannst du für die folgernden vier Fälle den Parameter t ausrechnen: X-Komponente von s(t) ist gleich 0 (links) Y-Komponente von s(t) ist gleich 0 (oben) X-Komponente von s(t) ist gleich b (rechts) Y-Komponente von s(t) ist gleich h (unten) Du hast jetzt vier mögliche Werte für t, und der kleinste positive Wert ist der Fall, der kollidiert - ic nenne ihn jetzt t_k. Wenn du die Kollision gefunden hast, kannst du folgendermaßen vorgehen: :arrow: Kollision rechts oder links: X-Komponente von v invertieren ("Vorzeichen umdrehen" bzw. "mal minus eins nehmen") :arrow: Kollision oben oder unten: Y-Komponente von v invertieren ergibt v_neu Neuer Ortsvektor ist s(t_k) [ Mit dem neuen Ortsvektor kannst du auch vom alten zum neuen ne Linie auf dein Canvas zeichnen ;) ] Damit erhältst du eine neue Bewegungsgleichung: s2(t2) = s(t_k) + t2 * v_neu Jetzt kannst du weieder von vorne anfangen. Beenden, wenn du genügend Schritte hast. Falls du etwas nicht verstanden hast, frage ruhig nach :stupid: MfG, Julius |
Re: Ausfallswinkel berechnen und mit Canvas einzeichnen
Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
const cMax = 5; var X0, X1: Integer; Y0, Y1: Integer; W, H: Integer; R: TRect; count: Integer; procedure MirrorY(Value: Integer); forward; procedure MirrorX(Value: Integer); begin if Count > cMax then Exit; X := Value; Y := Round(Y0 + (X - X0)*(Y1 - Y0)/(X1 - X0)); if Y < R.Top then MirrorY(R.Top) else if Y > R.Bottom then MirrorY(R.Bottom) else begin Inc(Count); X1 := 2*X - X1; Canvas.LineTo(X, Y); X0 := X; Y0 := Y; end; end; procedure MirrorY(Value: Integer); begin if Count > cMax then Exit; Y := Value; X := Round(X0 + (Y - Y0)*(X1 - X0)/(Y1 - Y0)); if X < R.Left then MirrorX(R.Left) else if X > R.Right then MirrorX(R.Right) else begin Inc(Count); Y1 := 2*Y - Y1; Canvas.LineTo(X, Y); X0 := X; Y0 := Y; end; end; begin Self.Repaint; W := Shape1.Width div 2; H := Shape1.Height div 2; X0 := Shape1.Left + W; Y0 := Shape1.Top + H; with Shape2 do R := Rect(Left + W, Top + H, Left + Width - W, Top + Height - H); W := Shape2.Width; if shape2.Height > W then W := shape2.Height; Canvas.MoveTo(X0, Y0); X1 := X0 + 5*W*(X - X0); Y1 := Y0 + 5*W*(Y - Y0); Count := 0; while Count < cMax do begin if X1 < R.Left then MirrorX(R.Left) else if X1 > R.Right then MirrorX(R.Right) else if Y1 < R.Top then MirrorY(R.Top) else if Y1 > R.Bottom then MirrorY(R.Bottom) else Break; end; Canvas.LineTo(X1, Y1); end; procedure TForm1.Shape2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin self.Repaint; Canvas.MoveTo(shape1.Left + (Shape1.Width div 2), Shape1.Top + (Shape1.Height div 2)); Canvas.LineTo(shape2.Left + X, shape2.Top + Y); end; |
Re: Ausfallswinkel berechnen und mit Canvas einzeichnen
@jfheins, danke für deine Anleitung aber leider habe ich keine Ahnung wie du das mit den Vektoren meinst.
@Uwe Raabe, du hast mir eben den Abend gerettet! Klappt wunderbar und ist auch einfach nachzuvollziehen. DANKE! Gruß Onkelrossi |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz