### Turtle Graphics

Let's imagine that the given program creates a pen for drawing lines on the screen.

This pen is at the middle of the screen has an initial direction to the right. When it is given the command
FW(100), it moves forward by 100 pixels, and leaves a white trail on the screen.

The next command, LT(60), changes the direction of the pen by
60 degrees to the left.
The command FW(250) makes the pen move 250 pixels forward and leave a trail.

The next command, RT(90), changes the direction of the pen by
90 degrees to the right.
The command FW(150) makes the pen move 150 pixels forward and leave a trail.

The next command, SETCOLOR(/orange), changes the color of the pen.
The command RT(90) changes the direction of the pen by
90 degrees to the right.
The final command, FW(500) makes the pen move 500 pixels forward,
but this time the trail is orange.

This way of drawing images is known as **turtle graphics**,
in association with the turtle cursor of the Logo programming language, which was used as
an educational programming language in the past.

The function-procedures FW, LT,
RT and SETCOLOR are defined
in the second part of the program. We will explore them in more detail later on.

The command SKIP(20) moves the pen forward by 20 pixels,
but without leaving a trail.

The command SKIP is implemented as a
user-defined procedure. The signature of this procedure is:

The signature of user-defined procedure SETCOLOR is:

Procedures don't return a value, which is indicated by the keyword
void. This allows procedures to be used as statements,
and in this usage they can be called **commands**.

Drawing a square seems to be easy enough.

The command FW is implemented as a
user-defined procedure. The signature of this procedure is:

Let's try to draw a house.

The first three lines are akin to drawing a square. Now the roof.
First, the command RT(180) turns the pen into the opposite direction.

A shape that makes up the roof is a triangle. If the lines of the roof are
to be the same length as the other lines, then the triangle is equilateral.
Equailateral triangles have all sides of equal lenght and inner angles equal to 60
degrees. Therefore, we turn the pen by 60 degrees and draw a line of length 200.

For the second part of the roof, we have to make another turn. The inner angle of
an equilateral triangle is 60 degrees, which makes the outer angle equal to 120 degrees, because
inner angle and outer angle must sum up to 180 degrees. So, we turn 120 degrees to the right.

Unfortunately, the drawing is out of bounds. To correct this, uncomment the
SETPOS command at the top.

Let's now add a diagonal line. The first issue is the direction of the pen.
To make it go straight downwards, it first needs to be rotated by 30 degrees.
Then, to change into diagonal direction, it needs to be changed by another 45 degrees.

What's the length of the diagonal line? The diagonal line is longer than the sides of the
house, so the lenght must be bigger than 200, but how much exactly? The mathematics tells
that the length of a diagonal of a square equals the side length multiplied by the square root of 2.
The procedure sqrt calculates square roots, so the length of the diagonal
equals 200*sqrt(2).

After that, the direction changes again and the line of length 200 is drawn.

Exercise: draw the other diagonal of the house.

The user-defined procedure RSKIP makes the pen go backwards,
without leaving a trail.

Here is another simple shape.

Here is an even simpler shape, which uses a rotation of 50 degrees.
Try out different values for a rotation angle, for example 60, 70, 80, 83.3 degrees.

If the angle of 120 degrees was used, the result would be a triangle.

What if the angle is slightly greater than 120 degrees?

This program answers the question.

This program answers the question: What if the line color changes in a gradient?

The user-defined procedure SETPAUSEMS
changes the drawing speed. The parameter is sleep time in milliseconds.

This program answers the question: What if the line length increases and the color changes?

* * *

The state of the pen consists of the following properties: color, width, position and direction.
These properties are implemented as variables penColor,
penWidth, penPos and
penDir. The variable penPos
is a point of type point2D and variable penDir
is a vector of type vector2D.
There are two limitations on the possible values of these variables, namely: penWidth
must be positive and penDir must be a unit vector (a vector of length 1).

The user-defined procedure InitPen procedure sets the pen's initial state. The starting state of the
pen is: white color, width of 4, position at the screen center and direction to the right.

The definition of this procedure is given at the beginning of the second part of the source code.

This program answers the question: What if a bigger angle and random colors were used?

* * *

The procedure FW has a parameter named
distance. It is defined at the end of the second part of the source code.
It first calculates the motion vector
v. The variable penPos
contains the current position. Then a disc is drawn at the current position, and a
line is drawn from current position to motion end position. Lastly, the current position
is set to equal the motion end position.

The procedures LT and RT change
the pen's direction. The direction is rotated according to the
parameter angle. The pen's direction, stored in the
variable penDir, must be a unit vector. Since rotating
a vector doesn't change its length, the new direction vector should remain to
be approximately a unit vector.