兩個區間映射關係詳解/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:"<<i<<" srcValue:"<<srcValue<<std::endl;
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章