Elm – fun with L-System (Part 4)

Yan Cui

I help clients go faster for less using serverless technologies.

This article is brought to you by

Don’t reinvent the patterns. Catalyst gives you consistent APIs for messaging, data, and workflow with key microservice patterns like circuit-breakers and retries for free.

Try the Catalyst beta

Series:

  1. Algae
  2. Pythago­ras Tree
  3. Can­tor Dust
  4. Koch Curve (this)
  5. Sier­pin­ski Triangle
  6. Dragon Curve
  7. Frac­tal Plant

Last time out we imple­mented the Cantor Dust exam­ple from the L-System wikipedia page. Now, let’s con­tinue our jour­ney and see how we can imple­ment the Koch Curve exam­ple in Elm.

 

Example 4 : Koch Curve

Once again, we will start by defining our L-System:

image

From here, there are a lot of similarities with our implementation for Part 2, so time for a minor refactor!

We’ll add a shared Path module, and move the common abstractions and helper functions there:

image

Over the course of the series, we’ll add to this common module to help handle other aspects of drawing our L-Systems.

 

For the Koch Curve, the only thing we really need to implement is the display function to handle ‘F’, ‘–’ and ‘+’:

“Here, F means “draw forward”, + means “turn left 90 degrees”, and – means “turn right 90 degrees”..”

So this was what I ended up with as a 1st pass:

image

OK, so that was a lot of code to digest, so let’s break it down a bit.

The most important bit of code is here:

image

where we implemented the logic for:

  • ‘F’ : draw a line segment
  • ‘–‘ :  turn left 90 degrees
  • ‘+’ : turn right 90 degrees

in a left fold over the current state, using the starting position (0, 0) and rotation angle 0 (radians).

But, what’s this canvasArea that’s passed along?

Aha, good, you caught me! I’ve secretly added a little something to the Path module:

image

These are to help me track the area that has been drawn on so that I can use this information to scale down and move the completed path later on so that it fits inside the collage and is centred.

canvas_area

Whenever a new segment has been added the ending position is used to expand the canvas area:

image

At the end, we work out the scale factor, and move the path to the centre of the collage:

image

 

As it turns out, much of what’s in the display function is the same across most of the examples, so let’s refactor and move it into the Path module:

image

and our Koch Curve implementation becomes much simpler:

image

 

Run­ning this exam­ple in Elm Reac­tor I can get the demo to gen 6, before the rendering time starts to go up noticeably.

koch_curve

 

Live Demo (here)

Use LEFT and RIGHT arrow keys to evolve/devolve the L-System.

 

Source Code (here)

 

 

Next : Sierpinski Triangle

 

Links

Whenever you’re ready, here are 3 ways I can help you:

  1. Production-Ready Serverless: Join 20+ AWS Heroes & Community Builders and 1000+ other students in levelling up your serverless game. This is your one-stop shop for quickly levelling up your serverless skills.
  2. I help clients launch product ideas, improve their development processes and upskill their teams. If you’d like to work together, then let’s get in touch.
  3. Join my community on Discord, ask questions, and join the discussion on all things AWS and Serverless.

4 thoughts on “Elm – fun with L-System (Part 4)”

  1. Pingback: Elm – fun with L-System (Part 1) | theburningmonk.com

  2. Pingback: Elm – fun with L-System (Part 2) | theburningmonk.com

  3. Pingback: Elm – fun with L-System (Part 7) | theburningmonk.com

  4. Pingback: Elm – fun with L-System (Part 3) | theburningmonk.com

Leave a Comment

Your email address will not be published. Required fields are marked *