Autor |
Beitrag |
Dornathal
      
Beiträge: 38
|
Verfasst: Fr 06.06.08 17:38
Hey Leute hab versucht ne Wassersimulation zu schreiben.
Ich wollt mal fragen ob hier evtl. jemand sowas auch schon einmal versucht hat. Denn ich habe Folgende Probleme.
1. Wenn ich die Gravitation auf 0.00981 (Ich glaub weil der jede 1000stel Sekunde das Ausführt müsste das die normale sein) setze dann kommen die Molekuele irgendwie zu nah beieinander und explodieren.
2. Irgendwie sieht das gnaz nicht wie Wasser aus. Ich hab das nach einem Tutorial gemacht und so ne Formel für das Lennard-Jones-Potential benutzt um die Kräfte zwischen den Molekuelen zu erhalten.
Das Tutorial ist hier: elib.uni-stuttgart.d...147/pdf/DIP_2556.pdf
Weis jemand welche werte ich da für n.m einsetzen muss und was die Lennard-Jones konstante is?
Freue mich über antworten. MFG Dorn Moderiert von Christian S.: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Fr 06.06.2008 um 17:39
|
|
Wonko
      
Beiträge: 69
|
Verfasst: Fr 06.06.08 18:39
Hallo,
bei Deinem "Tutorial" handelt es sich wohl eher um eine Diplomarbeit  .
Wenn es um Wechselwirkung zwischen Molekülen geht, weiß ich nicht, was Du mit der Erdbeschleunigung anfangen möchtest  .
Für n und m kannst Du "beliebige" Werte einsetzen. 12 und 6 haben sich etabliert, da es mathematisch einfacher wird und die Wirklichkeit recht gut trifft.
Was meinst Du mit "Lennard-Jones-Konstante"? Es gibt da noch die minimale Energie (meist epsilon) und den Abstand, bei dem die Energie verschwindet (meist sigma).
Vielleicht hilft Dir diese "Versuchsanleitung" weiter, das sieht eher nach "Tutorial" aus und scheint didaktisch durchdacht.
Grüße,
Wonko
_________________ "Read the directions, even if you don't follow them.", Mary Schmich
|
|
Dornathal 
      
Beiträge: 38
|
Verfasst: Sa 07.06.08 11:19
Hey danke ich hab gedacht das epsilon sei diese konstante von Lennard Jones.
Muss ich was falsch verstanden haben.
Aber wenn ich doch ohne Gravitation mache dann bekommt man doch nicht so ne Tropfenbildung die eigentlich so Wasser immer macht. Das ist der Teil der auch funktioniert. Bekomm da immer alle 25 Molekuele in so nem Tropfenartigen Gebilde zusammen. Aber wenn ich un mehr machen will um diese Wellenbildung zu bekommen dann tropft der erst nach unten, dann schießen ein paar molekuele nach rechts und links auseinander. Soweit sieht das auch noch einigermaßen wie wasser aus. Aber normalerweise "wirbelt" das dann ja auch dann über die nachströmenden und fließt dann wieder zurück. Aber bei mir spritzt das dann in irgendwelche Richtungen weg. Glaube dass es z.T. daran liegt dass die Gravitation nur 1/100stel ist aber wenn ich die größer mache dann kommen die Teilchen irgendwie wohl zu nahe.
Werde mir mal dem Tutorial annehmen. Danke dafür schonmal.
|
|
Tilo
      
Beiträge: 1098
Erhaltene Danke: 13
Win7 geg. WInXP oder sogar Win98
Rad2007
|
Verfasst: Sa 07.06.08 11:27
Hast Du auch bedacht das zwischen Wassermolekülen eine elektrische (? eventuell nicht ganz korrekte Bezeichnung) Anziehungskraft besteht(Besonders wenn sie sehr nahe sind)? Wasser ist ein Dipol(H20). Dadurch bilden sich asserstoff/Sauerstoffbrüken zwischen benachbarten Molekülen. Daddurch "haften" die Wassermoleküle zusammen.
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Sa 07.06.08 12:23
Hi,
Dein Wassertropfen platzt als auseinander, habe ich das richtig verstanden? Hast du berücksichtigt, dass um das Wasser Luft ist? Sonst würde sich der tropfen ja verhalten wie im absoluten Vakuum...
2): Ein Tropfen mit 24 Molekülen verhält sich ja wahrscheinlich gar nicht wie ein makroskopischer.
3): Dein nTropfen fällt also bei normaler Gravitation zum Schwarzen Loch zusammen  IMHO fehlen einfach grundlegende quantenmechanische Eigenschaften, die das verhindern.. Solange du das Wasser auf molekularer Ebene beschreibst und Gravitation haben willst, musst du IMHO auch Quantenmechanik einfließen lassen, da sie den Mikrokosmos dominiert.
Quantenmechanik und Grvitation geht aber zurzeit nicht.. Entweder du hast einen Fehler in der Stärke von Gravitation oder Elektromagnetismus oder du musst die Gravitation rauslassen.. denn um ihre Auswirkungen zu verhindern bräuchtest du eine QUANTENTHEORIE DER GRAVITATION.
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Dornathal 
      
Beiträge: 38
|
Verfasst: Sa 07.06.08 13:11
Hmm stimmt muss wohl die Luft vergessen haben.
So macht das natürlich sinn.
Hier is schon mal so was ich gemacht habe
In das Kästchen da mit 'w' die Molekuele initalisieren. Hab die mal auf 5^2 gesetzt damit das simulieren schneller geht und da sieht man dann auch die tropfenbildung. mit dem Mausklick macht man immer nur ein Molekuel mehr rein.
Is momentan noch in der MsUm geschrieben deswegen nur die exe.
Einloggen, um Attachments anzusehen!
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Sa 07.06.08 13:13
Was? mSuM - modul Stifte und Mäuse  Den Mist muss ich in der Schule verwenden^^
Edit: Habs runtergeladen. Tatsächlich mSuM... Ist ganz schön, soweit 
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Dornathal 
      
Beiträge: 38
|
Verfasst: Sa 07.06.08 13:52
Ich reg mich da auch auf... vor allem wir fangen jetzt (3 Wochen vor Ferien wo noch 1,5 wegfallen wegen Ausflüge und Projekttage) mit der richtigen Oberfläche, von der ich momentan immer noch Bahnhof verstehe.
naja mit Informatik in der Schule geht das wohl nicht weiter und deswegen hat sich der ganze Mist auch nicht gelohnt. Ich hasse diese mSuM <<< sol angeblich mit Stiften und Mäusen heißen. Ist aber bloss ne Übersetzung von Delphi in Deutsch Pen ist nen Buntstift und die Farben sind BLAU GRUEN GELB etc. Ich find das hilft bloss zum lernen wie Klassen funktionieren.
Aber das braucht man nicht auf deutsch zu machen sollte man besser direkt das richtige benutzen. Jetzt müssen die die das am anderen Gymnasium genommen haben wo nen Kurs zusammenkommt zweimal den selben mist lernen was ich voll Zeitverschwednung finde.
Naja will mich hier nicht aufregen *finger verkreuz* Soll hier ja um Wasser gehen was nicht in Form von Tränen tropft...
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Sa 07.06.08 14:33
Hi,
Es gab dazu hier übrigens schonmal ein Topic..
Arm an der ganzen Sache ist vor allem, dass Delphi bei den Hints weiterhin Integer statt "GanzeZahl" anzeigt. Das verwirrt. Wenn dann sollte es statt "type GanzeZahl = Integer" "type GanzeZahl = -2147483648..2147483647" heißen.. Spätestens bei "Wahrheitswert = Boolean" hörts dann aber auf, find ich.
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Allesquarks
      
Beiträge: 510
Win XP Prof
Delphi 7 E
|
Verfasst: Sa 07.06.08 15:12
Ein Lennard Jones Potential zu verwenden ist erstmal nicht schlecht (ist eine empirische Näherung). Quantenmechanik ist darin übrigens bedingt berücksichtigt (der 1/r^12 Term beeinhaltet wesentlich das Pauli-Verbot und die Coulombabstoßung). Der 1/r^6 Term resultiert nun gerade aus der gegenseitigen Polarisation sollte also berücksichtigen, dass Wasser ein Dipol ist. Die Konstanten im Lennard Jones sind Materialspeziefisch!!! Und gerade bei Wasser werden die für den 1/r^6 Term völlig verschieden von unpolaren Stoffen sein.
Ich denke du hast einfach einen Fehler darin. Egal wie stark die Gravitaion sie ist eben nur 1/r, der 1/r^12 Term hält sie garantiert auf Abstand alles andere ist unphysikalisch. Nebenbei: Die Gravitation spielt für Sachen wie Kohäsion und Ausbildung der Nahordnung von Stoffen keine Rolle (Sie ist um viele Größenordnungen schwächer). Die kannst du also direkt weglassen.
Und als letzten Punkt: So ein minimales System aus 50 Molekülen oder so ist so stark entropisch dominiert, dass das sich sicher auch nicht wie ein Wassertropfen verhält.
|
|
Dornathal 
      
Beiträge: 38
|
Verfasst: Sa 07.06.08 17:09
Hmm bei 24 Molekuelen hab ich nur grade den Vorteil gesehen dass das so wenige sind dass sie den ganzen Boden nicht kompett bedecken und man erkennen kann dass dadurch dass sie sich übereinander ziehen anscheinend schon so ein annäherndes Verhalten von Wasser erkennbar ist, denn wenn man zwei Tropfen auf eine Folie tropft dann ziehen sich diese beiden Tropfen wenn sich nahe genug zusammen sind auch an und bilden einen neuen Tropfen.
Ich kann das auch mit mehr molekuelen simulieren. Hab das mal mit 15^2 Molekueln gemacht und da verhält sich das erst mal im Flug realistischer.
Hier hab ich mal die tasten e r und t jeweils mitbelegt mit denen man dann mehr Fluide gleichzeitig erstellen kann. (Drauf achten dass diese beim Erstellen nicht den Rand berühren) => w ^= 5^2 e ^= 10^2 r ^= 15^2 t ^= 20^2 Molekuele;
So nun mal zu meiner Frage Hidden meinte ich soll die AUssenluft noch mitsimulieren. Wenn man nun das ganz einfach mal vereinfacht dann dürfte die Luft doch eigentlich ausser Reibung an den Molekuelen nichts verursachen. Denn die Drückt an jedem molekuel doch von allen Richtungen gleich stark. Allerdings würde die Luft dann ja auch den freien fall abbremsen weshalb ich den dann auch größer wieder machen könnte.
Jetzt hab ich bloss ein Problem wenn ich so 20^2 Molekuele Simuliere dann geht die FPS schon ziemlich in den Keller. wie ist das erst mit Luft noch drum herum. Gibt es da ne einfache und schnelle Möglichkeit? Ich hab das einfach mal versucht den Bewegungsvektor immer ein bisschen zu skalieren aber dann kann ich iwi die Beschleunigung x beliebeig groß machen die wirkt sich dann so gut wie gar nicht mehr auf die Molekuele auf und diese fallen immer mit der selben geschwindigkeit und beschleunigen auch nciht mehr. Also kann das ja nicht die Lösung sein.
@hidden deshalb hab ich das ja auch nur kurz angerissen...
P.S. (Muss ich jetzt das zuerst hochgeladenen Programm löschen? Weis das grade nciht.
Einloggen, um Attachments anzusehen!
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Sa 07.06.08 18:03
Dornathal hat folgendes geschrieben: | So nun mal zu meiner Frage Hidden meinte ich soll die AUssenluft noch mitsimulieren. Wenn man nun das ganz einfach mal vereinfacht dann dürfte die Luft doch eigentlich ausser Reibung an den Molekuelen nichts verursachen. Denn die Drückt an jedem molekuel doch von allen Richtungen gleich stark. Allerdings würde die Luft dann ja auch den freien fall abbremsen weshalb ich den dann auch größer wieder machen könnte. |
Hi,
Das stimmt so nicht. Erstens nimmst du damit an, dass es sich bei deinen Molekülen um makroskopische Körper handelt, bei denen statistisch gesehen von allen Seiten gleich stark gestossen wird. Zweitens vernachlässigst du so den Auftrieb(wenn wir mal bei makroskopischen Körpern bleiben).
Gut. Nehmen wir einmal an du betrachtest die Moleküle als makroskopische Körper, was man angesichts der enormen Vereinfachung ruhig mal machen kann. Dann ist aber die Luftmolekül-Konzentration außerhalb des Tropfens höher als innen und der Druck wirkt nicht von allen Seiten gleich stark auf das Molekül ein.
Zitat: | Jetzt hab ich bloss ein Problem wenn ich so 20^2 Molekuele Simuliere dann geht die FPS schon ziemlich in den Keller. wie ist das erst mit Luft noch drum herum. Gibt es da ne einfache und schnelle Möglichkeit? Ich hab das einfach mal versucht den Bewegungsvektor immer ein bisschen zu skalieren aber dann kann ich iwi die Beschleunigung x beliebeig groß machen die wirkt sich dann so gut wie gar nicht mehr auf die Molekuele auf und diese fallen immer mit der selben geschwindigkeit und beschleunigen auch nicht mehr. Also kann das ja nicht die Lösung sein. |
Hierfür habe ich einen Ansatz, der das ganze gleichzeitig realistischer macht, musst du mal schauen, ob sich das umsetzen lässt: Man sieht ja auch sonst keine einzelnen Moleküle.
Die Hauptlast an dein Programm besteht darin, die einzelnen Moleküle zu zeichnen. Ich würde nun immer nur Molekülansammlungen einer gewissen Größe zeichnen, damit kannst du die Systemlast merklich reduzieren und eine realistische Anzahl an Molekülen pro Tropfen initialisieren.
Die Kraft durch den Luftdruck berechnet sich dann aus der Anzahl der Wassermoleküle in unmittelbarer Umgebung; je weniger Wasser, desdo mehr Luft. Das berechnest du nicht ständig und für jedes Molekül sondern alle n Bewegungsdurchläufe einmal für jeden Pixel(oder sowas, jedenfalls konstant große Cluster/Zonen).
Dieser Ansatz wäre sicherlich sehr kompliziert und mit mSuM schon garnicht zu bewerkstelligen. Zumal er sich sehr von deinem bisherigen unterscheidet. Wenn du allerdings eine realistische Teilchenzahl erreichen willst, wird dir wohl nichts weiter übrig bleiben als nicht alle Teilchen zu zeichnen. Dazu müsstest du eine Datenstruktur anlegen, die alle Teilchen nach ihrer Position auflistet.
Zitat: | P.S. (Muss ich jetzt das zuerst hochgeladenen Programm löschen? Weis das grade nciht. |
Am besten beide hochgeladenen Versionen löschen und im ersten Post immer die aktuelle Version hochladen.
PS: Du solltest die Energie limitieren. Wenn man ein Wassermolekül direkt auf ein anderes setzt bekommt es näerungsweise unendlich viel Energie, die es auf alle anderen überträgt. Dadurch haben direkt alle ziemlich hohe geschwinduigkeiten und man kann nichts mehr erkennen.
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Dornathal 
      
Beiträge: 38
|
Verfasst: Di 17.06.08 18:47
|
|
Allesquarks
      
Beiträge: 510
Win XP Prof
Delphi 7 E
|
Verfasst: Di 17.06.08 19:08
Also dein Engagement ist lobenswert. Damit du auch schnell Erfolgserlebnisse bekommst hier vlt ein paar Tipps (ich habe dich so verstanden, dass du die Moleküle als Kugeln simulieren möchtest und nicht Wasser über Strömungsgleichungen):
Informatik:
Eine SQL Datenbank ist wahrscheinlich eine sehr schlechte Idee. 200 Kugeln kommt mir spontan sehr wenig vor. Du brauchst ein array so groß wie die Anzahl der Kugeln. Nach dichtester Kugelpackung und so ergeben sich je nach nächster Nachbarn oder übernächste Nachbarn Wechselwirkung (ich denke weiter sollte man nicht gehen) eine maximalzahl von nächsten Nachbarn (schätze mal unter 20). die solltest du in einem anderen array speichern und updates der Konfiguration nur über diese laufen lassen.
Ich denke du könntest die Rechnung noch beschleunigen, indem du dir Näherungstabellen für die verwendeten e-Funktionen oder Potenzen (r^12) baust. Insbesondere kannst du mit denen gleich ggf die Kehrwerte bilden (einmalig die hast du ja dann gespeichert) (denn Multiplikationen sind viel schneller als Divisionen).
Physik:
Wie schon erwähnt Gravitation kannst du eigentlich weglassen solange du keine Wände hast, weil du dann immer ins Schwerpunktsystem transformieren kannst. Luftdruck würde ich in deiner Version auch eher weglassen, aber wenn dann einfach über zusätzliche Partikel simulieren die im Mittel 3/2 k_B T Energie besitzen ok die Wasserteilchen haben im thermischen Gleichgewicht dieselbe Energie.
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Di 17.06.08 19:21
Hidden hat folgendes geschrieben: | Die Kraft durch den Luftdruck berechnet sich dann aus der Anzahl der Wassermoleküle in unmittelbarer Umgebung; je weniger Wasser, desdo mehr Luft. Das berechnest du nicht ständig und für jedes Molekül sondern alle n Bewegungsdurchläufe einmal für jeden Pixel(oder sowas, jedenfalls konstant große Cluster/Zonen). |
Da fällt mir spontan ein kleiner Deknfehler auf: Bei einem sich bewegenden, schwingenden Wassertropfen könnte es auf Druckwellen ankommen - die Luft könnte nicht überall am Tropfen den gleichen Druck haben.
Dornathal hat folgendes geschrieben: | Aber eine Frage, Wenn man nun ermittelt hat wie viele Moleküle in der Nähe sind muss die Luft die Molekuele auch in bestimmte Richtung drücken oder nicht. also wenn man sag ich mal nen tropfen Wasser hat und man berechnet die "Luftkraft" für einen äußeren Pixel muss diese ja in Richtung des Molekuels gehen. Oder hab ich das jetzt falsch verstanden und du wills den Druck berechnen der momentan in einem dieser Pixel herrscht. Und mittels Druckunterschied dann die Moleküle bewegen. |
Angenommen, um ein Wassermolekül sieht es so aus: Nun sollte das mti __ gekennzeichnete Molekül beispielsweise eine zusätzliche Kraft nach unten erfahren.
Zitat: | Dann allerdings würden die Wassertropfen ja noch mehr danach streben auseinander zu driften. denn in dem Tropfen ist der Druck denk ich sicherlich größer als außen an der Luft. |
Das ist er ja auch in der Realität  Dein Problem ist, denke ich, dass du den Druck des Wassers durch das Vorhandensein von einzelnen Wassermolekülen zwar berücksichtigst, den Druck der Luft als schwächeren Gegenspieler allerdings nicht.
Zitat: | Aber was ich bisher noch nicht verstehe ist das mit der Datenstruktur und der Position der Teilchen weil ich hab das ja neuerdings auch mit 3Koordinaten (x,y,z) und wenn ich das (Ich denk da an meine MySQL erfahrungen) in eine Datenabank anlege dann würde es auch wieder einige Abfragen brauchen um die Naheliegenden Punkte zu bekommen. |
Dass sich ein 3D-Wassertropfen anders verhalten würde als ein 2D- hast du richtig erkannt. Vermutlich bilden sich durch die Dreiatom-Dipolstruktur des Wassers die bekannten Brückenbindungen und nehmen in 3D ganz andere Strukturen ein. Das ist aber nur eine Frage, wie realistisch du das machen willst.
Zur Datenstruktur: Im Prizip reicht es ja einfach, ein Array mit allen Molekülen drin zu machen, in dem du records(x, y, z - Position) ablegst. Bei Problemenschau am besten mal hier drüber.
Wenn du nun aber nach der Position auf ein Molekül zugreuifen willst, bräuchtest du ein 3D-Array, in dem du sie nach der Position ordnest. Zusätzlich(damit du nicht ständig das Riesenarray durchlaufen musst) immernoch das kleinere.
Ich denke mal mit 3 Dimensionen läuft dir das ganz etwas aus dem Ruder: Du müsstest den Tropfen dann ja auch 3D darstellen..
mfg Dornathal[/quote]
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Dornathal 
      
Beiträge: 38
|
Verfasst: Di 17.06.08 19:32
1.
Hmm ich wollte bisher erstmal das mit der Aussenluft in die Simulation miteinbauen, denn so wie die Sumulation aussieht kommt es dem Beispiel was ich glaub ich schon mal geschriebe habe sehr ähnlich, bloss an den Rändern spritzen die Molekuele nach oben weg.
Aus dem Grund denk ich dass es wirklich mit der Umgebungsluft zusammenhängen kann.
Ich habe bloss die Idee mit dem vereinfachten Ableiten des Druckes der Luft auf die Molekuel im bezug zu der Anzahl der Molekuele in der Nähe nicht ganz verstanden. Denn nehmen wir einmal an ich überprüfe ein Molekuel und bekomme als Resultat ich hätte 7 Andere Molkuele drumrum. (Nehmen wir an bei einem inmitten des Tropfens schwimmenden Molekuels sind 12 in der Nähe(im Schnitt)) Wie weis ich aus der Information in Welche Richtung die Luft das Molekuels evtl. Abbremst.
<< Primäre Klärungsfrage momentan.
2.
200 Molekuele sind wirkleich ein bisschen wenig, allerdings ist die Framerate bei 500 z.B. so gering dass es nur ruckelt. Also kann man das dann nicht mehr als realtime simulation (oder wie das heisst) bezeichnen, oder?
3.
Delphi-Quelltext 1: 2: 3: 4:
| for lx:= low(Wasser) to high(Wasser) do for ly:= low(Wasser) to high(Wasser) do if lx <> ly then Wasser[lx].Anziehung(Wasser[ly]); |
Damit übergebe ich momentan jedem Molekuel einen möglichen Partner mit dem eine solche Wechselwirkung stattfinden könnte.
Delphi-Quelltext 1: 2: 3: 4:
| lRichtung := SubtrahiereVektor(hatGLKugel.GibPosition,pWasser.hatGLKugel.GibPosition); lAbstand := Magnitude(lRichtung); if (lAbstand < (GibRadius * CONST_Abschneideradius)) then |
Wenn also die Molekuele innerhalb einem Kreis von 3 (Const_Abschneideradius) * dem Radius der Kugel befinden wird die Wechselwirkung ausgerechnet.
Gibt es da irgendwie noch eine Vereinfaachung?
eventuel so (nicht getestet grade mal Idee gehabt)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| TWasserliste : Array of TWasser; Wasserarray : Array of Array of Array of TWasserListe;
for lx := wasser[lWasserIndex].Pos.X -2 to wasser[lWasserIndex].Pos.X +2 do for ly := wasser[lWasserIndex].Pos.Y -2 to wasser[lWasserIndex].Pos.Y +2 do for ly := wasser[lWasserIndex].Pos.Z -2 to wasser[lWasserIndex].Pos.Z +2 do for lWasserListeIndex := low(Wasserarray[lx][ly][lz]) to high(Wasserarray[lx][ly][lz]) do wasser[lWasserIndex].Anziehung(Wasserarray[lx][ly][lz][lWasserListeIndex]; |
Also so ungefähr?
Anders kann ich mir das mit der Datenstrucktur nicht Vorstellen.
MFG Dornathal
P.S.
Werde das dann evtl. nochmal komplett neuprogrammieren je nachdem wie weit das geändert werden muss.
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Di 17.06.08 20:01
Dornathal hat folgendes geschrieben: | 1.
Hmm ich wollte bisher erstmal das mit der Aussenluft in die Simulation miteinbauen, denn so wie die Sumulation aussieht kommt es dem Beispiel was ich glaub ich schon mal geschriebe habe sehr ähnlich, bloss an den Rändern spritzen die Molekuele nach oben weg.
Aus dem Grund denk ich dass es wirklich mit der Umgebungsluft zusammenhängen kann.
Ich habe bloss die Idee mit dem vereinfachten Ableiten des Druckes der Luft auf die Molekuel im bezug zu der Anzahl der Molekuele in der Nähe nicht ganz verstanden. Denn nehmen wir einmal an ich überprüfe ein Molekuel und bekomme als Resultat ich hätte 7 Andere Molkuele drumrum. (Nehmen wir an bei einem inmitten des Tropfens schwimmenden Molekuels sind 12 in der Nähe(im Schnitt)) Wie weis ich aus der Information in Welche Richtung die Luft das Molekuels evtl. Abbremst.
<< Primäre Klärungsfrage momentan. |
Daraus nicht. Du kannst nur bestimmen, in welcher Richtung vom Molekül kein anderes ist und dann annehmen, dass dort Luft ist -> for Richtungen if Leer then Kraft in die Richtung.
Dummerweise hast du damit kein geschlossenes System mehr  Der simmulierte Wechselwirkungspartner Luftmolekül an dieser Stelle trägt Energie hinaus oder hinein.
Zitat: | 2.
200 Molekuele sind wirkleich ein bisschen wenig, allerdings ist die Framerate bei 500 z.B. so gering dass es nur ruckelt. Also kann man das dann nicht mehr als realtime simulation (oder wie das heisst) bezeichnen, oder? |
Also imho bedeutet kein Ruckeln, kombiniert mit vielen Teilchen, dass du die einzelnen Moleküle nicht oder nur zu Debugging-Zwecken zeichnest. Du würdest dann dein Array abscannen und mit einem Timer alle n Millisekunden(wahrscheinlich 1000-2000) die Stellen dunkler machen, an denen viele Moleküle sind. Alternativ könntest du auch ein Video erzeugen und die Arbeit im Vorraus machen, dann auf play drücken aber das ist wohl ein bissel viel
Delphi-Quelltext 1: 2: 3: 4:
| for lx:= low(Wasser) to high(Wasser) do for ly:= low(Wasser) to high(Wasser) do Wasser[lx].Anziehung(Wasser[ly]); | Hmm.. die Moleküle ziehen sich ja gegenseitig an und dann gibt es jeweils noch eine Gegenkraft dazu, also 4x. Tschuldigung, wenns jetzt banal wird aber das hast du berücksichtigt, oder?
Ich überlege gerade, ob es sich lohnen würde, die Kraft zu verdoppeln und dafür das doppelte Ansteuern eines Molekülpaares zu unterbinden. Vermutlich ist aber wie gesagt das Zeichnen der springende Punkt und das hier wäre wohl eher eine Kleinigkeit.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| TWasserliste : Array of TWasser; Wasserarray : Array of Array of Array of TWasser; for lx := -2 to 2 do begin for ly := -2 to 2 do begin for ly := wasser[lWasserIndex].Pos.Z -2 to wasser[lWasserIndex].Pos.Z +2 do for lWasserListeIndex := low(Wasserarray[lx][ly][lz]) to high(Wasserarray[lx][ly][lz]) do wasser[lWasserIndex].Anziehung(Wasserarray[lx][ly][lz][lWasserListeIndex]; |
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Dornathal 
      
Beiträge: 38
|
Verfasst: Di 17.06.08 21:17
Zitat: |
for lx:= low(Wasser) to high(Wasser) do
for ly:= low(Wasser) to high(Wasser) do
//if lx <> ly then //imho schneller, nicht jedes zu überprüfen.. eine Wechselwirkung mit sich selbst hätte ja auch nichts zur Folge, oder?
Wasser[lx].Anziehung(Wasser[ly]);
|
wenn lx = ly dann ist der Abstand = 0 . Und dann kommt dividiere durch null error. Also gar nicht erst berücksichtigen.
Ausserdem jo kleiner der Abstand desto größer die Kraft und die Steigt exponentiel an. Das weiderrum hat zur Folge, dass das ganze System explosionsartig auseinanderdriftet.
Zitat: | TWasserliste : Array of TWasser;
Wasserarray : Array of Array of Array of TWasser; //das wäre ja schon 4D, oder was meinst du damit?
// nehmen wir an ein Wasserteilchen hat position (5,5,5) und wir wollen in einem Radius von 2 alles überpreuefen dann
for lx := -2 to 2 do begin
for ly := -2 to 2 do begin //hier weiß ich nicht, as du willst. die weiderverwendung der Variablen führt definitiv zu einem Fehler - oder ist das ein Copy- und Paste-Fehler?
for ly := wasser[lWasserIndex].Pos.Z -2 to wasser[lWasserIndex].Pos.Z +2 do
for lWasserListeIndex := low(Wasserarray[lx][ly][lz]) to high(Wasserarray[lx][ly][lz]) do
wasser[lWasserIndex].Anziehung(Wasserarray[lx][ly][lz][lWasserListeIndex];
|
Ja denke schon dass es 4D wird. einmal in Drei D die ganzen Koordinaten der Wasserteilchen und jede Koordinate beinhaltet ein Array indem alle Wasserteilchen gelistet sind die auf dieser Koordinate sind. Dann hab ich das zwar nicht ganz so genau aber es vereinfacht schonmal die for schleife von oben. Das habe ich dabei gedacht. Denn koordinate 5,5,5 sollte einfach dann alle Molekuele beinhalten dessen Position in dem Kasten von (const_abstand pixel)^3 sind. >>>
kleineres Array weniger tauschen der Molekuele. Dachte du meintest das mit Clustern wenn man das so beschreiben kann.
Und wegen dem Platz für mehr als ein Molekuel in diesem Bereich dann noch ein Array das die ganzen Wassermolekuele beinhaltet die an dem Platz sind. (War ne Spontanidee, wollte wissen ob die Zukunft hat oder schon im Keim erstickt werden will);
Ne Frage: Ist das da Sinnvoll mit Pointern zu arbeiten? Ich gehe jetz vonder Übersetzung aus denn ich hab mit Pointern momentan kein Kontakt. Also ich denke dass Pointer einfach nur die Adresse enthalten zu einer Instanz einer Klasse. Oder liege ich da jetzt falsch?
Naja wäre besser anderes Thema...
Nochmal zurück zu der Luft.
Nehmen wir an (In meinem Beispiel ist das eins der Probleme), die ganzen Molekuele haben die Energie = 0 am Anfang (Also wenn man Bewegeung addiert(Ich hab Brownsche bewegung aussen vor gelassen))(Eins der möglichen Fehler) dann bewegen sich die Äusseren molekuele richtung Zentrum und die inneren richtung aussen nachdem diese das Zentrum errecht haben. Dabei entsteht nach einiger Zeit nen Loch mitten in dem Tropfen. Logischerweise hat dieses Loch da denke ich nichts drin zu suchen. Also müsste dort ja unterdruck herschen was den Tropfen wieder ein bisschen Zusammmenhält.
Wie unterscheide ich jetzt zwischen "Sog" und "Druck" wenn da kein Molekuel in die Richtung ist.
Oder gibt es dieses Problem mit implementation der Luft nicht mehr da sich die Aussenluft darum kümmert dass sich mitten im Tropfen kein großes Loch mehr bilden kann und wenn doch es sich schnell wieder verflüchtigt. und sich das ganze dann einpendelt.
2.
Zitat: | Hmm.. die Moleküle ziehen sich ja gegenseitig an und dann gibt es jeweils noch eine Gegenkraft dazu, also 4x. Tschuldigung, wenns jetzt banal wird aber das hast du berücksichtigt, oder? |
Also ich addiere nur die Kraft die durch Anwesenhait des übergebenen Molekuels auf das Molekuel sich auswirkt also in der Procedure wird nichts an der GEschwindigkeit und Richtung des Parametermolekuels geändert. Nur das aktuelle Molekuel.
Ich hab da auch überlegt evtl die For-schleife zu kürzen aber bin da noch nicht ganz zu gekommen.
Also gegenkraft hab ich jetzt auch nicht berücksichtigt, da ich dachte die steckt noch in der Wechselwirkung mit drin bzw. wenn man die Einwirkende Kraft verdoppelt kommt die Gegenkraft dabei raus weil die muss ja eigentlich gleich der Kraft des anderen Molekuels sein. abstand ist ja gleich und Richtung spielt keien Rolle. ich meine Das steckt auch schon in der Formel drin um die Kraft auszurechnen kann mich aber auch irren und wenn ja dann steckt die 2 bei mir in dem epsilon der Formel (kann ich dann ja verdoppeln um Gegenkraft mitdrin zu haben)
MFG Dorn
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Di 17.06.08 22:10
Dornathal hat folgendes geschrieben: | Ja denke schon dass es 4D wird. einmal in Drei D die ganzen Koordinaten der Wasserteilchen und jede Koordinate beinhaltet ein Array indem alle Wasserteilchen gelistet sind die auf dieser Koordinate sind. |
Wie du schon festgestellt hast, wäre an der Stelle eine Gleitkommaoperation durch null. Somit darf zu jeder Zeit nur ein Molekül einen Platz belegen. Wenn du überlegst, dass diese Teilchen unscharf und von virtuellen Teilchen umgeben und "geschützt" sind, könnte das auch garnicht passieren. Müsstest du unterbinden.
Zitat: | Ist das da Sinnvoll mit Pointern zu arbeiten? |
Die Frage ist, ob du implizit oder explizit mit Pointern arbeitest(das kannst du wohl kaum verhindern, du wirst immer Pointer haben). Ich sehe keinen Grund, explizit min Pointern zu arbeiten, warum  ?
[quote}Nehmen wir an, die ganzen Molekuele haben die Energie = 0 am Anfang[/quote]Hmm.. Mir fält gerade nicht der Fehler ein. Im Prinzip hättest du damit Eis am absoluten Nullpunkt, da dürfte sich nichts tun. Vermutlich ist der Abstand ziwschen den Molekülen so groß, dass du erstmal große Lageenergie und damit doch Wärme hast. Damit erklärt sich auch dein "Loch" am Anfang: es sind Lücken zwischen, du hast zu Beginn eine Implusion.
Noch was: Eigentlich darfst du auf molekularer Ebene nicht mit dem Druck argumentieren. In unserer Makro-Welt müsste sich da ganz schön viel unwahrscheinliches aufsummieren. Hier allerdings betrachten wir eine Ebene, auf der auch Sachen vokommen, die in unserer Welt weggemittelt werden.
Zitat: | Oder gibt es dieses Problem mit implementation der Luft nicht mehr da sich die Aussenluft darum kümmert dass sich mitten im Tropfen kein großes Loch mehr bilden kann und wenn doch es sich schnell wieder verflüchtigt. und sich das ganze dann einpendelt. |
und nochmal: deine paar Moleküle wabern interessant wie makroskopisches Wasser herum; du hast allerdings eine 2D-Welt und äußerst kleine Molekülzahlen, das ist kein Wassertropfen so. So etwas kann also sehr gut vorkommen. Allerdings scheinen die Unterschiede wohl doch nicht so riesig zu sein, mit dem Loch könntest du imho eventuell trotzdem leben müssen.
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
|