initial class definitions
This commit is contained in:
parent
a31dfee4a8
commit
3e90ffb5d0
95
OrbitSim.py
95
OrbitSim.py
|
@ -1 +1,96 @@
|
|||
import os, json, numpy, pygame
|
||||
|
||||
groundControlPath = "GroundControlFiles"
|
||||
configPath = os.path.join("ConfigFiles", "OrbitSim")
|
||||
configFilename = os.path.join(configPath, "Universe.cfg")
|
||||
mapFilename = os.path.join(configPath, "Map.png")
|
||||
|
||||
def config():
|
||||
"""Returns the config dictionary. Generates with default values if no config dictionary exists."""
|
||||
|
||||
if not os.path.exists(configPath):
|
||||
os.makedirs(configPath)
|
||||
if not os.path.exists(configFilename):
|
||||
#generate default
|
||||
config_dic = {
|
||||
"g": 6674,
|
||||
"gExp": -14, #G = g * 10^gExp
|
||||
"earthMass": 5972,
|
||||
"earthMassExp": 21, #Me = earthMass * 10^earthMassExp; in kg
|
||||
"earthRadius": 6378000, #meters
|
||||
"timeScale": 1 #higher number go faster wheeeeee
|
||||
}
|
||||
with open(configFilename, "w") as file:
|
||||
json.dump(config_dic, file, indent = 4)
|
||||
return config_dic
|
||||
else:
|
||||
with open(configFilename) as file:
|
||||
return json.load(file)
|
||||
|
||||
class Point:
|
||||
"""Numpy 3-vec"""
|
||||
def __init__(self, x, y, z):
|
||||
self.vector = numpy.array([x, y, z])
|
||||
|
||||
def magnitude(self):
|
||||
return numpy.linalg.norm(self.vector)
|
||||
|
||||
def distanceFrom(self, otherPoint:"Point"):
|
||||
return numpy.linalg.norm(self.vector - otherPoint.vector)
|
||||
|
||||
Point.zero = Point(0, 0, 0)
|
||||
|
||||
class Camera:
|
||||
"""Object which will be used to paint pixels on screen."""
|
||||
def __init__(self, location:Point, target:Point = Point.zero, FOV = 75):
|
||||
self.location = location
|
||||
self.target = target
|
||||
self.FOV = FOV
|
||||
|
||||
def isInside(self, planet:"Planet"):
|
||||
"""returns True if camera is inside the planet."""
|
||||
return numpy.linalg.norm(self.location.magnitude) < planet.radius
|
||||
|
||||
class OrbitingBody:
|
||||
"""a zero-mass point object parented to a planet"""
|
||||
def __init__(self, location:Point, velocity:Point, name, displaySize, parentPlanet):
|
||||
self.location = location
|
||||
self.velocity = velocity
|
||||
self.name = name
|
||||
self.displaySize = displaySize #the size of the object on camera, for visibility reasons
|
||||
self.parentPlanet = parentPlanet
|
||||
|
||||
class Planet:
|
||||
"""A massive body at 0,0,0 and a given radius."""
|
||||
def __init__(self, name, mass, radius, rotationPeriod):
|
||||
"""Rotation period given in seconds."""
|
||||
self.name = name
|
||||
self.mass = mass
|
||||
self.radius = radius
|
||||
self.rotationPercentage = 0
|
||||
self.rotationPeriod = rotationPeriod
|
||||
|
||||
Planet.Earth = Planet("Earth", (config()["earthMass"] * 10**config()["earthMassExp"]), config()["earthRadius"], 86400)
|
||||
|
||||
if __name__=="__main__":
|
||||
pygame.init()
|
||||
pygame.display.set_caption("Spinny")
|
||||
|
||||
window = pygame.display.set_mode((400, 400))
|
||||
resolutionDownscaling = 2
|
||||
pygame.display.flip()
|
||||
|
||||
running = True
|
||||
display = False
|
||||
|
||||
while running:
|
||||
for event in pygame.event.get():
|
||||
if event.type == pygame.QUIT:
|
||||
running = False
|
||||
elif event.type == pygame.MOUSEBUTTONDOWN:
|
||||
if not display:
|
||||
display = True
|
||||
camera = Camera(Point(0, 0, 6378000*4))
|
||||
pygame.quit()
|
||||
|
||||
print("Bye!")
|
Loading…
Reference in a new issue