float Value::getEstimateValue(float size, const RuleSet& ruleSet, const boost::shared_ptr<Shape>& shape) const { if (type == Value::TYPE_ABSOLUTE) { return ruleSet.evalFloat(value, shape); } else if (type == Value::TYPE_RELATIVE) { return ruleSet.evalFloat(value, shape) * size; } else { return ruleSet.evalFloat(value, shape); } }
/** * 指定されたsizeをsplitした後の、各断片のサイズを計算する。 * * @param size もとのsize * @param sizes 指定された、各断片のサイズ * @param output_names 指定された、各断片の名前 * @param ruleSet ルール (sizeなどで変数が使用されている場合、解決するため) * @param decoded_sizes [OUT] 計算された、各断片のサイズ * @param decoded_output_names [OUT] 計算された、各断片の名前 */ void Rule::decodeSplitSizes(float size, const std::vector<Value>& sizes, const std::vector<std::string>& output_names, const RuleSet& ruleSet, const boost::shared_ptr<Shape>& shape, std::vector<float>& decoded_sizes, std::vector<std::string>& decoded_output_names) { float regular_sum = 0.0f; float floating_sum = 0.0f; int repeat_count = 0; for (int i = 0; i < sizes.size(); ++i) { if (sizes[i].repeat) { repeat_count++; } else { if (sizes[i].type == Value::TYPE_ABSOLUTE) { regular_sum += ruleSet.evalFloat(sizes[i].value, shape); } else if (sizes[i].type == Value::TYPE_RELATIVE) { regular_sum += size * ruleSet.evalFloat(sizes[i].value, shape) * size; } else if (sizes[i].type == Value::TYPE_FLOATING) { floating_sum += ruleSet.evalFloat(sizes[i].value, shape); } } } float floating_scale = 1.0f; if (floating_sum > 0 && repeat_count == 0) { floating_scale = (size - regular_sum) / floating_sum; } for (int i = 0; i < sizes.size(); ++i) { if (sizes[i].repeat) { float s = sizes[i].getEstimateValue(size - regular_sum - floating_sum * floating_scale, ruleSet, shape); int num = (size - regular_sum - floating_sum * floating_scale) / s; s = (size - regular_sum - floating_sum * floating_scale) / num; for (int k = 0; k < num; ++k) { decoded_sizes.push_back(s); decoded_output_names.push_back(output_names[i]); } } else { if (sizes[i].type == Value::TYPE_ABSOLUTE) { decoded_sizes.push_back(ruleSet.evalFloat(sizes[i].value, shape)); decoded_output_names.push_back(output_names[i]); } else if (sizes[i].type == Value::TYPE_RELATIVE) { decoded_sizes.push_back(ruleSet.evalFloat(sizes[i].value, shape) * size); decoded_output_names.push_back(output_names[i]); } else if (sizes[i].type == Value::TYPE_FLOATING) { decoded_sizes.push_back(ruleSet.evalFloat(sizes[i].value, shape) * floating_scale); decoded_output_names.push_back(output_names[i]); } } } }