-1

我正在做一个项目,我正在控制一艘船的马达(一个模型)。我有一种方法可以给出从 0 到 1000 的值,用于调节船的前进速度,但我的电机仅以 80 到 160 的值向前移动。我的问题是,是否有可能以某种方式转换这个大间隔到较小的?所以零等于 80,1000 等于 160,并且其间的所有值都是均匀分布的(1 等于 80.08,2 等于 80.16 等等)?关于这样做的好方法的任何提示?

我正在用 C 编写代码。

4

3 回答 3

2

高中代数来拯救!

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
于 2013-10-18T12:20:17.090 回答
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;
于 2013-10-18T12:19:10.823 回答
0

未经测试的代码,注释应该解释所有...

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);
于 2013-10-18T12:21:34.380 回答