On the Practical Implementation of L-Systems
Total Page:16
File Type:pdf, Size:1020Kb
INTERNATIONAL JOURNAL OF COMPUTERS Volume 9, 2015 On the practical implementation of L-systems David Brebera generation is consistent with members of the Fibonacci Abstract— L-system, sometimes called Lindenmayer system is a sequence and the ratio of a to b in the limit corresponds to the formal way of writing an algorithm first introduced in 1968 by golden ratio φ = 1.618 ... which occurs in many different forms Hungarian biologist Aristide Lindenmayer (1925-1989), and is in nature. primarily designed as a tool to describe the growth of plants [Lin68]. Over time, however, the L system has become a tool used not only in biology, but also today, mainly in computer science (as an example II. TURTLE GRAPHICS for the study of context-free grammars) and mathematics (a tool used Turtle Graphics is commonly used term for a simple vector to describe and exploration of fractal curves). As a visualization tool graphic language interpreter in the XY plane. To the public it L-system often uses turtle graphics (below), i.e. LOGO programming is often presented as being a turtle tail, which in its simplest language. implementation has just five graphic commands: TurnLeft, Keywords— algorithm, fractal, L-system, LEGO, LOGO, TurnRight, PENUP, PenDown, Forward. If the tail of the recursion, turtle graphics turtle is down (PenDown), then draws a line in the sand, when the tail is up, then after the command Forward turtle only I. L-SYSTEMS moves, but it is not drawing. These methods were used in the print driver for plotter described below. For the purpose of L- HE Definition of L-system is often stated as follows systems often leads to a simple modification, the trio [Pru 90]: L-system is an ordered triplet L = <V, ω, P>, T commands PenUp, PenDown a Forward is replaced by a pair where V is an alphabet, V* set of words compiled from the of MoveForward (without drawing lines) and DrawForward alphabet V and V+ the set of all non-empty words drawn from (while drawing lines). Likewise, a pair of commands TurnLeft the alphabet V. In addition, ω ε+ is the axiom defining the TurnRight are replaced with a single command TurnLeft with initial state of the entire L-system. Finally P V × V* is a a positive argument for turning to the left (counter clockwise) finite set of rewriting rules to ∈rewriting s V to w V*, in and a negative argument to turn to the right (clockwise). The abbreviated labeling as a → w. For each symbol⊂ s V that is logic is the same as the standard measurement angle in the not on the left side of some rewriting rule P ∈is defined∈ identity plane when the default angle φ = 0 is a shift in the positive s → s. These symbols are called constants or terminals.∈ direction of the X axis negative analogy argument commands This definition of L-system is slightly differs from the MoveForward and DrawForward causes movement / drawing conventional definition of deterministic context-free grammar opposite direction. [Sip06] thinking grammar G = <V, Σ, R, S> arranged as a ordered quartet with only one initial symbol S V (unlike L- system where initial axiom can be a whole word - although this III. L-SYSTEM WITH BRACKETS can be in the L-system neatly fixed by adding one∈ more rewrite L-system with brackets extends the standard L-system of rules ω0 → ω, ω0 V) and a set Σ disjoint with V as a finite set of terminals. branches by introducing two new symbols: "[" as the ∈ beginning of branches and "]" as the end of the branches. The The simplest L-system can be, for example, often referred to symbol "[" then stores on the stack the current state of the following a set of rules (which Lindenmayer used as a rule of system, typically the current coordinates (position of the turtle) algae growth) and the axiom, rule a → ab, b → a. After a few and the angle of rotation. Symbol "]" analogically restores the steps we get a, b, aba, abaab, abaababa, abaababaabaab etc. system state to the point stored in the stack (these values from Certainly it is interesting that the number of symbols in each the stack are picked up, move the turtle to coordinates and rotates it in the saved, respectively. The symbols "[" and "]" have become so integral part of the L-systems, that if today we This work was supported by the project No. SGSFES_2015001 speak about L-systems we completely automatically Ekonomický a sociální rozvoj v soukromém a veřejném sektoru (Economical and social development in private and public sector), financed from Czech understand just as L-systems with brackets. Such a system will Republic funds. enable to create different types of trees (not necessarily binary- only). Let us say, however, that any system with brackets can D. Brebera, Institute of Mathematics and Quantitative Methods, Faculty of Economics and Administration, University of Pardubice, Pardubice, be rewritten without parentheses simply that instead of the Studentská 84, 532 10 Pardubice, Czech Republic (e-mail: symbol "]" inverted repeat steps carried out after the preceding [email protected]). "[", i.e. the inverse shift and rotation turtles and inverse ISSN: 1998-4308 125 INTERNATIONAL JOURNAL OF COMPUTERS Volume 9, 2015 mathematical operations. This procedure has been used to L-systems - we will not repeat this process in all the upcoming draw some further mentioned fractals. listings. IV. PARAMETRIC L-SYSTEM WITH BRACKETS Further expansion of L-systems is the introduction of the arguments on the individual symbols. Arguments in decimal form (or in general, any mathematical function) allow you to control the rendering algorithm, for example, by passing the length of the line or angle. V. SELECTED L-SYSTEMS AND THEIR GRAPHICAL REPRESENTATION Let us imagine now briefly some simple L-systems. For each, we will present its graphic (often fractal) form and write Fig. 1: Levy C-curve the algorithm in the system Malsys [Fis12]. All presented algorithms are also possible to draw on Lego plotter. For some we will also describe detail procedures for processing because the recursion is not supported by Lego (!) programming lsystem Levy_C_curve_LEGO { language. set symbols axiom = - F1 ; set iterations = 5; VI. LEVY C-FRACTAL interpret F as DrawForward(16); Levy C-fractal is based on the axiom F, and one very frugal interpret + as TurnLeft(90); overwrite rule interpret - as TurnLeft(-90); F → - F + + F rewrite F1 to - F2 + F2 F2 + F2 - ; rewrite F2 to - F3 + F3 F3 + F3 - ; rewrite F3 to - F4 + F4 F4 + F4 - ; where the symbol + represents a turn to the left about 45 rewrite F4 to - F + F F + F - ; degrees symbol - clockwise rotation of 45 ° F symbol and } move forward. Successively overwriting this chain then comprises the following sequence: Fig. 2: Levy C-curve algorithm F - F + + F - - - F + F + - + - F + + F - - etc. VII. H-FRACTAL However, since, as already mentioned, the programming H-fractal is the simplest example of a binary tree of language does not support recursion, such realization of L- parametric L-system with parentheses. Parameter is the length system is impossible. If we replace doubles in the latter chain, of the branch, then parentheses denote branching point. Again, a pair of symbols - - and + + we receive always one new a very simple example, however the implementation is same symbol with an angle of 90 ° (intermediate sequences - + impossible in Lego environment, since the entire system would + - cancel each other out), we can get a very similar record need be programmed. To draw a tree was used the same again with the axiom F and overwrite rule principle as the C-Levy fractal, moreover, it was necessary to draw upon each branch return by the same route back, which F → - F + F F + -. replaces pick originally stored parameters on the stack. Now broken down a few steps as follows: axiom F_0 and rewriting rules F_0 → - F_1 + F_1 F_1+ F_1 - F_1 → - F_2 + F_2 F_2+ F_2 - F_n → - F + F F+ F - ⋮ In the last, the n-th step, already do not call other nesting, but actually the first command Forward. The same trick, therefore multiple calls to the same rules, with only a slightly modified name (index added) was used also in the creation of additional Fig. 3: the H-fractal ISSN: 1998-4308 126 INTERNATIONAL JOURNAL OF COMPUTERS Volume 9, 2015 same direction - try as many times as you can) followed by unfolding with the preservation of right angles. lsystem H_fractal { set symbols axiom = + A(256) ; set iterations = 8; interpret F(x) as _ DrawForward(256/(sqrt(2)^x)); interpret + as TurnLeft(90); interpret - as TurnLeft(-90); Fig. 7: paper folding (credit Wikimedia Commons) interpret [ as StartBranch; interpret ] as EndBranch; rewrite A to F(currentIteration) [ - A] [ + A ] ; } Fig. 4: the H-fractal algorithm VIII. HILBERT CURVE The Hilbert curve, which tore down many prejudices about mathematical infinitely thin lines and their derivatives (as in the limit covers the entire plane dimension 2 and becomes flat) certainly deserves its place among L-systems deserves. Let's leave it without further comment and try it to draw the curve in hand. It's not as easy as it seems at first glance. Fig. 8: Dragon curve in 1024 steps lsystem DragonCurve { set symbols axiom = - F X; set iterations = 10; interpret F as DrawForward(8); interpret + as TurnLeft(90); interpret - as TurnLeft(-90); rewrite X to X + Y F ; rewrite Y to F X - Y ; } Fig. 9: Dragon curve in 1024 steps Fig. 5: the Hilbert curve X. RECURSION FREE ALGORITHM lsystem HilbertCurve { To draw a Dragon curve using rewriting rules and recursion is set symbols axiom = L; easy, but (as already mentioned) the recursion is impossible set iterations = 6; development environment Lego does not.