Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Ausfallswinkel berechnen und mit Canvas einzeichnen (https://www.delphipraxis.net/122379-ausfallswinkel-berechnen-und-mit-canvas-einzeichnen.html)

Onkelrossie 15. Okt 2008 01:15


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.

http://s2.imgimg.de/uploads/Kugel576dc054PNG.png

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

Cyf 15. Okt 2008 01:40

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".

Onkelrossie 15. Okt 2008 02:20

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

ede57 15. Okt 2008 09:31

Re: Ausfallswinkel berechnen und mit Canvas einzeichnen
 
Schau mal hier

http://www.delphi-library.de/topic_+...nen_47305.html

Onkelrossie 15. Okt 2008 16:09

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

Uwe Raabe 15. Okt 2008 17:12

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.

Onkelrossie 15. Okt 2008 17:16

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

jfheins 15. Okt 2008 17:27

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

Uwe Raabe 15. Okt 2008 18:00

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;

Onkelrossie 15. Okt 2008 18:18

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 10:30 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz