Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Freeware: Gasteilchen 3D [1.6.9] (Facharbeit Informatik) (https://www.delphipraxis.net/86649-freeware-gasteilchen-3d-%5B1-6-9%5D-facharbeit-informatik.html)

Cöster 2. Mär 2007 19:24

Re: Gasteilchen 3D [Version 1.6!]
 
Zitat:

Zitat von mr.winkle
Das liegt daran, dass die Teilchen, nach dem Erstellen darauf geprüft werden inwiefern sie innerhalb anderer Teilchen liegen und dann verschoben werden
Bei 200 Teilchen ist es da nicht leicht freie Plätze zu finden, deswegen kann es schon mal einfrieren. Mir fällt momentan aber keine geeignete abfrage ein, da es ja manchmal auch funktioniert....

Ich nehme an, die Ortzuweisung läuft random. Du könntest doch die Anzahl der Versuche, einen Ort zu finden auf z.B. 100 begrenzen. Wenn nach der 100sten Random-Generierung eines Ortes für ein und das selbe Teilchen immer noch kein freier Platz gefunden wurde, bricht die Suche ab und gibst ne Message aus. (Mit den 100 könntest du noch rumexperimentieren).

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.

mr.winkle 2. Mär 2007 19:40

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:
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;
Warum wird so nicht der komplette Raum ausgefüllt, sondern es bleiben immer Ränder? :gruebel:

Cöster 3. Mär 2007 13:48

Re: Gasteilchen 3D [Version 1.6!]
 
Zitat:

Zitat von mr.winkle
Warum wird so nicht der komplette Raum ausgefüllt, sondern es bleiben immer Ränder? :gruebel:

Was meinst du mit "Rändern"? Wenn die Anzahl der Teilchen keine Kubikzahl (weiß nicht, ob's das Wort gibt, ich meine Zahlen deren dritte Wurzel eine ganze Zahl ist, z.B. 27), wird das so nicht glatt aufgehen. Auch wenn es eine Kubikzahl ist, müsste man den Code noch etwas ändern:

Delphi-Quellcode:
f:=power(high(T),1/3);
Warum nicht Length statt High?

Delphi-Quellcode:
y:=0;
x:=0;
z:=0;
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)

Delphi-Quellcode:
if x>f*d then begin
Aus Optimierungsgründen vll besser direkt auf x>70 prüfen. Kann man aber auch so lassen.

Delphi-Quellcode:
x:=1;
Wie kommst du auf 1? Ich würd's wieder auf d/2 setzen (s.o.)

Delphi-Quellcode:
if y>f*d then begin
  y:=1;
  z:=z+d;
end;
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.


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.

mr.winkle 3. Mär 2007 20:44

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:
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;
mit 125 oder auch 52 Teilchen klappt das z.B. einwandfrei, aber mit 81 und 39 siehts sehr falsch aus.

himitsu 4. Mär 2007 08:06

Re: Gasteilchen 3D [Version 1.6]
 
Zitat:

Zitat von mr.winkle
Nach diesen Änderungen habe ich allerdings das Problem, dass Teilchen aus dem Raum austreten.

Wollt ich auch grad erwähnen ... vorallem bei großen Geschwindigkeiten (hoher Energie) kommt dat sehr oft und vorallem weit hinaus vor.


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:

mr.winkle 9. Mär 2007 14:26

Re: Gasteilchen 3D [Version 1.6]
 
Zitat:

Zitat von himitsu
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:

Ja, dass ist auch der Grund warum man die Wand nicht mehr verschieben kann, wenn diese ein wenig angehoben wurde.



Die Kollisionsabfrage bei nicht angehobener Wand sieht folgendermaßen aus:
Delphi-Quellcode:
  if (wandy=0) and wand and (x-r<wandx) then begin
    x:=wandx+r;
    vx:=-vx;
  end;
Das funktioniert auch schon ziemlich perfekt. Allerdings klappt das so ja nur, wenn sowieso keine Teilchen auf der anderen Seite sein dürfen.


Bei hochgehobener Wand setzt dann diese Abfrage ein:
Delphi-Quellcode:
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;
Es gibt also einen Bereich vor der Wand, in dem die Teilchen umgelenkt werden.

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?

NormanNG 9. Mär 2007 15:12

Re: Gasteilchen 3D [Version 1.6] [benötige Hilfe]
 
Hi,

Delphi-Quellcode:
if (wandy=0) and wand and (x-r<wandx) then begin
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".

Delphi-Quellcode:
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;
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?

mr.winkle 9. Mär 2007 17:27

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:

himitsu 10. Mär 2007 17:24

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:
if (X + R > Wand2) or (X - R < Wand1) then Schritt := -Schritt;
X := X + Schritt;
erstmal schauen wo die neue Position wäre und schon vorm Verschieben darauf reagieren
Code:
if (X + [color=#ff0000]Achritt[/color] + R > Wand2)
  or (X + [color=#ff0000]Achritt[/color] - R < Wand1) then Schritt := -Schritt;
X := X + Schritt;
und nicht erst wenn das Teilchen schon in der Wand ist ^^

(hier mal an 'ner geraden PingPong-Bewegung zwischen 2 Wänden)

Gremlin 6. Mai 2007 17:40

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 18:45 Uhr.
Seite 3 von 4     123 4      

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