1、首先給一個兩個區間映射的公式:
2、最近做項目中頻繁用到區間轉換,在網上找了許多例子都只有公式介紹,沒有直接可用的代碼,所以自己寫一個給大家參考
3、直接給實現代碼:
struct Interval
{
Interval(): min(0.0), max(1.0){}
Interval(const double &_min, const double &_max)
: min(_min), max(_max){}
double min;
double max;
};
class CIntervalMap
{
#define EPSILON 0.000001
public:
CIntervalMap(const double &min = 0.0, const double &max = 1.0)
{
m_dstInterval.min = min;
m_dstInterval.max = max;
}
void setSrcInterval(const double &min = 0.0, const double &max = 1.0)
{
m_srcInterval.min = min;
m_srcInterval.max = max;
}
void setDstInterval(const double &min = 0.0, const double &max = 1.0)
{
m_dstInterval.min = min;
m_dstInterval.max = max;
}
void getIntervalMapValue(const double& dstValue, double &srcValue)
{
double den = (m_dstInterval.max - m_dstInterval.min);
double d = den > EPSILON ? (m_srcInterval.max - m_srcInterval.min) / den : 1.0;
srcValue = (dstValue - m_dstInterval.min) * d + m_srcInterval.min;
}
private:
Interval m_srcInterval;
Interval m_dstInterval;
};
int main()
{
//將區間[1~30]數據映射到區間[300~500]數據中
Interval dst(1, 30);
Interval src(300, 500);
CIntervalMap inter(dst.min, dst.max);
inter.setSrcInterval(src.min, src.max);
for (int i = dst.min; i <= dst.max; ++i)
{
double srcValue = 0.;
inter.getIntervalMapValue(i, srcValue);
std::cout<<"dstValue:"<<i<<" srcValue:"<<srcValue<<std::endl;
}
return 0;
}