Turtle graphics

Luxor provides some basic "turtle graphics" functions. Functions to control the turtle begin (somewhat unusually) with a capital letter: Forward, Turn, Circle, Orientation, Towards, Rectangle, Pendown, Penup, Pencolor, Penwidth, and Reposition.

Angles are specified in clockwise degrees rather than radians.

using Luxor, ColorsDrawing(600, 400, "../assets/figures/turtles.png")origin()background("midnightblue")🐢 = Turtle() # you can type the turtle emoji with \:turtle:Pencolor(🐢, "cyan")Penwidth(🐢, 1.5)n = 5for i in 1:400    global n    Forward(🐢, n)    Turn(🐢, 89.5)    HueShift(🐢)    n += 0.75endfontsize(20)Message(🐢, "finished")finish()

turtles

List of words the turtle knowsArgumentsAction
Forwardn (1)More forward by d units
Turnθ (5°)Increase the turtle's rotation by n°
Circler (1)Draw filled circle centered at current pos
HueShiftn (1)Shift the Hue of the turtle's pen color by n
Messaget ("")Output text t
Orientationθ (5°)Set the turtle's orientation to θ degrees
Pen_opacity_randomSet opacity to random value
Pencolorr g bSet the Red, Green, and Blue values
PendownStart drawing
PenupStop drawing
PenwidthwSet the width of the line to w
PopMove turtle to the value stored on the stack
PushSave the turtle's position on the stack
Randomize_saturationRandomize the saturation of the current color
Rectanglew hDraw filled rectangle centered at current pos
RepositionptPlace turtle at new position pt
TowardsptRotate turtle to face towards a point

The turtle commands expect a reference to a turtle as the first argument (it doesn't have to be a turtle emoji!).

You can have any number of turtles active at a time.

quantity = 9turtles = [Turtle(O, true, 2π * rand(), (rand(), rand(), 0.5)...) for i in 1:quantity]Reposition.(turtles, first.(collect(Tiler(800, 800, 3, 3))))n = 10Penwidth.(turtles, 0.5)for i in 1:300    global n    Forward.(turtles, n)    HueShift.(turtles)    Turn.(turtles, [60.1, 89.5, 110, 119.9, 120.1, 135.1, 145.1, 176, 190])    n += 0.5end

many turtles

A turtle graphics approach lends itself well to recursive programming. This short recursive function draws a Hilbert curve.

function hilbert(t::Turtle, level, angle, lengthstep)    level == 0 && return    HueShift(t, 0.1)    Turn(t, angle)    hilbert(t, level-1, -angle, lengthstep)    Forward(t, lengthstep)    Turn(t, -angle)    hilbert(t, level-1, angle, lengthstep)    Forward(t, lengthstep)    hilbert(t, level-1, angle, lengthstep)    Turn(t, -angle)    Forward(t, lengthstep)    hilbert(t, level-1, -angle, lengthstep)    Turn(t, angle)end@draw beginbackground("black")setline(2)setlinecap("round")hilbert(Turtle(first(BoundingBox()) + (12, 12), true, 0, (1, 0, 0)),        6,  # level        90, # turn angle, in degrees        6   # steplength        )end

hilbert turtle