; von Krischan, 15.10.2005 im blitzforum
Graphics 800,600,16,2
AppTitle "Sonnensystem"
SetBuffer BackBuffer()
Global panz=9
;Datenfelder auslesen
Dim planeten$(panz,8)
Restore planeten
For p=0 To panz
For q=0 To 8
Read planeten$(p,q)
Next
Next
;Parameter festlegen
mx=GraphicsWidth()/2
my=GraphicsHeight()/2
zoom#=100
zeit#=1
;1 Jahr = Umlaufzeit Erde
jahr#=360/(365.256/Float(planeten$(3,4)))
;Fonts laden
font1=LoadFont("System",16,0,0,0)
font2=LoadFont("Small Fonts",10,0,0,0)
;Hauptschleife
While Not KeyHit(1)
;Tastatursteuerung
If KeyDown(208) Then zoom#=zoom#+10
If KeyDown(200) Then zoom#=zoom#-10
If KeyDown(205) Then zeit#=zeit#+(zoom#/1000)
If KeyDown(203) Then zeit#=zeit#-(zoom#/1000)
;Begrenzungen
If zoom#<25 Then zoom#=25
If zoom#>5000 Then zoom#=5000
If zeit#<1 Then zeit#=1
If zeit>1000 Then zeit#=1000
; Bildschirm leeren
Cls
;alle Objekte durchgehen
For planet=0 To panz
;Daten aus den Feldern lesen
name$=planeten$(planet,0)
dist#=Float(planeten$(planet,1))/zoom#*100
aphel#=Float(planeten$(planet,2))
perihel#=Float(planeten$(planet,3))
speed#=365.256/Float(planeten$(planet,4))
size#=Float(planeten$(planet,5))/zoom#
If size#<5 Then size#=5
r=Int(planeten$(planet,6))
g=Int(planeten$(planet,7))
b=Int(planeten$(planet,8))
;aktuellen Planet einzeichnen
zeichneplanet(mx,my,name$,dist#,aphel#,perihel#,speed#,size#,i#,360,r,g,b,font2)
Next
;Winkel erhöhen
i#=i#+zeit#
SetFont font1
;abgelaufene Zeit in Erdjahren zeigen
Color 255,255,255
Text 0,0,"Erdumläufe:":Text 100,0,i#/jahr#
Text 0,15,"Zoom:":Text 100,15,Int(zoom#)
Text 0,30,"Speed:":Text 100,30,zeit#
;Bufferswitch
Flip 1
Wend
End
.planeten
; --------------------------------------------------------------------------------
; Daten der einzelnen Planeten, aus denen die Szene berechnet wird
; frei aus der Wikipedia übernommen bzw. umgerechnet
; --------------------------------------------------------------------------------
; Name Radius Aphel Perihel synod.Per. Grösse Rot Grün Blau
; --------------------------------------------------------------------------------
Data "Sonne" , 0.0, 1.000, 1.000, 1.000, 1392.000, 255 , 255 , 0
Data "Merkur" , 38.7, 1.206, 0.794, 87.989, 4.878, 255 , 128 , 0
Data "Venus" , 108.2, 1.007, 0.993, 224.701, 5.000, 255 , 255 , 0
Data "Erde" , 149.6, 1.017, 0.983, 365.256, 12.756, 0 , 0 , 255
Data "Mars" , 227.9, 1.093, 0.906, 686.980, 6.794, 255 , 0 , 0
Data "Jupiter" , 778.6, 1.049, 0.951, 4332.589, 142.984, 255 , 192 , 0
Data "Saturn" ,1514.6, 1.057, 0.944, 10759.346, 120.536, 255 , 224 , 0
Data "Uranus" ,3003.6, 1.046, 0.954, 30685.400, 51.118, 0 , 128 , 255
Data "Neptun" ,4545.7, 1.011, 0.989, 60267.240, 49.248, 0 , 255 , 255
Data "Pluto" ,7304.3, 1.244, 0.756, 90465.000, 2.390, 255 , 255 , 255
; --------------------------------------------------------------------------------
;Planet an einer bestimmten Stelle mit Kreisbahn zeichnen
Function zeichneplanet(mx,my,name$,dist#,aphel#,perihel#,speed#,size#,i#,angle#,r,g,b,font)
;Vorberechnungen
radiusx#=dist#*aphel#
radiusy#=dist#*perihel#
i#=i#*speed#
;mittleren Bahnradius einzeichnen
Color 32,32,32
Oval mx-(dist#),my-(dist#),dist#*2,dist#*2,0
;Ellipsenposition berechnen
xcos#=Cos#(angle#)
xsin#=Sin#(angle#)
tmpx#=Cos#(i#)*radiusx#
tmpy#=Sin#(i#)*-radiusy#
x#=tmpx#*xcos#+tmpy*-xsin#
y#=tmpx#*xsin#+tmpy*xcos#
;elliptischen Bahnradius einzeichnen
Color r/4,g/4,b/4
Oval mx-radiusx#,my-radiusy,radiusx#*2,radiusy#*2,0
;Planet auf Ellipsenposition zeichnen
Color r,g,b
Oval mx+x#-(size#/2),my+y#-(size#/2),size#,size#,1
;Planetennamen über dem Objekt einzeichnen
SetFont font
Text mx+x#,my+y#-(size#/2)-5,name$,1,1
End Function
|