initial class definitions

This commit is contained in:
Sakimori 2021-04-22 15:10:57 -04:00
parent a31dfee4a8
commit 3e90ffb5d0

View file

@ -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!")