[an error occurred while processing this directive]
CIS 110

Recursive Graphics
Programming Assignment

Write a program that plots a Sierpinski triangle, as illustrated below. Then develop a program that plots a recursive pattern of your own design.

Sierpinski triangle of order 9

Part 1.   The Sierpinski triangle is another example of a fractal pattern like the H-tree pattern from Section 2.3 of the textbook. The Polish mathematician Wacław Sierpiński described the pattern in 1915, but it has appeared in Italian art since the 13th century. Though the Sierpinski triangle looks complex, it can be generated with a short recursive program. Your task is to write a program Sierpinski.java with a recursive function sierpinski() and a main() function that calls the recursive function once, and plots the result using standard drawing. Think recursively: sierpinski() should draw one colored triangle (pointed downwards) and then call itself recursively 3 times (with an appropriate stopping condition). When writing your program, exercise modular design: include a (non-recursive) function filledTriangle() that draws a filled equilateral triangle of a specified size at a specified location. Use any color, or many colors! But leave the background white, to save toner when we print it out.

Your program shall take one integer command-line argument N, to control the depth of the recursion. All of the drawing should fit inside the unit box (x- and y coordinates between 0 and 1). First, make sure that your program draws a single colored triangle when N is set to 1. Then, check that it draws four colored triangles when N is set to 2. Your program will be nearly (or completely) debugged when you get to this point. Below are the target Sierpinski triangles for different values of N. (Drawing the outline triangle is optional.)

   % java Sierpinski 1 % java Sierpinski 2 % java Sierpinski 3
   Sierpinski triangle of order 1 Sierpinski triangle of order 2 Sierpinski triangle of order 3
   % java Sierpinski 4 % java Sierpinski 5 % java Sierpinski 6
   Sierpinski triangle of order 4 Sierpinski triangle of order 5 Sierpinski triangle of order 6

A diversion: fractal dimension.   In grade school, we learn that the dimension of a line segment is one, the dimension of a square is two, and the dimension of a cube is three. But you probably didn't learn what is really meant by dimension. How can we express what it means mathematically or computationally? Formally, we can define the Hausdorff dimension or similarity dimension of a self-similar figure by partitioning the figure into a number of self-similar pieces of smaller size. We define the dimension to be the log (# self similar pieces) / log (scaling factor in each spatial direction). For example, we can decompose the unit square into 4 smaller squares, each of side length 1/2; or we can decompose it into 25 squares, each of side length 1/5. Here, the number of self-similar pieces is 4 (or 25) and the scaling factor is 2 (or 5). Thus, the dimension of a square is 2 since log (4) / log(2) = log (25) / log (5) = 2. We can decompose the unit cube into 8 cubes, each of side length 1/2; or we can decompose it into 125 cubes, each of side length 1/5. Therefore, the dimension of a cube is log(8) / log (2) = log(125) / log(5) = 3.

We can also apply this definition directly to the (set of white points in) Sierpinski triangle. We can decompose the unit Sierpinski triangle into 3 Sierpinski triangles, each of side length 1/2. Thus, the dimension of a Sierpinski triangle is log (3) / log (2) ≈ 1.585. Its dimension is fractional—more than a line segment, but less than a square! With Euclidean geometry, the dimension is always an integer; with fractal geometry, it can be any fraction. Fractals are widely applicable for describing physical objects like the coastline of Britain.

Part 2.   In this part you will design and create your own recursive fractal. Your job is to write a program Art.java that takes one integer command-line argument N to control the depth of recursion and produces a recursive pattern of your own choosing. It should work and stay within the unit box for values 1 through 7; you must not call setXscale or setYscale. You are free to choose a geometric pattern (like, but not too similar to, Htree or Sierpinski) or a random construction (like, but not too similar to, Brownian). Originality and creativity in the design will be a factor in your grade. Please use a white background (unless your design includes a background image) to save toner. If you do have a background image, it is allowed to go outside the unit box, provided your actual drawing stays within the box.

Checklist.   Don't forget to read the checklist.

Submission.   Submit Sierpinski.java, Art.java, and, if desired, a zip file containing any supplementary image files needed by Art.java. Finally, submit a readme_sierpinski.txt file and answer the questions.