使用限制器创建步进控件
Creating a stepper control with a limiter
我创建了一个带有限制器的简单步进控件。
总的来说似乎效果不错。但是,如果我尝试使限制器的范围从 numeric_limits<float>::min()
到 numeric_limits<float>::max()
,当值变为负数时它无法正常工作。
这是我的完整测试代码。
#include <iostream>
using namespace std;
class Stepper {
public:
Stepper(float from, float to, float value, float interval){ //limited range
mFrom = from;
mTo = to;
mValue = value;
mInterval = interval;
}
Stepper(float value, float interval){ //limitless range version
mFrom = numeric_limits<float>::min();
mTo = numeric_limits<float>::max();
mValue = value;
mInterval = interval;
}
float getCurrentValue() {
return mValue;
}
float getDecreasedValue() {
if (mFrom < mTo)
mValue -= mInterval;
else
mValue += mInterval;
mValue = clamp(mValue, min(mFrom, mTo), max(mFrom, mTo));
return mValue;
}
float getIncreasedValue() {
if (mFrom < mTo)
mValue += mInterval;
else
mValue -= mInterval;
mValue = clamp(mValue, min(mFrom, mTo), max(mFrom, mTo));
return mValue;
}
private:
float clamp(float value, float min, float max) {
return value < min ? min : value > max ? max : value;
}
float mFrom, mTo, mValue, mInterval;
};
int main(int argc, const char * argv[]) {
bool shouldQuit = false;
// Stepper stepper(-3, 3, 0, 1); //this works
Stepper stepper(0, 1); //this doesn't work when the value becomes negative
cout << "step : " << stepper.getCurrentValue() << endl;
while (!shouldQuit) {
string inputStr;
cin >> inputStr;
if (inputStr == "-") //type in '-' decrease the step
cout << "step : " << stepper.getDecreasedValue() << endl;
else if (inputStr == "+") //type in '+' increase the step
cout << "step : " << stepper.getIncreasedValue() << endl;
else if (inputStr == "quit")
shouldQuit = true;
}
return 0;
}
我的 class 构造函数需要 4 个参数,它们是
- minimum limited value (this also can be maximum)
- maximum limited value (this also can be minimum)
- initial value
- interval of steps
此外,构造函数只能接受 2 个参数,它们是
- initial value
- interval of steps
这种情况下,限制器的范围从numeric_limits<float>::min()
到numeric_limits<float>::max()
。
但在这种情况下,如果该值变为负数,则 returns 1.17549e-38
与 numeric_limits<float>::min()
.
的值相同
可以解决这个问题吗?
任何建议或指导将不胜感激!
在我看来,min()
有一个不幸的名字。它的值是最小的、正的、归一化的浮点数。
改用lowest()
,它包含真正的最小值。
std::numeric_limits<float>::lowest()
is the lowest values in the mathematical sense. std::numeric_limits<float>::min()
只是最小的正值(大于零)。
详情见this question。命名可以追溯到 C.
我创建了一个带有限制器的简单步进控件。
总的来说似乎效果不错。但是,如果我尝试使限制器的范围从 numeric_limits<float>::min()
到 numeric_limits<float>::max()
,当值变为负数时它无法正常工作。
这是我的完整测试代码。
#include <iostream>
using namespace std;
class Stepper {
public:
Stepper(float from, float to, float value, float interval){ //limited range
mFrom = from;
mTo = to;
mValue = value;
mInterval = interval;
}
Stepper(float value, float interval){ //limitless range version
mFrom = numeric_limits<float>::min();
mTo = numeric_limits<float>::max();
mValue = value;
mInterval = interval;
}
float getCurrentValue() {
return mValue;
}
float getDecreasedValue() {
if (mFrom < mTo)
mValue -= mInterval;
else
mValue += mInterval;
mValue = clamp(mValue, min(mFrom, mTo), max(mFrom, mTo));
return mValue;
}
float getIncreasedValue() {
if (mFrom < mTo)
mValue += mInterval;
else
mValue -= mInterval;
mValue = clamp(mValue, min(mFrom, mTo), max(mFrom, mTo));
return mValue;
}
private:
float clamp(float value, float min, float max) {
return value < min ? min : value > max ? max : value;
}
float mFrom, mTo, mValue, mInterval;
};
int main(int argc, const char * argv[]) {
bool shouldQuit = false;
// Stepper stepper(-3, 3, 0, 1); //this works
Stepper stepper(0, 1); //this doesn't work when the value becomes negative
cout << "step : " << stepper.getCurrentValue() << endl;
while (!shouldQuit) {
string inputStr;
cin >> inputStr;
if (inputStr == "-") //type in '-' decrease the step
cout << "step : " << stepper.getDecreasedValue() << endl;
else if (inputStr == "+") //type in '+' increase the step
cout << "step : " << stepper.getIncreasedValue() << endl;
else if (inputStr == "quit")
shouldQuit = true;
}
return 0;
}
我的 class 构造函数需要 4 个参数,它们是
- minimum limited value (this also can be maximum)
- maximum limited value (this also can be minimum)
- initial value
- interval of steps
此外,构造函数只能接受 2 个参数,它们是
- initial value
- interval of steps
这种情况下,限制器的范围从numeric_limits<float>::min()
到numeric_limits<float>::max()
。
但在这种情况下,如果该值变为负数,则 returns 1.17549e-38
与 numeric_limits<float>::min()
.
可以解决这个问题吗? 任何建议或指导将不胜感激!
在我看来,min()
有一个不幸的名字。它的值是最小的、正的、归一化的浮点数。
改用lowest()
,它包含真正的最小值。
std::numeric_limits<float>::lowest()
is the lowest values in the mathematical sense. std::numeric_limits<float>::min()
只是最小的正值(大于零)。
详情见this question。命名可以追溯到 C.