Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Gravitation,Planet trudelt xD
Jarastu - Fr 08.06.07 16:21
Titel: Gravitation,Planet trudelt xD
joa, moin ersma^^
ich schreib grad an nem prog, welches einen kleinen planeten um meinen mauszeiger rotieren lassen soll, also wie nen echten planeten.
inzwischen bin ich soweit, dass er das auch macht, aber jetz tut er irgendwann anfangen zu trudeln (zumindest interpretiere ich das so^^)
joa hier is der Quellcode:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| var Form1: TForm1; v,vx,vy,sx,sy: real; implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject); var a,b,r,x,y: integer; F,Be: real; begin randomize; x:=mouse.CursorPos.x-form1.left-4; label1.Caption:='x='+inttostr(x); y:=mouse.CursorPos.Y-form1.Top-28; label2.Caption:='y='+inttostr(y); a:=x-(shape1.Left)-10; label3.Caption:='a='+inttostr(a); b:=(shape1.Top)-y+10; label4.Caption:='b='+inttostr(b); r:=round(sqrt(a*a+b*b)); label5.Caption:='r='+inttostr(r); case r of 0..10: begin shape1.Left:=random(780); shape1.Top:=random(580); end; end; F:=100000/(r*r); label6.caption:='F='+floattostr(F); Be:=(F/10); label7.caption:='Be='+floattostr(Be); v:=Be/20+v; label8.caption:='v='+floattostr(v); vx:=a/r*v-vx; label9.Caption:='vx='+floattostr(vx); vy:=b/r*v-vy; label10.Caption:='vy='+floattostr(vy); sx:=Be/2/400+vx/20+sx; sy:=Be/2/400+vy/20+sy; shape1.Left:=shape1.Left+round(sx); shape1.Top:=shape1.Top-round(sy); end; |
hab ne zip mit allem dazugetan, hoffe ihr könnt helfen
Allesquarks - Fr 08.06.07 17:57
an und für sich siehts ganz lustig aus was gefällt dir daran nicht? Ich will zwar nicht behaupten, dass ich deinen Code vollständig blicke aber die Physik die ich darin gesucht habe habe ich nicht gefunden.
vec(F)=c*vec(r)/r^2 soll Be deine Beschleunigung sein? Wieso ist das einfach /10 ist das so eine Fahrschulformel oder soll die Masse 10 sein. Was treibst du dann mit den Geschwindigkeiten.
Alles was du brauchst ist doch:
vec(F)=d vec(p)/dt und das Gravitationsgesetz.
Jarastu - Fr 08.06.07 19:05
Be is die beschleunigung ja^^ (a war schon vergeben)
nuja ich hbas halt so versucht^^'
bin noch relativ unerfahren
vec, sind das vektoren?, hab ich noch nie gemacht, deshlab hab ichs halt in teilgeschwindigkeiten gebastelt.
die massen hab ich willkürlich gewält, so dass mir die ergebnisse halbwegs passabel vorkamen xD
dann die gravitationskraft ausgerechnet
dann die beschleunigung, daraus die resultierende geschwindigkeit
die hab ich dann über ein verhältniss in vx (geschwindigkeit in x-richtung) und vy aufgeteilt, weil über trigonometrische funktionen scheint in delphi recht dämlich zu sein.
dann jedenfalls die zurückgelegten wege ausgerechnet und die den koordinaten des shapes zugerechnet(wobei hier plus und minus ebenfalls recht willkürlich verteilt sind( umgebstellt bis es ging wie es sollte ^^'))
mein problem is, dass wenn man den zeiger mehrmals bewegt oder der shape aufgrund der if-anweisung(kollision, um /0 zu vermeiden) versetzt wird beginnt der shape zu "eiern" sprich er springt quer zu seiner bewegungsrichtung hin und her, was ich irgendwie für widersprüchlich halte.
Agawain - Fr 08.06.07 22:34
öhm
nicht daß ich etzt wirklich Ahnung von dem ganzen Kram hab...aber so wie der Diskussionsstand ist...simulierst Du Erde, oder einen Planeten mit echten Gravi-Werten...Erde ohne Mond eiert aber...das schon berücksichtigt?
Just 2 cent
Sorry, wenn ich da voll daneben liege
Gruß
Aga
Jarastu - Fr 08.06.07 23:04
meines wissens isses andersrum^^, erde eiert mit mond weil mond und erde um gemeinsamen mmasseschwerpunkt rotieren (masseverhältniss 1:6).
da der mauszeiger, mit der großen masse, fest steht eiert theoretisch nix. (beispiel sonne, die eiert eigentlich auch, aber eben verschwindend gering.
Xion - Sa 09.06.07 10:16
ich sags mal so...ich bin grad dabei ne Physikfacharbeit über das Thema Gravitation und so zu proggen...aber durch deinen Code durchkämpfen tu ich nicht ^^ kein wunder, dass es nicht funktioniert, wenn du das so komprimiert da hinschreibst...und so viel ich weiß ist das ganze onehin viel einfacher, wenn man nur 2 Körper hat:
-geb dem Planeten ne Anfangsgeschwindigkeit
-F=G*M1*M2/r² (Gravitationskraft)
-diesen Wert einmal durch r und mal xDifferenz für die Kraft nach x (das selbe nochmal für y)
-das durch M1 (Masse des Planeten, dann hast du ne Beschleunigung nach F=a*m)
-v=a*t :arrow: du hast ne Geschwindikeit...
:arrow: du hast ne Geschwindikeit in x und y richtung...fertig
PS: M2 musst du halt im Verhältnis zur Geschwindigkeit machen...und überleg dir was, wenn der Planet zu nah an die Maus kommt...dann ist der Rundungsfehler wegen t (v=a*t) so groß, da sich a so schnell ändert, dass es dir den Planet davonhaut ^^
//EDIT:
hab mir die exe mal angesehen...das passt schon so wies ist...guck dir mal die Bahn von irgendwelchen Kometen an...es ist nur dann "kreisrund" wenn die Geschwindigkeit genau zum Abstand und der Masse passt
Jarastu - Sa 09.06.07 13:57
das die bahn kein kreis is, is mir wurscht, was ich mein is, was wohl mit dem rundungsfehler zusammenhängt den du erwähnt hast, nähmlich, dass der planet nach ner weile(wenn er schon 1-2 mal auf der maus"aufgeschlagen" is) keine parabelbahn fliegt sondern von der einen zur anderen seite hin und herspringt.
Xion hat folgendes geschrieben: |
-diesen Wert einmal durch r und mal xDifferenz für die Kraft nach x (das selbe nochmal für y) |
kannst du mir des nochma genau erklären? den satz check ich irgendwie nich xD
Xion - Sa 09.06.07 17:15
lol, jetzt wo ichs mir nochmal länger angeguckt hab, fällts mir auch auf ^^ der fängt irgendwie das hüpfen an...das hat aber nichts mit T zu tun, ist also kein Rundungsfehler. Das ist der Fehler, der kommt wenn du den Planeten auf die Maus aufschlagen lässt und dann nicht neu den Planeten setzt (da r sehr klein wird F sehr groß)...
Zitat: |
Xion hat folgendes geschrieben: | -diesen Wert einmal durch r und mal xDifferenz für die Kraft nach x (das selbe nochmal für y) |
kannst du mir des nochma genau erklären? den satz check ich irgendwie nich xD |
das entspricht deinem
Delphi-Quelltext
1: 2:
| vx:=a/r*v-vx; vy:=b/r*v-vy; |
ein Tipp zu dem hier:
Delphi-Quelltext
1: 2:
| x:=mouse.CursorPos.x-form1.left-4; label1.Caption:='x='+inttostr(x); y:=mouse.CursorPos.Y-form1.Top-28; |
das kannst du ganz einfach per Form.ScreenToClient(Mouse.CursorPos) machen
hmmm...so wie ich das jetzt rausgekriegt hab ist bei dir T=1/20...
ich glaube das hier ist das problem
ich denke mal du musst deine geschwindikeiten als Vektor speichern...soll heißen, nicht v global sonder vx,vy global und erst da zum alten vx,vy die neue geschwindigkeit dazu rechnen.
Jarastu - Sa 09.06.07 23:54
ich danke dir, denke damit lässt sich was anfangen ^.-
noch ne frage zu den Form.ScreenToClient(Mouse.CursorPos)
is das denn die position ohne die boarders oder muss ich de noch abziehen?
Calyptus - So 10.06.07 03:06
probiers doch einfach aus ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!