The **turtle graphics **library included for us in introCS will allow us to use different coding concepts and algorithms we learn throughout the semester to create fun patterns and designs. There are several functions that can be imported from "introcs/turtle" that will allow us to move an invisible turtle around our screen and create graphics dictated by our code.

import { forward, left, right, moveTo } from "introcs/turtle";

The forward function has the following signature:

forward(n: number): void

You can call the *forward* function with some number **n**, and can expect the turtle to move forward in its current direction by **n** pixels.

The *left* function has the following signature:

left(rad: number): void

You can call the *left* function with some number **rad**, and can expect the turtle to rotate left in its current position by **rad** radians. Remember that a full circle has 2π radians.

The *right* function has the following signature:

right(rad: number): void

You can call the *right* function with some number **rad**, and can expect the turtle to rotate right in its current position by **rad** radians. Remember that a full circle has 2π radians.

The *moveTo* function has the following signature:

moveTo(x: number, y: number): void

You can call the *moveTo* function with some number **x** and some number **y**, and can expect the turtle to move to the specified (x, y) coordinate.

Here's an example of how we might use turtle graphics to draw a horizontal zig-zag with 10 points!

let i = 0; while (i < 10) { if (i === 0) { left(Math.PI / 4); } else if (i % 2 === 0) { left(Math.PI / 2);; } else { right(Math.PI /2); } forward(50); i++; }

Recursion enhances our ability to make more nuanced and intricate art! Basically the idea is that you draw the same thing over and over again and use only a few simple lines of code to create something beautiful. Let's take a look at some examples!

**Special spirals!**

In lecture we went over the examples of drawing trees and a square spiral, but what if you wanted your spiral to be customizable? Here's a function that lets you make any sort of special spiral you want:

let specialSpiral = (sideLength: number, angle: number, scaleFactor: number, minLength: number): void => { if (sideLength <= minLength) { return; } forward(sideLength); left(angle); specialSpiral(sideLength*scaleFactor, angle, scaleFactor, minLength); };

It takes in 4 parameters: the initial *sideLength* of your spiral, the angle by which the spiral will be turning left, the factor by which the *sideLength* will decrease with every recursive call, and our minimum *sideLength* which acts as our base case. Here a few example calls to *specialSpiral* and the resulting art!

specialSpiral(150, 45, 0.95, 5);

specialSpiral(400, 15, 0.95, 5);

specialSpiral(20, 25, 0.99, 0.05);