/** Draws Sierpinski carpets of various polygons. */ [n, levels] = eval[input["Sierpinski Carpet", [["Enter number of vertices: ", 4], ["Enter number of levels: ", 3]]]] anglestep = circle / n // Angle between vertices theta2 = 1/2 anglestep // half angle between vertices inner = 180 degrees (n-2) / n halfinner = 1/2 inner r = 1 theta3 = 180 degrees - theta2 - halfinner r2 = sin[halfinner] / sin[theta3] vertices = [ [0,0] ] g = new graphics for level = 0 to levels { if level > 0 g.color[1,1,1] startAngle = (n mod 2 == 1) ? 90 degrees + theta2 * (level mod 2) : theta2 newVertices = new array for [cx, cy] = vertices { p = new filledPolygon for vertex = 0 to n-1 { // Draw the polygon theta = anglestep * vertex + startAngle x = r cos[theta] + cx y = r sin[theta] + cy p.addPoint[x,-y] if (level > 0) and (level < levels) { // Add the next 2 polygon centers newVertices.push[ [2 r cos[theta] + cx, 2 r sin[theta] + cy] ] newVertices.push[ [2 r2 cos[theta + theta2] + cx, 2 r2 sin[theta + theta2] + cy] ] } } g.add[p] } if level > 0 vertices = newVertices r = 1/3 r r2 = 1/3 r2 } g.show[]