X-Git-Url: https://git.piment-noir.org/?p=lsystem3d.git;a=blobdiff_plain;f=src%2Fruleset.cpp;fp=src%2Fruleset.cpp;h=024f77e1975e52cfef5c9ab90add0a610d093ff8;hp=0000000000000000000000000000000000000000;hb=71fe848416e50bea3b6484345047b0379126508b;hpb=df45724d152972305a473c34f9a4fdda14f8ced0 diff --git a/src/ruleset.cpp b/src/ruleset.cpp new file mode 100644 index 0000000..024f77e --- /dev/null +++ b/src/ruleset.cpp @@ -0,0 +1,161 @@ +// 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 +#include + +#include "rule.h" +#include "ruleset.h" + + + +/** + * Constructor + */ +RuleSet::RuleSet() +{ + srand(time(NULL)); +} + + + +/** + * Destructor + */ +RuleSet::~RuleSet() +{ +} + + + +/** + * Clear rule set + */ +void RuleSet::clear() +{ + _rules.clear(); +} + + + +/** + * Add one rule + * @param rule the rule + */ +void RuleSet::addRule(Rule rule) +{ + _rules.insert(make_pair(rule.getName(), rule)); +} + + + +/** + * Get one rule with repect of probability factor + * @param name the rule name + * @return the rule + */ +Rule RuleSet::findRule(string ruleName) +{ + // TODO: clean up... + + + int numRules = _rules.count(ruleName); + Rule selectedRule; + + if (numRules == 0) + { + // no rule with this name + selectedRule.setProbability(0.0); + } + else if (numRules == 1) + { + // only one rule with this name + selectedRule = _rules.find(ruleName)->second; + } + else + { + // many rules with this name + + + // find ranges + + // TODO: int ok? + int ranges[numRules + 1]; + + double lastRange = ranges[0] = 0; + int index = 1; + + // TODO: move to addRule() + pair interval = _rules.equal_range(ruleName); + for (rulemap::iterator it = interval.first; it != interval.second; it++) + { + // calculate and store ranges + lastRange += it->second.getProbability() * RAND_MAX; + ranges[index++] = (int)lastRange; + } + + ranges[numRules] = RAND_MAX; + + + // choose random range + + int selection = 0; + int random = rand(); + + for (int i = 0; i < numRules; i++) + { + if (random >= ranges[i] && random <= ranges[i + 1]) + { + // in range + selection = i; + + break; + } + } + + + // make selection + + rulemap::iterator it = interval.first; + for (int i = 0; i < selection; i++) + { + it++; + } + selectedRule = it->second; + } + + + return selectedRule; +} + + + +/** + * Get all rules + * @return the rules + */ +rulemap RuleSet::getRules() +{ + return _rules; +}