我正在做一个项目,我正在控制一艘船的马达(一个模型)。我有一种方法可以给出从 0 到 1000 的值,用于调节船的前进速度,但我的电机仅以 80 到 160 的值向前移动。我的问题是,是否有可能以某种方式转换这个大间隔到较小的?所以零等于 80,1000 等于 160,并且其间的所有值都是均匀分布的(1 等于 80.08,2 等于 80.16 等等)?关于这样做的好方法的任何提示?
我正在用 C 编写代码。
高中代数来拯救!
y = mx + b
你的斜率m
是新变量相对于旧变量的变化,所以
m = (160-80)/(1000-0) = 0.08
您的 y 截距 ,b
是旧值为零处的新值:
y = 80 at x = 0
所以,
y = 0.08 x + 80
或在 C 中:
int oldValue;
float newValue;
oldValue = 500;
newValue = 0.08*(float)oldValue + 80.0
// newValue is 120.0
您在区间 [0, 1000] 中有一个值。您希望将该值转换为区间 [80, 160]。
如果将该值除以 1000,则得到一个区间 [0, 1] 中的值。如果你将它乘以新区间的大小 (160 - 80),你会得到一个介于 [0, 80] 之间的值。现在添加偏移量 80 以获得区间 [80, 160] 中的值。
在数学上,这等于:
value / 1000 * (160 - 80) + 80
在 C 中:
double newvalue = value / 1000.0 * (160 - 80) + 80;
未经测试的代码,注释应该解释所有...
double scaleValue(double value,
double originalMin, double originalMax,
double newMin, double newMax)
{
// scale original value to range 0...1
double normalizedValue = (originalMax - originalMin) / (value - originalMin);
// optional, outside question scope, change shape of the curve, for example:
// normalizedValue = normalizedValue * normalizedValue
// calculate position in new scale
double scaledNormalizedValue = (newMax - newMin) * normalizedValue;
// return new value in new range
return scaledNormalizedValue + newMin;
}
问题值的示例用法:
motorValue = scaleValue(speedValue, 0, 1000, 80, 160);