AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Freeware: Gasteilchen 3D [1.6.9] (Facharbeit Informatik)
Thema durchsuchen
Ansicht
Themen-Optionen

Freeware: Gasteilchen 3D [1.6.9] (Facharbeit Informatik)

Ein Thema von mr.winkle · begonnen am 16. Feb 2007 · letzter Beitrag vom 23. Nov 2007
Antwort Antwort
Seite 3 von 4     123 4      
mr.winkle
Registriert seit: 25. Mai 2006
Gasteilchen 3D
Ist meine Facharbeit im Fach Informatik
Realisiert mit OpenGl, mit vielen Statistik Funktionen und Einflussmöglichkeiten...
Wenn sich irgendwo der Fehlerteufel eingeschlichen haben sollte, dann sagt mir bitte bescheid

In der neuen Version 1.6 dazugekommen:
  • Pfeile zeigen die Richtung der Teilchen an
  • Farbe der Teilchen gibt Aufschluss über deren kinetische Energie
  • Bugfixes ohne Ende

Zur Bedienung: (Auszüge aus meiner Facharbeit)

1.1. Die 3D-Ansicht
Im 3D-Ansichtsbereich navigiert der Benutzer ausschliesslich mit der Maus:
Wird die linke Maustaste gedrückt gehalten und die Maus bewegt, so dreht sich die Kamera um den Raum herum und es ist möglich, die Gasteilchen aus jedem Winkel zu beobachten.
Hält man hingegen die rechte Maustaste gedrückt und schiebt die Maus nach oben oder unten, so ändert sich die Brennweite der Kamera. Dieses Zoomen erlaubt es, Teilbereiche des Raumes vergößert zu sehen.
Durch einen Klick auf den Button "Reset" (oben rechts unter Ansicht) - oder auch mit einem Klick mit dem Mausrad auf den 3D-Ansichtsbereich - werden alle Änderungen an der Kamera zurückgesetzt.


Wie ihr an die Statistiken usw kommt, ist selbsterklärend. Das Programm wird ausschliesslich mit der Maus gesteuert und konfiguriert.
Miniaturansicht angehängter Grafiken
screenshot_956.jpg  
Angehängte Dateien
Dateityp: zip gasteilchen_3d_1.6.9b_144.zip (444,7 KB, 293x aufgerufen)
 
Cöster

 
Turbo Delphi für Win32
 
#21
  Alt 2. Mär 2007, 19:24
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.
  Mit Zitat antworten Zitat
mr.winkle

 
Delphi 7 Personal
 
#22
  Alt 2. Mär 2007, 19:40
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?
  Mit Zitat antworten Zitat
Cöster

 
Turbo Delphi für Win32
 
#23
  Alt 3. Mär 2007, 13:48
Zitat von mr.winkle:
Warum wird so nicht der komplette Raum ausgefüllt, sondern es bleiben immer Ränder?
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:

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)

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

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.
  Mit Zitat antworten Zitat
mr.winkle

 
Delphi 7 Personal
 
#24
  Alt 3. Mär 2007, 20:44
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.
Miniaturansicht angehängter Grafiken
teilchen_ausserhalb_des_raums_109.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#25
  Alt 4. Mär 2007, 08:06
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 ... 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.
  Mit Zitat antworten Zitat
mr.winkle

 
Delphi 7 Personal
 
#26
  Alt 9. Mär 2007, 14:26
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.
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?
  Mit Zitat antworten Zitat
NormanNG

 
Delphi 2007 Professional
 
#27
  Alt 9. Mär 2007, 15:12
Hi,

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?
  Mit Zitat antworten Zitat
mr.winkle

 
Delphi 7 Personal
 
#28
  Alt 9. Mär 2007, 17:27
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
(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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#29
  Alt 10. Mär 2007, 17:24
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)
  Mit Zitat antworten Zitat
Gremlin

 
Delphi 7 Enterprise
 
#30
  Alt 6. Mai 2007, 17:40
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:54 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