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

From Coder Merlin
Line 1: Line 1:
= Emergence & Lindenmayer Systems =
= Emergence & Lindenmayer Systems =
== Research ==
== Research ==
* Read [https://en.wikipedia.org/wiki/Emergence Emegence]
* Read [https://en.wikipedia.org/wiki/Emergence Emegence]
* Read [https://en.wikipedia.org/wiki/L-system Lindenmayer System]
* Read [https://en.wikipedia.org/wiki/L-system Lindenmayer System]
* View [https://www.youtube.com/watch?v=f6ra024-ASY L-Systems - The Nature of Code]
* View [https://www.youtube.com/watch?v=f6ra024-ASY L-Systems - The Nature of Code]
* Read [https://developer.apple.com/documentation/swift/set Swift Sets]
Supplemental research:
* Read [http://algorithmicbotany.org/papers/#abop The Algorithmic Beauty of Plants]
== Experiment ==
Begin a '''new project''':
Create an empty project named Lindenmayer within your "project" directory.
<syntaxhighlight lang="bash">
cd ~/projects
mkdir Lindenmayer
cd Lindenmayer
swift package init --type executable
</syntaxhighlight>
Change to the source directory.
<syntaxhighlight lang="bash">
cd Sources/Lindenmayer/
</syntaxhighlight>
Edit the file main.swift.
<syntaxhighlight lang="bash">
emacs main.swift
</syntaxhighlight>
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:
<syntaxhighlight lang="swift">
let productionRules = [ProductionRule(predecessor:"1", successor:"11"),
                      ProductionRule(predecessor:"0", successor:"1[0]0")]
</syntaxhighlight>
Design an LSystem class such that an LSystem may be constructed using the following syntax:
<syntaxhighlight lang="swift">
let lSystem = LSystem(alphabet:["0", "1", "[", "]"], axiom:"0", productionRules:productionRules)
</syntaxhighlight>
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".)
<syntaxhighlight lang="swift">
func nonTerminals() -> Set<Character>
</syntaxhighlight>
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 "]".)
<syntaxhighlight lang="swift">
func terminals() -> Set<Character>
</syntaxhighlight>
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".)
<syntaxhighlight lang="swift">
func produce(generationCount:Int) -> String
</syntaxhighlight>
As you're implementing these classes, be sure to '''validate''' input.  At a ''minimum'':
# Defining more than one production rule for the same predecessor is forbidden.
# Defining a rule for which the predecessor is not present in the alphabet is forbidden.
# Specifying an invalid axiom (i.e. an axiom for which any characters are not present in the alphabet) is forbidden.
== Exercises ==
Continuing with this project:
# Validate your class' functionality by manually testing each of the aforementioned constraints on input.
# Validate your class' functionality by testing against the following LSystems:
## [https://en.wikipedia.org/wiki/L-system#Example_1:_Algae Algae]
## [https://en.wikipedia.org/wiki/L-system#Example_2:_Fractal_(binary)_tree Fractal Tree]
## [https://en.wikipedia.org/wiki/L-system#Example_3:_Cantor_set Cantor Set]
## [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]

Revision as of 22:32, 27 January 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.

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