Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Gasteilchen-Simulation (https://www.delphipraxis.net/107412-gasteilchen-simulation.html)

xy124 11. Feb 2008 17:47

Re: Gasteilchen-Simulation
 
ich habs geschrieben!

erstell nen Timer nen shape und nen button!

dan so:
(musst auch noch timer und button doppelklicken, evtl timerintervall verringern dann alles reinkopieren!...)
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, math;

type
  TForm1 = class(TForm)
    Shape1: TShape;
    Button1: TButton;
    Timer1: TTimer;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  x, y: Integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  timer1.enabled := true;
  x := 5; //Startwerte für X&Y-Speed
  y := 3;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  //Kollissionstests
  if (shape1.Top < 0) or (shape1.Top > clientheight - shape1.Height) then
    y := -y;
  if (shape1.Left < 0) or (shape1.Left > clientwidth - shape1.width) then
    x := -x;
 
  //eigentliche bewegung
  shape1.Top := shape1.Top + y;
  shape1.Left := shape1.Left + x;

  form1.caption := floattostr(sqrt(x*x+y*Y)) //pythagoras(schreibt man den so?) hilft weiter
end;
end.
:bouncing4: was war jetzt so schwer daran? :bounce1:

Pungex 11. Feb 2008 22:31

Re: Gasteilchen-Simulation
 
extremst großes dankeschön dafür... das hat mir enorm viel weitergeholfen....


1000-facher dank :thumb:



hab nur ne frage: Was genau beschreibt das Clientheight/-width? Ist das das gesamte Formular?

xy124 12. Feb 2008 09:47

Re: Gasteilchen-Simulation
 
ja aber ohne titelleiste und den bei xp blauen rand

Pungex 13. Feb 2008 17:01

Re: Gasteilchen-Simulation
 
jetzt wirds erst richtig kompliziert.... die einzelnen shapes müssten bei berührung aufeinander reagieren....

mein plan sieht soweit erstmal so aus:
Ich ermittle in jedem Zeitschritt die Abstände der einzelnen Shapes zueinander (Abstand der Mittelpunkte mitm Pythagoras, also r=Wurzel(delta_x²+delta_y²))... und wenn der Abstand dann ´klein genug is (nen paar wenige pixel), dann sollen die sich abstoßen (wenn der abstand in diesem Zeitschritt zu klein is, sollen sie halt durchfliegen, sonst stürzt mir sicherlich das programm ab).... mit den genauen stoßvorgängen muss ich mir jez nochn kopf machen...

was haltet ihr erstma von dieser grundidee? oder sollte man das vllt anders machen?



mfg pungex

shmia 13. Feb 2008 17:14

Re: Gasteilchen-Simulation
 
Folgende Funktion ermittelt, ob 2 Punkte näher als ein bestimmter Abstand sind.
Der Abstand (Squaredist) muss in quadrierter Form übergeben werden.
(3 Pixel Abstand => Squaredist = 9)
Delphi-Quellcode:
function Kollision(A, B : TPoint; Squaredist:integer):boolean;
var
   x,y : integer;
begin
  x := A.x-B.x;
  y := A.x-B.x;
  result := ((x*x)+(y*y) <= Squaredist);
end;
Nachtrag: komplett auf Integerarithmetik umgestellt

mr.winkle 16. Feb 2008 16:27

Re: Gasteilchen-Simulation
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hi Pungex,
ich bin der Typ mit Gasteilchen3D :)

Zitat:

Zitat von shmia
Delphi-Quellcode:
function Kollision(A, B : TPoint; Squaredist:integer):boolean;
var
   x,y : integer;
begin
  x := A.x-B.x;
  y := A.x-B.x;
  result := ((x*x)+(y*y) <= Squaredist);
end;

Naja, bei y sollte man schon die Y-Koordinaten der Punkte voneinander subtrahieren, sonst wird das nichts ;)
Delphi-Quellcode:
y:= A.Y-B.Y;
Ich mach das immer mit folgender Funktion:
Delphi-Quellcode:
function abstand(a,b:tpoint):real;
begin
  result:=sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));
end;

//Abfrage
if abstand(punkta,punktb)<=radiusa+radiusb then kollision;
Allerdings reicht das alleine für die Abprallberechnungen von Teilchen nicht aus. Deshalb hab ich mal meine absoluten Anfänge angehängt. Ich bin mir ziemlich sicher das du das gebrauchen kannst ;)

Meine Stossprozedur sieht so aus:
Delphi-Quellcode:
procedure tForm1.stoss(var b1,b2:tBall);
var M1,M2,delvx,delvy,dmx,dmy,dvx,dvy:single;
begin
  M1:=b1.masse;
  M2:=b2.masse;
  dmx:=b2.x-b1.x;
  dmy:=b2.y-b1.y;
  delvx:=b2.vx-b1.vx;
  delvy:=b2.vy-b1.vy;
  dvx:=2*M2*dmx*(dmx*delvx+dmy*delvy)/((SQR(dmx)+SQR(dmy))*(M1+M2));
  dvy:=2*M2*dmy*(dmx*delvx+dmy*delvy)/((SQR(dmx)+SQR(dmy))*(M1+M2));
  b1.vx:=b1.vx+dvx;
  b1.vy:=b1.vy+dvy;
  b2.vx:=b2.vx-(M1/M2)*dvx;
  b2.vy:=b2.vy-(M1/M2)*dvy;
  bewegeball(b1);
  bewegeball(b2);
end;
Damit werden auch sofort je nach Masse, Winkel und Radius die neuen Geschwindigkeiten und Richtungen angegeben. Allerdings treten noch ein paar Schönheitsfehler auf, die sich aber leicht beheben lassen. Im Anhang findest du eine laufende Simulation und bei Fragen kannst du diese gern an mich stellen.

mfg, mr.winkle :cheers:

Pungex 17. Feb 2008 14:46

Re: Gasteilchen-Simulation
 
großes dankeschön... des is echt sehr nett ... hab im moment leider grad keine zeit und möglichkeit das auszuprobieren, aber ich werd mich da nächste woche mal ransetzen....


MfG
Pungex

mjvdlek 11. Mär 2008 23:04

Re: Gasteilchen-Simulation
 
:-D Diese Simulation finde ich super! Auch die Idee, die Gasteilchen eine Randomfarbe zu geben.
Ich arbeite auf Delphi an einem Gesamtphysikprogramm. Meine Frage ist: darf ich den Codetext in
mein Programm einbauen?

MJVDLEK

mr.winkle 14. Mär 2008 02:29

Re: Gasteilchen-Simulation
 
Ja, ist okay. Wenn du den Sourcecode nutzt bitte aber auch eine PN an mich schicken, ich würde das Resultat gerne mal sehen.
Ansonsten kannst du auch einmal nach "Gasteilchen 3D" suchen - dann findest du das Programm das aus diesem Code entstanden ist. Wird dir sicherlich gefallen!

mfg, mr.winkle

Pungex 22. Mär 2008 15:25

Re: Gasteilchen-Simulation
 
ich habe das jetzt mal für mich umgeschrieben, aber irgendwie läuft das nich... kann mir da vllt einer helfen


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:56 Uhr.
Seite 2 von 4     12 34      

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