Entwickler-Ecke

Open Source Projekte - Gravity (simple Physik-Simulation)


cuejo - Sa 01.04.06 22:10
Titel: Gravity (simple Physik-Simulation)
Hi Leute,

Erst einmal möchte ich sagen, dass ich noch ziehmlich neu hier bin und auch noch nicht sehr erfahren bin, was die Programmierung angeht.
Zu meinem Programm: Ich habe mal versucht ein simples Programm zu schreiben, das die Gravitation simuliert. Das habe ich durch zwei Geschwindigkeiten (horizontal und vertikal) gelößt, die ich unabhänig voneinander betrachte. Auf die Vertikalkomponente wirkt noch dazu die Gravitation. Aber schaut doch am besten selbst. :zwinker:
Zur Visualisierung zeichne ich einen Kreis mit Canvas, den man mit der Maus aufnehmen und herumschleudern kann.
Allerdings habe ich noch einige Probleme in Bezug auf die Simulierung der Reibung:
Schaltet man sie aus springt der Ball immer höher obwohl er eigentlich immer auf die Maximalhöhe kommen sollte. Und ich finde den Fehler nicht. :bawling: Bitte kann mir da jemand helfen.
Weitere Bugs:
-prallt der Ball an der rechten Seite ab scheint er schneller zu werden
-die horizontale Reibung wirkt bei niedrigen Geschwindikeiten zu abruppt und der Ball hat dann plötzlich keine Horizontalbewegung mehr

Ich hoffe ihr könnt mir da ein bisschen helfen. :roll:


Moderiert von user profile iconGausi: Topic aus Freeware Projekte verschoben am So 02.04.2006 um 14:23


LonghornUser - Sa 01.04.06 23:39

Ich kann dir zwar bei deinem Problem net helfen, muss aber sagen, dass mir das Programm echt gut gefällt. Kompliment :) Vor allem mit wie wenig Code man sowas hinbekommen kann. Net schlecht :)


Marc. - Sa 01.04.06 23:45

und noch ein bug:

hält man den ball direkt unter der leiste des programmes un lässt ihn anschließend los, so bleibt er dort hängen ;)


Christian S. - So 02.04.06 00:32

Hallo!

user profile iconcuejo hat folgendes geschrieben:
Allerdings habe ich noch einige Probleme in Bezug auf die Simulierung der Reibung: [...] Bitte kann mir da jemand helfen. [...] Ich hoffe ihr könnt mir da ein bisschen helfen. :roll:

Ich möchte nur mal kurz drauf hinweisen, dass in den Thread der Freeware-Sparte bitte nicht die Programmierprobleme besprochen werden. Dafür bitte Threads in den Programmiersparten erstellen! Danke! :-)

Grüße
Christian


GTA-Place - So 02.04.06 07:42

Mir gefällt nicht, dass der Ball, wenn er auf dem Boden liegt, halb aus dem Bild draußen ist (die Show-Tip-Checkbox ist auch nur so halb zu sehen). Außerdem sollte das Programm sofort auf die Änderung des Ortes reagieren (IMHO).

Sonst nicht schlecht!


F34r0fTh3D4rk - So 02.04.06 10:10

ich würde sagen, dass ist eher opensource, deshalb hier ein minimaler vorschlag:

Delphi-Quelltext
1:
2:
3:
4:
function ball.wall(value:real):real; // Reibung an Bande
begin
  if fri then result:=value*0.8 else result:=value;
end;

du machst ja vert := wall(vert);
also geht das auch so:

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure ball.wall(var value: real) // Reibung an Bande
begin
  if fri then 
    value := value * 0.8;
end;

dann machst du wall(vert) und fertig ;)

sonst recht gut, außer dass der ball im weltraum an der decke hängenbleibt.
(das liegt an der reibung, vielleicht sollte die dann abgeschaltet werden ;) )


DelphiAnfänger - So 02.04.06 13:45

kannst du mal die exe datei hochstellen kann die mit Delphi 5 nicht erzeugen


Marc. - So 02.04.06 14:08

die exe befindet sich im zipordner :roll:

edit: hab sie hochgeladen ;) vermutlich lag sie nur im meinem ordner vor, weil ich zuvor den code compilert habe :roll:


Ironwulf - So 02.04.06 14:42

öhm bei mir is die nich in dem ordner


cuejo - So 02.04.06 21:12

Danke für die Kritik, Anregungen und natürlich auch fürs Lob :mrgreen:!

user profile iconNoTVerYEvilPzYchO hat folgendes geschrieben:
und noch ein bug:

hält man den ball direkt unter der leiste des programmes un lässt ihn anschließend los, so bleibt er dort hängen

Hab ich behoben. Es lag daran, dass die Kugel immer wieder an die Selbe stelle replaced wurde:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
if (posy-r)=(top+1then
  begin
    vert:=wall(vert);
    vert:=-1*vert;   
    posy:=top+r+1;
  end;


user profile iconChristian S. hat folgendes geschrieben:

Ich möchte nur mal kurz drauf hinweisen, dass in den Thread der Freeware-Sparte bitte nicht die Programmierprobleme besprochen werden. Dafür bitte Threads in den Programmiersparten erstellen! Danke! :-)

Grüße
Christian

Ok. Hab ein Thread [http://www.delphi-forum.de/viewtopic.php?p=349687#349687] geöffnet. :)

user profile iconGTA-Place hat folgendes geschrieben:
Mir gefällt nicht, dass der Ball, wenn er auf dem Boden liegt, halb aus dem Bild draußen ist (die Show-Tip-Checkbox ist auch nur so halb zu sehen).

Komisch, so ein Problem hab ich nicht. :shock:

user profile iconGTA-Place hat folgendes geschrieben:
Außerdem sollte das Programm sofort auf die Änderung des Ortes reagieren (IMHO).

Wie meinst du das?


user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
ich würde sagen, dass ist eher opensource, deshalb hier ein minimaler vorschlag:

Delphi-Quelltext
1:
2:
3:
4:
function ball.wall(value:real):real; // Reibung an Bande
begin
  if fri then result:=value*0.8 else result:=value;
end;

du machst ja vert := wall(vert);
also geht das auch so:

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure ball.wall(var value: real) // Reibung an Bande
begin
  if fri then 
    value := value * 0.8;
end;

dann machst du wall(vert) und fertig ;)

Ja, klar das kann man machen. Es wäre aber nur eine Formalität, oder bringt das irgentwelche Vorteile? :nixweiss:

user profile iconDelphiAnfänger hat folgendes geschrieben:
kannst du mal die exe datei hochstellen kann die mit Delphi 5 nicht erzeugen

Hab ich. Hier die neue Version ohne an-der-Deke-hängenbleib:


wunsiedler - So 02.04.06 21:14

Bei mir a net. Hätts gern mal ausprobiert.

EDIT

Augen auf, da isses ja :-)


GTA-Place - Mo 03.04.06 19:16

Das eine hat sich erledigt, funktioniert jetzt (war selbe Fehler wie hängen bleiben) und das andere Problem hab ich bei XP-Style hier. Bissl flimmern tut's auch.


F34r0fTh3D4rk - Mo 03.04.06 19:46

der vorteil liegt in der performance, das merkst du aber erst wenn du versuchst 1000000 bälle zu bewegen ^^


cuejo - Mo 03.04.06 21:49

ok, gut das ich das nicht vor habe :zwinker:


cuejo - Di 04.04.06 22:39

So die neue Version ist fertig:

fixed Bugs:


Big THX an user profile iconSimon Joker. Er hat mir die Augen geöffnet... :D

added Features:


Allerdings gibts jetzt einen kleinen Schönheitsfehler :( : Die Kugel zittert, wenn sie am Boden liegt. Wer mir helfen will kann das hier [http://www.delphi-forum.de/viewtopic.php?p=349687#349687] machen.


Zyklame - Mi 05.04.06 11:42

Zitat:
Sie flackert auch nicht mehr (benutze kreisförmiges Shape zur Darstellung)

Wenn das shape größer ist flackert es und zwar ziemlich stark.

Eine möglichkeit wäre es die Kugel (als Bild und nicht als Shape) mit der win API Funktion
BitBlt auf der Form zu verschieben
siehe http://www.dsdt.info/tipps/?id=348


F34r0fTh3D4rk - Mi 05.04.06 12:02

oder du verwendest double buffering

der ball hört aber irgendwie nicht auf zu hüpfen :?


GTA-Place - Do 06.04.06 19:49

Wenn du die Reibung abstellst ist klar, dass er nicht aufhört zu hüpfen. Sonst mit Reibung ist es nur der Bug, den cuejo angesprochen hat.


cuejo - Do 06.04.06 20:53

Hab jetzt geschafft das zittern mithilfe einer genaueren Kollisionsabfrage zu unterbinden. Nun ja unter seltenen umständen kanns immer noch zittern, aber dann längst nicht mehr so extrem wie es sonst der fall war.
Sobald ich noch das flackern abgestellt habe werde ich die neue Version hochladen. Doch das bereitet mir noch ziehmiches Kopfzerbrechen. BitBlt() scheint in meiner Delphi Version irgendwie nicht zu funktionieren, oder ich bin einfach nur zu doof dazu. :roll: Ich hab schon herumexperimentiert, die Kugel in ein TBitmap zu zeichnen und anschließend in einem Image auszugeben, aber das hab ich nicht hinbekommen... :oops:
Doublebuffering klappt prima (das hab selbst ich hinbekommen :lol: ), aber dann werden alle checkboxes usw. schwarz wenn man mit der maus drüberfährt... :?:
Wäre sehr dankbar wenn mir irgendjemand zu diesem Thema ein Link zu einem Tutorial oder ähnichem posten kann (ich hab schon gesucht aber nix gescheites gefunden).


Danniolo - Do 06.04.06 21:17

Ich hab in deinen Code mal ein "manuelles" DoubleBuffering eingebaut.
Jetzt sollte alles (bis aufs Vergrößern) Flackerfrei laufen :roll:


Born-to-Frag - Fr 07.04.06 18:22

Danniolo hab mir jetzt nur deins angesehen weil ich glaub da gibts nicht viel Unterschied..
Also da sind noch einige Bugs dinne z.b. bei Sun fänt der Ball an rasend auf den Boden zu springen.

Dann wenn ich den Bell größer mache und Impulse mache verwindet der Ball auf er Form :D


greetz


cuejo - Di 18.04.06 15:57

Es hat zwar etwas länger gedauert, aber ich war in letzter Zeit nicht nur faul:
Ich habe mich der Version von user profile iconDanniolo angenommen und es mal selbst probiert. Das unschöne zittern hab ich jetzt mit einem Trick teilweise wegbekommen. Bei Jupiter siehts man es noch etwas zittern aber bei Sun ist es noch ziehmlich extrem. Aber dem gebe ich mich jetzt geschlagen... ich hab keine Lust mehr da noch weiter dran rumzufummeln... :P
Außerdem hab ich noch ein paar features hinzugefügt... schauts euch einfach mal an.
Wer noch Ideen oder Anmerkungen hat, den bitte ich sie zu äußern, ansonsten werd ich den Topic schließen.
Noch mal vielen Dank allen, die mir als Anfänger geholfen haben. Ich denke ich habe mit dem ganzen schon einiges dazugelernt :D