planeten.py
planeten.py — text/python-source, 5 KB (5694 bytes)
Dateiinhalt
# -*- coding: utf-8 -*-
# einfaches Planetensystem
# Sonne (km,km,kg):
s_radius=1.39e6
s_masse=2e30
# Merkur (km,d,d):
mer_radius=2439
mer_umkreiszeit=88
mer_rotzeit=59
s_abstand_merkur=58e6
# Venus (km,d,d):
v_radius=6050
v_umkreiszeit=224.7
v_rotzeit=243
s_abstand_venus=108e6
# Erde (km, km, kg,°,d):
e_radius=12730
s_abstand_erde=150e6
e_masse=5,97e24
e_neigungswinkel=23.44
e_rotzeit=1
e_umkreiszeit=365
# Mond (km, kg)
m_radius=1738
e_abstand_mond=384400
m_masse=7.35e22
m_rotzeit=29
m_umkreiszeit=29
# Mars (km, d, d, km):
ma_radius=3397
ma_rotzeit=24.5
ma_umkreiszeit=687
s_abstand_mars=227e6
# Jupiter():
j_radius=71490
s_abstand_jupiter=777e6
j_umkreiszeit=365*11+316
j_rotzeit=0.35
# 1 Tag = 1 Minute bei zfakt=250
# 1 Tag = 1 Sekunde bei zfakt=4.16
zfakt = 250
from visual import * # das 3D-Modul
from threading import * # das Modul für Nebenläufigkeit
from math import * # das Mathe-Modul (sin, cos, log)
#-- Oberflächen Mond und Mars (do it yourself ...) ------------
import Image
name = "moon"
width = 1024
height = 512
im = Image.open(name+".tga")
materials.saveTGA(name,im)
mondtextur = materials.texture(data=im, mapping="spherical")
name = "mars"
width, height = 1024/2, 512/2
im = Image.open(name+".tga")
materials.saveTGA(name,im)
marstextur = materials.texture(data=im, mapping="spherical")
#-----------------------------------------------------------------
def scale_dist(rohdaten):
"globale Hilfsfunktion: skaliert Entfernungen"
return sqrt(rohdaten)
def scale_rad(rohdaten):
"globale Hilfsfunktion: skaliert Radien"
return sqrt(rohdaten)
class Planet(Thread):
"Klasse erstellt Planetenobjekte"
def __init__(self, form=0, pos=(0,0,0), radius=e_radius, color=(1,1,1), rotzeit=1, umkreiszeit=365, zentrum=None,\
abstand_zentrum=0, material=materials.earth, neigungswinkel=23.4, spurlaenge=500, spurfarbe=(0.3,0,0)):
Thread.__init__(self)
self.f = frame(pos=pos)
self.planet = sphere(frame=self.f)
self.planet.material = material
self.planet.radius = radius
self.planet.color = color
self.planet.frame=self.f
self.neigungswinkel=neigungswinkel
self.rotzeit=rotzeit
self.umkreiszeit = umkreiszeit
self.zentrum=zentrum
self.abstand_zentrum = abstand_zentrum
self.trail = curve(color=spurfarbe)
self.spurlaenge = spurlaenge
def run(self):
x=0.0
while 1:
rate(25) # max. 50 Berechnungen pro Sekunde
self.planet.rotate(angle=pi/zfakt*5/self.rotzeit, axis=(0,1,0)) # Eigendrehung: 1d = 1min
self.f.axis = (cos(radians(self.neigungswinkel)),sin(radians(self.neigungswinkel)),0) # Neuausrichtung der Frame-Axis für Planetenneigungswinkel
if self.zentrum:
self.f.pos = (self.zentrum.f.pos.x+self.abstand_zentrum*sin(x/self.umkreiszeit/zfakt), 0 ,self.zentrum.f.pos.z+self.abstand_zentrum*cos(x/self.umkreiszeit/zfakt)) #Bewegung um Zentrum
self.trail.append(pos=self.f.pos, retain=int(self.spurlaenge*zfakt))
x+=1
if __name__ == '__main__': # falls Skript gestartet...
scene.width=800 # Fensterbreite
scene.height=400 # Fensterhöhe
scene.forward-=vector(0,0.03,0.1) # Blickpunkt in Zentrum über den Bahnen...(Vektoraddition)
print scene.forward # Kontrollausgabe des Vektors
scene.lights=[distant_light(direction=(0.22, 0.44, 0.88), color=color.gray(0.4))] # nur schwaches 'Weltraumlicht'
sonne = Planet(pos=(0,0,0),radius=scale_dist(s_radius), color = (1,1,0), material=materials.emissive)
sonnenlicht = local_light(pos=(0,0,0), color=color.white)
merkur = Planet(pos=(0,0,scale_dist(s_abstand_merkur)),radius=scale_rad(mer_radius), color = (1,0.6,0.2), material=materials.wood, rotzeit=mer_rotzeit, \
umkreiszeit=mer_umkreiszeit, zentrum=sonne, abstand_zentrum=scale_dist(s_abstand_merkur))
venus = Planet(pos=(0,0,scale_dist(s_abstand_venus)), radius=scale_rad(v_radius), color=(0.4,0.6,0.8), material=materials.marble, rotzeit=v_rotzeit, \
umkreiszeit=v_umkreiszeit, zentrum=sonne, abstand_zentrum=scale_dist(s_abstand_venus), spurlaenge=1000)
erde = Planet(pos=(0,0,scale_dist(s_abstand_erde)), radius=scale_rad(e_radius), rotzeit=e_rotzeit, material=materials.earth,neigungswinkel=e_neigungswinkel,\
zentrum=sonne, umkreiszeit=e_umkreiszeit, abstand_zentrum=scale_dist(s_abstand_erde))
mond = Planet(pos=(0,0,0), radius=scale_rad(m_radius), zentrum=erde, abstand_zentrum=scale_dist(e_abstand_mond), \
material=mondtextur, rotzeit=m_rotzeit, umkreiszeit=m_umkreiszeit, spurlaenge=20000)
"""
mars = Planet(pos=(0,0,scale_dist(s_abstand_mars)), radius=scale_rad(ma_radius), zentrum=sonne, abstand_zentrum=scale_dist(s_abstand_mars),\
umkreiszeit=ma_umkreiszeit, rotzeit=ma_rotzeit, material=marstextur, spurlaenge=300000)
jupiter= Planet(pos=(0,0,scale_dist(s_abstand_jupiter)), radius=scale_rad(j_radius), zentrum=sonne, abstand_zentrum=scale_dist(s_abstand_jupiter),\
umkreiszeit=j_umkreiszeit, rotzeit=j_rotzeit, color=(0.7,0.3,0.2), material=materials.marble, spurlaenge=300000)
"""
# Planeten-Threads einzeln starten...
merkur.start()
venus.start()
erde.start()
mond.start()
"""
mars.start()
jupiter.start()
"""