tikz.within( '*' ) local s60 = math.sin( 60 / 180 * math.pi ) local c60 = math.cos( 60 / 180 * math.pi ) -- creates a table object having ptop, pleft and pright as points -- and a "draw yourself" function function equilateralTriangle( ptop, len ) return { ptop = ptop, pleft = ptop + p{ -len/2, -len*s60 }, pright = ptop + p{ len/2, -len*s60 }, draw = function( self ) draw{ fill = black, draw = none, polyline{ self.ptop, self.pleft, self.pright, 'cycle' } } end } end -- one step into the fractal -- ptop: top point of triangle -- len: current length -- level: current fractal level function drawFractal( ptop, len, level ) if level == 1 then local t = equilateralTriangle( ptop, len ) t:draw( ) else local ttop = equilateralTriangle( ptop, len / 2 ) drawFractal( ttop.ptop, len / 2, level - 1 ) drawFractal( ttop.pleft, len / 2, level - 1 ) drawFractal( ttop.pright, len / 2, level - 1 ) end end drawFractal( p{ 0, 0 }, 8, 6 )