将值固定到一个范围(排序)
Clamping a value to a range (sort of)
我有一个滑块,返回从 0.0f 到 1.0f 的值。
我想使用此值并将其固定为 MIN 和 MAX,但不是完全固定。
假设最小值为 0.2f,最大值为 0.3f。当滑块为 0 时,我想要 0.2f。当滑块在 0.5f 时,我想要 0.25f,依此类推。
只是为了让滑块的效果没有那么强。
给定最小最大值和滑块Val,我如何夹紧滑块Val?
谢谢
slider_range = slider_max - slider_min;
range = range_max - range_min;
value = (double)(slider_pos - slider_min) / slider_range * range + range_min;
假设您希望滑块在 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
质检部
我们可以概括上述过程。不使用点(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;
基本上你有
0.0f -> MIN
1.0f -> MAX
你想要
clampedVal = sliderVal * ( MAX - MIN ) + MIN
std::lerp
这样做。它接受三个浮点数,并在第一个和第二个参数之间夹紧第三个参数。
来自 cpp 首选项的 Qouting:
#include <iostream>
#include <cmath>
int main()
{
float a=10.0f, b=20.0f;
std::cout << "a=" << a << ", " << "b=" << b << 'n'
<< "mid point=" << std::lerp(a,b,0.5f) << 'n'
<< std::boolalpha << (a == std::lerp(a,b,0.0f)) << ' '
<< std::boolalpha << (b == std::lerp(a,b,1.0f)) << 'n';
}
输出:
a=10, b=20
mid point=15
true true
相关文章:
- 使用std::transform将一个范围的元素添加到另一个范围中
- 如何设置一个范围来提取我想要获得的信息
- 不计算一个范围内的完美数
- 我有一个数组,我想输入一个范围,然后找到范围内所有偶数的总和?
- 在 C++20 中将多个范围适配器连接到一个范围中
- 如何将一个范围替换为矢量中的另一个范围?
- 将整数范围映射到另一个范围
- 是否存在一个范围::视图::group_by对应项,它将所有元素都考虑在内,而不是只考虑连续的元素
- 我已经编写了C++代码将 boost::optional 视为一个范围,但它无法编译
- 当在另一个范围中,将SelfAdjointeigensolver保存为成员的结果被重新引入
- C :在一个范围内计数偶数 /奇数
- 删除重复的元素并给出一个范围总和
- 为什么即将到来的范围库不支持一个范围的容器初始化
- 将无符号整数加法/减法括在一个范围周围
- 更快的方法将数字从范围转换为另一个范围
- 在一个范围内的阵列中找到三胞胎
- 如何在C++中选择多维数组中的一个范围
- 如何检查一个范围内的值是否是另一个范围内的值的倍数
- 将 std::vector<int> 设置为一个范围
- 正在检查排序列表中是否有一个范围内的数字