English: Section of the
Earth–
Moon system's trajectory around the Sun in proper scale.
▇ orbital path of the Earth
▇ orbital path of the Moon
Español: Un diagrama que ilustra la coórbita de la Luna con la Tierra.
- Used parameters
import numpy as np
import matplotlib.pyplot as plt
rEM = 38 # SVG pixel per |Earth-Moon|; we're going to round to int.
rSE = rEM*389.168 # pixel per |Sun-Earth|
n = 10 # polygon segments per quarter month; with cubic splines, n = 1 would probably suffice.
p = 12.4 # synodic months per year; 4*n*p segments per year.
θ = 2*np.pi*np.arange(-n-1, 3*n)/(4*n*p) # one month
xE = rSE*np.sin(θ)
yE =-rSE*np.cos(θ)
xM = rSE*np.sin(θ) + rEM*(np.sin(p*θ)*np.cos(θ) + np.cos(p*θ)*np.sin(θ)) # Rotate rM vector by Earth's arc angle.
yM =-rSE*np.cos(θ) - rEM*(np.cos(p*θ)*np.cos(θ) - np.sin(p*θ)*np.sin(θ))
fig, ax = plt.subplots(figsize=(19,2.5))
ax.plot(xE, yE, 'b-', linewidth=.5)
ax.plot(xM, yM, 'k-')
ax.plot(xE[1::n], yE[1::n], 'bo', markersize=5)
ax.plot(xM[1::n], yM[1::n], 'ko', markersize=2)
fig.tight_layout()
fig.show()
xE = xE.astype(int)
yE = yE.astype(int)
xM = xM.astype(int)
yM = yM.astype(int)
rM = 8; rE = 20 # radii, not to scale (would be 0.17 and 0.63)
open('out.svg', 'w').write(f<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="1600" height="{1600*(rSE+rEM+rM+yM[-1])/(xE[-1]-xE[0])}" viewBox="{xE[0]} {-(rSE+rEM+rM)} {xE[-1]-xE[0]} {rSE+rEM+rM+yM[-1]}">
<defs>
<marker id="E" overflow="visible"><circle r="{rE}" fill="blue"/></marker>
<marker id="M" overflow="visible"><circle r="{rM}" fill="black"/></marker>
</defs>
<path fill="none" stroke="blue" stroke-width="2" d="M{'L'.join([x+' '+y for x,y in zip(xE.astype(str), yE.astype(str))])}"/>
<path fill="none" stroke="black" stroke-width="4" d="M{'L'.join([x+' '+y for x,y in zip(xM.astype(str), yM.astype(str))])}"/>
<path fill="none" stroke="none" marker-start="url(#M)" marker-mid="url(#M)" marker-end="url(#M)" d="M{'L'.join([x+' '+y for x,y in zip(xM[1::n].astype(str), yM[1::n].astype(str))])}"/>
<path fill="none" stroke="none" marker-start="url(#E)" marker-mid="url(#E)" marker-end="url(#E)" d="M{'L'.join([x+' '+y for x,y in zip(xE[1::n].astype(str), yE[1::n].astype(str))])}"/>
</svg>
)