############################################################################
#
#	File:     fstars.icn
#
#	Subject:  Procedure to produce traces of fractal stars
#
#	Author:   Ralph E. Griswold
#
#	Date:     May 23, 1996
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  This procedure produces traces of fractal "stars".  For a discussion of
#  fractal stars, see
#
#	Fractals; Endlessly Repeated Geometrical Figures, Hans Lauwerier,
#	Princeton University Press, 1991, pp. 72-77.
#
#  and
#
#	Geometric and Artistic Graphics; Design Generation with
#	Microcomputers, Jean-Paul Delahaye, Macmillan, 1987, pp. 55-63.
#
#  The arguments are:
#
#	x, y, n, p, r, incr, extent
#
#	x	x coordinate of the initial point, default 0
#	y	y coordinate of the initial point, default 0.5
#	n	number of vertices, default 5
#	p	number of phases, default 5
#	r	reduction factor, default 0.35
#	incr	angular increment factor, default 0.8
#	extent	extent of drawing, 1.0
#
#  Chosing values for these arguments that produce interesting results and
#  centering the star in the window is somewhat of an art.  See fstartbl.icn
#  for some good values.
#	
############################################################################
#
#  Links:  gobject
#
############################################################################

link gobject

global size

procedure fstar(x, y, n, p, r, incr, extent, xinit, yinit)	#: fractal stars
   local angle, i, h, m, dist, xloc, yloc

   /size := 500
   /x := 0
   /y := 0.5 * size
   /n := 5			# defaults
   /p := 5
   /r := 0.35
   /incr := 0.8
   /extent := 1.0
   /xinit := 0
   /yinit := 0.5

   incr *:= &pi			# scaling
   extent *:= size
   xloc := xinit * size
   yloc := yinit * size

   n -:= 1			# computational convenience
   p -:= 1

#  suspend Point(x + xloc, y + yloc)		# initial point

   angle := 0

   every i := 0 to ((n + 1) * n ^ p) do {
      m := i
      h := 0
      until (m % n ~= 0) | (h >= p) do {
         m /:= n
         h +:= 1
         }
      dist := extent * r ^ (p - h)
      xloc +:= dist * cos(angle)
      yloc +:= dist * sin(angle)
      suspend Point(x + xloc, y + yloc)
      angle +:= incr
      }

end
