applications.collages.collageAlgebra:
{  
  angle = const(15),
  l = const(2 * sin(#angle / 2)),
  v1x = const(#l * sin(2 * #angle)),
  v1y = const(#l * cos(2 * #angle)),
  v2x = const(#v1x + #l * sin(#angle)),
  v2y = const(#v1y + #l * cos(#angle)),
  v3x = const(#v2x),
  v3y = const(#v2y + #l),
  v4x = const(sin(#angle / 2)),
  v4y = const(cos(#angle / 2)),
  v5x = const(-sin(#angle / 2)),
  v5y = const(cos(#angle / 2)),
  v6x = const(#v5x + #l * sin(2 * #angle)),
  v6y = const(#v5y - #l * cos(2 * #angle)),
  v7x = const(#v6x + #l * sin(#angle)),
  v7y = const(#v6y - #l * cos(#angle)),
  v8x = const(#v7x),
  v8y = const(#v7y - #l),
  
  versatile
    = {
        polygon(
          (0,0),
          (#v1x,#v1y),
          (#v2x,#v2y),
          (#v3x,#v3y),
          (#v4x,#v4y),
          (#v5x,#v5y),
          (#v6x,#v6y),
          (#v7x,#v7y),
          (#v8x,#v8y) )
        },
        
  darkVersatile
    = {
        filledPolygon(
          (0,0),
          (#v1x,#v1y),
          (#v2x,#v2y),
          (#v3x,#v3y),
          (#v4x,#v4y),
          (#v5x,#v5y),
          (#v6x,#v6y),
          (#v7x,#v7y),
          (#v8x,#v8y) )[.15,.5,.9]
        } + #versatile,
  
  lightVersatile
    = {
        filledPolygon(
          (0,0),
          (#v1x,#v1y),
          (#v2x,#v2y),
          (#v3x,#v3y),
          (#v4x,#v4y),
          (#v5x,#v5y),
          (#v6x,#v6y),
          (#v7x,#v7y),
          (#v8x,#v8y) )[.45,.7,.9]
        } + #versatile,
  
  versatileA
    = {
        filledPolygon(
          (0,0),
          (#v1x,#v1y),
          (#v8x,#v8y) )[0,.4,.9],
        filledPolygon(
          (#v1x,#v1y),
          (#v2x,#v2y),
          (#v7x,#v7y),
          (#v8x,#v8y) )[.15,.5,.9],
        filledPolygon(
          (#v2x,#v2y),
          (#v3x,#v3y),
          (#v6x,#v6y),
          (#v7x,#v7y) )[.3,.6,.9],
        filledPolygon(
          (#v3x,#v3y),
          (#v4x,#v4y),
          (#v5x,#v5y),
          (#v6x,#v6y) )[.45,.7,.9]
        } + #versatile,
  
  versatileB
    = {
        filledPolygon(
          (0,0),
          (#v1x,#v1y),
          (#v8x,#v8y) )[.45,.7,.9],
        filledPolygon(
          (#v1x,#v1y),
          (#v2x,#v2y),
          (#v7x,#v7y),
          (#v8x,#v8y) )[.3,.6,.9],
        filledPolygon(
          (#v2x,#v2y),
          (#v3x,#v3y),
          (#v6x,#v6y),
          (#v7x,#v7y) )[.15,.5,.9],
        filledPolygon(
          (#v3x,#v3y),
          (#v4x,#v4y),
          (#v5x,#v5y),
          (#v6x,#v6y) )[0,.4,.9]
        } + #versatile,
  
  id = scale(1),
  arm1 = scale(1,-1) . translate(-sin(#angle / 2), cos(#angle / 2)),
  arm2 = translate(-#l, 0),
  arm3 = rotate(#angle) . use(arm2),
  arm4 = use(arm1) . use(arm3),
  arm5 = use(arm2) . use(arm3),
  arm6 = use(arm3) . use(arm3),
  arm7 = use(arm1) . use(arm6),
  arm8 = use(arm2) . use(arm6),
  arm9 = use(arm3) . use(arm6),
  arm10 = use(arm1) . use(arm9),
  arm11 = use(arm2) . use(arm9),
  arm12 = use(arm3) . use(arm9),
  arm13 = rotate(#angle) . use(arm12),
  arm14 = rotate(#angle) . use(arm13),
  arm15 = rotate(#angle) . use(arm14),
  arm = < id, #versatileB transformed by arm1, arm2,
          arm3, #versatileB transformed by arm4, arm5,
          arm6, #versatileB transformed by arm7, arm8,
          arm9, #versatileB transformed by arm10, arm11,
          arm12, arm13, arm14, arm15 >,
  
  three1 = rotate(120),
  three2 = rotate(240),
  three = <id, three1, three2 >,
  
  3F1 = scale(1,-1) . translate(0,2 * cos(#angle / 2)),
  3F2 = translate(sin(#angle / 2), cos(#angle / 2)),
  3F3 = translate(-sin(#angle / 2), cos(#angle / 2)),
  3F = < #versatileA, #versatileB transformed by 3F1, 3F2, 3F3 >,
  3G = < #versatileA, #versatileB transformed by 3F1, 3F2 >,
  3A = {
        filledPolygon(
          (0,0),
          (#v1x,#v1y),
          (#v2x,#v2y),
          (#v3x,#v3y),
          (#v4x,#v4y),
          (#v5x,#v5y),
          (#v6x,#v6y),
          (#v7x,#v7y),
          (#v8x,#v8y) )[.6,.9,.2]
        } + #versatile,
  3B = {
        filledPolygon(
          (0,0),
          (#v1x,#v1y),
          (#v2x,#v2y),
          (#v3x,#v3y),
          (#v4x,#v4y),
          (#v5x,#v5y),
          (#v6x,#v6y),
          (#v7x,#v7y),
          (#v8x,#v8y) )[.9,.4,.4]
        } + #versatile
 
 }
