applications.collages.collageAlgebra("Penrose rhombi"):
{
  ntColour = const(.8),
  tileColour1r = const(.7),
  tileColour1g = const(.4),
  tileColour1b = const(1),
  tileColour2r = const(.4),
  tileColour2g = const(.75),
  tileColour2b = const(.4),
  alpha = const(36),
  r = const(2/(1 + sqrt(5))),
      
  rhomb1 = {
      filledPolygon((sin(#alpha), 0), ((1 - #r / 2) * sin(#alpha), -#r / 2 * cos(#alpha)), (-(1 - #r / 2) * sin(#alpha), -#r / 2 * cos(#alpha)), (-sin(#alpha), 0))[#tileColour1r,#tileColour1g,#tileColour1b],
      filledPolygon((0,cos(#alpha)), (#r / 2 * sin(#alpha), (1 - #r / 2) * cos(#alpha)), (-#r / 2 * sin(#alpha), (1 - #r / 2) * cos(#alpha)))[#tileColour2r,#tileColour2g,#tileColour2b],
      polygon((0,-cos(#alpha)), (sin(#alpha), 0), (0,cos(#alpha)), (-sin(#alpha), 0))
  },
  
  rhomb2 = {
      filledPolygon((-(sin(#alpha / 2) - #r / 2 * sin(#alpha / 2)), -#r / 2 * cos(#alpha / 2)), (0,0), (-(sin(#alpha / 2) - #r / 2 * sin(#alpha / 2)), #r / 2 * cos(#alpha / 2)), (-sin(#alpha / 2), 0))[#tileColour2r,#tileColour2g,#tileColour2b],
      filledPolygon(((sin(#alpha / 2) - #r / 2 * sin(#alpha / 2)), -#r / 2 * cos(#alpha / 2)), (0,0), ((sin(#alpha / 2) - #r / 2 * sin(#alpha / 2)), #r / 2 * cos(#alpha / 2)), (sin(#alpha / 2), 0))[#tileColour1r,#tileColour1g,#tileColour1b],
      polygon((0,-cos(#alpha / 2)), (sin(#alpha / 2), 0), (0,cos(#alpha / 2)), (-sin(#alpha / 2), 0))
  },
  
  rt1 = translate(0,-cos(#alpha)) . rotate(-#alpha) . translate(0,cos(#alpha) / #r),
  rt2 = translate(-sin(#alpha / 2), 0) . rotate(90) . translate(0,cos(2 * #alpha)),
  kite = #rhomb1 transformed by rt1 + #rhomb2 transformed by rt2,
  
  rt3 = translate(0,cos(#alpha)) . rotate(#alpha),
  dart = #rhomb1 transformed by rt3,
  
  rk1 = scale(#r) . rotate(180 + #alpha) . translate(0, cos(#alpha) / #r),
  rk2 = translate(sin(2 * #alpha), 0) . scale(#r) . rotate(3 * #alpha) . translate(0, -cos(2 * #alpha)),
  rk3 = translate(-sin(2 * #alpha), 0) . scale(#r) . rotate(-3 * #alpha) . translate(0, -cos(2 * #alpha)),
  refine-kite = <rk1, rk2, rk3>,
  
  invert = translate(0, cos(2 * #alpha)) . rotate(-3 * #alpha) . scale(1/#r) . translate(-sin(2 * #alpha), 0),
  invert = <invert>,
  
  rd1 = translate(0, -cos(#alpha) / #r) . rotate(180) . scale(#r),
  rd2 = scale(#r) . rotate(180 - #alpha) . translate(sin(#alpha) / #r, cos(#alpha) / #r),
  refine-dart = <rd1, rd2>
  
  
}
