link graphics

record Point(x, y)

$define	A	150	# major semi-axis
$define	B	100	# minor semi-axis
$define	X	200	# center
$define	Y	200
$define	Orad	  5	# radius of orbiting body
$define	Srad	 13	# radius of orbited body
$define	Delay	 10	# delay between frames

procedure main()
   local focus_x, distance, point, new_point, old_point

   WOpen("size=" || (2 * X) || "," || (2 * Y))

   #  Trace the orbit.

   every point := ellipse(X, Y, A, B) do
      DrawPoint(point.x, point.y)

   #  Draw the orbited body.

   focus_x := X + sqrt(A ^ 2 - B ^ 2)

   FillCircle(focus_x, Y, Srad)

   WAttrib("drawop=reverse")

   #  Animate the orbit.

   until WQuit() do {		# new frame
      every new_point := ellipse(X, Y, A, B) do {
         FillCircle((\old_point).x, old_point.y, Orad)
         FillCircle(new_point.x, new_point.y, Orad)
         distance := sqrt((focus_x - new_point.x) ^ 2 +
            (Y - new_point.y) ^ 2)
         WDelay(Delay)
         old_point := new_point
         }
      }

end

procedure ellipse(x, y, a, b)
   local incr, theta

   every theta := 1 to 360 do
      suspend Point(
         x + a * cos(dtor(theta)),
         y + b * sin(dtor(theta))
         )

end