.. .. .. ..   ..
BlitzBasic > Codearchiv > Grafikeffekte/demosAktuallisiert 30.05.2009

..  Sonnensystemsimulation - von Krischan 
Eine sehr schöne Simulation unseres Sonnensystems mit der Sonne, den (alten) 9 Planeten und deren korrekten Umlaufbahnen- und geschwindigkeiten. Kann auch einfach erweitert werden - man weiß ja nie, wie viele Planeten noch dazukommen - oder verschwinden..

; 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