![]() |
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:
:bouncing4: was war jetzt so schwer daran? :bounce1:
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. |
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? |
Re: Gasteilchen-Simulation
ja aber ohne titelleiste und den bei xp blauen rand
|
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 |
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:
Nachtrag: komplett auf Integerarithmetik umgestellt
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; |
Re: Gasteilchen-Simulation
Liste der Anhänge anzeigen (Anzahl: 2)
Hi Pungex,
ich bin der Typ mit Gasteilchen3D :) Zitat:
Delphi-Quellcode:
Ich mach das immer mit folgender Funktion:
y:= A.Y-B.Y;
Delphi-Quellcode:
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 ;)
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; Meine Stossprozedur sieht so aus:
Delphi-Quellcode:
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.
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; mfg, mr.winkle :cheers: |
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 |
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 |
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 |
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. |
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