-----
import turtle
import math
# Ablak beállítása
ablak = turtle.Screen()
ablak.setup(width=660, height=660)
ablak.bgcolor("black")
ablak.title("3D Naprendszer szimuláció")
ablak.tracer(0) # A folyamatos animációhoz (villódzásmentesítés)
# A Nap
nap = turtle.Turtle()
nap.shape("circle")
nap.color("yellow")
nap.shapesize(3, 3)
nap.up()
nap.goto(0, 0)
# Bolygók adatai: név, szín, méret, távolság, szögsebesség, pálya dőlésszög
# A dőlésszögekkel (inklináció) hozzuk létre a 3D-s hatást
bolygok_adatok = [
("Merkúr", "gray", 0.3, 45.0, 4.7, 15),
("Vénusz", "orange", 0.7, 72.0, 3.5, 3),
("Föld", "blue", 0.8, 108.0, 3, 0),
("Mars", "red", 0.5, 144.0, 2.4, 1.8),
("Jupiter", "brown", 1.5, 198.0, 1.3, 1.3),
("Szaturnusz", "yellow", 1.2, 252.0, 1, 2.5),
("Uránusz", "light blue", 1.1, 306.0, 0.7, 0.8),
("Neptunusz", "blue", 1.1, 360.0, 0.5, 1.8)
]
bolygok = []
szogok = []
for nev, szin, meret, tav, seb, inclinacio in bolygok_adatok:
bolygo = turtle.Turtle()
bolygo.shape("circle")
bolygo.color(szin)
bolygo.shapesize(meret, meret)
bolygo.up()
# Tároljuk a kezdeti adatokat, beleértve a térbeli dőlést is (radiánba váltva)
bolygok.append((bolygo, tav, seb, math.radians(inclinacio)))
szogok.append(0)
# Hold a Föld körül
hold = turtle.Turtle()
hold.shape("circle")
hold.color("white")
hold.shapesize(0.3, 0.3)
hold.up()
hold_szog = 0
# 3D koordináta-transzformáció (döntött nézet)
def vetulet_3d(x, y, z):
# Döntjük a teret, hogy látszódjon a magasság (z)
szog_xy = math.radians(60) # Kamera szöge
x_3d = x - y * math.cos(szog_xy)
y_3d = z + (x + y * math.sin(szog_xy)) * 0.5
return x_3d, y_3d
while True:
for i, (bolygo, tav, seb, inclinacio) in enumerate(bolygok):
# 3D keringés a Nap körül
# A magasság (z) a pálya dőlésszögétől függ
szog_rad = math.radians(szogok[i])
x_2d = tav * math.cos(szog_rad)
y_2d = tav * math.sin(szog_rad)
z_3d = tav * math.sin(inclinacio) * math.sin(szog_rad)
# 2D-be vetítés
x_3d, y_3d = vetulet_3d(x_2d, y_2d, z_3d)
bolygo.goto(x_3d, y_3d)
szogok[i] += seb
# A Hold mozgatása a Föld körül
if i == 2: # Föld
hold_szog_rad = math.radians(hold_szog)
hold_x_2d = x_2d + 30 * math.cos(hold_szog_rad)
hold_y_2d = y_2d + 30 * math.sin(hold_szog_rad)
hold_z_3d = z_3d + 10 * math.sin(hold_szog_rad) # A Hold pályája is döntött
hx_3d, hy_3d = vetulet_3d(hold_x_2d, hold_y_2d, hold_z_3d)
hold.goto(hx_3d, hy_3d)
hold_szog += 5
ablak.update() # Képernyő frissítése (tracer miatt szükséges)
Nincsenek megjegyzések:
Megjegyzés küldése