applications.collages.collageAlgebra:
{  
  r = const(5),
  s = const(.6),
  a = const(45),
  w = const(.9),
  
  x1 = const(-#r * sin(#a / 2)),
  y1 = const(#r * cos(#a / 2)),
  x12 = const(-#r / 40),
  y12 = const(#y1 * #w),
  x2 = const(-#x1),
  y2 = const(#y1),
  x3 = const(#x12 * #s),
  y3 = const(#y12 * #s),
  x23 = const((#x2 + #x3) / 2 + #r / 40),
  y23 = const((#y2 + #y3) / 2 - #r / 10),
  x31 = const(#x12 - #r / 200),
  y31 = const(#y12 - #r / 15),
  
  body = {
    filledCurve((#x1,#y1) left (.2, -.7) right (.8,.4),
                 (#x12,#y12) left (-.5, .2) right (.75,-.3),
                 (#x2,#y2) left (-.8,0) right (-.6,-.2),
                 (#x23,#y23) left (.4,.6) right (-.05,-.2),
                 (#x3,#y3) left (.15,.6) right (-.2,.4),
                 (#x31,#y31) left (.2, -.3) right (-.4, .3))
    },
  eyesA = {
    filledCurve((#x23 - #r / 30, #y23) left (-.75, -.2) right (-.65,.7))[1],
    filledCurve((#x23 - #r / 16, #y23 + #r / 130) left (-.4, -.03) right (-.28,.30)),
    filledCurve((#x23 - #r / 150, #y23 + #r / 40) left (-.6, .8) right (.4,.7))[1],
    filledCurve((#x23 - #r / 100, #y23 + #r / 18) left (-.25, .4) right (.15,.33))
  },
  eyesB = {
    closedCurve((#x23 - #r / 30, #y23) left (-.75, -.2) right (-.65,.7))[.7],
    filledCurve((#x23 - #r / 16, #y23 + #r / 130) left (-.4, -.03) right (-.28,.30)),
    closedCurve((#x23 - #r / 150, #y23 + #r / 40) left (-.6, .8) right (.4,.7))[.7],
    filledCurve((#x23 - #r / 100, #y23 + #r / 18) left (-.25, .4) right (.15,.33))
  },
  pattern = {
    filledCurve((#x1 + #r / 30, #y1 - #r / 100) left (1.7,-.38) right (1.3, -.25),
                 (#x23 - #r / 20, #y23 + #r / 21) left (-.25,.4) right (-.2, .1) ) [.7],
    filledCurve((#x1 + #r / 6, #y1 - #r / 75) left (-.5,-.1) right (-.35,-.1),
                 (#x1 + #r / 6.7, #y1 - #r / 14) left (0,0) right (0,0) ) [.7],
    filledCurve((#x3 + #r / 12.5, #y3 + #r / 9) left (-.25,.3) right (-.35,.3),
                 (#x23 - #r / 11, #y23 + #r / 12.5) left (-.2, .2) right (-.1,.4),
                 (#x2 - #r / 7, #y2 - #r / 5.5) left (-.15,.35) right (-.15,.3),
                 (#x23 - #r / 50, #y23 + #r / 75) left (-.6,.75) right (-.6,.6)
                  ) [.7],
    filledCurve((#x3 + #r / 15, #y3 + #r / 8),
                 (#x3 + #r / 25, #y3 + #r / 9) left (.03,.03) right (.05,.05),
                 (#x3 + #r / 15.5, #y3 + #r / 7.8)
                  ) [.7],
    filledPolygon((#x3 + #r / 17, #y3 + #r / 6.6),
                 (#x3 + #r / 35, #y3 + #r / 6.5),
                 (#x3 + #r / 17.5, #y3 + #r / 6.4)
                  ) [.7],
    filledPolygon((#x3 + #r / 17, #y3 + #r / 5.5),
                 (#x3 + #r / 35, #y3 + #r / 5.3),
                 (#x3 + #r / 17, #y3 + #r / 5.7)
                  ) [.7],
    filledPolygon((#x3 + #r / 12, #y3 + #r / 5),
                 (#x3 + #r / 25, #y3 + #r / 4.5),
                 (#x3 + #r / 13, #y3 + #r / 5.1)
                  ) [.7],
    filledPolygon((#x23 - #r / 12, #y23 + #r / 8),
                 (#x23 - #r / 8, #y23 + #r / 5.8),
                 (#x23 - #r / 12.4, #y23 + #r / 7.5)
                  ) [.7],
    filledPolygon((#x23 - #r / 18, #y23 + #r / 6.7),
                 (#x23 - #r / 14, #y23 + #r / 5.5),
                 (#x23 - #r / 19, #y23 + #r / 6.5)
                  ) [.7],
    filledPolygon((#x23 - #r / 35, #y23 + #r / 6),
                 (#x23 - #r / 35, #y23 + #r / 4.8),
                 (#x23 - #r / 42, #y23 + #r / 6)
                  ) [.7],
    filledCurve((#x23 + #r / 200, #y23 + #r / 6.4),
                 (#x23 + #r / 26, #y23 + #r / 4.3) left (-.14,-.2) right (-.12, -.2),
                 (#x23 + #r / 100, #y23 + #r / 6.5)
                  ) [.7],
    filledCurve((#x23 + #r / 200, #y23 + #r / 6.4),
                 (#x23 + #r / 26, #y23 + #r / 4.3) left (-.14,-.2) right (-.12, -.2),
                 (#x23 + #r / 100, #y23 + #r / 6.5)
                  ) [.7]
  },
  blackToWhite = map((#x1,#y1) -> (#x3, #y3),
      (#x2,#y2) -> (#x2, #y2),
      (#x23,#y23) -> (#x31 * cos(-#a) - #y31 * sin(-#a), #x31 * sin(-#a) + #y31 * cos(-#a))) .
    translate(-#x3, -#y3) .
    matrix(.95, .1, 0, .96) .
    translate(#x3, #y3),
  patch = #body + #pattern + #eyesA + 
          #pattern transformed by blackToWhite + #eyesB transformed by blackToWhite,
  
  rot0 = rotate(0 * #a),
  rot1 = rotate(1 * #a),
  rot2 = rotate(2 * #a),
  rot3 = rotate(3 * #a),
  rot4 = rotate(4 * #a),
  rot5 = rotate(5 * #a),
  rot6 = rotate(6 * #a),
  rot7 = rotate(7 * #a),
  
  circ =
    #patch transformed by rot0 +
    #patch transformed by rot1 +
    #patch transformed by rot2 +
    #patch transformed by rot3 +
    #patch transformed by rot4 +
    #patch transformed by rot5 +
    #patch transformed by rot6 +
    #patch transformed by rot7,
  
  S = #circ,
  G = #circ,
  
  shrink = scale(#s),
  shrink = < #circ, shrink >,
  
  grow = scale(1/#s),
  grow = < #circ, grow >,
  
  shrink-grow = < #circ, shrink, grow >
  
 
 }
