# Exercises

### Flat Polygon

Using the Turtle methods, `Range`, and `flatMap`, rewrite your method to create a polygon. The signature of `polygon` is

``````def polygon(sides: Int, sideLength: Double): Image =
???``````

<div class="solution"> Using `flatMap` we can make the code more compact than the explicit structural recursion we had to use before.

``````def polygon(sides: Int, sideLength: Double): Image = {
val rotation = Angle.one / sides

Turtle.draw((1 to sides).toList.flatMap { n =>
List(turn(rotation), forward(sideLength))
})
}``````

</div>

### Flat Spiral

Using the Turtle methods, `Range`, and `flatMap`, rewrite your method to create the square spiral. The signature of `squareSpiral` is

``````def squareSpiral(steps: Int, distance: Double, angle: Angle, increment: Double): Image =
???``````

<div class="solution"> Again, the result is more compact than the previous implementation without `flatMap`. Isthis easier to read? I find it about the same. I belive comprehensibility is a function of familiarity, and we're (hopefully) by now becoming familiar with `flatMap`.

``````def squareSpiral(steps: Int, distance: Double, angle: Angle, increment: Double): Image = {
Turtle.draw((1 to steps).toList.flatMap { n =>
List(forward(distance + (n * increment)), turn(angle))
})
}``````

</div>

### L-System Art

In this exercise we want you to use your creativity to construct a picture of a natural object using your L-system implementation. You've seen many examples already that you can use an inspriation.