|
class Planet(VMobject): |
|
def __init__(self, |
|
sun:VMobject=None, |
|
ax:CoordinateSystem=None, |
|
color = BLUE, |
|
radius =0.1, |
|
mass = 6e24, |
|
pos = np.array([150e9,0,0]), |
|
vel = np.array([0,30e3,0]), |
|
G = 6.67e-11, |
|
speed_factor = 24*60*60*20 |
|
): |
|
super().__init__() |
|
self.become(Dot(point=ax.c2p(*pos), color=color, radius=radius)) |
|
self.mass = mass |
|
self.vel = vel |
|
self.ax = ax |
|
self.sun = sun |
|
self.G = G |
|
self.speed_factor = speed_factor |
|
self.add_updater(self.updater) |
|
|
|
def updater(self, obj, dt): |
|
if self.sun is not None: |
|
dvec = self.ax.p2c(self.sun.get_center())-self.ax.p2c(obj.get_center()) |
|
a = dvec*self.G*self.sun.mass/(np.linalg.norm(dvec)**3) |
|
obj.vel = obj.vel + a*dt*self.speed_factor |
|
obj.shift(self.ax.c2p(*(obj.vel*dt*self.speed_factor))) |
|
|
|
class orbit(Scene): |
|
def construct(self): |
|
ax = ThreeDAxes( |
|
x_range=[-200e9,200e9,50e9], |
|
y_range=[-200e9,200e9,50e9], |
|
z_range=[-200e9,200e9,50e9], |
|
x_length=8, |
|
y_length=8, |
|
z_length=8, |
|
tips=False |
|
) |
|
G = 6.67e-11 |
|
sun = Planet( |
|
sun = None, |
|
ax = ax, |
|
color = YELLOW, |
|
radius = 0.2, |
|
mass = 2e30, |
|
pos = np.array([0,0,0]), |
|
vel = np.array([3000,0,0]), |
|
) |
|
earth = Planet( |
|
sun = sun, |
|
ax=ax, |
|
radius=0.1, |
|
color=BLUE, |
|
mass=6e24, |
|
pos = np.array([150e9,0,0]), |
|
vel = np.array([3000,30000,0]), |
|
) |
|
|
|
bluetrace = TracedPath(earth.get_center, stroke_width=1, stroke_color=BLUE) |
|
|
|
self.add(sun,earth,bluetrace) |
|
self.wait(50) |