Difference between revisions of "W2511 Emergence & Lindenmayer Systems (Part 1)"
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
Emergence & Lindenmayer Systems[edit]
Research[edit]
- Read Emegence
- Read Lindenmayer System
- View L-Systems - The Nature of Code
- Read Swift Sets
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:
- 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[edit]
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: