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

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:"<     }
    return 0;
}

你可能感兴趣的:(code--C/C++专栏)