Final exam version with mass and speed
This commit is contained in:
BIN
SolarSystem
BIN
SolarSystem
Binary file not shown.
@@ -1,57 +1,75 @@
|
|||||||
@startuml
|
@startuml
|
||||||
|
skinparam classAttributeIconSize 0
|
||||||
|
|
||||||
class SpaceObject {
|
class SpaceObject {
|
||||||
x
|
x
|
||||||
y
|
y
|
||||||
radius
|
radius
|
||||||
color
|
color
|
||||||
update()
|
mass
|
||||||
draw()
|
update()
|
||||||
|
draw()
|
||||||
}
|
}
|
||||||
|
|
||||||
class Star {
|
class Star {
|
||||||
name
|
name
|
||||||
planets
|
planets
|
||||||
add_planet()
|
add_planet()
|
||||||
set_position()
|
set_position()
|
||||||
update()
|
update()
|
||||||
draw()
|
draw()
|
||||||
}
|
}
|
||||||
|
|
||||||
class Planet {
|
class Planet {
|
||||||
star
|
star
|
||||||
orbit_number
|
orbit_number
|
||||||
orbit_radius
|
orbit_radius
|
||||||
angle
|
angle
|
||||||
speed
|
speed
|
||||||
direction
|
angular_speed
|
||||||
calculate_position()
|
linear_speed
|
||||||
update()
|
direction
|
||||||
draw_orbit()
|
calculate_position()
|
||||||
draw()
|
update()
|
||||||
|
draw_orbit()
|
||||||
|
draw()
|
||||||
}
|
}
|
||||||
|
|
||||||
class SolarSystem {
|
class SolarSystem {
|
||||||
stars
|
width
|
||||||
show_orbits
|
height
|
||||||
paused
|
stars
|
||||||
create_system()
|
show_orbits
|
||||||
resize()
|
paused
|
||||||
update()
|
create_system()
|
||||||
draw()
|
get_direction()
|
||||||
toggle_pause()
|
resize()
|
||||||
toggle_orbits()
|
update()
|
||||||
|
draw()
|
||||||
|
toggle_pause()
|
||||||
|
toggle_orbits()
|
||||||
|
get_all_objects()
|
||||||
|
get_total_mass()
|
||||||
|
get_planet_count()
|
||||||
}
|
}
|
||||||
|
|
||||||
class SolarApp {
|
class SolarApp {
|
||||||
system
|
screen
|
||||||
handle_events()
|
clock
|
||||||
draw_panel()
|
system
|
||||||
run()
|
save_callback
|
||||||
|
draw_panel()
|
||||||
|
handle_events()
|
||||||
|
run()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class save_system_to_file
|
||||||
|
|
||||||
SpaceObject <|-- Star
|
SpaceObject <|-- Star
|
||||||
SpaceObject <|-- Planet
|
SpaceObject <|-- Planet
|
||||||
Star "1" o-- "many" Planet
|
SolarSystem *-- Star
|
||||||
SolarSystem "1" o-- "2" Star
|
Star *-- Planet
|
||||||
SolarApp --> SolarSystem
|
SolarApp --> SolarSystem
|
||||||
|
SolarApp --> save_system_to_file
|
||||||
|
|
||||||
@enduml
|
@enduml
|
||||||
|
|||||||
45
UML_objects_end.puml
Normal file
45
UML_objects_end.puml
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
@startuml
|
||||||
|
object system {
|
||||||
|
paused = True/False
|
||||||
|
show_orbits = True/False
|
||||||
|
}
|
||||||
|
|
||||||
|
object star1 {
|
||||||
|
name = Star 1
|
||||||
|
x = current_x
|
||||||
|
y = current_y
|
||||||
|
mass = 1.989e30
|
||||||
|
}
|
||||||
|
|
||||||
|
object star2 {
|
||||||
|
name = Star 2
|
||||||
|
x = current_x
|
||||||
|
y = current_y
|
||||||
|
mass = 1.750e30
|
||||||
|
}
|
||||||
|
|
||||||
|
object planet1_end {
|
||||||
|
orbit_number = 1
|
||||||
|
angle = changed_angle
|
||||||
|
x = current_x
|
||||||
|
y = current_y
|
||||||
|
direction = 1
|
||||||
|
angular_speed = 0.0097
|
||||||
|
linear_speed = angular_speed * orbit_radius
|
||||||
|
}
|
||||||
|
|
||||||
|
object planet2_end {
|
||||||
|
orbit_number = 2
|
||||||
|
angle = changed_angle
|
||||||
|
x = current_x
|
||||||
|
y = current_y
|
||||||
|
direction = -1
|
||||||
|
angular_speed = 0.0104
|
||||||
|
linear_speed = angular_speed * orbit_radius
|
||||||
|
}
|
||||||
|
|
||||||
|
system -- star1
|
||||||
|
system -- star2
|
||||||
|
star1 -- planet1_end
|
||||||
|
star2 -- planet2_end
|
||||||
|
@enduml
|
||||||
39
UML_objects_start.puml
Normal file
39
UML_objects_start.puml
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
@startuml
|
||||||
|
object system {
|
||||||
|
paused = False
|
||||||
|
show_orbits = True
|
||||||
|
}
|
||||||
|
|
||||||
|
object star1 {
|
||||||
|
name = Star 1
|
||||||
|
planets = 11
|
||||||
|
mass = 1.989e30
|
||||||
|
}
|
||||||
|
|
||||||
|
object star2 {
|
||||||
|
name = Star 2
|
||||||
|
planets = 12
|
||||||
|
mass = 1.750e30
|
||||||
|
}
|
||||||
|
|
||||||
|
object planet1_start {
|
||||||
|
orbit_number = 1
|
||||||
|
angle = start_angle
|
||||||
|
direction = 1
|
||||||
|
angular_speed = 0.0097
|
||||||
|
mass = 3e24..8e24
|
||||||
|
}
|
||||||
|
|
||||||
|
object planet2_start {
|
||||||
|
orbit_number = 2
|
||||||
|
angle = start_angle
|
||||||
|
direction = -1
|
||||||
|
angular_speed = 0.0104
|
||||||
|
mass = 3e24..8e24
|
||||||
|
}
|
||||||
|
|
||||||
|
system -- star1
|
||||||
|
system -- star2
|
||||||
|
star1 -- planet1_start
|
||||||
|
star2 -- planet2_start
|
||||||
|
@enduml
|
||||||
10
build_linux.sh
Executable file
10
build_linux.sh
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
python3 -m venv venv
|
||||||
|
source venv/bin/activate
|
||||||
|
pip install pygame pyinstaller
|
||||||
|
rm -rf build dist *.spec
|
||||||
|
pyinstaller --onefile --windowed --name SolarSystem main.py
|
||||||
|
cp dist/SolarSystem .
|
||||||
|
chmod +x SolarSystem
|
||||||
|
echo "Done: ./SolarSystem"
|
||||||
@@ -5,14 +5,29 @@ def save_system_to_file(system, filename="solar_state.txt"):
|
|||||||
with open(filename, "w", encoding="utf-8") as file:
|
with open(filename, "w", encoding="utf-8") as file:
|
||||||
file.write(f"Saved: {datetime.now()}\n")
|
file.write(f"Saved: {datetime.now()}\n")
|
||||||
file.write(f"Paused: {system.paused}\n")
|
file.write(f"Paused: {system.paused}\n")
|
||||||
file.write(f"Show orbits: {system.show_orbits}\n\n")
|
file.write(f"Show orbits: {system.show_orbits}\n")
|
||||||
|
file.write(f"Total stars: {len(system.stars)}\n")
|
||||||
|
file.write(f"Total planets: {system.get_planet_count()}\n")
|
||||||
|
file.write(f"Total objects: {len(system.get_all_objects())}\n")
|
||||||
|
file.write(f"Total mass: {system.get_total_mass():.3e}\n\n")
|
||||||
|
|
||||||
for star in system.stars:
|
for star in system.stars:
|
||||||
file.write(f"{star.name}: x={round(star.x, 2)}, y={round(star.y, 2)}, radius={star.radius}\n")
|
file.write(
|
||||||
|
f"{star.name}: "
|
||||||
|
f"x={round(star.x, 2)}, y={round(star.y, 2)}, "
|
||||||
|
f"radius={star.radius}, mass={star.mass:.3e}\n"
|
||||||
|
)
|
||||||
|
|
||||||
for planet in star.planets:
|
for planet in star.planets:
|
||||||
file.write(
|
file.write(
|
||||||
f" Planet orbit={planet.orbit_number}, "
|
f" Planet orbit={planet.orbit_number}, "
|
||||||
f"x={round(planet.x, 2)}, y={round(planet.y, 2)}, "
|
f"x={round(planet.x, 2)}, y={round(planet.y, 2)}, "
|
||||||
f"radius={planet.radius}, speed={round(planet.speed, 4)}\n"
|
f"radius={planet.radius}, "
|
||||||
|
f"mass={planet.mass:.3e}, "
|
||||||
|
f"angular_speed={round(planet.angular_speed, 4)}, "
|
||||||
|
f"linear_speed={round(planet.linear_speed, 4)}, "
|
||||||
|
f"direction={planet.direction}, "
|
||||||
|
f"angle={round(planet.angle, 4)}, "
|
||||||
|
f"orbit_radius={planet.orbit_radius}\n"
|
||||||
)
|
)
|
||||||
file.write("\n")
|
file.write("\n")
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ TICKET_CONFIG = {
|
|||||||
"first_orbit": 48,
|
"first_orbit": 48,
|
||||||
"orbit_step": 24,
|
"orbit_step": 24,
|
||||||
"color": (255, 190, 40),
|
"color": (255, 190, 40),
|
||||||
|
"mass": 1.989e30,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Star 2",
|
"name": "Star 2",
|
||||||
@@ -26,6 +27,7 @@ TICKET_CONFIG = {
|
|||||||
"first_orbit": 58,
|
"first_orbit": 58,
|
||||||
"orbit_step": 38,
|
"orbit_step": 38,
|
||||||
"color": (255, 150, 55),
|
"color": (255, 150, 55),
|
||||||
|
"mass": 1.750e30,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
"rules": {
|
"rules": {
|
||||||
@@ -50,7 +52,14 @@ class SolarSystem:
|
|||||||
self.stars = []
|
self.stars = []
|
||||||
|
|
||||||
for star_data in TICKET_CONFIG["stars"]:
|
for star_data in TICKET_CONFIG["stars"]:
|
||||||
star = Star(0, 0, radius=34, color=star_data["color"], name=star_data["name"])
|
star = Star(
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
radius=34,
|
||||||
|
color=star_data["color"],
|
||||||
|
name=star_data["name"],
|
||||||
|
mass=star_data["mass"],
|
||||||
|
)
|
||||||
planet_count = star_data["planet_count"]
|
planet_count = star_data["planet_count"]
|
||||||
planets_per_orbit = star_data["planets_per_orbit"]
|
planets_per_orbit = star_data["planets_per_orbit"]
|
||||||
orbit_count = math.ceil(planet_count / planets_per_orbit)
|
orbit_count = math.ceil(planet_count / planets_per_orbit)
|
||||||
@@ -67,7 +76,16 @@ class SolarSystem:
|
|||||||
break
|
break
|
||||||
|
|
||||||
angle = base_angle + place * (2 * math.pi / planets_per_orbit)
|
angle = base_angle + place * (2 * math.pi / planets_per_orbit)
|
||||||
planet = Planet(star, orbit_number, orbit_radius, angle, speed, direction)
|
planet_mass = random.uniform(3.0e24, 8.0e24)
|
||||||
|
planet = Planet(
|
||||||
|
star,
|
||||||
|
orbit_number,
|
||||||
|
orbit_radius,
|
||||||
|
angle,
|
||||||
|
speed,
|
||||||
|
direction,
|
||||||
|
mass=planet_mass,
|
||||||
|
)
|
||||||
star.add_planet(planet)
|
star.add_planet(planet)
|
||||||
created += 1
|
created += 1
|
||||||
|
|
||||||
@@ -115,3 +133,9 @@ class SolarSystem:
|
|||||||
objects.append(star)
|
objects.append(star)
|
||||||
objects.extend(star.planets)
|
objects.extend(star.planets)
|
||||||
return objects
|
return objects
|
||||||
|
|
||||||
|
def get_total_mass(self):
|
||||||
|
return sum(obj.mass for obj in self.get_all_objects())
|
||||||
|
|
||||||
|
def get_planet_count(self):
|
||||||
|
return sum(len(star.planets) for star in self.stars)
|
||||||
|
|||||||
@@ -3,11 +3,12 @@ import random
|
|||||||
|
|
||||||
|
|
||||||
class SpaceObject:
|
class SpaceObject:
|
||||||
def __init__(self, x, y, radius, color):
|
def __init__(self, x, y, radius, color, mass=1.0):
|
||||||
self.x = x
|
self.x = x
|
||||||
self.y = y
|
self.y = y
|
||||||
self.radius = radius
|
self.radius = radius
|
||||||
self.color = color
|
self.color = color
|
||||||
|
self.mass = mass
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
pass
|
pass
|
||||||
@@ -17,8 +18,8 @@ class SpaceObject:
|
|||||||
|
|
||||||
|
|
||||||
class Star(SpaceObject):
|
class Star(SpaceObject):
|
||||||
def __init__(self, x, y, radius=34, color=(255, 185, 40), name="Star"):
|
def __init__(self, x, y, radius=34, color=(255, 185, 40), name="Star", mass=1.989e30):
|
||||||
super().__init__(x, y, radius, color)
|
super().__init__(x, y, radius, color, mass)
|
||||||
self.name = name
|
self.name = name
|
||||||
self.planets = []
|
self.planets = []
|
||||||
|
|
||||||
@@ -46,13 +47,15 @@ class Star(SpaceObject):
|
|||||||
|
|
||||||
|
|
||||||
class Planet(SpaceObject):
|
class Planet(SpaceObject):
|
||||||
def __init__(self, star, orbit_number, orbit_radius, angle, speed, direction, radius=None, color=None):
|
def __init__(self, star, orbit_number, orbit_radius, angle, speed, direction, radius=None, color=None, mass=None):
|
||||||
self.star = star
|
self.star = star
|
||||||
self.orbit_number = orbit_number
|
self.orbit_number = orbit_number
|
||||||
self.orbit_radius = orbit_radius
|
self.orbit_radius = orbit_radius
|
||||||
self.angle = angle
|
self.angle = angle
|
||||||
self.speed = speed
|
self.speed = speed
|
||||||
|
self.angular_speed = speed
|
||||||
self.direction = direction
|
self.direction = direction
|
||||||
|
self.linear_speed = abs(self.angular_speed * self.orbit_radius)
|
||||||
|
|
||||||
if radius is None:
|
if radius is None:
|
||||||
radius = random.randint(8, 13)
|
radius = random.randint(8, 13)
|
||||||
@@ -64,8 +67,11 @@ class Planet(SpaceObject):
|
|||||||
random.randint(90, 255),
|
random.randint(90, 255),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if mass is None:
|
||||||
|
mass = random.uniform(3.0e24, 8.0e24)
|
||||||
|
|
||||||
x, y = self.calculate_position()
|
x, y = self.calculate_position()
|
||||||
super().__init__(x, y, radius, color)
|
super().__init__(x, y, radius, color, mass)
|
||||||
|
|
||||||
def calculate_position(self):
|
def calculate_position(self):
|
||||||
x = self.star.x + math.cos(self.angle) * self.orbit_radius
|
x = self.star.x + math.cos(self.angle) * self.orbit_radius
|
||||||
@@ -73,7 +79,7 @@ class Planet(SpaceObject):
|
|||||||
return x, y
|
return x, y
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
self.angle += self.speed * self.direction
|
self.angle += self.angular_speed * self.direction
|
||||||
self.x, self.y = self.calculate_position()
|
self.x, self.y = self.calculate_position()
|
||||||
|
|
||||||
def draw_orbit(self, screen, pygame):
|
def draw_orbit(self, screen, pygame):
|
||||||
|
|||||||
Reference in New Issue
Block a user