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 )