// $Id: Penrose.inc,v 1.23 2006/05/06 04:08:28 jon Exp $ // Penrose tiling macros // ---------- Penrose Constants ---------- #declare phi = (sqrt (5) + 1) / 2; // ~= 1.61803 #declare c36 = phi / 2; // = cos ( pi / 5) ~= 0.80902 #declare c72 = (phi - 1) / 2; // = cos (2 * pi / 5) ~= 0.30902 #declare s36 = sqrt ((5 - sqrt (5)) / 8); // = sin ( pi / 5) ~= 0.58779 #declare s72 = sqrt ((5 + sqrt (5)) / 8); // = sin (2 * pi / 5) ~= 0.95106 // ---------- Macros to cache results of inflation ---------- // This isn't strictly necessary, but due to the way tiles overlap when // the inflation routines operate on tiles, many duplicate tiles will be // generated without doing this. The procedure is simple, take the location // of a new tile, and check the array entry for that location. If false, // the tile has not been done yet. If true, it's already been done, so skip it. // This should be done at every level of the recursion to really be worth while. #declare inflate_cache_scale = phi + 1; // Use this to initialize everything, the values define the rectangle where // Penrose tiles will be allowed, level is the maximum level of recursion // the inflation routines will be using. #macro inflate_init (min_r, min_c, max_r, max_c, level) #declare inflate_minr = min_r; #declare inflate_minc = min_c; #declare inflate_maxr = max_r - min_r; #declare inflate_maxc = max_c - min_c; #local inflate_rs = ceil (inflate_cache_scale * inflate_maxr); #local inflate_cs = ceil (inflate_cache_scale * inflate_maxc); #declare inflate_done = array[inflate_rs][inflate_cs][level+1]; #local row = 0; #while (row < inflate_rs) #local col = 0; #while (col < inflate_cs) #local lev = 0; #while (lev < level + 1) #declare inflate_done[row][col][lev] = false; #local lev = lev + 1; #end #local col = col + 1; #end #local row = row + 1; #end #end // This macro will determine if the tile has already been generated. If it hasn't // been generated yet, call PENROSE_object to generate it. #macro PENROSE_cache (pos, ang, level) #local row = floor (inflate_cache_scale * pos.x) - inflate_minr; #local col = floor (inflate_cache_scale * pos.z) - inflate_minc; #if (row > 0 & row < inflate_maxr & col > 0 & col < inflate_maxc) #if (inflate_done[row][col][level] = false) #declare inflate_done[row][col][level] = true; PENROSE_object (pos, ang, level) #end #end #end // ---------- Thick & Thin Rhomb macros ---------- // The Rhomb's sides are all of length 1. The thick // rhomb has angles of 72 and 108 degrees, the thin // rhomb uses angles of 36 and 144 degrees instead. // Given the center and orientation of a thick tile, // generate the corners of the tile and pass them to the // "thick_corners" macro. #macro PENROSE_thick_corners (pos, ang) #local major = c36 * vrotate (x, ang * y); #local minor = s36 * vrotate (x, (ang + 90) * y); PENROSE_object (pos + major, pos + minor, pos - major, pos - minor) #end // Inflate a thick rhomb. The original rhomb should be centered // at "pos", and be oriented in the direction "ang". #macro thick (pos, ang, level) #macro PENROSE_object (pos, ang, level) #if (level < 1) PENROSE_thick (pos, ang) #else #local new = 2 * c36 * (pos + vrotate((c36 - 1 / (2 * c36)) * x, ang * y)); thick (new + vrotate (s36 * x, (ang + 54) * y), ang + 144, level - 1) thin (new + vrotate (s72 * x, (ang + 126) * y), ang + 36, level - 1) thick (new + vrotate (c36 * x, (ang + 180) * y), ang + 180, level - 1) thin (new + vrotate (s72 * x, (ang - 126) * y), ang - 36, level - 1) thick (new + vrotate (s36 * x, (ang - 54) * y), ang - 144, level - 1) #end #end PENROSE_cache (pos, ang, level) #end // Now do the same things for the "thin" rhomb. Note the similarities. // Differences should be in the locations of the corners, and the portion // of the inflation routine that turns a single tile into multiple tiles. #macro PENROSE_thin_corners (pos, ang) #local major = s72 * vrotate (x, (ang + 90) * y); #local minor = c72 * vrotate (x, ang * y); PENROSE_object (pos + minor, pos + major, pos - minor, pos - major) #end #macro thin (pos, ang, level) #macro PENROSE_object (pos, ang, level) #if (level < 1) PENROSE_thin (pos, ang) #else #local new = 2 * c36 * (pos + vrotate(c72 * x, ang * y)); thick (new + vrotate (c36 * x, (ang + 108) * y), ang + 108, level - 1) thin (new + vrotate (s72 * x, (ang + 162) * y), ang - 108, level - 1) thin (new + vrotate (s72 * x, (ang - 162) * y), ang + 108, level - 1) thick (new + vrotate (c36 * x, (ang - 108) * y), ang - 108, level - 1) #end #end PENROSE_cache (pos, ang, level) #end // ---------- Rhomb Vertex Patterns ---------- #macro vert_a (pos, ang, level) #local i = 0; #while (i < 5) thick (pos + vrotate (c36 * x, (ang + i * 72) * y), ang + i * 72, level) #local i = i + 1; #end #end #macro vert_b (pos, ang, level) #local i = 0; #while (i < 5) thick (pos + vrotate (c36 * x, (ang + i * 72) * y), ang + i * 72 + 180, level) #local i = i + 1; #end #end #macro vert_c (pos, ang, level) thick (pos + vrotate (c36 * x, (ang - 144) * y), ang - 144, level) thick (pos + vrotate (c36 * x, (ang - 72) * y), ang - 72, level) thin (pos + vrotate (s72 * x, (ang - 18) * y), ang + 72, level) thin (pos + vrotate (s72 * x, (ang + 18) * y), ang - 72, level) thick (pos + vrotate (c36 * x, (ang + 72) * y), ang + 72, level) thick (pos + vrotate (c36 * x, (ang + 144) * y), ang + 144, level) #end #macro vert_d (pos, ang, level) thick (pos + vrotate (c36 * x, (ang - 144) * y), ang - 144, level) thin (pos + vrotate (s72 * x, (ang - 90) * y), ang, level) thin (pos + vrotate (s72 * x, (ang - 54) * y), ang - 144, level) thick (pos + vrotate (c36 * x, (ang ) * y), ang, level) thin (pos + vrotate (s72 * x, (ang + 54) * y), ang + 144, level) thin (pos + vrotate (s72 * x, (ang + 90) * y), ang, level) thick (pos + vrotate (c36 * x, (ang + 144) * y), ang + 144, level) #end #macro vert_e (pos, ang, level) thick (pos + vrotate (s36 * x, (ang - 126) * y), ang - 36, level) thin (pos + vrotate (s72 * x, (ang - 54) * y), ang - 144, level) thick (pos + vrotate (c36 * x, (ang ) * y), ang, level) thin (pos + vrotate (s72 * x, (ang + 54) * y), ang + 144, level) thick (pos + vrotate (s36 * x, (ang + 126) * y), ang + 36, level) #end #macro vert_f (pos, ang, level) thick (pos + vrotate (c36 * x, (ang - 72) * y), ang + 108, level) thick (pos + vrotate (c36 * x, (ang ) * y), ang + 180, level) thick (pos + vrotate (c36 * x, (ang + 72) * y), ang - 108, level) thin (pos + vrotate (c72 * x, (ang + 180) * y), ang, level) #end #macro vert_g (pos, ang, level) thick (pos + vrotate (s36 * x, (ang - 126) * y), ang + 144, level) thin (pos + vrotate (c72 * x, (ang ) * y), ang, level) thick (pos + vrotate (s36 * x, (ang + 126) * y), ang - 144, level) #end #macro vert_h (pos, ang, level) thin (pos + vrotate (c72 * x, (ang - 108) * y), ang + 72, level) thick (pos + vrotate (c36 * x, (ang ) * y), ang + 180, level) thin (pos + vrotate (c72 * x, (ang + 108) * y), ang - 72, level) #end // ---------- Empires of the Rhomb Vertex Patterns ---------- #macro empire_a (pos, ang, level) // vert_a (pos, ang, level) #local i = 0; #while (i < 5) #local na = ang + 72 * i; #local nd = vrotate (x, na * y); empire_e (pos + nd, na, level) #local i = i + 1; #end #end #macro empire_b (pos, ang, level) // vert_b (pos, ang, level) #local i = 0; #while (i < 5) empire_g (pos + vrotate (x, (ang + i * 72 + 180) * y), ang + i * 72 + 180, level) #local i = i + 1; #end #end #macro empire_c (pos, ang, level) // vert_c (pos, ang, level) empire_e (pos + vrotate (2 * s72 * x, (ang - 18) * y), ang - 144, level) empire_e (pos + vrotate (2 * s72 * x, (ang + 18) * y), ang + 144, level) empire_e (pos + vrotate ((1 + 2 * c36) * x, (ang - 72) * y), ang + 180, level) empire_e (pos + vrotate ((1 + 2 * c36) * x, (ang + 72) * y), ang + 180, level) empire_d (pos + vrotate ((1 + 2 * c36) * x, (ang + 144) * y), ang + 36, level) empire_d (pos + vrotate ((1 + 2 * c36) * x, (ang - 144) * y), ang - 36, level) empire_e (pos + vrotate (x, (ang + 180) * y) + vrotate (4 * s72 * x, (ang + 126) * y), ang - 108, level) empire_e (pos + vrotate (x, (ang + 180) * y) + vrotate (4 * s72 * x, (ang - 126) * y), ang + 108, level) empire_e (pos + vrotate (2 * (1 + c36 + c72) * x, (ang + 180) * y) + vrotate (2 * c36 * x, (ang - 108) * y), ang + 72, level) empire_e (pos + vrotate (2 * (1 + c36 + c72) * x, (ang + 180) * y) + vrotate (2 * c36 * x, (ang + 108) * y), ang - 72, level) #end #macro empire_d (pos, ang, level) // vert_d (pos, ang, level) empire_e (pos + vrotate (x, (ang + 180) * y), ang + 180, level) empire_h (pos + vrotate (x, (ang + 72) * y), ang + 72, level) empire_h (pos + vrotate (x, (ang - 72) * y), ang - 72, level) empire_e (pos + vrotate ((1 + 2 * c36) * x, (ang + 144) * y), ang - 108, level) empire_e (pos + vrotate ((1 + 2 * c36) * x, (ang - 144) * y), ang + 108, level) empire_g (pos + vrotate ((1 + 2 * c36) * x, ang * y), ang, level) empire_g (pos + vrotate ((2 + 2 * c36) * x, (ang + 180) * y), ang + 180, level) #end #macro empire_e (pos, ang, level) vert_e (pos, ang, level) empire_g (pos + vrotate (x, (ang + 36) * y), ang + 144, level) empire_g (pos + vrotate (x, (ang - 36) * y), ang - 144, level) #end #macro empire_f (pos, ang, level) // vert_f (pos, ang, level) empire_g (pos + vrotate (x, (ang + 36) * y), ang + 36, level) empire_g (pos + vrotate (x, (ang - 36) * y), ang - 36, level) empire_e (pos + vrotate (x, (ang + 108) * y), ang - 144, level) empire_e (pos + vrotate (x, (ang - 108) * y), ang + 144, level) empire_b (pos + vrotate ((1 + 2 * c72) * x, (ang + 180) * y), ang + 36, level) #end #macro empire_g (pos, ang, level) vert_g (pos, ang, level) #end #macro empire_h (pos, ang, level) // vert_h (pos, ang, level) empire_e (pos + vrotate (x, (ang + 36) * y), ang + 144, level) empire_e (pos + vrotate (x, (ang - 36) * y), ang - 144, level) #end // ---------- Kite & Dart macros ---------- // These two macros convert from Kites and Darts to Thick and Thin Rhombs. #macro PENROSE_kite_rhombs (pos, ang, level) thick (pos + vrotate (s36 * x, (ang + 126) * y), ang - 144, level) thin (pos + vrotate (c72 * x, ang * y), ang, level) thick (pos + vrotate (s36 * x, (ang - 126) * y), ang + 144, level) #end #macro PENROSE_dart_rhombs (pos, ang, level) thick (pos + vrotate (s36 * x, (ang + 54) * y), ang + 144, level) thick (pos + vrotate (s36 * x, (ang - 54) * y), ang - 144, level) #end // These macros are for Kites and Darts. They should look a whole lot // like the Thick and Thin Rhomb macros, except the corners are a bit different // and the inflation itself is a bit different. On the other hand, by abstracting // out some mundane thing like PENROSE_cache, we don't have to duplicate all that // stuff and can concentrate on stuff that actually matters. #macro PENROSE_kite_corners (pos, ang) PENROSE_object (pos + vrotate (2 * c72 * x, ang * y), pos + vrotate (, ang * y), pos + vrotate (-x, ang * y), pos + vrotate (, ang * y)) #end #macro kite (pos, ang, level) #macro PENROSE_object (pos, ang, level) #if (level < 2) PENROSE_kite (pos, ang) #else #local new = 2 * c36 * pos; kite (new + vrotate (2 * c72 * x, (ang + 72) * y), ang - 108, level - 1) dart (new + vrotate ( x, (ang + 144) * y), ang - 144, level - 1) dart (new + vrotate ( x, (ang - 144) * y), ang + 144, level - 1) kite (new + vrotate (2 * c72 * x, (ang - 72) * y), ang + 108, level - 1) #end #end PENROSE_cache (pos, ang, level) #end #macro PENROSE_dart_corners (pos, ang) PENROSE_object (pos, pos + vrotate (<-c72,0,s72>, ang * y), pos + vrotate (x, ang * y), pos + vrotate (<-c72,0,-s72>, ang * y)) #end #macro dart (pos, ang, level) #macro PENROSE_object (pos, ang, level) #if (level < 2) PENROSE_dart (pos, ang) #else #local new = 2 * c36 * pos; dart (new + vrotate ( x, (ang + 72) * y), ang + 144, level - 1) kite (new + vrotate (2 * c72 * x, ang * y), ang + 180, level - 1) dart (new + vrotate ( x, (ang - 72) * y), ang - 144, level - 1) #end #end PENROSE_cache (pos, ang, level) #end // ---------- Kite & Dart Vertex Patterns ---------- #macro sun (pos, ang, level) #local i = 0; #while (i < 5) kite (pos + vrotate (x, (ang + i * 72) * y), ang + i * 72, level) #local i = i + 1; #end #end #macro star (pos, ang, level) #local i = 0; #while (i < 5) dart (pos + vrotate (x, (ang + i * 72) * y), ang + i * 72 + 180, level) #local i = i + 1; #end #end #macro ace (pos, ang, level) kite (pos + vrotate (x, (ang - 144) * y), ang - 36, level) dart (pos, ang, level) kite (pos + vrotate (x, (ang + 144) * y), ang + 36, level) #end #macro deuce (pos, ang, level) dart (pos + vrotate ( x, (ang - 144) * y), ang + 144, level) kite (pos + vrotate (2 * c72 * x, (ang - 72) * y), ang + 108, level) kite (pos + vrotate (2 * c72 * x, (ang + 72) * y), ang - 108, level) dart (pos + vrotate ( x, (ang + 144) * y), ang - 144, level) #end #macro jack (pos, ang, level) kite (pos + vrotate ( x, (ang - 144) * y), ang - 144, level) dart (pos + vrotate ( x, (ang - 72) * y), ang - 144, level) kite (pos + vrotate (2 * c72 * x, ang * y), ang + 180, level) dart (pos + vrotate ( x, (ang + 72) * y), ang + 144, level) kite (pos + vrotate ( x, (ang + 144) * y), ang + 144, level) #end #macro queen (pos, ang, level) kite (pos + vrotate (x, (ang - 144) * y), ang - 36, level) kite (pos + vrotate (x, (ang - 72) * y), ang + 180, level) dart (pos + vrotate (x, ang * y), ang + 180, level) kite (pos + vrotate (x, (ang + 72) * y), ang + 180, level) kite (pos + vrotate (x, (ang + 144) * y), ang + 36, level) #end #macro king (pos, ang, level) kite (pos + vrotate (x, (ang - 144) * y), ang + 108, level) dart (pos + vrotate (x, (ang - 72) * y), ang + 108, level) dart (pos + vrotate (x, ang * y), ang + 180, level) dart (pos + vrotate (x, (ang + 72) * y), ang - 108, level) kite (pos + vrotate (x, (ang + 144) * y), ang - 108, level) #end // ---------- Empires of the Kite & Dart Vertex Patterns ---------- #macro empire_sun (pos, ang, level) sun (pos, ang, level) #end #macro empire_star (pos, ang, level) #local i = 0; #while (i < 5) ace (pos + vrotate (x, (ang + i * 72) * y), ang + i * 72 + 180, level) #local i = i + 1; #end #end #macro empire_ace (pos, ang, level) ace (pos, ang, level) #end #macro empire_deuce (pos, ang, level) // deuce (pos, ang, level) ace (pos + vrotate (x, (ang - 144) * y), ang + 144, level) ace (pos + vrotate (x, (ang + 144) * y), ang - 144, level) #end #macro empire_jack (pos, ang, level) // jack (pos, ang, level) ace (pos + vrotate ( x, (ang - 72) * y), ang - 144, level) sun (pos + vrotate ((1 + 2 * c72) * x, ang * y), ang + 36, level) ace (pos + vrotate ( x, (ang + 72) * y), ang + 144, level) #local new = pos + vrotate ((phi + 1) * x, (ang + 180) * y); #local i = 0; #while (i < 3) ace (new + vrotate (x, (ang + i * 72 - 72) * y), ang + i * 72 + 108, level) #local i = i + 1; #end #end #macro empire_queen (pos, ang, level) // queen (pos, ang, level) #local c = pos + vrotate ((1 + phi) * x, (ang - 108) * y); #local b = pos + vrotate ((1 + phi) * x, (ang + 108) * y); #local a = pos + vrotate ((1 + phi) * x, ang * y); sun (a, ang, level) #local i = 0; #while (i < 3) dart (a + vrotate (phi * x, (ang + i * 72 + 108) * y), ang + i * 72 + 108, level) ace (b + vrotate ( x, (ang + i * 72 - 108) * y), ang + i * 72 + 72, level) ace (c + vrotate ( x, (ang - i * 72 + 108) * y), ang - i * 72 - 72, level) #local i = i + 1; #end kite (pos + vrotate ((1 + phi) * x, (ang + 180) * y), ang + 180, level) #end #macro empire_king (pos, ang, level) // king (pos, ang, level) empire_star (pos + vrotate ((1 + phi) * x, (ang + 180) * y), ang + 36, level) dart (pos + vrotate ((1 + phi) * x, (ang - 108) * y), ang + 180, level) dart (pos + vrotate ((1 + phi) * x, (ang + 108) * y), ang + 180, level) empire_queen (pos + vrotate ((1 + phi) * x, (ang + 36) * y), ang - 36, level) empire_queen (pos + vrotate ((1 + phi) * x, (ang - 36) * y), ang + 36, level) #end // ---------- Other Kite & Dart patterns ---------- #macro princess (pos, ang, level) sun (pos, ang, level) dart (pos + vrotate (phi * x, (ang - 108) * y), ang - 108, level) dart (pos + vrotate (phi * x, (ang + 108) * y), ang + 108, level) #end #macro short_bowtie (pos, ang, level) ace (pos + vrotate (phi * x, (ang + 36) * y), ang + 36, level) ace (pos + vrotate (phi * x, (ang - 36) * y), ang - 36, level) #end #macro long_bowtie (pos, ang, level) dart (pos, ang, level) ace (pos + vrotate (x, (ang - 108) * y) + vrotate (phi * x, (ang - 36) * y), ang - 36, level) ace (pos + vrotate (x, (ang + 108) * y) + vrotate (phi * x, (ang + 36) * y), ang + 36, level) #end #macro batman (pos, ang, level) jack (pos + vrotate (x, ang * y), ang, level) deuce (pos + vrotate (x, (ang - 108) * y), ang - 36, level) deuce (pos + vrotate (x, (ang + 108) * y), ang + 36, level) #end #macro decagon (pos, ang, level, which) #local sel = which; #local i = 0; #while (i < 10) #if (mod (sel, 2)) ace (pos + vrotate ((2 * phi + 1) * x, (ang + 36 * i) * y) + vrotate (x, (ang + 36 * i + 144) * y), ang + 36 * i - 36, level) #else ace (pos + vrotate ((2 * phi + 1) * x, (ang + 36 * i + 36) * y) + vrotate (x, (ang + 36 * i - 108) * y), ang + 36 * i + 72, level) #end #local sel = floor (sel / 2); #local i = i + 1; #end #end #macro cartwheel (pos, ang, level, which) #local loc = pos + vrotate ((3 * phi + 2) * x, ang * y); #local sel = which; #local i = 0; #while (i < 10) #local dir = mod (sel, 2); sun (loc, ang + i * 36 + 144, level) dart (loc + vrotate (phi * x, (ang + i * 36 + 180) * y), ang + i * 36 + 180, level) dart (loc + vrotate (phi * x, (ang + i * 36 +36) * y), ang + i * 36 + 36, level) dart (loc + vrotate (phi * x, (ang + i * 36 - 36) * y), ang + i * 36 - 36, level) long_bowtie (loc + vrotate ((phi + dir) * x, (ang + i * 36 + 108) * y), ang + i * 36 + 180 * dir + 108, level) #local loc = loc + vrotate ((2 * phi + 1) * x, (ang + i * 36 + 108) * y); #local sel = floor (sel / 2); #local i = i + 1; #end #end #macro short_cartwheel (pos, ang, level, which) #local loc = pos + vrotate ((5 * phi + 3) * x, ang * y); #local sel = which; #local i = 0; #while (i < 10) #local dir = mod (sel, 2); ace (loc + vrotate (x, (ang + i * 36 + 108) * y), ang + i * 36 - 72, level) ace (loc + vrotate (x, (ang + i * 36 + 180) * y), ang + i * 36, level) ace (loc + vrotate (x, (ang + i * 36 - 108) * y), ang + i * 36 + 72, level) short_bowtie (loc + vrotate ((1 + (dir + 1) * phi) * x, (ang + i * 36 + 108) * y), ang + i * 36 + 180 * dir + 108, level) #local loc = loc + vrotate ((3 * phi + 2) * x, (ang + i * 36 + 108) * y); #local sel = floor (sel / 2); #local i = i + 1; #end #end #macro long_cartwheel (pos, ang, level, which) #local pos = pos + vrotate ((5 * phi + 4) * x, (ang - 108) * y); #local i = 0; #while (i < 10) #local dir = mod (which, 2); long_bowtie (pos + vrotate ((2 + (dir + 2) * phi) / phi * x, (ang + i * 36) * y), ang + i * 36 + 180 * dir, level) #local pos = pos + vrotate ((4 * phi + 1) * x, (ang + i * 36) * y); #local i = i + 1; #local which = floor (which / 2); #end #end #macro center0 (pos, ang, level) #local i = 0; #while (i < 5) dart (pos + vrotate (phi * x, (ang + 72 * i) * y), ang + 72 * i + 108, level) #local i = i + 1; #end #end #macro center1a (pos, ang, level) dart (pos + vrotate (phi * x, (ang + 180) * y), ang - 72, level) ace (pos + vrotate (x / phi, (ang - 144) * y), ang - 144, level) ace (pos + vrotate (phi * x, (ang + 72) * y), ang + 180, level) #end // center3a () ??? (parallel darts) #macro center3b (pos, ang, level) dart (pos + vrotate (phi * x, (ang - 36) * y), ang + 72, level) dart (pos + vrotate (phi * x, (ang - 144) * y), ang - 36, level) ace (pos + vrotate (phi * x, (ang + 36) * y), ang - 72, level) ace (pos + vrotate (x / phi, ang * y), ang, level) #end #macro center5a (pos, ang, level) kite (pos + vrotate (phi * x, (ang + 36) * y), ang - 144, level) ace (pos + vrotate (x / phi, (ang - 36) * y), ang - 36, level) dart (pos + vrotate (phi * x, (ang + 180) * y), ang - 72, level) dart (pos + vrotate (phi * x, (ang - 72) * y), ang + 36, level) dart (pos + vrotate (phi * x, (ang + 108) * y), ang, level) #end #macro center5c (pos, ang, level) dart (pos + vrotate (phi * x, (ang - 108) * y), ang, level) ace (pos + vrotate (x / phi, (ang - 72) * y), ang - 72, level) ace (pos + vrotate (phi * x, (ang + 144) * y), ang - 108, level) #end // center7a () ??? (parallel darts) // center7b () ??? (parallel darts) #macro center7c (pos, ang, level) short_bowtie (pos + vrotate ((phi + 1) * x, (ang + 108) * y), ang - 72, level) dart (pos + vrotate (phi * x, (ang - 108) * y), ang, level) ace (pos + vrotate (x / phi, (ang - 72) * y), ang - 72, level) #end #macro center9a (pos, ang, level) ace (pos + vrotate (phi * x, (ang + 72) * y), ang + 180, level) ace (pos + vrotate (phi * x, (ang + 180) * y), ang - 72, level) ace (pos + vrotate (x / phi, (ang - 144) * y), ang - 144, level) #end #macro center9d (pos, ang, level) dart (pos + vrotate (phi * x, (ang - 72) * y), ang + 36, level) ace (pos + vrotate (x / phi, (ang - 36) * y), ang - 36, level) ace (pos + vrotate (phi * x, (ang + 180) * y), ang - 72, level) kite (pos + vrotate (phi * x, (ang + 36) * y), ang - 144, level) #end // center11a () ??? (parallel darts) #macro center11b (pos, ang, level) king (pos + vrotate (phi * x, ang * y), ang + 180, level) ace (pos + vrotate (x / phi, ang * y), ang, level) ace (pos + vrotate (phi * x, (ang + 36) * y), ang - 72, level) dart (pos + vrotate (phi * x, (ang - 144) * y), ang - 36, level) dart (pos + vrotate (phi * x, (ang + 144) * y), ang + 36, level) #end #macro center11d (pos, ang, level) dart (pos + vrotate (phi * x, (ang - 72) * y), ang + 36, level) ace (pos + vrotate (phi * x, (ang + 180) * y), ang - 72, level) ace (pos + vrotate (x / phi, (ang - 36) * y), ang - 36, level) #end #macro center13ad (pos, ang, level) jack (pos + vrotate (x, (ang + 144) * y), ang + 144, level) kite (pos + vrotate (phi * x, (ang + 36) * y), ang - 144, level) dart (pos + vrotate (x / phi, (ang - 36) * y), ang - 36, level) dart (pos + vrotate (phi * x, (ang - 72) * y), ang + 36, level) #end // center13c () ??? (parallel darts) // center15a () ??? (parallel darts) // center15b () ??? (parallel darts) // center15c () ??? (parallel darts) #macro center15d (pos, ang, level) ace (pos + vrotate (phi * x, (ang + 180) * y), ang - 72, level) dart (pos + vrotate (phi * x, (ang - 72) * y), ang + 36, level) dart (pos + vrotate (phi * x, (ang + 108) * y), ang, level) ace (pos + vrotate (x / phi, (ang - 36) * y), ang - 36, level) #end // center17a () ??? (parallel suns, no central king) #macro center17e (pos, ang, level) queen (pos + vrotate (phi * x, ang * y), ang - 108, level) ace (pos + vrotate (phi * x, (ang + 72) * y), ang + 180, level) ace (pos + vrotate (x / phi, (ang + 108) * y), ang + 108, level) kite (pos + vrotate (phi * x, (ang + 180) * y), ang, level) #end #macro center19ab (pos, ang, level) ace (pos + vrotate (phi * x, (ang - 144) * y), ang - 36, level) ace (pos + vrotate (x / phi, (ang - 108) * y), ang - 108, level) ace (pos + vrotate (phi * x, (ang + 36) * y), ang - 72, level) dart (pos + vrotate (phi * x, (ang + 108) * y), ang - 144, level) #end #macro center19be (pos, ang, level) ace (pos + vrotate (x / phi, ang * y), ang, level) ace (pos + vrotate (phi * x, (ang + 36) * y), ang - 72, level) ace (pos + vrotate (phi * x, (ang - 144) * y), ang - 36, level) dart (pos + vrotate (phi * x, (ang - 36) * y), ang + 72, level) #end // center21a () ??? (parallel suns, no central king) #macro center21c (pos, ang, level) queen (pos + vrotate (phi * x, (ang + 144) * y), ang - 108, level) kite (pos + vrotate (x / phi, (ang - 72) * y), ang, level) kite (pos + vrotate (phi * x, (ang + 36) * y), ang - 144, level) dart (pos + vrotate (phi * x, (ang - 108) * y), ang, level) #end #macro center21e (pos, ang, level) queen (pos + vrotate (phi * x, ang * y), ang - 108, level) kite (pos + vrotate (x / phi, (ang - 144) * y), ang + 144, level) kite (pos + vrotate (phi * x, (ang + 180) * y), ang, level) kite (pos + vrotate (phi * x, (ang + 108) * y), ang - 72, level) #end #macro center23a (pos, ang, level) ace (pos + vrotate (phi * x, (ang - 144) * y), ang - 36, level) dart (pos + vrotate (phi * x, (ang + 36) * y), ang - 72, level) ace (pos + vrotate (x / phi, (ang - 108) * y), ang - 108, level) dart (pos + vrotate (phi * x, (ang + 108) * y), ang - 144, level) #end // center23b () ??? (parallel darts) #macro center23c (pos, ang, level) ace (pos + vrotate (phi * x, (ang + 72) * y), ang - 36, level) dart (pos + vrotate (phi * x, (ang - 108) * y), ang, level) ace (pos + vrotate (x / phi, (ang + 36) * y), ang + 36, level) dart (pos + vrotate (phi * x, (ang + 180) * y), ang + 72, level) #end #macro center23e (pos, ang, level) ace (pos + vrotate (phi * x, (ang - 144) * y), ang - 36, level) king (pos + vrotate (phi * x, ang * y), ang + 180, level) ace (pos + vrotate (x / phi, ang * y), ang, level) #end #macro center25ae (pos, ang, level) deuce (pos + vrotate (x, (ang+ 36) * y), ang - 36, level) deuce (pos + vrotate (x, (ang + 180) * y), ang - 108, level) dart (pos + vrotate (phi * x, (ang - 36) * y), ang + 72, level) #end // center25d () ??? (parallel darts) #macro center27abe (pos, ang, level) ace (pos + vrotate (x / phi, ang * y), ang, level) ace (pos + vrotate (x * phi, (ang + 36) * y), ang - 72, level) dart (pos + vrotate (phi * x, (ang - 36) * y), ang + 72, level) short_bowtie (pos + vrotate ((phi + 1) * x, (ang + 180) * y), ang, level) #end // center27d () ??? (parallel darts) #macro center29ae (pos, ang, level) ace (pos + vrotate (x / phi, ang * y), ang, level) short_bowtie (pos + vrotate ((phi + 1) * x, (ang + 180) * y), ang, level) dart (pos + vrotate (phi * x, (ang - 36) * y), ang + 72, level) dart (pos + vrotate (phi * x, (ang + 36) * y), ang - 72, level) #end // center29c () ??? (parallel darts) // center29d () ??? (parallel darts) #macro center31ae (pos, ang, level) jack (pos + vrotate (x, (ang + 180) * y), ang + 180, level) king (pos + vrotate (phi * x, ang * y), ang + 180, level) #end // center31b () ??? (parallel darts) // center31c () ??? (parallel darts) // center31d () ??? (parallel darts) #macro center33 (pos, ang, level) queen (pos + vrotate (phi * x, ang * y), ang - 108, level) dart (pos + vrotate (phi * x, (ang + 72) * y), ang + 180, level) ace (pos + vrotate (phi * x, (ang - 108) * y), ang, level) dart (pos + vrotate (x / phi, (ang + 108) * y), ang + 108, level) #end #macro center35b (pos, ang, level) dart (pos + vrotate (phi * x, (ang - 144) * y), ang - 36, level) ace (pos + vrotate (phi * x, (ang + 108) * y), ang - 144, level) ace (pos + vrotate (x / phi, (ang - 108) * y), ang - 108, level) dart (pos + vrotate (phi * x, (ang + 36) * y), ang - 72, level) #end #macro center37c (pos, ang, level) ace (pos + vrotate (phi * x, (ang + 144) * y), ang - 108, level) deuce (pos + vrotate (x, (ang - 144) * y), ang + 144, level) ace (pos + vrotate (x / phi, (ang - 72) * y), ang - 72, level) #end #macro center39bc (pos, ang, level) ace (pos + vrotate (phi * x, (ang + 144) * y), ang - 108, level) deuce (pos + vrotate (x, (ang - 144) * y), ang + 144, level) ace (pos + vrotate (x / phi, (ang - 72) * y), ang - 72, level) dart (pos + vrotate (phi * x, (ang + 72) * y), ang - 36, level) #end #macro center41d (pos, ang, level) queen (pos + vrotate (phi * x, (ang + 180) * y), ang - 72, level) dart (pos + vrotate (phi * x, (ang - 72) * y), ang + 36, level) kite (pos + vrotate (x / phi, (ang - 36) * y), ang + 36, level) ace (pos + vrotate (phi * x, (ang + 72) * y), ang + 180, level) #end // center43b () ??? (parallel suns, no central king) #macro center43d (pos, ang, level) queen (pos + vrotate (phi * x, (ang + 180) * y), ang - 72, level) ace (pos + vrotate (phi * x, (ang + 36) * y), ang - 72, level) kite (pos + vrotate (x / phi, (ang - 36) * y), ang + 36, level) dart (pos + vrotate (phi * x, (ang - 72) * y), ang + 36, level) #end // center45c () ??? (parallel darts) #macro center45d (pos, ang, level) kite (pos + vrotate (x / phi, (ang - 36) * y), ang + 36, level) queen (pos + vrotate (phi * x, (ang + 180) * y), ang - 72, level) king (pos + vrotate (phi * x, (ang + 72) * y), ang - 108, level) dart (pos + vrotate (phi * x, (ang - 72) * y), ang + 36, level) #end #macro center47b (pos, ang, level) dart (pos + vrotate (phi * x, (ang + 72) * y), ang - 36, level) ace (pos + vrotate (x / phi, (ang - 72) * y), ang - 72, level) ace (pos + vrotate (phi * x, (ang - 108) * y), ang, level) dart (pos + vrotate (phi * x, (ang + 144) * y), ang - 108, level) #end // center47c () ??? (parallel darts) #macro center47d (pos, ang, level) dart (pos + vrotate (phi * x, (ang - 72) * y), ang + 36, level) ace (pos + vrotate (x / phi, (ang + 72) * y), ang + 72, level) ace (pos + vrotate (phi * x, (ang + 108) * y), ang, level) dart (pos + vrotate (phi * x, (ang - 144) * y), ang + 108, level) #end // ONE HALF DONE WITH THE DECAGONS... #macro center49 (pos, ang, level) dart (pos + vrotate (phi * x, (ang + 72) * y), ang + 180, level) dart (pos + vrotate (phi * x, (ang - 108) * y), ang, level) ace (pos + vrotate (phi * x, (ang + 180) * y), ang + 72, level) queen (pos + vrotate (phi * x, ang * y), ang - 108, level) dart (pos + vrotate (x / phi, (ang + 108) * y), ang + 108, level) #end // center49e () ??? (parallel darts) #macro center51b (pos, ang, level) ace (pos + vrotate (phi * x, (ang + 180) * y), ang + 72, level) ace (pos + vrotate (phi * x, (ang + 108) * y), ang - 144, level) ace (pos + vrotate (x / phi, (ang + 144) * y), ang + 144, level) #end // center51e () ??? (parallel darts) #macro center53c (pos, ang, level) kite (pos + vrotate (phi * x, (ang + 36) * y), ang - 144, level) kite (pos + vrotate (phi * x, (ang + 108) * y), ang - 72, level) jack (pos + vrotate (x, (ang - 144) * y), ang - 144, level) #end // center53e () ??? (parallel darts) #macro center55bc (pos, ang, level) jack (pos + vrotate (x, (ang - 144) * y), ang - 144, level) deuce (pos + vrotate (x, (ang + 108) * y), ang + 180, level) #end // center55e () ??? (parallel darts) #macro center57 (pos, ang, level) ace (pos + vrotate (phi * x, (ang + 72) * y), ang + 180, level) jack (pos + vrotate (x, (ang - 144) * y), ang + 36 + 180, level) #end // center57d () ??? (parallel darts) // center57e () ??? (parallel darts) #macro center59b (pos, ang, level) ace (pos + vrotate (phi * x, (ang + 36) * y), ang - 72, level) ace (pos + vrotate (x / phi, ang * y), ang, level) dart (pos + vrotate (phi * x, (ang - 144) * y), ang - 36, level) dart (pos + vrotate (phi * x, (ang - 36) * y), ang + 72, level) dart (pos + vrotate (phi * x, (ang + 144) * y), ang + 36, level) #end // center59d () ??? (parallel darts) // center59e () ??? (parallel darts) #macro center69ac (pos, ang, level) dart (pos + vrotate (phi * x, (ang + 180) * y), ang - 72, level) kite (pos + vrotate (phi * x, (ang + 36) * y), ang - 144, level) ace (pos + vrotate (x / phi, (ang - 36) * y), ang - 36, level) ace (pos + vrotate (phi * x, (ang - 72) * y), ang + 36, level) dart (pos + vrotate (phi * x, (ang + 108) * y), ang, level) #end #macro center69b (pos, ang, level) queen (pos + vrotate (phi * x, ang * y), ang - 108, level) kite (pos + vrotate (x / phi, (ang - 144) * y), ang + 144, level) dart (pos + vrotate (phi * x, (ang - 108) * y), ang + 144, level) ace (pos + vrotate (phi * x, (ang + 144) * y), ang - 108, level) #end // center71a () ??? (parallel darts) #macro center71c (pos, ang, level) jack (pos + vrotate (x, (ang + 108) * y), ang + 108, level) dart (pos + vrotate (phi * x, (ang - 108) * y), ang, level) dart (pos + vrotate (x / phi, (ang - 72) * y), ang - 72, level) #end #macro center73ad (pos, ang, level) ace (pos + vrotate (phi * x, (ang + 180) * y), ang - 72, level) ace (pos + vrotate (phi * x, (ang - 72) * y), ang + 36, level) ace (pos + vrotate (x / phi, (ang - 36) * y), ang - 36, level) kite (pos + vrotate (phi * x, (ang + 36) * y), ang - 144, level) #end #macro center73b (pos, ang, level) ace (pos + vrotate (phi * x, (ang + 72) * y), ang + 180, level) ace (pos + vrotate (x / phi, (ang + 108) * y), ang + 108, level) dart (pos + vrotate (phi * x, (ang - 108) * y), ang + 144, level) dart (pos + vrotate (phi * x, (ang + 144) * y), ang + 36, level) #end // center75a () ??? (parallel darts) #macro center75d (pos, ang, level) ace (pos + vrotate (phi * x, (ang + 180) * y), ang - 72, level) ace (pos + vrotate (phi * x, (ang - 72) * y), ang + 36, level) ace (pos + vrotate (x / phi, (ang - 36) * y), ang - 36, level) #end #macro center77acd (pos, ang, level) queen (pos + vrotate (phi * x, (ang + 72) * y), ang + 180, level) queen (pos + vrotate (phi * x, (ang - 144) * y), ang + 108, level) kite (pos + vrotate (phi * x, (ang + 144) * y), ang - 36, level) dart (pos + vrotate (phi * x, (ang - 72) * y), ang + 36, level) dart (pos + vrotate (x / phi, (ang - 36) * y), ang - 36, level) #end #macro center77b (pos, ang, level) dart (pos + vrotate (phi * x, (ang - 108) * y), ang + 144, level) queen (pos + vrotate (phi * x, ang * y), ang - 108, level) kite (pos + vrotate (x / phi, (ang - 144) * y), ang + 144, level) ace (pos + vrotate (phi * x, (ang + 108) * y), ang, level) #end #macro center83a (pos, ang, level) ace (pos + vrotate (phi * x, (ang + 36) * y), ang - 72, level) queen (pos + vrotate (phi * x, (ang + 144) * y), ang + 36, level) kite (pos + vrotate (x / phi, ang * y), ang - 72, level) ace (pos + vrotate (phi * x, (ang - 72) * y), ang + 36, level) #end #macro center83e (pos, ang, level) dart (pos + vrotate (phi * x, (ang - 36) * y), ang + 72, level) queen (pos + vrotate (phi * x, (ang - 144) * y), ang - 36, level) kite (pos + vrotate (x / phi, ang * y), ang + 72, level) ace (pos + vrotate (phi * x, (ang + 108) * y), ang - 144, level) #end #macro center85ac (pos, ang, level) queen (pos + vrotate (phi * x, (ang + 72) * y), ang + 180, level) queen (pos + vrotate (phi * x, (ang - 144) * y), ang + 108, level) dart (pos + vrotate (phi * x, (ang - 72) * y), ang + 36, level) dart (pos + vrotate (x / phi, (ang - 36) * y), ang - 36, level) #end #macro center85be (pos, ang, level) queen (pos + vrotate (phi * x, ang * y), ang - 108, level) queen (pos + vrotate (phi * x, (ang - 144) * y), ang - 36, level) kite (pos + vrotate (phi * x, (ang + 108) * y), ang - 72, level) #end #macro center87a (pos, ang, level) dart (pos + vrotate (phi * x, (ang + 36) * y), ang - 72, level) queen (pos + vrotate (phi * x, (ang + 144) * y), ang + 36, level) kite (pos + vrotate (x / phi, ang * y), ang - 72, level) ace (pos + vrotate (phi * x, (ang - 72) * y), ang + 36, level) #end #macro center87c (pos, ang, level) ace (pos + vrotate (phi * x, (ang + 72) * y), ang - 36, level) ace (pos + vrotate (x / phi, (ang + 36) * y), ang + 36, level) dart (pos + vrotate (phi * x, (ang - 108) * y), ang, level) dart (pos + vrotate (phi * x, (ang + 180) * y), ang + 72, level) #end #macro center87e (pos, ang, level) ace (pos + vrotate (phi * x, (ang + 72) * y), ang - 36, level) queen (pos + vrotate (phi * x, (ang - 144) * y), ang - 36, level) dart (pos + vrotate (phi * x, (ang - 36) * y), ang + 72, level) kite (pos + vrotate (x / phi, ang * y), ang + 72, level) #end #macro center89abe (pos, ang, level) ace (pos + vrotate (phi * x, (ang + 72) * y), ang + 180, level) ace (pos + vrotate (phi * x, (ang + 144) * y), ang + 36, level) ace (pos + vrotate (x / phi, (ang + 108) * y), ang + 108, level) dart (pos + vrotate (phi * x, (ang - 108) * y), ang + 144, level) dart (pos + vrotate (phi * x, (ang - 36) * y), ang + 72, level) #end // center89d () ??? (parallel darts) #macro center91a (pos, ang, level) ace (pos + vrotate (phi * x, (ang + 36) * y), ang - 72, level) ace (pos + vrotate (x / phi, ang * y), ang, level) ace (pos + vrotate (phi * x, (ang + 144) * y), ang + 36, level) dart (pos + vrotate (phi * x, (ang - 36) * y), ang + 72, level) #end // center91d () ??? (parallel darts) #macro center91e (pos, ang, level) queen (pos + vrotate (phi * x, (ang - 144) * y), ang - 36, level) ace (pos + vrotate (x / phi, (ang + 108) * y), ang + 108, level) dart (pos + vrotate (phi * x, (ang - 36) * y), ang + 72, level) dart (pos + vrotate (phi * x, (ang + 144) * y), ang + 36, level) dart (pos + vrotate (phi * x, (ang + 72) * y), ang + 180, level) #end #macro center93ac (pos, ang, level) ace (pos + vrotate (phi * x, (ang - 72) * y), ang + 36, level) ace (pos + vrotate (x / phi, (ang - 36) * y), ang - 36, level) kite (pos + vrotate (phi * x, (ang + 36) * y), ang - 144, level) dart (pos + vrotate (phi * x, (ang + 108) * y), ang, level) dart (pos + vrotate (phi * x, (ang + 180) * y), ang - 72, level) #end #macro center93be (pos, ang, level) ace (pos + vrotate (phi * x, (ang + 144) * y), ang + 36, level) ace (pos + vrotate (x / phi, (ang + 108) * y), ang + 108, level) dart (pos + vrotate (phi * x, (ang - 36) * y), ang + 72, level) dart (pos + vrotate (phi * x, (ang - 108) * y), ang + 144, level) kite (pos + vrotate (phi * x, (ang + 36) * y), ang - 144, level) #end // center93d () ??? (parallel darts) #macro center99 (pos, ang, level) jack (pos + vrotate (x, (ang + 72) * y), ang + 72, level) ace (pos + vrotate (phi * x, (ang - 72) * y), ang + 36, level) dart (pos + vrotate (phi * x, (ang - 144) * y), ang + 108, level) #end #macro center101bc (pos, ang, level) jack (pos + vrotate (x, (ang - 108) * y), ang - 108, level) king (pos + vrotate (phi * x, (ang + 72) * y), ang - 108, level) #end #macro center103 (pos, ang, level) jack (pos + vrotate (x, (ang - 108) * y), ang - 108, level) dart (pos + vrotate (phi * x, (ang + 108) * y), ang, level) dart (pos + vrotate (x / phi, (ang + 72) * y), ang + 72, level) #end #macro center105 (pos, ang, level) ace (pos + vrotate (phi * x, (ang - 72) * y), ang + 36, level) queen (pos + vrotate (phi * x, (ang + 180) * y), ang - 72, level) ace (pos + vrotate (x / phi, (ang + 72) * y), ang + 72, level) dart (pos + vrotate (phi * x, (ang + 36) * y), ang + 144, level) #end #macro center107 (pos, ang, level) ace (pos + vrotate (phi * x, (ang - 72) * y), ang + 36, level) queen (pos + vrotate (phi * x, (ang + 180) * y), ang - 72, level) ace (pos + vrotate (phi * x, (ang + 36) * y), ang - 72, level) kite (pos + vrotate (x / phi, (ang - 36) * y), ang + 36, level) #end #macro center109 (pos, ang, level) ace (pos + vrotate (phi * x, (ang - 72) * y), ang + 36, level) ace (pos + vrotate (phi * x, (ang - 144) * y), ang + 108, level) ace (pos + vrotate (phi * x, (ang + 108) * y), ang, level) ace (pos + vrotate (x / phi, (ang + 72) * y), ang + 72, level) dart (pos + vrotate (phi * x, (ang + 36) * y), ang + 144, level) #end #macro center147abc (pos, ang, level) jack (pos + vrotate (x, (ang + 72) * y), ang + 72, level) king (pos + vrotate (phi * x, (ang - 108) * y), ang + 72, level) kite (pos + vrotate (phi * x, (ang + 180) * y), ang, level) #end #macro center147bce (pos, ang, level) ace (pos + vrotate (phi * x, (ang + 36) * y), ang - 72, level) ace (pos + vrotate (phi * x, (ang - 36) * y), ang + 72, level) ace (pos + vrotate (x / phi, ang * y), ang, level) ace (pos + vrotate (phi * x, (ang - 144) * y), ang - 36, level) #end #macro center149a (pos, ang, level) dart (pos + vrotate (phi * x, (ang + 36) * y), ang - 72, level) ace (pos + vrotate (phi * x, (ang - 144) * y), ang - 36, level) ace (pos + vrotate (x / phi, (ang - 108) * y), ang - 108, level) dart (pos + vrotate (phi * x, (ang - 72) * y), ang + 180, level) dart (pos + vrotate (phi * x, (ang + 108) * y), ang - 144, level) #end #macro center149e (pos, ang, level) ace (pos + vrotate (phi * x, (ang - 36) * y), ang + 72, level) ace (pos + vrotate (x / phi, ang * y), ang, level) ace (pos + vrotate (phi * x, (ang - 144) * y), ang - 36, level) dart (pos + vrotate (phi * x, (ang + 36) * y), ang - 72, level) #end // able to be filled... #macro center155 (pos, ang, level) batman (pos, ang + 180, level) #end #macro center165 (pos, ang, level) ace (pos + vrotate (phi * x, (ang - 36) * y), ang + 72, level) ace (pos + vrotate (phi * x, (ang + 144) * y), ang - 108, level) kite (pos + vrotate (phi * x, (ang + 36) * y), ang - 144, level) kite (pos + vrotate (phi * x, (ang - 144) * y), ang + 36, level) kite (pos + vrotate (x / phi, ang * y), ang + 72, level) // kite (pos + vrotate (x / phi, (ang + 180) * y), ang - 108, level) #end #macro center171bcd (pos, ang, level) queen (pos + vrotate (phi * x, (ang + 108) * y), ang - 144, level) queen (pos + vrotate (phi * x, (ang - 108) * y), ang + 144, level) king (pos + vrotate (phi * x, ang * y), ang + 180, level) #end #macro center173d (pos, ang, level) dart (pos + vrotate (phi * x, (ang + 144) * y), ang + 36, level) ace (pos + vrotate (x / phi, ang * y), ang, level) ace (pos + vrotate (phi * x, (ang - 36) * y), ang + 72, level) dart (pos + vrotate (phi * x, (ang + 36) * y), ang - 72, level) dart (pos + vrotate (phi * x, (ang - 144) * y), ang - 36, level) #end #macro center179bc (pos, ang, level) king (pos + vrotate (phi * x, (ang + 144) * y), ang - 36, level) king (pos + vrotate (phi * x, ang * y), ang + 180, level) kite (pos + vrotate (phi * x, (ang - 144) * y), ang + 36, level) kite (pos + vrotate (phi * x, (ang - 72) * y), ang + 108, level) kite (pos + vrotate (phi * x, (ang + 72) * y), ang - 108, level) #end // center179e () ??? (parallel darts) #macro center341bd (pos, ang, level) queen (pos + vrotate (phi * x, (ang + 72) * y), ang - 36, level) queen (pos + vrotate (phi * x, (ang - 72) * y), ang + 36, level) kite (pos + vrotate (phi * x, (ang + 180) * y), ang, level) #end