两个区间映射关系详解c++

mac2024-05-30  52

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

最新回复(0)