Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 22.04.2008, 23:26 Titel: |
|
|
Hallo
Ich hätte da noch einen Vorschlag zur Bahnberechnung. Du könntest die Planeten sich auch dem Gravitationsgesetz folgend bewegen lassen. Hört sich kompliziert an, ist aber eigentlich auch nicht schwerer, als Punkte auf einer Kreisbahn zu berechnen. Mein Programmbeispiel (das allerdings in QB geschrieben ist, soll aber auch nur ne Anregung sein) kommt sogar ohne SIN und COS aus
Ausserdem bekommt man so realistische Bewegungen auch auf elliptischen Bahnen, man kann Monde einbauen etc. ohne an der Berechnung selbst etwas zu ändern. Für zusätzliche Planeten müssen nur entsprechende Startwerte eingesetzt werden. Es ist übrigens gar nicht so einfach, ein stabiles Planetensystem zu erstellen. Etwas Spielen mit den Startwerten zeigt das.
Code: | SCREEN 12
CLS
k& = 0 'Zeiteinheit dt an die Rechner-
t = TIMER 'geschwindigkeit anpassen
DO: LOOP WHILE t = TIMER
t = TIMER
DO
k& = k& + 1
LOOP WHILE t = TIMER
dt = 50 / k&
g = .0001 'Gravitationskonstante
planeten = 3 'Anzahl der Planeten
'Startwerte
'Stern
m(0) = 1500 'Masse
X(0) = 320 'X-Position
y(0) = 240 'Y-Position
vx(0) = 0 'Geschwindigkeit in X-Richtung
vy(0) = 0 'Geschwindigkeit in Y-Richtung
m(1) = 10 'grosser Planet
X(1) = 170
y(1) = 240
vx(1) = 0
vy(1) = .03
m(2) = .01 'Mond des grossen Planeten
X(2) = 165
y(2) = 240
vx(2) = 0
vy(2) = .045
'kleiner Planet
m(3) = 2
X(3) = 320
y(3) = 20
vx(3) = -.01
vy(3) = 0
DO 'Bewegen
'Jeder Koerper zieht jeden an
FOR a = 0 TO planeten
FOR b = 0 TO planeten
IF a <> b THEN 'ausser sich selbst
dx = X(a) - X(b) 'X-Abstand
dy = y(a) - y(b) 'y-Abstand
dq = dx ^ 2 + dy ^ 2 'Abstand im Quadrat
d = SQR(dq) 'Abstand
f = -g * m(a) * m(b) / dq 'Gravitationskraft berechnen
fx = f * dx / d 'Kraft in X-Richtung
ax = fx / m(a) 'Beschleunigung in X-Richtung
vx(a) = vx(a) + ax * dt 'Geschwindigkeitsaenderung in X-Richtung
fy = f * dy / d 'Kraft in Y-Richtung
ay = fy / m(a) 'Beschleunigung in Y-Richtung
vy(a) = vy(a) + ay * dt 'Geschwindigkeitsaenderung in Y-Richtung
END IF
NEXT
NEXT
FOR a = 0 TO planeten 'Anzeigen
PSET (X(a), y(a)), 0 'alte Position loeschen
NEXT
FOR a = 0 TO planeten
X(a) = X(a) + vx(a) * dt 'neue X-Position berechnen
y(a) = y(a) + vy(a) * dt 'neue Y-Position berechnen
PSET (X(a), y(a)), 15 'Punkt an neue Position setzen
NEXT
LOOP WHILE INKEY$ = "" 'Beenden mit beliebiger Taste |
Gruß
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|