# -*- coding: cp1252 -*-
from __future__ import division
from visual import *
insectossaurosrex = input (' bem vindo\n para usar o programa escreva 1 para informações escreva 2 para detalhes técnicas escreva 3: ')
if insectossaurosrex == 2:
print """
Este programa cria uma simulação 3D baseada nas leis da gravitação de newton
Vamos colocar um "satelite" em orbita de um planeta!
Nesta versão levamos em conta a força que o satelite exerce sobre o planeta
A velocidade de escape na realidade é superior á aqui simulada pois os efeitos da gravidade do sol e outros planetas aumentam-na
Podemos simular satelites naturais, artificiais e porque não até um planeta a volta do sol?
As leis são as mesmas!
esta simulação deixa de ser fiavel com o passar do tempo e especialmente para satelites baixos
para bases teoricas aconselha-se a leitura de:
http://en.wikipedia.org/wiki/Astrodynamics http://en.wikipedia.org/wiki/Celestial_mechanics para valores planetários do sistema solar:
http://hyperphysics.phy-astr.gsu.edu/hb ... ldata.html http://www.solarviews.com/eng/toc.htm para data de planetas de outros sistemas:
http://astro.berkeley.edu/~gmarcy/Table.htmlDeixo aqui alguns valores que podem ser uteis:
(raios sao metade do maior valor na dimensão dos satelites)
O telescopio espacial hubble:
raio orbita 600 km
massa de 11 300 Kg,
raio 6,6 m
A estação espacial internacional
raio orbita 360 km
massa 303,663 Kg
raio 54.25 m
A orbita Geostacionaria da terra é 35,786 km acima da superficie terrestre no equador.
Satelites GPS orbitam 20,000 km acima da superficie terrestre.
Mais dados são fornecidos ao longo do programa, divirta-se!
Programa por: João Casimiro Gonçalves Ferreira
"""
if insectossaurosrex == 3:
print '''\nversão 1.5
novo nesta versão:
corrigidos alguns erros de portugues,
implementada a atração que o satelite exerce sobre o planeta,
a cor das orbitas foi mudada para a cor escolhida para o satelite/planeta
foi implementada a possibilidade de especificar vector para a velocidade
corrigidos alguns erros minimos de computação
retirado o periodo pois nao faz sentido falar de periodo uma vez que o corpo nao está sempre á mesma distancia da terra
pode-se usar "pi" nos valores inseridos
Como usar:
Calculos:
pode-se fazer contas :
+ somar
- subtrair
* multiplicar
/ dividir
sqrt(valor) raiz quadrada
se ouver necessidade de elevar a algum numero usa-se ** por exemplo 5 elevado a 7 escreve-se " 5**7 ",
podemos usar notação cientifica, usando a letra "e" 50e20 é o mesmo que "50x10^20" ou usando a notaçao do programa "50*10**20"
para decimais é favor usar pontos e nao virgulas 5,5 crasha o programa, 5.5 é a maneira correcta de escrever
pode-se usar sinais negativos á vontade
Camera:
carregando no botão direito do rato roda a camera em volta do centro de acordo com os movimentos do rato
carregando nos 2 botoes o rato faz zoom conforme se mexa o rato para a frente ou para traz
outros:
o valor final de distancia ao planeta, normalmente negativok NÃO é o quanto o satelite entrou na terra!
'''
def make_time_string(t):
"Accept a number of seconds, return a relative string."
if t < 60: return "%02i seconds"%t
mins,secs = divmod(t, 60)
if mins < 60: return "%02i minutes %02i seconds"%(mins,secs)
hours, mins = divmod(mins,60)
if hours < 24: return "%02i hours %02i minutes"%(hours,mins)
days,hours = divmod(hours,24)
return "%02i days %02i hours"%(days,hours)
scene.title = "satelite personalizado"
scene.width = 800
scene.height = 600
print' para começar vamos dar nomes:'
satname = raw_input ('nome do satelite: ')
platname = raw_input ('nome do planeta: ')
print' insira a massa de ' + str(platname)+ ' (kg)'
print'''
terra: 5.98e24
mercurio: 3.3e23
venus: 4.87e24
marte: 6.42e23
jupiter: 1.90e27
saturno: 5.69e26
urano: 8.7e25
neptuno: 1.03e26
plutao: 1e22
sol: 1.989e30
'''
massOfEarth = input ('massa : ')
print' insira a massa de ' + str(satname) +'(kg)'
print'''
lua =7.36e22
Phobos: 1.08e+16
Deimos: 1.8e+15
Metis: 1.9e+27
Io: 8.94e+22
Europa: 4.8e+22
Ganymede: 1.48e+23
Callisto: 1.08e+23
Prometheus: 2.7e+17
Titan: 1.35e+23
Tritão: 2.14e+22
Charon: 1.90e+21
'''
massOfSatellite = input ('massa : ')
print' insira o raio de ' + str(platname) + ' (m)'
print'''
mercurio: 2439700
venus: 6051800
terra: 6.38e6
marte: 3397200
jupiter: 71492000
saturno: 60268000
urano: 25559000
neptuno: 24746000
plutão: 1145000
sol: 695000000
'''
radiusOfEarth = input ('raio: ') # m
print' insira o raio de ' + str(satname) + ' (m)'
print'''
lua: 1.74e6
Metis: 20000
Phobos: 13.5x10.8x9.4 (km)
Deimos: 7.5x6.1x5.5 (km)
Amalthea: 135x84x75 (km)
Thebe: 55x45 (km)
Io: 1815000
Europa: 1569000
Ganimede: 2631000
Callisto: 2403000
Lysithea: 18000
Pasiphae: 25000
Sinope: 18000
Atlas: 20 x 15 (km)
Prometheus: 72.5x42.5x32.5 (km)
Pandora: 57x42x31 (km)
Epimetheus: 72x54x49 (km)
Janus: 98x96x75 (km)
Tethys: 530000
Telesto: 17x14x13 (km)
Calypso: 17x11x11 (km)
'''
radiusOfSatellite = input ('raio : ') # m
print' insira a distancia de ' + str(platname) + ' a ' + str(satname) + ' (m)'
print'''
terra/lua: 384400000
mercurio/sol: 57910000
venus/sol:108200000
terra/sol: 149600000
marte/sol: 227940000
Phobos/marte: 9380000
Deimos/marte: 23460000
Europa/Jupiter: 670900000
Charon/plutão: 19640000
'''
distanceEarthToSatellite = input ('distancia: ')
distanceEarthToSatellite += radiusOfEarth + radiusOfSatellite
distanceEarthToSatellite1 = distanceEarthToSatellite
print ' para satelites perto de ' + str(platname) + ' insira um valor de 0.01 a 10, para satelites distantes tipo lua entre 30 e 100'
print ' numeros pequenos dão mais precisão mas demora mais tempo a processar'
dt = input ('valor de processamento: ')
totalseconds = 0
print ''' centrar camera em:
1 - ''' + str(satname) + '''(recomendado para artificiais)
2 - ''' + str(platname) + '''(recomendado)
3 - inserir coordenadas (recomendado (0,0,0) para se notar melhor o movimento do planeta devido ao satelite)
'''
yttt = input ('inseria a sua escolha: ')
if yttt == 3:
x=input('x: ')
y=input('y: ')
z=input('z: ')
G = 6.67e-11
earth = sphere(pos=(0,0,0),radius=radiusOfEarth,color=color.blue)
earth.mass = massOfEarth
satellite = sphere(pos=(0,distanceEarthToSatellite,0),radius=radiusOfSatellite,color=color.white)
satellite.mass = massOfSatellite
mylabel = label(pos=(distanceEarthToSatellite1 + 100000,distanceEarthToSatellite1 + 100000,-radiusOfEarth - 2000))
info = label(pos=(0,-distanceEarthToSatellite1 - 100000 ,-radiusOfEarth -2000))
print 'para se conseguir visualizar melhor os satelites é recomendado aumentar raio'
print 'aumentar por um factor de quanto?'
print 'atençao que se aumentar muito os satelites podem ser tapados pelo planeta'
r=input('factor de multiplicação :')
satellite.radius = satellite.radius * r
earth.radius = earth.radius * r
print ' para ter um satelite em orbita circular este programa calcula a velocidade necessaria'
print ' deseja exprimentar e ver o que acontece com outras velocidades?'
y = 2
n = 0
w=input ('y ou n?')
initialAcceleration = (G * earth.mass * satellite.mass / distanceEarthToSatellite**2) / satellite.mass
calculatedVelocity = (initialAcceleration * distanceEarthToSatellite)**.5
speedOfSatellite = calculatedVelocity
satellite.velocity = speedOfSatellite * vector (1,0,0)
pi = 3.141592653589793238462643
vect = pi
if w == 2:
print 'caso deseje escreva "vect" para inserir coordenadas do vector velocidade'
speedOfSatellite = input ('com que velocidade se move ' + str(satname) + ' :\n (esquerda para a direita)')
if not speedOfSatellite == pi:
satellite.velocity = speedOfSatellite * vector(1,0,0)
if speedOfSatellite == pi:
speedOfSatellite = vector (0,0,0)
speedOfSatellite.x = input ('x :')
speedOfSatellite.y = input ('y :')
speedOfSatellite.z = input ('z :')
satellite.velocity = speedOfSatellite
print' que cor deseja para ' + str(platname) + " ?"
cordopaneta = raw_input('vermelho, azul, verde, amarelo, ciano, ou cinzento ?')
if cordopaneta == "vermelho":
earth.color = color.red
if cordopaneta == "azul":
earth.color = color.blue
if cordopaneta == "verde":
earth.color = color.green
if cordopaneta == "amarelo":
earth.color = color.yellow
if cordopaneta == "ciano":
earth.color = color.cyan
if cordopaneta == "cinzento":
earth.color = color.white
cordosat = raw_input('e para ' + str(satname) + ' ?')
if cordosat == "vermelho":
satellite.color = color.red
if cordosat == "azul":
satellite.color = color.blue
if cordosat == "verde":
satellite.color = color.green
if cordosat == "amarelo":
satellite.color = color.yellow
if cordosat == "ciano":
satellite.color = color.cyan
if cordosat == "cinzento":
satellite.color = color.white
print ' por ultimo, deseja as linhas da orbita representadas?'
wanttrail = raw_input('sim/não :')
if wanttrail == "sim":
trail=curve(color=satellite.color)
etrail=curve(color=earth.color)
planeta = label
satelite = label
planeta.text = str(platname)
satelite.text = str(satname)
earth.velocity = vector (0,0,0)
finished = False
while not finished:
totalseconds += dt
rate(10000)
distEarthToSatellite = mag(earth.pos - satellite.pos)
distEarthToSatellite2 = mag(satellite.pos - earth.pos)
planeta.pos = earth.pos
satelite.pos = satellite.pos
#periodo=2 * pi * sqrt (distEarthToSatellite*distEarthToSatellite*distEarthToSatellite / (G*(earth.mass + satellite.mass)))
ForceGravityOnTheSatelliteDir = norm(earth.pos - satellite.pos)
ForceGravityOnTheSatelliteDir2 = norm(satellite.pos - earth.pos)
ForceGravityOnTheSatelliteMag = G * (earth.mass * satellite.mass) / distEarthToSatellite**2
ForceGravityOnTheSatellite = ForceGravityOnTheSatelliteMag * ForceGravityOnTheSatelliteDir
ForceGravityOnEarth = ForceGravityOnTheSatelliteMag * ForceGravityOnTheSatelliteDir2
satellite.acceleration = ForceGravityOnTheSatellite / satellite.mass
satellite.velocity += satellite.acceleration * dt
satellite.pos += satellite.velocity * dt + .5 * satellite.acceleration * dt**2
#satelite.pos += satellite.velocity * dt + .5 * satellite.acceleration * dt**2
earth.acceleration = ForceGravityOnTheSatellite / earth.mass
earth.velocity += earth.acceleration * dt
earth.pos += earth.velocity * dt + .5 * earth.acceleration * dt**2
#satelite.pos += satellite.velocity * dt + .5 * satellite.acceleration * dt**2
escapevelocity = sqrt (2 * G * earth.mass /distEarthToSatellite)
if yttt == 1:
scene.center = satellite.pos
if yttt ==2:
scene.center = earth.pos
if yttt ==3:
scene.center = (x,y,z)
if wanttrail == "sim":
trail.append(pos=satellite.pos)
etrail.append(pos=earth.pos)
message = "Informacoes: "
message += "\nDistancia de " + str(satname) + ' a ' + str(platname) + ': ' + str(((distEarthToSatellite-radiusOfEarth)/1000)) + " kilometros"
message += "\nVelocidade de " + str(satname)+ ": " +str(mag(satellite.velocity))+" m/s"
message += "\nAceleracao de " + str(satname)+ ": " +str(mag(satellite.acceleration))+" m/s**2"
message += "\nForca Gravitica: " + str(ForceGravityOnTheSatelliteMag) + " N"
message += "\nvelocidade de escape: " + str(escapevelocity) + " m/s"
#satanic = "\nperiodo: " + str(periodo) + " s"
satanic = "\nmassa de " + str(satname)+ ": " + str(massOfSatellite) +" kg"
satanic += "\nmassa de " + str(platname)+ ": " + str (massOfEarth) +" kg"
satanic += "\nraio de " + str(platname)+ ": " + str (radiusOfEarth) + " m"
satanic += "\nraio de " + str(satname)+ ": " + str (radiusOfSatellite) + " m"
satanic += "\ndistancia inicial: " + str (distanceEarthToSatellite1) + " m"
satanic += "\nvelocidade inicial de " + str(satname)+ ": " + str (speedOfSatellite) + " m/s"
satanic += "\nTempo em orbita: " + make_time_string(totalseconds)
message += satanic
mylabel.text = message
vectores = "Vectores: "
vectores += "\nvelocidade: " + str(satellite.velocity)
vectores += "\naceleracao: " + str(satellite.acceleration)
vectores += "\nposicao: " + str(satellite.pos)
vectores += "\ngravidade: " + str(ForceGravityOnTheSatellite)
info.text = vectores
if distEarthToSatellite <= radiusOfEarth :
info.text = str(satname) + " colidiu com " + str(platname)+ "!"
periodo = 0
finished = True
if 3*escapevelocity <= mag(satellite.velocity):
satan = str(platname) + " nao consegue manter " + str(satname) + " em orbita pois este esta muito longe"
satan += "\ncomo pode verificar pelas informacoes fornecidas ao longo do programa a velocidade e superior a velocidade de escape"
info.text = satan