Example #1
0
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);
	}
}
Example #2
0
/**
 * 指定された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]);
			}
		}
	}
}