![]() |
Gasteilchen-Simulation
Hi,
ich soll für die Schule eine Gasteilchensimulation programmieren, nur leider habe ich davon so gar keine Ahnung. Grundidee ist erstmal, dass ich einen Raum festlege und erstmal ein Teilchen "losfliegen" lasse, so das dieses erstmal nur mit den Wänden kollidiert und dann eben weiterfliegt. Ich würde die Teilchen als Shape erstellen... Naja.. kann mir da jemand ein wenig weiterhelfen? MfG Pungex |
Re: Gasteilchen-Simulation
Naja, ich glaube eher ihr solltet Bällchen simulieren, weil zur Simulation von Gasteilchen müsste man mit Lösungen der
![]() |
Re: Gasteilchen-Simulation
meinste das mit dem an der wand wieder abprallen so wie dieser eine windows bildschirmschoner? Einfallswinkel = Ausfallswinkel???
MFG und herzlich Willkommen in der DP :dp: Lars Wiltfang |
Re: Gasteilchen-Simulation
![]() |
Re: Gasteilchen-Simulation
Es soll schon eine richtig Gassimulation (allerdings nicht 3D sondern 2D, 3D wäre mir dann doch zu schwer) werden... die kann ja auch erstmal relativ primitiv sein... also nach dem Prinzip 'Einfallswinkel = Ausfallswinkel' eines Teilchens mit einer Wand (=Shape knallt auf eine Begrenzung) würde mir für den Anfang schonmal reichen...
Ich weiß aber nicht mal wie ich das mit der Wand realisieren soll. Trotzdem schonmal ein Danke für die Antworten. MfG Pungex |
Re: Gasteilchen-Simulation
Zitat:
Ein Teilchen hat eine Geschwindigkeit in X- und Y-Richtung. (Gesamtgeschwindigkeit siehe Pythagoras) Bei der Reflektion an einer waagerechten Wand ändert sich das Vorzeichen der Geschwindigkeit in Y-Richtung (y_speed := -y_speed;). Wie es bei einer senkrechten Wand geht, brauche ich wohl nicht zu erklären. |
Re: Gasteilchen-Simulation
Eine richtige Simulation eines Fluids, und du scheiterst bereits an einer Wand? Wann musst du das Projekt abgeben? 2025?
Ich freu mich auf die Stelle, an der es an die bei diesen Skalen nötigerweise zu beachtende Brownsche Bewegung geht. |
Re: Gasteilchen-Simulation
Hehe... ich wär froh wenn ich das gar nicht abgeben müsste, aber des muss leider sein...
Ich wollte ja sowieso so ne Art Draw-A-Game programmieren, aber des war ihm zu einfach... hat mir mein Infolehrer dieses Projekt vorgeschlagen, fandsch auch nich so toll ^^ Außerdem solls nur nen "ganz simples" Programm werden... Thx für den Hinweis mit der Wand MfG Pungex |
Re: Gasteilchen-Simulation
Das mit der Wand klappt so irgendwie nich... aba ich probier mich erma selber weiter dran...
|
Re: Gasteilchen-Simulation
irgendwie funktioniert das nich so wie ich mir das vorstelle....
wie soll ich das shape / das gasteilchen am besten "auf den weg schicken", also wie lass ich das ding seine bewegung starten? |
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
|
Re: Gasteilchen-Simulation
Zitat:
Zitat:
|
Re: Gasteilchen-Simulation
Ich versteh ja selber nich wieso absolut nichts passiert, wenn ich den Knopf drücke....
Es kommen keine Fehlermeldungen, also habe ich mich schonmal nirgendwo verschrieben, denke ich. Das Image, was erscheinen müsste (unabhängig davon ob das eigentliche Programm erstmal läuft oder nicht), erscheint schon gar nicht... das bringt mich gerade schon total zu Verzweifelung. Ob das gesamt Programm geht, weiß ich nicht, weil ich das Image nicht sehe, indem die ganze Simulation abläuft. Die Frage also: Wieso sehe ich das Image nicht? Wenn mir das jemand beantworten könnte, wäre ich schon sehr froh. ^^ MfG Pungex /Edit: und sry für die plumpe erste frage... war/bin nur grad nen bissel verzweifelt |
Re: Gasteilchen-Simulation
Woher sollen wir das wissen, wenn du uns nur die Hälfte von deinem Projekt zeigst? Dazu gehört eine dfm-Datei für das Formular und eine dpr-Datei für das Projekt selber.
Bist du schon mal auf die Idee gekommen den Code mal zu debuggen (F5, F7) und die einzelnen Variablenwerte zu kontrollieren? |
Re: Gasteilchen-Simulation
Liste der Anhänge anzeigen (Anzahl: 1)
gut, dann hier mal der komplett ordner
|
Re: Gasteilchen-Simulation
Einen Fehler, nein zwei, habe ich schon gefunden. Das Timer Ereignis war nicht mit dem Timer verknüpft. Und setz mal einen Breakpoint (F5) auf for-Zeil:
Delphi-Quellcode:
Und fahr mal mit der Maus über die Variablen...
procedure TForm1.Timer1Timer(Sender: TObject);
var g,gg: byte; begin for g:=1 to GasteilchenMax do zeige_nichtGasteilchen(Gasteilchen[g]); Dann hast du hier
Delphi-Quellcode:
noch eine ungültige Fließkommaoperation, weil alle Werte null sind wahrscheinlich.
DeltaGeschwindigkeit_x:= 2 * Masse2 * DeltaMasse_x * (DeltaMasse_x * DelGeschwindigkeit_x + DeltaMasse_y * DelGeschwindigkeit_y) / ((sqr(DeltaMasse_x) + sqr(DeltaMasse_y)) * (Masse1 + Masse2));
Das alles hättest du schon mal selber rausfinden können. |
Re: Gasteilchen-Simulation
Und wie verknüpfe ich das Timerereignis mit dem Timer?
Auch versteh ich nicht was mir der Breakpoint bringt.... dadurch ändert sich für mich irgendwie nichts (also nichts erkennbares, weils dadurch immer noch nicht läuft, d.h. ich immer noch nicht das Image sehe.... was wiederum mit der ersten Sache zusammenhängt, die ich nicht verstehe). Nachvollziehen kann ich nur in etwa, warum da 0 rauskommt.... weil sich die einzelnen Werte nicht unterscheiden und dann K-K=0 ist... das alles multipliziert is dann ja auch 0.... richtig? |
Re: Gasteilchen-Simulation
Waren die Fragen jetzt zu doof oder unqualifiziert?
|
Re: Gasteilchen-Simulation
( Zu deiner Frage --> Der erste Punkt trifft eher zu)
Hast du kontrolliert, ob das Image auch die richtigen Werte in Width und Height hat? |
Re: Gasteilchen-Simulation
Zitat:
Zitat:
Zitat:
|
Re: Gasteilchen-Simulation
Zitat:
Für mich sieht das so aus, als ob ich das bereits getan hätte oO? //Edit: verstanden ^^.... zumindest wird jetzt das image angezeigt, aber die Kugeln nicht (nicht mal eine)... das bereitet mir jetzt wieder Kopfzerbrechen... Zitat:
Versteh ich nicht, ich habe doch weiter oben (beim erstellen der Kugeln) extra Parameter so gewählt, das die einzelnen Teile (Masse, Geschwindigkeiten und eben auch Positionen) unterschiedlich erstellt werden müssten. MfG Pungex |
Re: Gasteilchen-Simulation
Liste der Anhänge anzeigen (Anzahl: 1)
Das mag ja sein. Aber trotzdem ist alles null. Siehe Anhang. Und jetzt debugg deine Anwendung mal bitte selber und finde raus, warum die Werte alle null sin.
|
Re: Gasteilchen-Simulation
joa, werdsch mich morgen mal dran versuchen... hab heute leider nich so viel zeit
thx & mfg pungex |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 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