jma*_*erx 1 c++ algorithm math
我有一个滑块,返回0.0f到1.0f的值.
我想使用这个值并将其钳制到MIN和MAX,但不是完全钳位.
说min是0.2f,max是0.3f.当滑块为0时,我想要0.2f.当滑块为0.5f时,我想要0.25f,依此类推.
这只是滑块的效果不那么强烈.
给定MIN MAX和sliderVal,我如何钳制sliderVal?
谢谢
slider_range = slider_max - slider_min;
range = range_max - range_min;
value = (double)(slider_pos - slider_min) / slider_range * range + range_min;
Run Code Online (Sandbox Code Playgroud)
假设您希望滑块在0.2f和之间线性变化0.3f,那么从间隔[0.0 1.0]到的变换[0.2 0.3]是微不足道的:
newVal = 0.2f + (sliderVal)*0.1f;
Run Code Online (Sandbox Code Playgroud)
从数学角度来看,根据您的描述,您希望输出相对于输入是线性的.因此,输入和输出值之间的传递函数必须是以下形式:
y = mx + b
Run Code Online (Sandbox Code Playgroud)
考虑作为x输入的值(滑块值),以及y要作为输出的值(新的期望值).因此,您有两点:(0.0, 0.2)并将(1.0, 0.3)这些点替换为上述等式:
0.2 = (0.0)m + b
0.3 = (1.0)m + b
Run Code Online (Sandbox Code Playgroud)
你现在有一个线性方程组,这个系统很容易解决:
0.2 = (0.0)m + b --> b = 0.2
0.3 = (1.0)m + b --> 0.3 = m + 0.2 --> m = 0.1
Run Code Online (Sandbox Code Playgroud)
因此,传递函数是:
y = 0.1 * x + 0.2
Run Code Online (Sandbox Code Playgroud)
QED
我们可以概括上述过程.而不是使用点,(0.0, 0.2)并(1.0, 0.3)使用点(minSlider, maxSlider)和(minValue, maxValue).
minValue = (minSlider)m + b
maxValue = (maxSlider)m + b
Run Code Online (Sandbox Code Playgroud)
Elimate变量b:
minValue = (minSlider)m + b
-maxValue = -(maxSlider)m - b
--> minValue-maxValue = (minSlider-maxSlider)m
m = (minValue-maxValue)/(minSlider-maxSlider)
Run Code Online (Sandbox Code Playgroud)
消除变量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)
Run Code Online (Sandbox Code Playgroud)
您可以验证这些方程为m和提供完全相同的值b.如果我们假设最小滑块值始终为0.0:
m = (minValue-maxValue)/(minSlider-maxSlider)
b = (minValue*maxSlider - maxValue*minSlider)/(maxSlider-minSlider)
--> m = (maxValue-minValue)/(maxSlider)
b = minValue
Run Code Online (Sandbox Code Playgroud)
在C++中:
const double maxSlider = 1.0;
const double minValue = 0.2;
const double maxValue = 0.3;
double value = (maxValue-minValue)/(maxSlider)*getSliderPosition() + minValue;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2036 次 |
| 最近记录: |