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