############################################################################ # # File: rings.icn # # Subject: Program to draw tiles of rings and circles # # Author: Gregg M. Townsend # # Date: July 13, 1994 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This program produces seamless tiles with drawings of circles and # rings. # # It words from characters input to the window: # # q quit # c draw 10 random circles # r draw 5 random rings # W writes image to GIF file; files are named ring000.gif, # ring001.gif, ... # E erases the window # F fills the window # R reverses the colors # # At present there are no options except those provided for # opening the window. # # Some modifications have been made by Ralph E. Griswold # ############################################################################ # # Requires: Version 9 graphics # ############################################################################ # # Links: xio, xutils # ############################################################################ $define W 128 $define H 128 link xio, xutils procedure main(args) local count count := -1 Window(args) repeat case Event() of { QuitEvents(): exit() "c": randrop(circle, 10) "r": randrop(ring, 5) "W": WriteImage("rings" || right(count +:= 1, 3, "0") || ".gif", , , W, W) "E": EraseArea() "F": FillRectangle() "R": {WAttrib("drawop=reverse"); FillRectangle(); WAttrib("drawop=copy")} } end procedure replicate() CopyArea(0, 0, W, H, 0, H) CopyArea(0, 0, W, 2 * H, W, 0) CopyArea(0, 0, 2 * W, 2 * H, 2 * W, 0) CopyArea(0, 0, 4 * W, 2 * H, 0, 2 * H) DrawLine(W, 0, W, H, 0, H) return end procedure randrop(p, n) local x, y every 1 to n do { x := ?W - W / 2 y := ?H - H / 2 p(x, y) p(x, y + H) p(x + W, y) p(x + W, y + W) } replicate() return end procedure ring(x, y) static outer, inner initial { outer := Clone("fg=black", "linewidth=5") inner := Clone("fg=white", "linewidth=3") } DrawCircle(outer, x, y, 30) DrawCircle(inner, x, y, 30) return end procedure circle(x, y) static white initial white := Clone("fg=white") FillCircle(white, x, y, 12) DrawCircle(x, y, 12) # change to 10 for gaps return end