// Copyright (C) 2006 Erik Dahlberg
//
-// This file is part of LSystem3d.
+// This file is part of LSystem3D.
//
// LSystem3D is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
#ifndef LINDENMAYERSYSTEM_H
#define LINDENMAYERSYSTEM_H
-#include <map>
#include <string>
#include "model.h"
#include "turtle.h"
+#include "rule.h"
+#include "ruleset.h"
using namespace std;
/**
- * Lindenmayer System
+ * Lindenmayer system generator
*/
class LindenmayerSystem
{
public:
+
/**
* Constructor
- * @param model the model for generation
+ * @param model empty model
*/
LindenmayerSystem(Model *model);
*/
~LindenmayerSystem();
+
+ /**
+ * Clear all parameters
+ */
+ void clear();
+
+ /**
+ * Generate L-system data
+ */
+ void generate();
+
+ /**
+ * Render L-system data
+ */
+ void render();
+
+
/**
* Set the initial rule (the axiom)
* @param axiom the axiom
*/
- void setAxiom(string axiom);
+ void setAxiom(Rule axiom);
/**
* Set one rule
- * @param name rule name
* @param rule the rule
*/
- void setRule(string name, string rule);
+ void setRule(Rule rule);
/**
* Set the turn/pitch/roll angle
void setAngle(double degrees);
/**
- * Set the number of iterations
- * @param numIterations number of iterations
+ * Set recursion depth
+ * @param depth depth of recursion
+ */
+ void setDepth(int depth);
+
+ /**
+ * Set initial segment diameter
+ * @param diameter the diameter
*/
- void setNumIterations(int numIterations);
+ void setDiameter(double diameter);
+
+ /**
+ * Set segment diameter factor
+ * @param diameterFactor the diameter factor
+ */
+ void setDiameterFactor(double diameterFactor);
+
/**
* Get the initial rule (the axiom)
* @return the axiom
*/
- string getAxiom();
+ Rule getAxiom();
/**
* Get all rules
* @return the rules
*/
- map<string,string> getRules();
+ RuleSet getRules();
/**
* Get the turn/pitch/roll angle
double getAngle();
/**
- * Get the number of iterations
- * @return number of iterations
+ * Get recursion depth
+ * @return depth of recursion
*/
- int getNumIterations();
+ int getDepth();
/**
- * Generate l-system data
+ * Get initial segment diameter
+ * @return the diameter
*/
- void generate();
+ double getDiameter();
+
+ /**
+ * Get segment diameter factor
+ * @return the diameter factor
+ */
+ double getDiameterFactor();
protected:
/**
- * Walk through the rule string for specified number of levels
+ * Recursively apply the replacement rules
* @param rule the rule
- * @param level current iteration level
+ * @param level recursion level
*/
void recursiveWalk(string rule, int level);
- /**
- * Verify and preprocess one rule string
- * @param ruleOrAxiom the rule
- * @return the preprocessed rule
- */
- string verifyAndPreprocessRule(string ruleOrAxiom);
-
- /**
- * Unpreprocess one rule string
- * @param ruleOrAxiom the rule
- * @return the unpreprocessed rule
- */
- string unpreprocessRule(string ruleOrAxiom);
// Parameters
- string _axiom;
- map<string,string> _rules; // TODO: use unsorted container?
- int _numIterations;
+ Rule _axiom;
+ RuleSet _rules;
+ int _depth;
+ double _segmentDiameter;
- Model *_model; // The model for generation
+ Model *_model; // The active model
Turtle *_turtle; // The rendering turtle
};