![]() |
Re: Gravitationssimulator
... kannst du dir ja selber erklären aus masse und zentrifugalkraft
|
Re: Gravitationssimulator
Zitat:
[OnTopic] Irgendwie hat das prog probleme mit dem start und abbrechen buttons bzw. beenden! |
Re: Gravitationssimulator
Huch! Danke für die vielen Kommentare! Werde den Source dann mal a) noch optimieren (ja da ist noch einiges Potential ;)) und b) Ordentlich schreiben... Aber nicht vor Freitag/Samstag, da ich erst Fr. irgendwann wieder nach Hause komme wo ich Delphi hab :? *entzuuuug*.
Ja, das Teil arbeitet rein Iterativ und ist quasi rundenbasiert. Es gibt ein Objekt GravEngine das ein Array von Partikelobjekten hält. Die Methode GravEngine.NextStep führt auf "einen Schlag" die Bewegung aller Partikel aus, nachdem vorher die Kollisionen bereinigt wurden. Auch die Richtung und Geschwindigkeit werden als Quatum behandelt, d.h. zu einem Zeitpunkt werden sämtliche Änderungen errechnet und dann in einem Rutsch ausgeführt. Dadurch wird das einigermaßen Stabil. Ich habs auch schon geschafft, dass das eine oder andere Partikelchen eine (scheinbar) stabile Ellipsenbahn um eine große Masse einnimmt! Ist aber nicht zu häufig, da die Ränder ja als Banden fungieren. Hier wird's dann die Option geben, dass die enfliehenden Partikel verschwinden - gute Idee! Eine feste stationäre Masse wäre auch eine feine Sache! Wird gemacht :) @maximov: Die Masse "pennt" :?: :gruebel: Und was meinst du mit "durchcyceln" ? @FlorianH: Jupp, hab ich leider zu spät gesehen. -> ToDo @Rackergen2: Nö ;). Ist halt etwas Vektorrechnung gepaart mit 1/r² :lol: @maximov(2): Die Sache mit den Buttons ist die: [Start] startet eine Schleife mit einem Application.ProcessMessages. Pause beendet diese Schleife nicht, sondern nimmt nur den Berechnungsblock raus, so dass nurnoch das ProcesssMessages geloopt wird. Erst der Stop-Button beendet die äusserste Schleife, und erst jetzt lässt sich das Programm schließen bzw. tut es das wenn vorher irgendwann das X gedrückt wurde. Diese etwas wenig elegante Methode habe ich gewählt, da ich irgendwie keine Lust auf Threads hatte :) So in etwa ists:
Delphi-Quellcode:
und die Buttons schalten jeweils nur die Flags.
procedure onBtnStartClick(Sender: TObject);
begin aborted := false; paused := false; while not aborted do begin if not paused then begin MacheRechnungUndZeichne; end; Application.Processmessages; end; end; \\edit: Ach ja! Ne DirectX-Version gibt es quasi schon. Halt an Stelle von Graphics32 nen DirectDraw-Image... Aber der Vorteil ist absolut minimal, da G32 schon sehr fix ist, und die reine Darstellung Kleinkram ist. Zumal DirectDraw nativ kein Zeichnen von antialiasten Linien (Richtungsvektoren) mitbringt, und es wird noch die Option "Motionblur" geben - nur wie in nem anderen Thread bereits geschrieben kann DD selbst DAS nicht von Hause aus. Dafür muss man auf Direct3D zurückgreifen, und das ist mir für so einen kleinen Effekt zu heftig. Schicken Gruß, bis die Tage, dizzy |
Re: Gravitationssimulator
Zitat:
Zitat:
Delphi-Quellcode:
Und wenn du zu anderen apps wechselst, dann wird der game loop ausser kraft gesetz.
procedure TForm1.FormCreate(Sender: TObject);
begin ... Application.OnActivate := AppActivate; Application.OnDeactivate := AppDeactivate; end; procedure TForm1.GameFrame(Sender: TObject; var Done: Boolean); begin MacheRechnungUndZeichne; Done := false; end; procedure TForm1.AppActivate(Sender: TObject); begin application.OnIdle := GameFrame; end; procedure TForm1.AppDeactivate(Sender: TObject); begin application.OnIdle := nil; end; Zitat:
|
Re: Gravitationssimulator
OnIdle nutzen so wie du schreibst klingt mal nach einer richtig guten Idee :thuimb:, so werd ich's umfrickeln! Cool!
Und das Cyclen ist mir getz auch klar. Klingt auch fein, da muss dan mal ne Auswahlkiste rein mit allem möglich was man mit sonnem Partikel machen kann wenns abhaut :) Bis die Tage, dizzy |
Re: Gravitationssimulator
Liste der Anhänge anzeigen (Anzahl: 1)
Jetzt endlich bin ich so weit. Hier der ganze Quatsch - mit Soße :)
Mit eine Klitzekleinigkeit bin ich noch etwas unzufrieden, nämlich der Anzeige der Raumverzerrung insbesondere bei großen Massen. Da kommt es leider noch etwas zu "Raumfaltung" die nicht sein dürfte. Aber es sieht trotzdem ganz nett aus, und mir sind die Ideen ausgegangen wie man das ändern könnte. Nun wurscht, dast Ding ist ganz schick geworden (es sind zur oberen Version ein paar Features dazugekommen). Sicherlich könnte man an der einen oder anderen Stelle performanter Proggen, aber mir reicht's so wie es ist ;) Nochmals viel Spaß damit! gruss, dizzy \\Nachtrag: Um den Source zu kompilieren braucht ihr die Graphics32 Library. Wie es mit Delphi < 7 aussieht weiss ich net. \\edit: UPDATE! Die Version von gestern Nacht hat noch ein Feature, nämlich ein Speicherleck beim Beenden. -> fixed Die Berechnung der Partikel benötigt jetzt nicht mehr unnötigerweise (n^2 - n) Rechenschritte, sondern nur noch (n^2 + n)/2 (Dreieickszahlen). Durch Luckies Nachfragen ists mir erst aufgefallen... |
Re: Gravitationssimulator
Delphi-Quellcode:
Optimiert hier der Delphi Compiler so schlecht? :gruebel:
function VectorLength(v: TVector): double;
asm fld v.x; fmul v.x; fld v.y; fmul v.y; faddp; fsqrt; fstp result; // In Delphi-Language: // result := sqrt(sqr(v[0])+sqr(v[1])); end; Nachtrag: Bei sehr vielen Partikeln leidet die Performance doch recht stark. :roll: |
Re: Gravitationssimulator
Zitat:
\\edit: Da fällt mir auf: Der Delphi-Code ist sogar mitlerweile falsch :oops:. TVector war mal ein Array. Mittlerweile ists ein record mit TVector.x und TVector.y *hüstel*. Zitat:
Es sind immer (n^2 - n) (n = Partikelanzahl) Verrechnungsschritte nötig, die ihrerseits nochmal diverse Divisionen und weitere Rechnungen beinhalten. Da schlägt natürlich jeder Partikel mehr sehr stark zu Buche. Lässt man zusätzlich noch das Gitter anzeigen, werden weitere solche Schleifen durchlaufen, da jeder Gitterpunkt ähnlich wie die Partikel gegen jeden vorhandenen Partikel verrechnet werden muss. Ich finde dafür ist die Simulation sogar noch recht fix ;). Nachti! dizzy |
Re: Gravitationssimulator
Echt Spitze die Soße :shock: :thuimb:
giebts das auch als Screensaver?? :roll: |
Re: Gravitationssimulator
Noch nicht. Aber ist sicherlich recht schnell machbar, da man ja nur auf Fullscreen umfrickeln muss, und statt .exe .scr schreiben ;)
btw: gibt nen Update :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:53 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