1 // Copyright (C) 2006 Erik Dahlberg
3 // This file is part of LSystem3D.
5 // LSystem3D is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // LSystem3D is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with LSystem3D; if not, write to the Free Software
17 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
26 #include "lindenmayersystem.h"
38 * @param model empty model
40 LindenmayerSystem::LindenmayerSystem(Model
*model
)
43 _turtle
= new Turtle(model
);
53 LindenmayerSystem::~LindenmayerSystem()
61 * Clear all parameters
63 void LindenmayerSystem::clear()
67 _turtle
->setAngle(0.0);
77 * Generate L-system data
79 void LindenmayerSystem::generate()
83 _model
->setColorIndex(0);
84 recursiveWalk(_axiom
.getPreprocessedContent(), _depth
);
91 * Set the initial rule (the axiom)
92 * @param axiom the axiom
94 void LindenmayerSystem::setAxiom(Rule axiom
)
103 * @param rule the rule
105 void LindenmayerSystem::setRule(Rule rule
)
107 _rules
.addRule(rule
);
113 * Set the turn/pitch/roll angle
114 * @param degrees the angle, in degrees
116 void LindenmayerSystem::setAngle(double degrees
)
118 // convert from degrees to radians
119 double radians
= (degrees
/ 360.0) * (2.0 * M_PIl
);
121 _turtle
->setAngle(radians
);
127 * Set depth of recursion
128 * @param depth depth of recursion
130 void LindenmayerSystem::setDepth(int depth
)
138 * Set diameter of segment
139 * @param diameter the diameter
141 void LindenmayerSystem::setDiameter(double diameter
)
143 _model
->setDiameter(diameter
);
149 * Set diameter factor
150 * @param diameterFactor the diameter factor
152 void LindenmayerSystem::setDiameterFactor(double diameterFactor
)
154 _model
->setDiameterFactor(diameterFactor
);
160 * Get the initial rule (the axiom)
163 Rule
LindenmayerSystem::getAxiom()
174 RuleSet
LindenmayerSystem::getRules()
182 * Get the turn/pitch/roll angle
183 * @return the angle, in degrees
185 double LindenmayerSystem::getAngle()
187 double radians
= _turtle
->getAngle();
189 // convert from radians to degrees
190 double degrees
= 360.0 * (radians
/ (2.0 * M_PIl
));
198 * Get depth of recursion
199 * @return depth of recursion
201 int LindenmayerSystem::getDepth()
209 * Get the generated model
210 * @return generated model
212 Model
*LindenmayerSystem::getModel()
220 * Recursively apply the replacement rules
222 * @param level recursion level
224 void LindenmayerSystem::recursiveWalk(string rule
, int level
)
226 // process every element in the rule string
227 for (int i
= 0; i
< rule
.size(); i
++)
234 // ignore marker, i.e. the "@"
240 string name
= rule
.substr(i
, 1);
241 recursiveWalk(_rules
.findRule(name
).getPreprocessedContent(), level
- 1);
251 // replacement rule for 'F'?
252 Rule rule
= _rules
.findRule("F");
253 if (rule
.getProbability() != 0.0 && level
> 0)
255 recursiveWalk(rule
.getPreprocessedContent(), level
- 1);
277 _turtle
->turnRight();
284 _turtle
->pitchDown();
305 _turtle
->rollRight();
309 // turn around 180 degrees
312 _turtle
->turnAround();
316 // save state to stack
323 // load state from stack
330 // create a filled surface
337 // close a filled surface
344 // one vertex in a filled surface
351 // decrement diameter of segment
354 _model
->decrementDiameter();
358 // increment current index to color table
365 // decrement current index to color table