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; }