Delphi-PRAXiS

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)

Pungex 27. Jan 2008 12:27


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

Medium 28. Jan 2008 09:36

Re: Gasteilchen-Simulation
 
Naja, ich glaube eher ihr solltet Bällchen simulieren, weil zur Simulation von Gasteilchen müsste man mit Lösungen der Navier-Stokes-Gleichungen bzw. Näherungsverfahren dazu aufwarten ;). Zeig doch mal, was du bisher versucht hast, und woran du konkret fest hängst.

Larsi 28. Jan 2008 09:44

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

Rakshasa 28. Jan 2008 10:07

Re: Gasteilchen-Simulation
 
Hier hat sich doch jemand bereits sehr eindrucksvoll damit beschäftigt. :)

Pungex 28. Jan 2008 16:33

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

shmia 28. Jan 2008 16:40

Re: Gasteilchen-Simulation
 
Zitat:

Zitat von Pungex
Ich weiß aber nicht mal wie ich das mit der Wand realisieren soll.

Das ist extrem einfach !
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.

Medium 29. Jan 2008 01:22

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.

Pungex 29. Jan 2008 12:54

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

Pungex 6. Feb 2008 22:06

Re: Gasteilchen-Simulation
 
Das mit der Wand klappt so irgendwie nich... aba ich probier mich erma selber weiter dran...

Pungex 11. Feb 2008 15:53

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?

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

Luckie 22. Mär 2008 15:35

Re: Gasteilchen-Simulation
 
Zitat:

Zitat von Pungex
ich habe das jetzt mal für mich umgeschrieben, aber irgendwie läuft das nich...

Ist es eigentlich so schwer zu verstehen, dass "funktioniert nicht", "geht nicht", "tut nicht" absolut unzureichende Fehlerbeschreibungen sind?
Zitat:

kann mir da vllt einer helfen
Also so wohl nicht. Sollen wir uns jetzt ein gazes Projekt um deine Unit bauen, um den Fehler zu finden?

Pungex 22. Mär 2008 15:45

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

Luckie 22. Mär 2008 15:57

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?

Pungex 22. Mär 2008 16:02

Re: Gasteilchen-Simulation
 
Liste der Anhänge anzeigen (Anzahl: 1)
gut, dann hier mal der komplett ordner

Luckie 22. Mär 2008 16:11

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:
procedure TForm1.Timer1Timer(Sender: TObject);
var g,gg: byte;
begin
 for g:=1 to GasteilchenMax do zeige_nichtGasteilchen(Gasteilchen[g]);
Und fahr mal mit der Maus über die Variablen...

Dann hast du hier
Delphi-Quellcode:
DeltaGeschwindigkeit_x:= 2 * Masse2 * DeltaMasse_x * (DeltaMasse_x * DelGeschwindigkeit_x + DeltaMasse_y * DelGeschwindigkeit_y) / ((sqr(DeltaMasse_x) + sqr(DeltaMasse_y)) * (Masse1 + Masse2));
noch eine ungültige Fließkommaoperation, weil alle Werte null sind wahrscheinlich.

Das alles hättest du schon mal selber rausfinden können.

Pungex 22. Mär 2008 16:34

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?

Pungex 23. Mär 2008 19:46

Re: Gasteilchen-Simulation
 
Waren die Fragen jetzt zu doof oder unqualifiziert?

olee 23. Mär 2008 20:18

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?

Luckie 23. Mär 2008 20:49

Re: Gasteilchen-Simulation
 
Zitat:

Zitat von Pungex
Und wie verknüpfe ich das Timerereignis mit dem Timer?

Im Objektinspektor zum Beispiel.

Zitat:

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).
Natürlich ändert sich dadurch nichts, aber du kannst dir zur Laufzeit die Werte der Variablen angucken und dein Programm mit F7 Schritt für Schritt debuggen.

Zitat:

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?
Da kommt null raus, weil alle Variablen in der Rechnung null sind.

Pungex 24. Mär 2008 15:40

Re: Gasteilchen-Simulation
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von Pungex
Und wie verknüpfe ich das Timerereignis mit dem Timer?

Im Objektinspektor zum Beispiel.


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:

Zitat von Luckie
Zitat:

Zitat von Pungex
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).

Natürlich ändert sich dadurch nichts, aber du kannst dir zur Laufzeit die Werte der Variablen angucken und dein Programm mit F7 Schritt für Schritt debuggen.

Zitat:

Zitat von Pungex
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?

Da kommt null raus, weil alle Variablen in der Rechnung null sind.


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

Luckie 25. Mär 2008 12:54

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.

Pungex 25. Mär 2008 18:50

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