# Lessons from a Triangle¶

OK, let’s look at what we have learned from writing a `drawTriangle`

and
`drawOctagon`

function. The first thing you had to figure out was that you
needed to modify the parameter to the `range`

function based on the number
of sides in the polygon. The next thing, and this may have been the most
challenging part for you was to figure out how much to turn each time. The
following table summarizes what you probably learned very nicely. If you
didn’t, look at the table and then go back to the previous page and see if
you can finish `drawTriangle`

and `drawOctagon`

.

Shape | Sides | range() | Angle |
---|---|---|---|

Triangle | 3 | 3 | 360/3 = 120 |

Square | 4 | 4 | 360/4 = 90 |

Octagon | 8 | 8 | 360/8 = 45 |

Looking at the table above you can really see that there is a pattern. If you know the number of sides you want, the rest can be figured out from there. This leads us to the next problem solving stage of this exercise, generalization. Why write a separate function for every kind of polygon when you can just write a single function that can be used to draw many different polygons?

Our new function `drawPolygon`

will have three parameters,
a turtle and the length of the side just like we have in the previous
functions, but now we will add an additional parameter: numSides.

Here’s the starting point for the drawPolygon function, see if you can fill in the details on your own.

# Finally a Circle¶

Now that we have our `drawPolygon`

function working we are almost done with
the drawCircle function. In fact if you tried to make a 100 sided polygon,
you probably noticed that it looked suspiciously close to a circle. The only
thing we’ll want to do differently is to remember that we don’t usually
specify a circle according to the number of sides it has,
but rather we specify a circle by its radius.

So, here is our next problem solving challenge. Given a radius,
how can we transform the radius into the parameters we need for the
`drawPolygon`

function? Let’s figure this out in two steps. First what
should we use as the number of sides? Second, what should we use as the side
length? To simplify the problem we can make a simple assumption about the
number of sides. Let’s just assume that 360 sides is going to be good enough
for any circle. Plus, it just makes sense that a circle has 360 degrees,
one side for each degree should give us a nice round circle.

Now that we have the number of sides figured out, we can use a bit of math to figure out the length of each of those sides. Since we are given the radius we know how large the circumference of the circle is. Right? You may remember from math class that the circumference of a circle is 2 * pi * radius. If we know the circumference and the number of sides (360), then the length of each side should be an equal proportion of the circumference. circumference / 360.

Here’s the final solution:

One annoying limitation of this `drawCircle`

function is that it draws the
circle to the right of the turtle’s current position and heading. As a short
aside, how could you change one line of the code to draw the circle to the
left of the turtle’s current position and heading?
What we would really like is to have the circle centered
on the turtle’s current position when drawCircle is called. Modify the
program above to make it so.

Finally, write another function `drawFilledCircle`

that takes a turtle,
a radius, and a color to fill in the circle.