In the first lesson, we taught the turtle how to draw a square. We ended up with a procedure that looks like this:
TO SQUARE REPEAT 4 [ FORWARD 100 RIGHT 90 ] END
In this lesson, we are going to improve upon this procedure. We are going to create a procedure that draws squares of any size. And we are going to create a procedure that draws other shapes.
Our SQUARE procedure is pretty good, but we can make it better. Right now, the turtle only knows how to draw squares that are 100 pixels long on each side. Let's teach the turtle how to draw squares of any size.
We can do this by using something called a "parameter". A parameter is like a fill-in-the-blank for a procedure. When you define a procedure, you leave some values blank. When you call that procedure, you give it a value to use in that blank.
This may sound complicated, but it's not. In fact, you already know a procedure that takes a parameter: FORWARD. When you give the turtle a "FORWARD" instruction, you can't just say "FORWARD", you also have to tell him how many screen dots to move forward. This number is a parameter.
We are going to make SQUARE take a parameter that tells the turtle how long each side should be.
Activity: Press the "Edall" button and change the SQUARE function to the following:
TO SQUARE :LENGTH REPEAT 4 [ FORWARD :LENGTH RIGHT 90 ] END
The ":LENGTH" is our parameter. When we use this SQUARE procedure, we have to put a number after it. The number we use will be the number of pixels that the turtle moves forward when drawing each side. For example, "SQUARE 10" tells the turtle to make a square with sides that are 10 pixels long.
We can use our more powerful SQUARE procedure to draw an interesting design.
REPEAT 10 [ SQUARE REPCOUNT * 10 ] |
Now the turtle can draw a square of any size, but what about other shapes. What about a triangle? What about a polygon with five sides? What about a polygon with a hundred sides? Can we make a single procedure that draws a polygon with any number of sides?
Let's look at some code for drawing polygons and try to find a pattern.
REPEAT 3 [ FORWARD 100 RIGHT 120 ] |
|
REPEAT 4 [ FORWARD 100 RIGHT 90 ] |
|
REPEAT 5 [ FORWARD 100 RIGHT 72 ] |
|
REPEAT 6 [ FORWARD 100 RIGHT 60 ] |
Do you see a pattern? All of these shapes were drawn by repeatedly moving forward and turning right. The number of times we repeat equals the number of sides. The amount that we moved forward doesn't change. The amount we turn seems to get smaller with more sides.
Now for the hard part: how much should we turn? If you add up the "outside angles" of any closed polygon, you always get 360°. In the shapes that we have drawn, all angles are the same size. For example, in a triangle, we have three angles. Since we have to turn a total of 360° for all three angles put together, each angle should be 360° divided by 3, or 120°.
So let's create a procedure that can draw all of the shapes above. We'll call this procedure "POLYGON". By the way, in Logo you divide by using the "/" operator.
TO POLYGON :SIDES REPEAT :SIDES [ FORWARD 100 RIGHT 360 / :SIDES ] END
POLYGON 3 |
|
POLYGON 4 |
|
POLYGON 5 |
|
POLYGON 6 |
Activity: Type in the POLYGON procedure and play around with it. What happens when you give it a number less than 3? What happens when you give it a large number, like 50?
Activity: Modify the POLYGON procedure to take a :LENGTH parameter, like we did for the SQUARE routine.
Activity: Create your own procedures that take a parameter. You can start from scratch or you can start with one of the samples from any lesson.
TO RIGHTTRIANGLE :LENGTH FORWARD :LENGTH RIGHT 135 FORWARD :LENGTH * SQRT 2 RIGHT 135 FORWARD :LENGTH RIGHT 90 END TO PYRAMID RIGHT 45 REPEAT 4 [ REPEAT 10 [ RIGHTTRIANGLE REPCOUNT * 10 ] RIGHT 90 ] LEFT 45 END PYRAMID |
|
TO POLYGON :SIDES :LENGTH REPEAT :SIDES [ FORWARD :LENGTH RIGHT 360 / :SIDES ] END TO HEXAGONFLOWER :PETALS REPEAT :PETALS [ POLYGON 5 50 RIGHT 360 / :PETALS ] END HEXAGONFLOWER 10 |
|
TO DOWNSLANT :LENGTH REPEAT 2 [ FORWARD :LENGTH RIGHT 135 FORWARD 20 RIGHT 45 ] RIGHT 135 FORWARD 20 LEFT 135 END TO UPSLANT :LENGTH REPEAT 2 [ FORWARD :LENGTH RIGHT 45 FORWARD 20 RIGHT 135 ] RIGHT 45 FORWARD 20 LEFT 45 END TO SHEET REPEAT 2 [ DOWNSLANT 100 ] REPEAT 2 [ UPSLANT 100 ] DOWNSLANT 100 REPEAT 2 [ UPSLANT 50 ] DOWNSLANT 50 REPEAT 2 [ DOWNSLANT 10 ] UPSLANT 10 END SHEET |
|
TO RECTANGLE :HEIGHT :WIDTH REPEAT 2 [ FORWARD :HEIGHT RIGHT 90 FORWARD :WIDTH RIGHT 90 ] END TO TRIANGLE :LENGTH RIGHT 45 FORWARD :LENGTH * (SQRT 2) / 2 RIGHT 90 FORWARD :LENGTH * (SQRT 2) / 2 RIGHT 135 FORWARD :LENGTH RIGHT 90 END TO HOUSE ; draw the house RECTANGLE 100 100 ; draw the roof FORWARD 100 TRIANGLE 100 BACK 100 ; draw the door RIGHT 90 FORWARD 60 LEFT 180 RECTANGLE 20 40 FORWARD 60 RIGHT 90 END HOUSE |
|
TO STAR :LENGTH :POINTS REPEAT :POINTS [ FORWARD :LENGTH RIGHT 180 - (180 / :POINTS) ] END STAR 200 9 |
|
TO TRIANGLE :LENGTH REPEAT 3 [FORWARD :LENGTH RIGHT 120 ] END TO TRIANGLEFLOWER :LENGTH :COUNT REPEAT :COUNT [ TRIANGLE :LENGTH RIGHT 360 / :COUNT ] END TO WEB REPEAT 6 [ TRIANGLEFLOWER REPCOUNT * 25 18 ] END WEB |