Autor Beitrag
Jarastu
Hält's aus hier
Beiträge: 5

XP <-kein smilie xD

BeitragVerfasst: 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:
ausblenden volle Höhe 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..10begin
             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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 5

XP <-kein smilie xD

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 460

win xp
D5, MySQL, devxpress
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 5

XP <-kein smilie xD

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: 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

_________________
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 Threadstarter
Hält's aus hier
Beiträge: 5

XP <-kein smilie xD

BeitragVerfasst: 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.



user profile iconXion 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: 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:

user profile iconXion 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
ausblenden Delphi-Quelltext
1:
2:
  vx:=a/r*v-vx;
  vy:=b/r*v-vy;


ein Tipp zu dem hier:
ausblenden 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
ausblenden v=a*t+v
1:
 v:=Be/20+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 Threadstarter
Hält's aus hier
Beiträge: 5

XP <-kein smilie xD

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 386

Win Xp Prof
D3, D6 Pers, D7 Ent
BeitragVerfasst: So 10.06.07 03:06 
probiers doch einfach aus ;)

_________________
Luft- und Raumfahrtechnik an der Uni Stuttgart