// $Id: Penrose.pov,v 1.19 2006/07/06 17:12:13 jon Exp $ #include "Penrose.inc" // ---------- Triangle Tile Macros ---------- // Just draw the edges for each triangle here. This could be quite // elaborate, drawing curves through each triangle, or changing color // based on the context parameter, etc... #macro triangle_edges (p1, p2, p3) #local col = vnormalize (); intersection { prism { linear_spline -rad_edge, rad_edge, 4 , , , } union { cylinder { pn, po, rad_edge } cylinder { po, pp, rad_edge } cylinder { pp, pn, rad_edge } } pigment { rgb col } } #end #macro slim1_tile (po, ang, dir, ctx) #local pn = po + vrotate (x, (ang - dir * 18) * y); #local pp = po + vrotate (x, (ang + dir * 18) * y); triangle_edges (pn, po, pp) #end #macro wide1_tile (po, ang, dir, ctx) #local pn = po + vrotate (x, (ang - dir * 54) * y); #local pp = po + vrotate (x, (ang + dir * 54) * y); triangle_edges (pn, po, pp) #end #macro slim2_tile (po, ang, dir, ctx) #local pn = po + vrotate (x, (ang - dir * 18) * y); #local pp = po + vrotate (x, (ang + dir * 18) * y); triangle_edges (pn, po, pp) #end #macro wide2_tile (po, ang, dir, ctx) #local pn = pos + (phi - 1) * vrotate (x, (ang - dir * 54) * y); #local pp = pos + (phi - 1) * vrotate (x, (ang + dir * 54) * y); triangle_edges (pn, po, pp) #end // ---------- Rhomb Tile Macros ---------- #macro thick_tile (p1, ang) #local pos = vrotate (x, (ang + 54) * y); #local neg = vrotate (x, (ang - 54) * y); #local p2 = p1 + pos; #local p3 = p1 + pos + neg; #local p4 = p1 + neg; #local col = ; triangle { p4, p1, p2 pigment { rgb col } } triangle { p2, p3, p4 pigment { rgb col } } #end #macro thin_tile (p1, ang) #local pos = vrotate (x, (ang + 18) * y); #local neg = vrotate (x, (ang - 18) * y); #local p2 = p1 + pos; #local p3 = p1 + pos + neg; #local p4 = p1 + neg; #local col = ; triangle { p4, p1, p2 pigment { rgb col } } triangle { p2, p3, p4 pigment { rgb col } } #end // ---------- Kite and Dart Tile Macros ---------- #macro kite_tile (po, ang, ctx) #local pn = po + vrotate (x, (ang + 18) * y); #local pf = po + vrotate (x, (ang - 18) * y); #local pp = po + vrotate (x, (ang - 54) * y); #local col = ; #if (ctx != 0) #local col = vnormalize (col) * 2/3; #end #if (ctx < 0) #local col = <1,1,1> - col; #end triangle { pn, po, pp pigment { rgb col } } triangle { pp, pf, pn pigment { rgb col } } #end #macro dart_tile (po, ang, ctx) #local pn = pos + (phi - 1) * vrotate (x, (ang - 162) * y); #local pf = pos + (phi - 1) * vrotate (x, (ang - 54) * y); #local pp = pos + (phi - 1) * vrotate (x, (ang + 54) * y); #local col = ; #if (ctx != 0) #local col = vnormalize (col) * 2/3; #end #if (ctx < 0) #local col = <1,1,1> - col; #end triangle { po, pn, pf pigment { rgb col } } triangle { po, pp, pf pigment { rgb col } } #end // ---------- Pentagon & Pentagram Tile Macros ---------- #macro ps2_tile (po, ang, dir, ctx) #local pn = po + vrotate (x, (ang - dir * 18) * y); #local pp = po + vrotate (x, (ang + dir * 18) * y); #local p1 = 1/2 * po + 1/2 * pn; #local p2 = (2 - phi) * po + (phi - 1) * pp; #local p3 = (1 - phi / 2) * pn + phi / 2 * pp; #if (ctx) #local c1 = <1,1,1>; #local c2 = <1/4,1/4,1/4>; #else #local c1 = <1/4,1/4,1/4>; #local c2 = <1,1,1>; #end triangle { po, p1, p2 pigment { rgb c1 } } triangle { pn, p1, p2 pigment { rgb c2 } } triangle { pn, p2, p3 pigment { rgb c2 } } triangle { pp, p2, p3 pigment { rgb 2/3 } } #end #macro pw2_tile (po, ang, dir, ctx) #local pn = pos + (phi - 1) * vrotate (x, (ang - dir * 54) * y); #local pp = pos + (phi - 1) * vrotate (x, (ang + dir * 54) * y); #local p1 = (1 - phi / 2) * pp + phi / 2 * po; #local p2 = (2 - phi) * pp + (phi - 1) * pn; #if (ctx) #local c1 = <1/4,1/4,1/4>; #else #local c1 = <1,1,1>; #end triangle { po, p1, p2 pigment { rgb 2/3 } } triangle { po, p2, pn pigment { rgb 2/3 } } triangle { pp, p1, p2 pigment { rgb c1 } } #end // ---------- Macros to map Penrose objects into actual objects ---------- // Draw the triangle edges, and color the kites, darts, and rhombs they make #macro PENROSE_slim1 (pos, ang, dir, ctx) slim1_tile (pos, ang, dir, ctx) #if (dir > 0) thin_tile (pos, ang) #end #end #macro PENROSE_wide1 (pos, ang, dir, ctx) wide1_tile (pos, ang, dir, ctx) #if (dir > 0) thick_tile (pos, ang) #end #end #macro PENROSE_slim2 (pos, ang, dir, ctx) slim2_tile (pos, ang, dir, ctx) #if (dir > 0) kite_tile (pos, ang, ctx) #end #end #macro PENROSE_wide2 (pos, ang, dir, ctx) wide2_tile (pos, ang, dir, ctx) #if (dir > 0) dart_tile (pos, ang, ctx) #end #end // ---------- Scene Constants ---------- #declare RND_STRM = seed(0); #declare pos = <0.001,0,0.001>; #declare ang = 9; #declare rad_edge = 1/30; // ---------- Scene Description ---------- #declare image_number = 2; #switch (image_number) #case (0) // show standard tiles and their generating triangles // Don't care about context for this image. #macro PENROSE_context (pos, ang, dir, level, obj, typ, context) context #end thick (pos + <-phi,0, 1>, ang, 3, 0) kite (pos + < 1,0, 1>, ang, 3, 0) thin (pos + <-phi,0,-1>, ang, 3, 0) dart (pos + < 1,0,-1>, ang, 3, 0) #break #case (1) // Cartwheel pattern #macro PENROSE_context (pos, ang, dir, level, obj, typ, context) #switch (obj) #case (PENROSE_obj_short_bowtie) #case (PENROSE_obj_long_bowtie) #local ctx = 1; #break #else #local ctx = context; #end ctx #end // Draw the batman pattern dark, everything else light, and let the // context macro darken the interesting parts. batman (pos, ang, 0, 1) decagon (pos, ang, 0, -1, 155) cartwheel (pos, ang, 0, -1, 155) short_cartwheel (pos, ang, 0, -1, 155) #break #case (2) // 'gons & 'grams tiling #macro PENROSE_context (pos, ang, dir, level, obj, typ, context) #switch (obj) #case (PENROSE_obj_wide2) #local ctx = 1 - context; #break #else #local ctx = context; #end ctx #end #macro PENROSE_slim2 (pos, ang, dir, ctx) ps2_tile (pos, ang, dir, ctx) #end #macro PENROSE_wide2 (pos, ang, dir, ctx) pw2_tile (pos, ang, dir, ctx) #end #local i = 0; #while (i < 5) slim2 (pos, ang + i * 72, 1, 5, 1) slim2 (pos, ang + i * 72 + 36,-1, 5, 1) #local i = i + 1; #end #break #end light_source { <0, 9, 0>, <1,1,1> * 3/2 parallel point_at <0, 0, 0> } camera { location pos + <0, 1, 0> * 15 look_at pos }