Get-Turtle
Gets Turtles
Gets turtles in a PowerShell.
Turtle Graphics are pretty groovy.
They have been kicking it since 1966, and they are how computers first learned to draw.
They kicked off the first computer-aided design boom and inspired generations of artists, engineers, mathematicians, and physicists.
They are also incredibly easy to build.
A Turtle graphic is described with a series of moves.
Let's start with the core three moves:
Imagine you are a Turtle holding a pen.
- You can turn
rotate
- You can move
forward
- You can lift the pen
These are the three basic moves a turtle can make.
We can describe more complex moves by combining these steps.
Each argument can be the name of a move of the turtle object.
After a member name is encountered, subsequent arguments will be passed to the member as parameters.
We can write shapes as a series of steps
turtle "
rotate 120
forward 42
rotate 120
forward 42
rotate 120
forward 42
"
We can also use a method. Polygon will draw an an N-sided polygon.
turtle polygon 10 5
A simple case of this is a square
turtle square 42
If we rotate 45 degrees first, our square becomes a rhombus
turtle rotate 45 square 42
We can draw a circle
turtle circle 10
Or a pair of half-circles
turtle circle 10 0.5 rotate 90 circle 10 0.5
We can multiply arrays in PowerShell this can make composing complex shapes easier. Let's take the previous example and repeat it 8 times.
turtle @('circle',42,0.5,'rotate',90 * 8)
Let's make a triangle by multiplying steps
turtle ('forward', 10, 'rotate', 120 * 3)
We can also write this with a polygon
turtle polygon 10 3
Let's make a series of polygons, decreasing in size
turtle polygon 10 6 polygon 10 5 polygon 10 4
We can also use a loop to produce a series of steps Let's extend our previous example and make 9 polygons
turtle @(
foreach ($n in 12..3) {
'polygon'
42
$n
}
)
We can use the same trick to make successively larger polygons
turtle @(
$sideCount = 3..8 | Get-Random
foreach ($n in 1..5) {
'polygon'
$n * 10
$sideCount
}
)
We can reflect a shape by drawing it with a negative number
turtle polygon 42 3 polygon -42 3
We can change the angle of reflection by rotating first
turtle rotate 60 polygon 42 3 polygon -42 3
We can morph any N shapes with the same number of points.
turtle square 42 morph @(
turtle square 42
turtle rotate 45 square 42
turtle square 42
)
Reflections always have the same number of points.
Morphing a shape into its reflection will zoom out, flip, and zoom back in.
turtle polygon 42 6 morph @(
turtle polygon -42 6
turtle polygon 42 6
turtle polygon -42 6
)
If we want to morph a smaller shape into a bigger shape,
we can duplicate lines
turtle polygon 21 6 morph @(
turtle @('forward', 21,'backward', 21 * 3)
turtle polygon 21 6
turtle @('forward', 21,'backward', 21 * 3)
)
We can repeat steps by multiplying arrays. Lets repeat a hexagon three times with a rotation
turtle ('polygon', 23, 6, 'rotate', -120 * 3)
Let's change the angle a bit and see how they overlap
turtle ('polygon', 23, 6, 'rotate', -60 * 6)
Let's do the same thing, but with a smaller angle
turtle ('polygon', 23, 6, 'rotate', -40 * 9)
A flower is a series of repeated polygons and rotations
turtle Flower
Flowers look pretty with any number of polygons
turtle Flower 50 10 (3..12 | Get-Random) 36
Flowers get less dense as we increase the angle and decrease the repetitions
turtle Flower 50 15 (3..12 | Get-Random) 24
Flowers get more dense as we decrease the angle and increase the repetitions.
turtle Flower 50 5 (3..12 | Get-Random) 72
Flowers look especially beautiful as they morph
$sideCount = (3..12 | Get-Random)
turtle Flower 50 15 $sideCount 36 morph @(
turtle Flower 50 10 $sideCount 72
turtle rotate (Get-Random -Max 360 -Min 180) Flower 50 5 $sideCount 72
turtle Flower 50 10 $sideCount 72
)
We can draw a pair of arcs and turn back after each one.
We call this a 'petal'.
turtle rotate -30 Petal 42 60
We can construct a flower out of petals
turtle FlowerPetal
Adjusting the angle of the petal makes our petal wider or thinner
turtle FlowerPetal 42 15 (20..60 | Get-Random) 24
Flower Petals get more dense as we decrease the angle and increase repetitions
turtle FlowerPetal 42 10 (10..50 | Get-Random) 36
Flower Petals get less dense as we increase the angle and decrease repetitions
turtle FlowerPetal 50 20 (20..72 | Get-Random) 18
Flower Petals look amazing when morphed
$Radius = 23..42 | Get-Random
$flowerAngle = 30..60 | Get-Random
$AngleFactor = 2..6 | Get-Random
$StepCount = 36
$flowerPetals = turtle rotate (
(Get-Random -Max 180) * -1
) flowerPetal $radius 10 $flowerAngle $stepCount
$flowerPetals2 = turtle rotate (
(Get-Random -Max 180)
) flowerPetal $radius (
10 * $AngleFactor
) $flowerAngle $stepCount
turtle flowerPetal $radius 10 $flowerAngle $stepCount morph (
$flowerPetals,
$flowerPetals2,
$flowerPetals
)
We can construct a 'scissor' by drawing two lines at an angle
turtle Scissor 42 60
Drawing a scissor does not change the heading So we can create a zig-zag pattern by multiply scissors
turtle @('Scissor',42,60 * 4)
Getting a bit more interesting, we can create a polygon out of scissors We will continually rotate until we have turned a multiple of 360 degrees.
Turtle ScissorPoly 23 90 120
Turtle ScissorPoly 23 60 72
This can get very chaotic, if it takes a while to reach a multiple of 360 Build N scissor polygons
foreach ($n in 60..72) {
Turtle ScissorPoly 16 $n $n
}
Turtle ScissorPoly 16 69 69
We can draw an outward spiral by growing a bit each step
turtle StepSpiral
turtle StepSpiral 42 120 4 18
Because Step Spirals are a fixed number of steps,
they are easy to morph.
turtle StepSpiral 42 120 4 18 morph @(
turtle StepSpiral 42 90 4 24
turtle StepSpiral 42 120 4 24
turtle StepSpiral 42 90 4 24
)
turtle @('StepSpiral',3, 120, 'rotate',60 * 6)
turtle @('StepSpiral',3, 90, 'rotate',90 * 4)
Step spirals look lovely when morphed
(especially when reversing angles)
turtle @('StepSpiral',3, 120, 'rotate',60 * 6) morph @(
turtle @('StepSpiral',3, 120, 'rotate',60 * 6)
turtle @('StepSpiral',6, -120, 'rotate',120 * 6)
turtle @('StepSpiral',3, 120, 'rotate',60 * 6)
)
When we reverse the spiral angle, the step spiral curve flips
turtle @('StepSpiral',3, 90, 'rotate',90 * 4) morph @(
turtle @('StepSpiral',3, 90, 'rotate',90 * 4)
turtle @('StepSpiral',3, -90, 'rotate',90 * 4)
turtle @('StepSpiral',3, 90, 'rotate',90 * 4)
)
When we reverse the rotation, the step spiral curve slides
turtle @('StepSpiral',3, 90, 'rotate',90 * 4) morph @(
turtle @('StepSpiral',3, 90, 'rotate',90 * 4)
turtle @('StepSpiral',3, 90, 'rotate',-90 * 4)
turtle @('StepSpiral',3, 90, 'rotate',90 * 4)
)
We we alternate, it looks amazing
turtle @('StepSpiral',3, 90, 'rotate',90 * 4) morph @(
turtle @('StepSpiral',3, 90, 'rotate',90 * 4)
turtle @('StepSpiral',3, 90, 'rotate',-90 * 4)
turtle @('StepSpiral',3, 90, 'rotate',90 * 4)
turtle @('StepSpiral',3, -90, 'rotate',90 * 4)
turtle @('StepSpiral',3, 90, 'rotate',90 * 4)
)
turtle @('StepSpiral',3, 120, 'rotate',60 * 6) morph @(
turtle @('StepSpiral',3, 120, 'rotate',60 * 6)
turtle @('StepSpiral',6, -120, 'rotate',120 * 6)
turtle @('StepSpiral',3, 120, 'rotate',60 * 6)
turtle @('StepSpiral',6, 120, 'rotate',-120 * 6)
turtle @('StepSpiral',3, 120, 'rotate',60 * 6)
)
turtle spirolateral
turtle spirolateral 50 60 10
turtle spirolateral 50 120 6 @(1,3)
turtle spirolateral 23 144 8
turtle spirolateral 23 72 8
Turtle can draw a number of fractals
turtle BoxFractal 42 4
We can make a Board Fractal
turtle BoardFractal 42 4
We can make a Crystal Fractal
turtle CrystalFractal 42 4
We can make ring fractals
turtle RingFractal 42 4
We can make a Pentaplexity
turtle Pentaplexity 42 3
We can make a Triplexity
turtle Triplexity 42 4
We can draw the Koch Island
turtle KochIsland 42 4
Or we can draw the Koch Curve
turtle KochCurve 42
We can make a Koch Snowflake
turtle KochSnowflake 42
We can draw the Levy Curve
turtle LevyCurve 42 6
We can use a Hilbert Curve to fill a space
Turtle HilbertCurve 42 4
We can use a Moore Curve to fill a space with a bit more density.
turtle MooreCurve 42 4
We can show a binary tree
turtle BinaryTree 42 4
We can also mimic plant growth
turtle FractalPlant 42 4
The SierpinskiArrowHead Curve is pretty
turtle SierpinskiArrowheadCurve 42 4
The SierpinskiTriangle is a Fractal classic
turtle SierpinskiTriangle 42 4
Let's draw two reflected Sierpinski Triangles
turtle rotate 60 SierpinskiTriangle 42 4 SierpinskiTriangle -42 4
We can draw a 'Sierpinski Snowflake' with multiple Sierpinski Triangles.
turtle @('rotate', 30, 'SierpinskiTriangle',42,4 * 12)
turtle @('rotate', 45, 'SierpinskiTriangle',42,4 * 24)