X-Git-Url: https://git.piment-noir.org/?p=lsystem3d.git;a=blobdiff_plain;f=src%2Frule.cpp;fp=src%2Frule.cpp;h=564aa2c6e3d7757a18d4e873c6aca236123c7e51;hp=0000000000000000000000000000000000000000;hb=71fe848416e50bea3b6484345047b0379126508b;hpb=df45724d152972305a473c34f9a4fdda14f8ced0 diff --git a/src/rule.cpp b/src/rule.cpp new file mode 100644 index 0000000..564aa2c --- /dev/null +++ b/src/rule.cpp @@ -0,0 +1,267 @@ +// Copyright (C) 2006 Erik Dahlberg +// +// 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 +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// LSystem3D is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with LSystem3D; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + + + +#include + +#include + +#include "rule.h" + +using namespace std; + + + +/** + * Constructor + */ +Rule::Rule() +{ + clear(); +} + + + +/** + * Constructor + * @param name name of rule + * @param content content of rule + * @param probability probability of rule + */ +Rule::Rule(string name, string content, double probability) +{ + setName(name); + setContent(content); + setProbability(probability); +} + + + +/** + * Constructor + * @param ruleString the rule string + */ +Rule::Rule(string ruleString) +{ + fromString(ruleString); +} + + + +/** + * Destructor + */ +Rule::~Rule() +{ +} + + + +/** + * Clear rule + */ +void Rule::clear() +{ + _name.clear(); + _content.clear(); + _probability = 0.0; +} + + + +/** + * Construct rule from string + * @param ruleString the rule string + */ +void Rule::fromString(string ruleString) +{ + // name + setName(ruleString.substr(0, 1)); + + + // probability factor + + int i = 2; + + if (ruleString[1] == '=') + { + // use default probability + setProbability(1.0); + } + else if (ruleString[1] == '(') + { + // set probability + while (ruleString[i] != ')') + { + i++; + } + setProbability(Glib::Ascii::strtod(string(ruleString, 2, i - 2))); + + // ignore the '=' + i += 2; + } + + // content + setContent(string(ruleString, i)); +} + + + +/** + * Construct rule string + * @return the rule string + */ +string Rule::toString() +{ + // name + string rulesString = getName(); + + + // probability factor + + if (_probability != 0.0) + { + // TODO: precision + string probabilityString(Glib::Ascii::dtostr(getProbability()), 0, 4); + + rulesString += '('; + rulesString += probabilityString; + rulesString += ')'; + } + + + rulesString += '='; + + + // content + rulesString += getContent(); + + + return rulesString; +} + + + +/** + * Set rule name + * @param name the name + */ +void Rule::setName(string name) +{ + _name = name; +} + + + +/** + * Set rule content + * @param content the content + */ +void Rule::setContent(string content) +{ + string preprocessedRule; + + // preprocess the rule content + for (int i = 0; i < content.size(); i++) + { + // TODO: allow string as name + if (content[i] >= 'A' && content[i] <= 'Z' && content[i] != 'F') + { + // add rule operator + preprocessedRule += '@'; + } + preprocessedRule += content[i]; + } + + _content = preprocessedRule; +} + + + +/** + * Set rule probability + * @param probability the probability factor + */ +void Rule::setProbability(double probability) +{ + if (probability >= 0 && probability <= 1) + { + _probability = probability; + } + else + { + probability = 0.0; + } +} + + + +/** + * Get rule name + * @return the rule name + */ +string Rule::getName() +{ + return _name; +} + + + +/** + * Get rule content + * @return the rule content + */ +string Rule::getContent() +{ + string unpreprocessedRule; + + // unpreprocess the rule content + for (int i = 0; i < _content.size(); i++) + { + if (_content[i] != '@') + { + unpreprocessedRule += _content[i]; + } + } + + return unpreprocessedRule; +} + + + +/** + * Get rule probability + * @return the probability + */ +double Rule::getProbability() +{ + return _probability; +} + + + +/** + * Get preprocessed content + * @return the preprocessed content + */ +string Rule::getPreprocessedContent() +{ + return _content; +}