Re: Gasteilchen 3D [Version 1.6!]
Zitat:
Oder: Du schreibst nen Algo, der die Teilchen gleichmäßig (also nicht zufällig) in der Box verteilt. Durch den kannst du dann errechnen, ob es überhaupt möglich ist, so viele Teilchen in die Box zu packen. Wenn nicht --> Message sonst --> Teilchen in der berechneten Konstellation anordnen Das könnte aber komplizierter sein als das erste. Ich hatte nämlich auch nach ner Zeit die Lust verloren, dein Programm auszuprobieren, weil es immer wieder nach ca. ner Minute (als ich ne bestimmte Einstellung ausprobiert hab) eingefroren ist. |
Re: Gasteilchen 3D [Version 1.6!]
mh. Ich versuche jetzt erst einmal die Teilchen geordnet in den Raum zu setzen, bekomme das aber nicht ganz hin:
Versuch:
Delphi-Quellcode:
Warum wird so nicht der komplette Raum ausgefüllt, sondern es bleiben immer Ränder? :gruebel:
var x,y,z:single;
d,f:single; i:integer; begin //T ist das Array mit den Teilchen f:=power(high(T),1/3); //Der Raum ist 70 Einheiten groß d:=70 / f; y:=0; x:=0; z:=0; for i:=0 to high(T) do begin T[i].x:=x; T[i].y:=y; T[i].z:=z; x:=x+d; if x>f*d then begin x:=1; y:=y+d; end; if y>f*d then begin y:=1; z:=z+d; end; end; |
Re: Gasteilchen 3D [Version 1.6!]
Zitat:
Delphi-Quellcode:
Warum nicht Length statt High?
f:=power(high(T),1/3);
Delphi-Quellcode:
Wenn eine Koordinate 0 ist, liegt das Teilchen ja auf der Oberfläche der Box. Ich würd's also auf d/2 setzen. Dann haben alle außen liegenden Teilchen den gleichen Abstand zur nächst gelegenen Seite der Box (nämlich d/2). Wenn d < Teilchendurchmesser, bedeutet das, dass die Teilchen nicht in die Box passen (zumindest nicht nach diesem Algorithmus)
y:=0;
x:=0; z:=0;
Delphi-Quellcode:
Aus Optimierungsgründen vll besser direkt auf x>70 prüfen. Kann man aber auch so lassen.
if x>f*d then begin
Delphi-Quellcode:
Wie kommst du auf 1? Ich würd's wieder auf d/2 setzen (s.o.)
x:=1;
Delphi-Quellcode:
Die letzten beiden Punkte gelten auch hier. Außerdem würde ich diese Abfrage in die andere hineinschachteln, da sie ja eigentlich nur aufgerufen werden braucht, wenn y verändert wurde (nach y:=y+d). Falsch wär es zwar nicht es hintereinander zu setzen, kostet aber unnötige Rechenzeit.
if y>f*d then begin
y:=1; z:=z+d; end; Aber wie gesagt, so würde das nur Aufgehen, wenn die Anzahl der Teilchen eine Kubikzahl ist. Denn sonst würdest du ja versuchen, beispielsweise 2,5 Teilchen in eine Reihe zu setzen. Dafür könntest du aber ja die Anzahl der Teilchen einfach auf die nächsthöhere Kubikzahl erhöhen, dann die Box füllen und anschließend die hinzugefügten Teilchen wieder löschen. Aber die Idee, es mit der dritten Möhre zu machen, ist gut. Bessere Algorithmen, die die Teilchen ideal gleichmäßig verteilen, auch wenn die Anzahl keine Kubikzahl ist, wären wohl unglaublich kompliziert zu implementieren (vll gibt es so einen Algo bisher sogar gar nicht, genau wie das bisher ungelöste mathematische Rätsel, Punkte gleichmäßig auf einer Kugeloberfläche zu verteiln), erst Recht, wenn die Teilchen unterschiedliche Durchmesser haben. |
Re: Gasteilchen 3D [Version 1.6!]
Liste der Anhänge anzeigen (Anzahl: 1)
Nach diesen Änderungen habe ich allerdings das Problem, dass Teilchen aus dem Raum austreten - siehe Screenshot!
Der Code sieht mittlerweile so aus:
Delphi-Quellcode:
mit 125 oder auch 52 Teilchen klappt das z.B. einwandfrei, aber mit 81 und 39 siehts sehr falsch aus.
var x,y,z:single;
d,f:single; i:integer; begin //T ist das Array mit den Teilchen f:=power(high(T),1/3); //Der Raum ist 70 Einheiten groß d:=70 / f; y:=d/2; x:=d/2; z:=d/2; for i:=0 to high(T) do begin T[i].x:=x; T[i].y:=y; T[i].z:=z; x:=x+d; if x>70 then begin x:=d/2; y:=y+d; if y>70 then begin y:=d/2; z:=z+d; end; end; end; |
Re: Gasteilchen 3D [Version 1.6]
Zitat:
Könntest du nicht abschalten, daß der Raum zurückgedreht wird, wenn man die Trennwand, oder den Ofen einblendet? [edit] Ich merk grad, dieses geschieht auch, wenn ich das Fenster verschiebe und es wird nicht nur zurückgedreht, jetzt wo ich mal das Zoomen entdeckt hab :stupid: ... ist wohl mehr ein [Reset]. [/edit] Und eigentlich wäre es schön die X-Achse auch noch ändern zu können, wenn die Wand offen ist (Y-Achse > 0). [add] was mir eben och noch auffiehl: Teilchen Bewegen sich durch die Wand. also nicht durch den winzigen Spalt daunten, sondern direkt durch das Material. Aber nach den Beshreibungen sollte es ja keine halbdurchlässige Membran sein. :angel: |
Re: Gasteilchen 3D [Version 1.6]
Zitat:
Die Kollisionsabfrage bei nicht angehobener Wand sieht folgendermaßen aus:
Delphi-Quellcode:
Das funktioniert auch schon ziemlich perfekt. Allerdings klappt das so ja nur, wenn sowieso keine Teilchen auf der anderen Seite sein dürfen.
if (wandy=0) and wand and (x-r<wandx) then begin
x:=wandx+r; vx:=-vx; end; Bei hochgehobener Wand setzt dann diese Abfrage ein:
Delphi-Quellcode:
Es gibt also einen Bereich vor der Wand, in dem die Teilchen umgelenkt werden.
if wand and (x+r>wandx-2) and (x+r<wandx-1) and (vx>0) and (y+r>wandy) then vx:=-vx else
if wand and (x-r<wandx+2) and (x-r>wandx-1) and (vx<0) and (y+r>wandy) then vx:=-vx; Wie könnte ich die letzte Abfrage optimieren, so dass man auch während der Laufzeit die Wand verschieben kann und keine Teilchen (auch bei hohen Geschwindigkeiten) mehr durch die Wand gelangen? |
Re: Gasteilchen 3D [Version 1.6] [benötige Hilfe]
Hi,
Delphi-Quellcode:
wenn ich das richtig deute, ist hier (x-r) die x-Position des Teilchens nach der Bewegung. Das klappt auch für große vx, weil ja dann auch git "<wandx".
if (wandy=0) and wand and (x-r<wandx) then begin
Delphi-Quellcode:
bein angehobener Wand wird geprüft, ob die neue x-Position "an" der Wand ist, aber bei großem vx kann die neue Position ja auch weit in oder hinter der Wand liegen. Müsste man nicht einfach prüfen, ob die neue Positon "auf der anderen Seite" der Wand liegt?
if wand and (x+r>wandx-2) and (x+r<wandx-1) and (vx>0) and (y+r>wandy) then vx:=-vx else
if wand and (x-r<wandx+2) and (x-r>wandx-1) and (vx<0) and (y+r>wandy) then vx:=-vx; |
Re: Gasteilchen 3D [Version 1.6] [benötige Hilfe]
Tut mir Leid, dass habe ich vergessen zu erwähnen: Bei X / Y handelt es sich um die momentane Position eines Teilchens, bei r um dessen Radius.
Die Idee mit der Abfrage, welche Position das Teilchen annähme, ist schon mal eine gute Idee. Ich bin mir aber nicht sicher in wie weit ich das implementieren kann, oder wie rechenintensiv die Abfrage ist. Ich werds in jedem Fall einmal ausprobieren :-D (Da müsste man dann ja sozusagen "vorausrechnen", oder die alte Position abspeichern und mit der neuen vergleichen... ...oder so) Allerdings gibt es ja dann auch noch das Problem, dass ich während der Laufzeit die Wand verschieben will... da fällt mir überhaupt nichts machbares ein :gruebel: |
Re: Gasteilchen 3D [Version 1.6] [benötige Hilfe]
Also speichern brauchst du die alte Position nicht, du mußt einfach nur vor dem Verschieben mit den neuen Werten prüfen.
also sozusagen statt
Delphi-Quellcode:
erstmal schauen wo die neue Position wäre und schon vorm Verschieben darauf reagieren
if (X + R > Wand2) or (X - R < Wand1) then Schritt := -Schritt;
X := X + Schritt;
Code:
und nicht erst wenn das Teilchen schon in der Wand ist ^^
if (X + [color=#ff0000]Achritt[/color] + R > Wand2)
or (X + [color=#ff0000]Achritt[/color] - R < Wand1) then Schritt := -Schritt; X := X + Schritt; (hier mal an 'ner geraden PingPong-Bewegung zwischen 2 Wänden) |
Re: Gasteilchen 3D [Version 1.6] [benötige Hilfe]
Hallo mr.winkle,
ein sehr interessantes Programm und toll gemacht. Mir sind aber noch diese Dinge aufgefallen: - Eine Exception bei Simulation-Presets-Laden und dann im Dialog abbrechen: Listenindex überschreitet das Maximum(0) - Die Gaswolke wird nicht mehr kalt, wenn der Ofen aus ist - Man weiss nicht wirklich, was die Einstellungen bedeuten zb. für Einflüsse Wärme und Ofen fehlt die Angabe der Einheiten - was bedeutet Partikel? - die Angabe der Simulationswerte sehen für mich unvollständig und ein wenig unübersichtlich aus - die Mausbedienung sollte beschrieben sein - das Maus Scrollrad sollte eine Zoom-Funktion in der Gaswolke auslösen - die Hints sind unvollständig und sagen nicht sehr viel aus, zb. bei Wand: "aktiviert eine Wand" oder Radius: "Stellt den Radius ein" - warum sind Teile des Menüs in fsBold? - wo ist denn der Unterschied von Ofen zu Wärme - eine Stop/Start-Funktion wär nicht schlecht, dann kann man die Simulation für einen Punkt anhalten, betrachten und anschliessend fortsetzen. Grüsse von Gremlin |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz