Autor |
Beitrag |
Jarastu
Hält's aus hier
Beiträge: 5
XP <-kein smilie xD
|
Verfasst: Fr 08.06.07 16:21
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:
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
Einloggen, um Attachments anzusehen!
|
|
Allesquarks
      
Beiträge: 510
Win XP Prof
Delphi 7 E
|
Verfasst: 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 
Hält's aus hier
Beiträge: 5
XP <-kein smilie xD
|
Verfasst: 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
      
Beiträge: 460
win xp
D5, MySQL, devxpress
|
Verfasst: 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 
Hält's aus hier
Beiträge: 5
XP <-kein smilie xD
|
Verfasst: 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
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: 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  du hast ne Geschwindikeit...
 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
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Jarastu 
Hält's aus hier
Beiträge: 5
XP <-kein smilie xD
|
Verfasst: 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
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: 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
v=a*t+v
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.
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Jarastu 
Hält's aus hier
Beiträge: 5
XP <-kein smilie xD
|
Verfasst: 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
      
Beiträge: 386
Win Xp Prof
D3, D6 Pers, D7 Ent
|
Verfasst: So 10.06.07 03:06
probiers doch einfach aus 
_________________ Luft- und Raumfahrtechnik an der Uni Stuttgart
|
|
|