Elm – fun with L-System (Part 4)

Yan Cui

I help clients go faster for less using serverless technologies.

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 4 ways I can help you:

  1. If you want a one-stop shop to help you quickly level up your serverless skills, you should check out my Production-Ready Serverless workshop. Over 20 AWS Heroes & Community Builders have passed through this workshop, plus 1000+ students from the likes of AWS, LEGO, Booking, HBO and Siemens.
  2. If you want to learn how to test serverless applications without all the pain and hassle, you should check out my latest course, Testing Serverless Architectures.
  3. If you’re a manager or founder and want to help your team move faster and build better software, then check out my consulting services.
  4. If you just want to hang out, talk serverless, or ask for help, then you should join my FREE Community.

 


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 *