









Study with the several resources on Docsity
Earn points by helping other students or get them with a premium plan
Prepare for your exams
Study with the several resources on Docsity
Earn points to download
Earn points by helping other students or get them with a premium plan
Material Type: Notes; Class: COMPUTER GRAPHICS; Subject: Computer Science; University: Rice University; Term: Fall 2008;
Typology: Study notes
1 / 16
This page cannot be seen from the preview
Don't miss anything!










Lecture 2: Fractals from Recursive Turtle Programs use not vain repetitions... Matthew 6: 7
1. Fractals Pictured in Figure 1 are four fractal curves. What makes these shapes different from most of the curves we encountered in the previous lecture is their amazing amount of fine detail. In fact, if we were to magnify a small region of a fractal curve, what we would typically see is the entire fractal in the large. In Lecture 1, we showed how to generate complex shapes like the rosette by applying iteration to repeat over and over again a simple sequence of turtle commands. Fractals, however, by their very nature cannot be generated simply by repeating even an arbitrarily complicated sequence of turtle commands. This observation is a consequence of the Looping Lemmas for Turtle Graphics. Sierpinski Triangle Fractal Swiss Flag Koch Snowflake C -Curve Figure 1: Four fractal curves. 2. The Looping Lemmas Two of the simplest, most basic turtle programs are the iterative procedures in Table 1 for generating polygons and spirals. The looping lemmas assert that all iterative turtle programs, no matter how many turtle commands appear inside the loop, generate shapes with the same general symmetries as these basic programs. (There is one caveat here, that the iterating index is not used inside the loop; otherwise any turtle program can be simulated by iteration.) POLY (Length, Angle) SPIRAL (Length, Angle, Scalefactor) Repeat Forever Repeat Forever FORWARD Length FORWARD Length TURN Angle TURN Angle RESIZE Scalefactor Table 1: Basic procedures for generating polygons and spirals via iteration.
Circle Looping Lemma Any procedure that is a repetition of the same collection of FORWARD and TURN commands has the structure of POLY(Length, Angle), where Angle = Total Turtle Turning within the Loop Length = Distance from Turtle’s Initial Position to Turtle’s Final Position within the Loop That is, the two programs have the same boundedness, closing, and symmetry. In particular, if Angle ≠ € 2 π k for some integer k, then all the vertices generated by the same FORWARD command inside the loop lie on a common circle. Spiral Looping Lemma Any procedure that is a repetition of the same collection of FORWARD, TURN, and RESIZE commands has the structure of SPIRAL(Length, Angle, Scalefactor), where Angle = Total Turtle Turning within the Loop Length = Distance from Turtle’s Initial Position to Turtle’s Final Position during the First Iteration of the Loop Scalefactor = Total Turtle Scaling within the Loop That is, the two programs have the same boundedness and symmetry. In particular, if Angle ≠ € 2 π k for some integer k, and Scalefactor ≠ € ± 1 , then all the vertices generated by the same FORWARD command inside the loop lie on a common spiral. To prove the Circle Looping Lemma, follow the turtle through two iterations of the loop and observe that the initial turtle state undergoes exactly the same change as the turtle traversing two iterations of the POLY procedure (see Figure 2 below). Since we are iterating through exactly the same loop over and over again, after every iteration of the loop the looping turtle must end up in exactly the same state as the turtle executing the POLY procedure. This observation is the essence of the Circle Looping Lemma. The Spiral Looping Lemma can be proved in an exactly analogous manner. €
Poly Procedure € • Looping Program
Figure 4: The output of the POLY procedure for different input angles A. From left to right: a regular ten sided polygon ( € A = π / 5 ), a seven pointed star ( € A = 6 π / 7 ), and a figure that never closes ( € A = π 2 / 2 ). Notice that in each case, the vertices lie on a common circle. Proposition 1: The vertices generated by the procedure POLY(Length, Angle) lie on a common circle for any angle € A ≠ 2 π k , for some integer k, and any length €
Proof: Consider the circle generated by the first three vertices € D , E , F visited by the turtle while executing the POLY procedure (see Figure 5). We need to show that the next vertex G visited by the turtle lies on the same circle -- that is, we need to show that € x = CG = R , where R is the radius of the circle circumscribed about € Δ DEF and C is the center of this circle. But €
since by construction the lengths of the three corresponding sides are equal (SSS). Now € A + β + α = A + α + α ⇒ β = α Therefore €
because these triangles agree in two sides and an included angle (SAS). Hence, since € Δ CEF is isosceles, € Δ CFG is also isosceles, so € x = CG = R.
€ R € R € R € €^ L L € L € x = R? € α € α € α € α € β € A € A € C € € D E € F
€ G Figure 5: The circle generated by the first three vertices € D , E , F visited by the turtle while executing the POLY procedure. The vertices of the fractals in Figure 1 do not lie on common circles nor do they lie on common spirals. Thus, as a consequence of the Looping Lemmas, these fractals cannot be generated by iterative turtle procedures. To generate these fractal curves, we must resort instead to recursive turtle programs. 4
3. Fractal Curves and Recursive Turtle Programs There are many different types of fractal curves, including gaskets, snowflakes, terrain, and even plants. Here we are going to concentrate on two representative types of fractals: fractal gaskets and bump fractals. Both of these types of fractal curves can be generated easily by simple recursive turtle programs. 3.1 Fractal Gaskets. The Sierpinski triangle in Figure 1 is an example of a fractal gasket. Because of the Looping Lemmas, we cannot use iteration to generate fractals, so we shall develop a recursive turtle program to generate this gasket. The key observation for building such a recursive program is that the big Sierpinski gasket is made up of three identical scaled down copies of the entire gasket. Thus, a Sierpinski gasket is just three smaller Sierpinski gaskets joined together. This definition would be circular, if we did not have a base case at which to stop the recursion. We shall say, therefore, that a very small Sierpinski gasket is just a very small triangle. Now the structure of the recursive portion of the turtle program for the Sierpinski gasket must be something like the following: To make a large Sierpinski gasket: Make a smaller Sierpinski gasket at one of the corners. Then move to another corner and make another small Sierpinski gasket. Then move to another corner and make another small Sierpinski gasket. Then return the turtle to her initial position and heading. The moves can be made with MOVE and TURN commands; the rescaling is achieved with RESIZE commands. To make the three smaller gaskets requires three recursive calls. Form follows function! By the way, why do you think you have to return the turtle to her initial state? Below is the complete program for generating the Sierpinski gasket. It’s short and simple. Different levels of the gasket generated by the SIERPINSKI program are illustrated in Figure 6. Notice that all the drawing done by this program is performed exclusively by the FORWARD commands inside the POLY procedure in the base case: SIERPINSKI ( Level) IF Level = 0, POLY (1, € 2 π / 3 ) OTHERWISE REPEAT 3 TIMES RESIZE 1/ SIERPINSKI ( Level - 1) RESIZE 2 MOVE 1 TURN € 2 π / 3 5
Figure 8: More fractal gaskets. We leave it as an exercise to the reader to develop recursive turtle programs to generate each of these fractal gaskets (see Exercise 4). 3.2 Bump Fractals. A bump curve is just a pulse along a straight line. Figure 9 illustrates three examples of bump curves. A bump fractal is a fractal curve generated by recursively replacing each straight line of a bump curve by a scaled version of the bump. The C -curve in Figure 1 is the bump fractal corresponding the right most bump curve in Figure 9. Figure 9: Some examples of bump curves. It is actually quite easy to write a recursive turtle program to generate any arbitrary bump fractal. The base case is a straight line, so the code for the base case consists of the single turtle command FORWARD 1. To generate the recursive body of the program, proceed in two steps:
TriangularBumpFractal (Level) If Level = 0 FORWARD 1 TriangularBump Otherwise RESIZE 1/3 RESIZE 1/ FORWARD 1 TriangularBumpFractal (Level-1) TURN € π / 3 TURN € π / 3 FORWARD 1 TriangularBumpFractal (Level-1) TURN € − 2 π / 3 TURN € − 2 π / 3 FORWARD 1 TriangularBumpFractal (Level-1) TURN € π / 3 TURN € π / 3 FORWARD 1 TriangularBumpFractal (Level-1) RESIZE 3 RESIZE 3 Table 2: The turtle program for a triangular bump, and the recursive turtle program for the corresponding bump fractal (the Koch curve). Figure 10: Levels 1, 2, 5 of the Koch curve corresponding to the recursive turtle program in Table
Notice that the recursive turtle program for the Koch curve restores the original step size of the turtle, but unlike the turtle program for the Sierpinski gasket, the turtle program for the Koch curve does not restore the turtle to her original position. Be sure that you understand why it is not necessary to restore the turtle to her initial position in order to generate the Koch curve or, in fact, to generate any other bump fractal.
4. Summary: Fractals -- Recursion Made Visible We never actually defined the term fractal. Nevertheless, from the turtle’s point of view, fractals are just recursion made visible. In this lecture we have studied two kinds of fractals: fractal gaskets and bump fractals. But pretty much any recursive turtle program generates a fractal curve. Conversely, many different fractal curves can be generated by recursive turtle programs. Consider, for example, the fractal curves in Figure 11. Each of these fractals is made up of 8
a. Prove that for any angle € A ≠ 2 π k , for some integer k, and any length € L ≠ 0 , the line segments of the curve generated by the turtle program POLY(L,A) are tangent to a common circle. (Hint: In Figure 12, prove that € β = α. Conclude that €
so € x = R and € ∠ CHG = π / 2 .) b. How does the radius of the inner circle vary as the angle A is increased?
€ R € R € L / 2 € x = R? € α € α € α € β € A € € A C € D € E € F
€ G € L / (^2) € L / 2 € L / 2 €
€ d € d € L / 2 € L / 2 Figure 12: The circle tangent to the first two edges generated by the turtle while executing the POLY procedure.
When the anchor is down, the hodograph turtle ignores the FORWARD and MOVE commands. b. Write turtle programs to generate simple curves like polygons, stars, and spirals using the hodograph turtle. c. Draw the curves in Figure 18 using i. the classical turtle ii. the hodograph turtle Which is easier? d. Compare and contrast the curves generated by the classical turtle and the hodograph turtle for the same turtle programs when the anchor is down. For example: i. What curve does the hodograph turtle draw, when the classical turtle draws a polygon, a star, or a rosette? ii. What curve does the hodograph turtle draw, when the classical turtle draws the Sierpinski gasket or the Koch curve? e. Compare the fractals generated by the classical turtle and the hodograph turtle for the same recursive turtle program. Form a conjecture concerning when the two turtles generate the same fractal curve. Figure 18. A pentagon inscribed in a circle (left), a pentagon circumscribed about a circle (center), and a collection of concentric circles (right). Are these curves easier to generate with the classical turtle or with the hodograph turtle?
D 1 = Distance from Turtle to Wall in Direction of Turtle Heading IF €
A = angle of reflection } NEWFORWARD €
To compute the angle of reflection A , let € ∠( w , N ) denote the angle between the turtle direction vector w and the normal N to the wall at the point where the turtle hits the wall. By a straightforward geometric argument, you should be able to show that: € A = π − 2 ∠( w , N ). a. Implement LOGO on a bounded domain, where the walls form: i. a rectangle ii. a circle iii. an ellipse b. Consider the turtle program consisting of the single command NEWFORWARD D Investigate the curves generated by this program for different shape walls, different values of D, and different initial positions and headings for the turtle. c. Investigate how curves drawn by the walled in turtle differ from curves drawn by the turtle on an infinite plane using the same turtle programs, where FORWARD is replaced by NEWFORWARD. In particular, investigate the curves generated by POLY, SPIRAL, and different recursive turtle procedures for generating fractals.