from enum import Enum import numpy as np from ..units import * from .calc import format_sig_figs class Body: """ Base class for any orbital body """ def __init__(self, X: Position, V: Velocity, m: Mass, name: str = ""): """ x (position) and v (velocity) """ self.X = X self.V = V self.A = Acceleration([0,0,0]) self.m = m self.name = name def save(self): return (self.X, self.V, self.m) @classmethod def load(cls, tup): return cls(tup[0], tup[1], tup[2]) def step(self, step_size: float): self.X += step_size*self.V self.V += step_size*self.A self.A = HighPrecisionVector([0,0,0]) def __str__(self): pos = 'm '.join([format_sig_figs(real_pos(x), 3) for x in self.X]) vel = 'm/s '.join([format_sig_figs(real_vel(v), 3) for v in self.V]) return str(f"{self.name}: X = {pos}, V = {vel}") def E(self): return self.ke() + self.pe() def pe(self): return -self.m/self.dist_from_o() def dist_from_o(self): return sum([x**2 for x in self.X]).sqrt() def ke(self): return Decimal(0.5)*self.m*(self._speed()**2) def _speed(self): return sum([v**2 for v in self.V]).sqrt() def speed(self): return str(f"{format_sig_figs(real_vel(self._speed),5)}")