'3D-Weltraummüll, begrenzt als Bildschirmschoner tauglich
WindowTitle "Räumliche inkrementelle Mehrkörper-Orbitsimulation nach Newton"
'(CL) CopyLeft 2014-01 by P.Specht, Wien. Keine Gewähr, für Garnichts!
WindowStyle 24:Window 0,0-%maxx,%maxy:cls 0:font 2
var xh&=width(%hwnd)\2:var yh&=height(%hwnd)\2
set("decimals",15):set("numwidth",30)
'print 2*xh&,2*yh&:waitinput 2000 'Bildschirmauflösung
var fm$=mkstr$("0",16):fm$=" "+fm$+"."+fm$+";-"+fm$+"."+fm$+"; "+fm$+"."+fm$
declare m&,n&,i&,j&,k&,G!,rr!,urrr!
G!=6.67384*10^-11'Universelle Gravitationskonstante [m³/(kg*s²)]=[N m²/kg²]
' Zur Beschleunigung Sonne schwerer und Einschussgeschwindigkeiten erhöht!
n&=12' Max.Anz. Körper (unten im Detail definiert)
dec n&:declare ax![n&],ay![n&],az![n&]'Errechnete Beschleunigungskomponenten
declare x_neu![n&],y_neu![n&],z_neu![n&]'schrittpuffer als Zwischenspeicher
declare vx_neu![n&],vy_neu![n&],vz_neu![n&]'schrittpuffer als Zwischenspeicher
'Daten: Name, Masse, Durchmesser, Farbe&Helligkeit, Orts- und Geschwindigkeitskomponenten:
declare m$[n&],m![n&],dm![n&],farbe&[n&], x![n&],y![n&],z![n&], vx![n&],vy![n&],vz![n&]
Goto "Daten_holen": weiter_hier:
n&=7' Beschränke das Sytem vorläufig auf n Körper ausser der Sonne (Testphase)
var Nr&=-n&' = zeige Daten des Planeten Nr&; - = off
REPEAT
inc m&
whileloop 0,n&:i&=&Loop' Unter Nutzung der Unabhängigkeit der Koordinaten: Für jeden Körper...
ax![i&]=0:ay![i&]=0:az![i&]=0
whileloop 0,n&:j&=&Loop' summiere alle Beschleunigungsvektoren auf, die durch die Massen
case j&=i&:continue' aller ANDEREN Körper verursacht sind:
rr!=sqr(x![j&]-x![i&])+sqr(y![j&]-y![i&])+sqr(z![j&]-z![i&])' = Quadrat der Distanz
if rr! > 1000000000' bzw. r(i)+r(j) = Kollision, im else-Zweig zu behandeln
urrr!=1/(rr!*sqrt(rr!))' Kehrwert der dritten Potenz der Körperdistanzen [m]
'(1 Potenz mehr als Gravitationsgesetz, um Richtungsvektor-Multiplikation zu kompensieren)
else
'Hier: Division durch 0 - Vermeidung durch Ansatz einer rechnerischen Mindestdistanz
urrr!=0' keine v-Änderung
endif
ax![i&]=ax![i&]+( m![j&]*(x![j&]-x![i&]) )*urrr!*G!
ay![i&]=ay![i&]+( m![j&]*(y![j&]-y![i&]) )*urrr!*G!
az![i&]=az![i&]+( m![j&]*(z![j&]-z![i&]) )*urrr!*G!
endwhile
' Einfluß der Beschleunigung auf die Geschwindigkeit: a/2 *t^2 , mit t = 1 sek bleibt a/2
vx_neu![i&]=vx![i&]+ax![i&]*0.5' Puffer um vorzeitigen Einfluss zu verhindern
vy_neu![i&]=vy![i&]+ay![i&]*0.5
vz_neu![i&]=vz![i&]+az![i&]*0.5
' Auswirkung der neuen mittleren Geschwindigkeiten auf die Ortsveränderung:
x_neu![i&]=x![i&]+vx_neu![i&]' s = s0 + Durchschnittl._V_unter_Beschleunigung * {t=1 sek}
y_neu![i&]=y![i&]+vy_neu![i&]' Puffer um vorzeitigen Einfluss zu verhindern
z_neu![i&]=z![i&]+vz_neu![i&]
endwhile
Stelle_Situation_dar
whileloop 0,n&:i&=&Loop' Alle Planeten: Umgreifen für den nächsten Iterationsschritt:
x![i&]=x_neu![i&]
y![i&]=y_neu![i&]
z![i&]=z_neu![i&]
vx![i&]=vx_neu![i&]
vy![i&]=vy_neu![i&]
vz![i&]=vz_neu![i&]
endwhile
UNTIL &loop
END
Proc Stelle_Situation_dar
declare r!,xx!,yy!
whileloop 0,n&
i&=&Loop
r!=(1+dm![i&]*0.5)/(2500000+z_neu![i&])
case i&=0:r!=7'Zonnenradius sonst viel zu groß
xx!=(x_neu![i&])/(z_neu![i&]+579100000)
yy!=(y_neu![i&])/(z_neu![i&]+579100000)
usebrush 1,farbe&[i&]:usepen 0,1,farbe&[i&]*rnd(2)*(i& mod 11)
ellipse xh&+xx!-r!,(yh&-yy!-r!) - xh&+xx!+r!+1,yh&-yy!+r!+1
endwhile
case nr&<0:return' -1 = keine Daten anzeigen
locate 1,1
print " a =",format$(fm$,ax![nr&]),format$(fm$,ay![nr&]),format$(fm$,az![nr&])
print " v =",format$(fm$,vx_neu![nr&]),format$(fm$,vy_neu![nr&]),format$(fm$,vz_neu![nr&])
print "xyz:",format$(fm$,x_neu![nr&]),format$(fm$,y_neu![nr&]),format$(fm$,z_neu![nr&])
print " ";m$[nr&]," ... Step",format$("000000",m&)',format$(" 0000;-0000",xh&+xx!),format$(" 000;-000",yh&-yy!)
endproc
'{ Daten des Zolar-Systems, provisorisch bis Zmars eingegeben
Daten_holen:
' Ort und Geschwindigkeiten (z.B. am 1.1.2000 00:00 Uhr UTZ(=GMT) )
i&=0' Katalognummer 0..n&-1, 0 = Zentralgestirn
m$[i&]="Zonne"
m![i&]=val("1.989e38")' val("1.989e30") 'Masse in kg
farbe&[i&]=rgb(255,230,100)'Farbe * Helligkeit
dm![i&]=val("1391000000")' Durchmesser in m
x![i&]=val("0")
y![n&]=val("0")
z![n&]=val("0")
vx![i&]=val("0 m/s")
vy![i&]=val("0 m/s")
vz![i&]=val("0 m/s")
i&=1
m$[i&]="Zmerkur"
dm![i&]=val("12104000")' Durchmesser in m
m![i&]=val("4.867e24")' Masse in kg
farbe&[i&]=rgb(200,200,255)
x![i&]=val("-108200000000")
y![n&]=val("0")
z![n&]=val("0")
vx![i&]=val("0 m/s")
vy![i&]=val("-100000000 m/s")'val("0 m/s")
vz![i&]=val("1100 m/s")
i&=2'OK
m$[i&]="Zvenus"
dm![i&]=val("12104000")' Durchmesser in m
m![i&] =val("4.867e24")' Masse in kg
farbe&[i&]=rgb(200,200,0)
x![i&]=val("108200000000")
y![n&]=val("0")
z![n&]=val("0")
vx![i&]=val("0 m/s")
vy![i&]=val("100000000 m/s")'val("0 m/s")'val("0 m/s")
vz![i&]=val("5500 m/s")
i&=3' Mit Überraschung, so OK!
m$[i&]="Zerde"
m![i&]=val("5.972e24")'Masse in kg
dm![i&]=val("12742000")' Durchmesser in m
farbe&[i&]=rgb(150,200,255)
x![i&]=val("149600000000")
y![n&]=val(" ")
z![n&]=val(" ")
vx![i&]=val("0 m/s")
vy![i&]=val("183300000 m/s")
vz![i&]=val("6000 m/s")
'}
'{ Ausserhalb Erdbahn
i&=4
m$[i&]="Zmars"' Doppelüberraschung!!
m![i&]=val("639e21")'Masse
dm![i&]=val("6779000")' Durchmesser in m
farbe&[i&]=rgb(200,200,0)
x![i&]=val("227900000000")
y![n&]=val("0")
z![n&]=val("0")
vx![i&]=val("0 m/s")
vy![i&]=val("-183300000 m/s")
vz![i&]=val("2000 m/s")
i&=5
m$[i&]="Zupiter"
m![i&]=val("1.898e27")'Masse
dm![i&]=2*val("69911000")' Durchmesser in m
farbe&[i&]=rgb(200,150,80)
x![i&]=val("278500000000")' val("778500000000")'real
y![n&]=val(" ")
z![n&]=val(" ")
vx![i&]=val("0 m/s")
vy![i&]=val("-28330000 m/s")
vz![i&]=val("0 m/s")
' }
' {----------------------------Experimente ab hier (n& erhöhen!) -----------------------
i&=6
m$[i&]="Zaturn"
m![i&]=val("568.3e24")'Masse
dm![i&]=val("58232000")'*2 Durchmesser in m
farbe&[i&]=rgb(243,0,200)
x![i&]=0' val("1433000000000")'real
y![n&]=val("1333000000000")
z![n&]=val("29999")
vx![i&]=val("0 m/s")
vy![i&]=val("-18330000 m/s")
vz![i&]=val("1555 m/s")
i&=7
m$[i&]="Zuranus"
m![i&]=val("568.3e24")'Masse
dm![i&]=val("8232000")' Durchmesser in m
farbe&[i&]=rgb(189,200,0)
x![i&]=val(" ")
y![n&]=val(" ")
z![n&]=val(" ")
vx![i&]=val("0 m/s")
vy![i&]=val("-8330000 m/s")
vz![i&]=val("-8330000 m/s")
i&=8
m$[i&]="Zneptun"
m![i&]=val("1.98934")' val("1.989e30") 'Masse in kg
farbe&[i&]=rgb(255,230,100)'Farbe * Helligkeit
dm![i&]=val("13910000")' Durchmesser in m
x![i&]=val(" ")
y![n&]=val("-13330000000")
z![n&]=val(" ")
vx![i&]=val("100000 m/s")
vy![i&]=val("0 m/s")
vz![i&]=val("0 m/s")
Goto "weiter_hier"
'}