NSCI0007 Practice Exam 2¶
Exam Start: N/A
Exam End: N/A
Instructions¶
Enter your answers in the file
answers.ipynb
in the practice exam folder.
Introduction¶
L-systems were invented by Biologist Aristid Lindenmayer, to model the growth of biological systems. The rules of an L-system are a set of instructions for transforming one string into another string. Here is an example of an L-system:
Axiom |
Rule 1 |
Rule 2 |
---|---|---|
|
|
|
The axiom is a string representing the starting point for the system. The rules represent string replacements, where X->Y
means replace all instances of symbol X
with string Y
, in this case resulting in a new string where each A
has been replaced with B
and B
has been replaced with AB
. Repeated application of the rules gives a sequence of strings.
Iteration |
String |
---|---|
0 |
|
1 |
|
2 |
|
3 |
|
4 |
|
If we use symbols with special meanings, we can use the L-system to program a graphical turtle. Using the symbols "F"
(draw forward 1 unit) "-"
(turn left 60 degrees) and "+"
(turn right 60 degrees), the following L-system implements a famous drawing called the Koch curve.
Axiom |
Rule 1 |
---|---|
|
|
Iteration |
String |
---|---|
0 |
|
1 |
|
2 |
|
The iterations 0, 1 and 2 and 3 of the Koch curve L-system are shown below:
Question 1 [3]¶
The code below implements a ‘Turtle Graphics’ program.
Write a function
rotate_right()
which rotates the turtle an angletheta
to the rightUse the functions
start
,draw_forward
,rotate_left
androtate_right
to draw iteration 1 of the Koch curve.
import matplotlib.pyplot as plt
import numpy as np
def start(theta):
state[0] = 0
state[1] = 0
state[2] = 0
state[3] = theta
fig = plt.figure(figsize=(5,5))
ax = fig.add_subplot(111)
ax.set_aspect('equal', adjustable='box')
def draw_forward():
x = state[0]
y = state[1]
angle = state[2]
state[0] = x + np.cos(angle)
state[1] = y + np.sin(angle)
plt.plot([x, state[0]], [y, state[1]], color="black", linewidth=2)
def rotate_left():
theta = state[3]
state[2] = state[2] + theta * np.pi / 180
state = [0, 0, 0, 0]
# Example: draw an L
start(90)
draw_forward()
rotate_left()
draw_forward()
Question 2 [4]¶
Write a function
draw_sequence(sequence, angle)
which draws a figure by following the instructions encoded in the stringsequence
. The function should callstart
, then read characters one at a time issuing the appropriate instruction to the turtle. Any characters other than"F"
,"-"
or"+"
should be ignored.Test that the following code correctly produces iteration 1 of the Koch curve:
draw_sequence("F-F++F-F", 60)
Question 3 [2]¶
Write a function
apply_koch_rule(sequence)
which returns the string generated by applying the Koch rewriting rule"F->F-F++F-F"
to the stringsequence
. Your function should replace every instance of the string"F"
with the string"F-F++F-F"
. Every other character should remain unchanged.Test your function with the following code:
apply_koch_rule("XFAF")
XF-F++F-FAF-F++F-F
Question 4 [2]¶
Write a Python script which uses the functions apply_koch_rule
and draw_sequence
to draw iterations 0, 1 and 2 of the Koch curve. Your output should look like the illustration at the top of this page.
Question 5 [4]¶
The Hilbert curve is generated by following L-system:
Axiom |
Rule 1 |
Rule 2 |
---|---|---|
|
|
|
"F"
instructs the Turtle to draw forward, "-"
to turn left by 90 degrees and "+"
to turn right by 90 degrees. "X"
and "Y"
are ignored by the Turtle.
Write a function
apply_hilbert_rules(sequence)
which returns the string formed by applying the Hilbert rewriting rule to the stringsequence
. NB make sure you apply the two rules to the string simultaneously.Test your function with the code below:
apply_hilbert_rules("XY")
-YF+XFX+FY-+XF-YFY-FX+
Draw iterations 1, 2 and 3 of the Hilbert curve.
Question 6 [7]¶
Write a function
apply_rules(sequence, rule_list)
whererule_list
is a list of strings of the form"X->Y"
. The function should return the string generated by applying each of the rewriting rules inrule_list
to the stringsequence
.Test your function with the code below:
s1 = apply_rules("AB", ["A->AB", "B->BA"])
s2 = apply_rules("AB", ["A->XY", "B->XZ"])
print(s1, s2)
ABBA XYXZ
Question 7 [8]¶
The file lsysdata.txt
contains the definitions of five L-systems. The file is a comma separated values file where each row (apart from the header row) contains the specification for an L-system. The first four items are the name, number of iterations, angle and axiom; the remaining items are the rewriting rules.
Write Python code to read the data from the file and plot each of the L-systems.
For each system, plot the
n
th iteration of the L-system wheren
is the number of iterations specified in the file.Add the name of the system as a title to each plot.
Hint: write a function draw_l_system(axiom, theta, rule_list, n)
which draws iteration n
of the specified L-system.