Download or view SierpinskiCarpet.frink in plain text format
/** 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[]
Download or view SierpinskiCarpet.frink in plain text format
This is a program written in the programming language Frink.
For more information, view the Frink
Documentation or see More Sample Frink Programs.
Alan Eliasen, eliasen@mindspring.com