# Ellipse demo - 2D Solar System viewer

reset

set zeroaxis
set xtics axis
set ytics axis
set size ratio 1
set xrange [-40:40]
set yrange [-40:40]
unset border 
set key right out
set title "Orbits of selected Solar System objects"
set angles degrees
set datafile separator "\t"
if (strstrt(GNUTERM,"wxt")) \
    set label 1 "Use Ctrl+mousewheel to zoom!" at graph 0.5,0.05 center 

fn = 'orbital_elements.dat'

# functions to calculate the parameters of the ellipses from orbital elements
# the actual 3D orbits are projected onto the ecliptic plane
f1(w,W,i) = cos(w)*cos(W)-sin(w)*sin(W)*cos(i)
f2(w,W,i) = cos(w)*sin(W)+sin(w)*cos(W)*cos(i)

angle(w,W,i) = atan2(f2(w,W,i), f1(w,W,i))
# center coordinates
cx(a,e,i,w,W) = -a*e*f1(w,W,i)
cy(a,e,i,w,W) = -a*e*f2(w,W,i)
# axes
fa(a,e,i,w,W) = 2*a*sqrt(1-sin(w)**2*sin(i)**2)
fb(a,e,i,w,W) = 2*a*sqrt(1-e**2)*sqrt(1-cos(w)**2*sin(i)**2)
afromq(q,e) = q/(1-e)

# the ellipse style needs five columns:
# center x, center y, major axis, minor axis, orientation 

plot fn using (cx($2,$3,$4,$5,$6)):\
              (cy($2,$3,$4,$5,$6)):\
              (fa($2,$3,$4,$5,$6)):\
              (fb($2,$3,$4,$5,$6)):\
              (angle($5,$6,$4)) index 0 with ellipses lw 3 title "Planets",\
     fn using (cx($2,$3,$4,$5,$6)):\
              (cy($2,$3,$4,$5,$6)):\
              (fa($2,$3,$4,$5,$6)):\
              (fb($2,$3,$4,$5,$6)):\
              (angle($5,$6,$4)) index 1 every ::0::20 with ellipses lw 1 title "Minor planets",\
     fn using (cx($2,$3,$4,$5,$6)):\
              (cy($2,$3,$4,$5,$6)):\
              (fa($2,$3,$4,$5,$6)):\
              (fb($2,$3,$4,$5,$6)):\
              (angle($5,$6,$4)) index 2 every ::0::10 with ellipses lw 1 title "Comets",\
     fn using (cx($2,$3,$4,$5,$6)):\
              (cy($2,$3,$4,$5,$6)):\
              (fa($2,$3,$4,$5,$6)):\
              (fb($2,$3,$4,$5,$6)):\
              (angle($5,$6,$4)) index 3 every ::0::10 with ellipses lw 1 title "Distant objects"
              
pause -1
reset
