diff --git a/OrbitSim.py b/OrbitSim.py index 8b13789..cf39a07 100644 --- a/OrbitSim.py +++ b/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!") \ No newline at end of file