Difference between revisions of "W2511 Emergence & Lindenmayer Systems (Part 1)"

From Coder Merlin
Line 74: Line 74:
## [https://en.wikipedia.org/wiki/L-system#Example_4:_Koch_curve Koch Curve]
## [https://en.wikipedia.org/wiki/L-system#Example_4:_Koch_curve Koch Curve]
## [https://en.wikipedia.org/wiki/L-system#Example_5:_Sierpinski_triangle Sierpinski Triangle]
## [https://en.wikipedia.org/wiki/L-system#Example_5:_Sierpinski_triangle Sierpinski Triangle]
== Key Concepts ==

Revision as of 10:43, 9 February 2019

Within these castle walls be forged Mavens of Computer Science ...
— Merlin, The Coder

Emergence & Lindenmayer Systems[edit]

Research[edit]

Supplemental research:

Experiment[edit]

Begin a new project:

Create an empty project named Lindenmayer within your "project" directory.

cd ~/projects
mkdir Lindenmayer
cd Lindenmayer
swift package init --type executable

Change to the source directory.

cd Sources/Lindenmayer/

Edit the file main.swift.

emacs main.swift

Now, do the following. Be sure to think and plan BEFORE typing.

Design a ProductionRule class such that rules may be constructed using the following syntax:

let productionRules = [ProductionRule(predecessor:"1", successor:"11"),
                       ProductionRule(predecessor:"0", successor:"1[0]0")]

Design an LSystem class such that an LSystem may be constructed using the following syntax:

let lSystem = LSystem(alphabet:["0", "1", "[", "]"], axiom:"0", productionRules:productionRules)

Implement a method for the LSystem class with the below signature which will return a set of all non-terminal (variable) characters in the alphabet. (In the above example, the non-terminals are "0" and "1".)

func nonTerminals() -> Set<Character>

Implement a method for the LSystem class with the below signature which will return a set of all terminal (constant) characters in the alphabet. (In the above example, the terminals are "[" and "]".)

func terminals() -> Set<Character>

Implement a method for the LSystem class with the below signature which will recursively produce the nth generation of the system. (In the above example the third generation would be "1111[11[1[0]0]1[0]0]11[1[0]0]1[0]0".)

func produce(generationCount:Int) -> String

As you're implementing these classes, be sure to validate input. At a minimum:

  1. Defining more than one production rule for the same predecessor is forbidden.
  2. Defining a rule for which the predecessor is not present in the alphabet is forbidden.
  3. Specifying an invalid axiom (i.e. an axiom for which any characters are not present in the alphabet) is forbidden.

If the input is invalid, the program should halt with a fatal error message.

Exercises[edit]

Continuing with this project:

  1. Validate your class' functionality by manually testing each of the aforementioned constraints on input.
  2. Validate your class' functionality by testing against the following LSystems:
    1. Algae
    2. Fractal Tree
    3. Cantor Set
    4. Koch Curve
    5. Sierpinski Triangle

Key Concepts[edit]