link graphics

record Point(x, y)

$define X	200	#  center
$define Y	200
$define Delay	 30	# frame delay
$define Message	"Awake!"
$define Radius	 40	# radius of blinker
$define Ring	 44	# radius of ring
$define Modulus	 12	# blinker delta
$define Orad	120	# orbit radius

procedure main()
   local new_point, old_point, count

   WOpen("size=" || (2 * X) || "," || (2 * Y),
      "bg=light gray", "drawop=reverse",
          "font=Helvetica,42") |
            stop("*** cannot open window")

   # Create background for blinker.

   FillCircle(X, Y, Ring)

   #  Animate the display.

   count := 0

   until WQuit() do {
      every new_point := circle(X, Y, Orad) do {
         CenterString((\old_point).x,
            old_point.y, Message)
         CenterString(new_point.x, new_point.y,
            Message)
         count +:= 1
         if count % Modulus = 0 then
            FillCircle(X, Y, Radius)
         WDelay(Delay)
         old_point := new_point
         }
      }

end

procedure circle(x, y, r)
   local theta

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

end