假设您希望滑块在0.2f 和0.3f 之间线性变化,那么从区间[0.0 1.0] 到[0.2 0.3] 的转换是微不足道的:
newVal = 0.2f + (sliderVal)*0.1f;
根据您的描述,从数学角度来看,您希望输出与输入成线性关系。因此,输入和输出值之间的传递函数必须是以下形式:
y = mx + b
将x 值视为输入(滑块值),将y 值视为输出(新的所需值)。因此,您有两点:(0.0, 0.2) 和 (1.0, 0.3) 将这些点代入上述等式:
0.2 = (0.0)m + b
0.3 = (1.0)m + b
您现在有一个线性方程组,求解起来很简单:
0.2 = (0.0)m + b --> b = 0.2
0.3 = (1.0)m + b --> 0.3 = m + 0.2 --> m = 0.1
因此,传递函数为:
y = 0.1 * x + 0.2
Q.E.D.
我们可以概括上述过程。不要使用点(0.0, 0.2) 和(1.0, 0.3),而是使用点(minSlider, maxSlider) 和(minValue, maxValue)。
minValue = (minSlider)m + b
maxValue = (maxSlider)m + b
消除变量b:
minValue = (minSlider)m + b
-maxValue = -(maxSlider)m - b
--> minValue-maxValue = (minSlider-maxSlider)m
m = (minValue-maxValue)/(minSlider-maxSlider)
消除变量m:
minValue*maxSlider = (minSlider*maxSlider)m + b*maxSlider
-maxValue*minSlider = -(minSlider*maxSlider)m - b*minSlider
--> minValue*maxSlider - maxValue*minSlider = b(maxSlider-minSlider)
b = (minValue*maxSlider - maxValue*minSlider)/(maxSlider-minSlider)
您可以验证这些等式为您提供的 m 和 b 的值是否完全相同。如果我们假设最小滑块值将始终为0.0:
m = (minValue-maxValue)/(minSlider-maxSlider)
b = (minValue*maxSlider - maxValue*minSlider)/(maxSlider-minSlider)
--> m = (maxValue-minValue)/(maxSlider)
b = minValue
在 C++ 中:
const double maxSlider = 1.0;
const double minValue = 0.2;
const double maxValue = 0.3;
double value = (maxValue-minValue)/(maxSlider)*getSliderPosition() + minValue;