⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imageinterp2d.cpp

📁 3D Game Engine Design Source Code非常棒
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    int iF11, int iF01)
{
    int iXN0, iYN0, iXN1, iYN1, iD0, iD1, iD2, iD3, iDet;

    if ( iF00 != 0 )
    {
        // convert to case "+***"
        if ( iF00 < 0 )
        {
            iF00 = -iF00;
            iF10 = -iF10;
            iF11 = -iF11;
            iF01 = -iF01;
        }

        if ( iF10 > 0 )
        {
            if ( iF11 > 0 )
            {
                if ( iF01 > 0 )
                {
                    // ++++
                    return;
                }
                else if ( iF01 < 0 )
                {
                    // +++-
                    iD0 = iF11 - iF01;
                    iXN0 = iF11*iX - iF01*iXP;
                    iD1 = iF00 - iF01;
                    iYN1 = iF00*iYP - iF01*iY;
                    AddEdge(rkVA,rkEA,iXN0,iD0,iYP,1,iX,1,iYN1,iD1);
                }
                else
                {
                    // +++0
                    AddVertex(rkVA,iX,1,iYP,1);
                }
            }
            else if ( iF11 < 0 )
            {
                iD0 = iF10 - iF11;
                iYN0 = iF10*iYP - iF11*iY;

                if ( iF01 > 0 )
                {
                    // ++-+
                    iD1 = iF01 - iF11;
                    iXN1 = iF01*iXP - iF11*iX;
                    AddEdge(rkVA,rkEA,iXP,1,iYN0,iD0,iXN1,iD1,iYP,1);
                }
                else if ( iF01 < 0 )
                {
                    // ++--
                    iD1 = iF01 - iF00;
                    iYN1 = iF01*iY - iF00*iYP;
                    AddEdge(rkVA,rkEA,iX,1,iYN1,iD1,iXP,1,iYN0,iD0);
                }
                else
                {
                    // ++-0
                    AddEdge(rkVA,rkEA,iX,1,iYP,1,iXP,1,iYN0,iD0);
                }
            }
            else
            {
                if ( iF01 > 0 )
                {
                    // ++0+
                    AddVertex(rkVA,iXP,1,iYP,1);
                }
                else if ( iF01 < 0 )
                {
                    // ++0-
                    iD0 = iF01 - iF00;
                    iYN0 = iF01*iY - iF00*iYP;
                    AddEdge(rkVA,rkEA,iXP,1,iYP,1,iX,1,iYN0,iD0);
                }
                else
                {
                    // ++00
                    AddEdge(rkVA,rkEA,iXP,1,iYP,1,iX,1,iYP,1);
                }
            }
        }
        else if ( iF10 < 0 )
        {
            iD0 = iF00 - iF10;
            iXN0 = iF00*iXP - iF10*iX;

            if ( iF11 > 0 )
            {
                iD1 = iF11 - iF10;
                iYN1 = iF11*iY - iF10*iYP;

                if ( iF01 > 0 )
                {
                    // +-++
                    AddEdge(rkVA,rkEA,iXN0,iD0,iY,1,iXP,1,iYN1,iD1);
                }
                else if ( iF01 < 0 )
                {
                    // +-+-
                    iD3 = iF11 - iF01;
                    iXN1 = iF11*iX - iF01*iXP;
                    iD2 = iF01 - iF00;
                    iYN0 = iF01*iY - iF00*iYP;

                    if ( iD0*iD3 > 0 )
                        iDet = iXN1*iD0 - iXN0*iD3;
                    else
                        iDet = iXN0*iD3 - iXN1*iD0;

                    if ( iDet > 0 )
                    {
                        AddEdge(rkVA,rkEA,iXN1,iD3,iYP,1,iXP,1,iYN1,iD1);
                        AddEdge(rkVA,rkEA,iXN0,iD0,iY,1,iX,1,iYN0,iD2);
                    }
                    else if ( iDet < 0 )
                    {
                        AddEdge(rkVA,rkEA,iXN1,iD3,iYP,1,iX,1,iYN0,iD2);
                        AddEdge(rkVA,rkEA,iXN0,iD0,iY,1,iXP,1,iYN1,iD1);
                    }
                    else
                    {
                        AddEdge(rkVA,rkEA,iXN0,iD0,iYN0,iD2,iXN0,iD0,iY,1);
                        AddEdge(rkVA,rkEA,iXN0,iD0,iYN0,iD2,iXN0,iD0,iYP,1);
                        AddEdge(rkVA,rkEA,iXN0,iD0,iYN0,iD2,iX,1,iYN0,iD2);
                        AddEdge(rkVA,rkEA,iXN0,iD0,iYN0,iD2,iXP,1,iYN0,iD2);
                    }
                }
                else
                {
                    // +-+0
                    AddEdge(rkVA,rkEA,iXN0,iD0,iY,1,iXP,1,iYN1,iD1);
                    AddVertex(rkVA,iX,1,iYP,1);
                }
            }
            else if ( iF11 < 0 )
            {
                if ( iF01 > 0 )
                {
                    // +--+
                    iD1 = iF11 - iF01;
                    iXN1 = iF11*iX - iF01*iXP;
                    AddEdge(rkVA,rkEA,iXN0,iD0,iY,1,iXN1,iD1,iYP,1);
                }
                else if ( iF01 < 0 )
                {
                    // +---
                    iD1 = iF01 - iF00;
                    iYN1 = iF01*iY - iF00*iYP;
                    AddEdge(rkVA,rkEA,iX,1,iYN1,iD1,iXN0,iD0,iY,1);
                }
                else
                {
                    // +--0
                    AddEdge(rkVA,rkEA,iX,1,iYP,1,iXN0,iD0,iY,1);
                }
            }
            else
            {
                if ( iF01 > 0 )
                {
                    // +-0+
                    AddEdge(rkVA,rkEA,iXP,1,iYP,1,iXN0,iD0,iY,1);
                }
                else if ( iF01 < 0 )
                {
                    // +-0-
                    iD1 = iF01 - iF00;
                    iYN1 = iF01*iY - iF00*iYP;
                    AddEdge(rkVA,rkEA,iX,1,iYN1,iD1,iXN0,iD0,iY,1);
                    AddVertex(rkVA,iXP,1,iYP,1);
                }
                else
                {
                    // +-00
                    AddEdge(rkVA,rkEA,iXP,1,iYP,1,iXN0,iD0,iYP,1);
                    AddEdge(rkVA,rkEA,iXN0,iD0,iYP,1,iX,1,iYP,1);
                    AddEdge(rkVA,rkEA,iXN0,iD0,iYP,1,iXN0,iD0,iY,1);
                }
            }
        }
        else
        {
            if ( iF11 > 0 )
            {
                if ( iF01 > 0 )
                {
                    // +0++
                    AddVertex(rkVA,iXP,1,iY,1);
                }
                else if ( iF01 < 0 )
                {
                    // +0+-
                    iD0 = iF11 - iF01;
                    iXN0 = iF11*iX - iF01*iXP;
                    iD1 = iF00 - iF01;
                    iYN1 = iF00*iYP - iF01*iY;
                    AddEdge(rkVA,rkEA,iXN0,iD0,iYP,1,iX,1,iYN1,iD1);
                    AddVertex(rkVA,iXP,1,iY,1);
                }
                else
                {
                    // +0+0
                    AddVertex(rkVA,iXP,1,iY,1);
                    AddVertex(rkVA,iX,1,iYP,1);
                }
            }
            else if ( iF11 < 0 )
            {
                if ( iF01 > 0 )
                {
                    // +0-+
                    iD0 = iF11 - iF01;
                    iXN0 = iF11*iX - iF01*iXP;
                    AddEdge(rkVA,rkEA,iXP,1,iY,1,iXN0,iD0,iYP,1);
                }
                else if ( iF01 < 0 )
                {
                    // +0--
                    iD0 = iF01 - iF00;
                    iYN0 = iF01*iY - iF00*iYP;
                    AddEdge(rkVA,rkEA,iXP,1,iY,1,iX,1,iYN0,iD0);
                }
                else
                {
                    // +0-0
                    AddEdge(rkVA,rkEA,iXP,1,iY,1,iX,1,iYP,1);
                }
            }
            else
            {
                if ( iF01 > 0 )
                {
                    // +00+
                    AddEdge(rkVA,rkEA,iXP,1,iY,1,iXP,1,iYP,1);
                }
                else if ( iF01 < 0 )
                {
                    // +00-
                    iD0 = iF00 - iF01;
                    iYN0 = iF00*iYP - iF01*iY;
                    AddEdge(rkVA,rkEA,iXP,1,iY,1,iXP,1,iYN0,iD0);
                    AddEdge(rkVA,rkEA,iXP,1,iYN0,iD0,iXP,1,iYP,1);
                    AddEdge(rkVA,rkEA,iXP,1,iYN0,iD0,iX,1,iYN0,iD0);
                }
                else
                {
                    // +000
                    AddEdge(rkVA,rkEA,iX,1,iYP,1,iX,1,iY,1);
                    AddEdge(rkVA,rkEA,iX,1,iY,1,iXP,1,iY,1);
                }
            }
        }
    }
    else if ( iF10 != 0 )
    {
        // convert to case 0+**
        if ( iF10 < 0 )
        {
            iF10 = -iF10;
            iF11 = -iF11;
            iF01 = -iF01;
        }

        if ( iF11 > 0 )
        {
            if ( iF01 > 0 )
            {
                // 0+++
                AddVertex(rkVA,iX,1,iY,1);
            }
            else if ( iF01 < 0 )
            {
                // 0++-
                iD0 = iF11 - iF01;
                iXN0 = iF11*iX - iF01*iXP;
                AddEdge(rkVA,rkEA,iX,1,iY,1,iXN0,iD0,iYP,1);
            }
            else
            {
                // 0++0
                AddEdge(rkVA,rkEA,iX,1,iYP,1,iX,1,iY,1);
            }
        }
        else if ( iF11 < 0 )
        {
            if ( iF01 > 0 )
            {
                // 0+-+
                iD0 = iF10 - iF11;
                iYN0 = iF10*iYP - iF11*iY;
                iD1 = iF01 - iF11;
                iXN1 = iF01*iXP - iF11*iX;
                AddEdge(rkVA,rkEA,iXP,1,iYN0,iD0,iXN1,iD1,iYP,1);
                AddVertex(rkVA,iX,1,iY,1);
            }
            else if ( iF01 < 0 )
            {
                // 0+--
                iD0 = iF10 - iF11;
                iYN0 = iF10*iYP - iF11*iY;
                AddEdge(rkVA,rkEA,iX,1,iY,1,iXP,1,iYN0,iD0);
            }
            else
            {
                // 0+-0
                iD0 = iF10 - iF11;
                iYN0 = iF10*iYP - iF11*iY;
                AddEdge(rkVA,rkEA,iX,1,iY,1,iX,1,iYN0,iD0);
                AddEdge(rkVA,rkEA,iX,1,iYN0,iD0,iX,1,iYP,1);
                AddEdge(rkVA,rkEA,iX,1,iYN0,iD0,iXP,1,iYN0,iD0);
            }
        }
        else
        {
            if ( iF01 > 0 )
            {
                // 0+0+
                AddVertex(rkVA,iX,1,iY,1);
                AddVertex(rkVA,iXP,1,iYP,1);
            }
            else if ( iF01 < 0 )
            {
                // 0+0-
                AddEdge(rkVA,rkEA,iX,1,iY,1,iXP,1,iYP,1);
            }
            else
            {
                // 0+00
                AddEdge(rkVA,rkEA,iXP,1,iYP,1,iX,1,iYP,1);
                AddEdge(rkVA,rkEA,iX,1,iYP,1,iX,1,iY,1);
            }
        }
    }
    else if ( iF11 != 0 )
    {
        // convert to case 00+*
        if ( iF11 < 0 )
        {
            iF11 = -iF11;
            iF01 = -iF01;
        }

        if ( iF01 > 0 )
        {
            // 00++
            AddEdge(rkVA,rkEA,iX,1,iY,1,iXP,1,iY,1);
        }
        else if ( iF01 < 0 )
        {
            // 00+-
            iD0 = iF01 - iF11;
            iXN0 = iF01*iXP - iF11*iX;
            AddEdge(rkVA,rkEA,iX,1,iY,1,iXN0,iD0,iY,1);
            AddEdge(rkVA,rkEA,iXN0,iD0,iY,1,iXP,1,iY,1);
            AddEdge(rkVA,rkEA,iXN0,iD0,iY,1,iXN0,iD0,iYP,1);
        }
        else
        {
            // 00+0
            AddEdge(rkVA,rkEA,iXP,1,iY,1,iXP,1,iYP,1);
            AddEdge(rkVA,rkEA,iXP,1,iYP,1,iX,1,iYP,1);
        }
    }
    else if ( iF01 != 0 )
    {
        // cases 000+ or 000-
        AddEdge(rkVA,rkEA,iX,1,iY,1,iXP,1,iY,1);
        AddEdge(rkVA,rkEA,iXP,1,iY,1,iXP,1,iYP,1);
    }
    else
    {
        // case 0000
        AddEdge(rkVA,rkEA,iX,1,iY,1,iXP,1,iY,1);
        AddEdge(rkVA,rkEA,iXP,1,iY,1,iXP,1,iYP,1);
        AddEdge(rkVA,rkEA,iXP,1,iYP,1,iX,1,iYP,1);
        AddEdge(rkVA,rkEA,iX,1,iYP,1,iX,1,iY,1);
    }
}
//----------------------------------------------------------------------------

//----------------------------------------------------------------------------
ImageInterp2D::Vertex::Vertex (int iXNumer, int iXDenom, int iYNumer,
    int iYDenom)
{
    if ( iXDenom > 0 )
    {
        m_iXNumer = iXNumer;
        m_iXDenom = iXDenom;
    }
    else
    {
        m_iXNumer = -iXNumer;
        m_iXDenom = -iXDenom;
    }

    if ( iYDenom > 0 )
    {
        m_iYNumer = iYNumer;
        m_iYDenom = iYDenom;
    }
    else
    {
        m_iYNumer = -iYNumer;
        m_iYDenom = -iYDenom;
    }
}
//----------------------------------------------------------------------------
void ImageInterp2D::Vertex::GetPair (float& rfX, float& rfY) const
{
    rfX = float(m_iXNumer)/float(m_iXDenom);
    rfY = float(m_iYNumer)/float(m_iYDenom);
}
//----------------------------------------------------------------------------
void ImageInterp2D::Vertex::GetPair (double& rdX, double& rdY) const
{
    rdX = double(m_iXNumer)/double(m_iXDenom);
    rdY = double(m_iYNumer)/double(m_iYDenom);
}
//----------------------------------------------------------------------------
bool ImageInterp2D::Vertex::operator< (const Vertex& rkVertex) const
{
    unsigned int auiValue0[4] =
    {
        *(unsigned int*)&m_iXNumer,
        *(unsigned int*)&m_iXDenom,
        *(unsigned int*)&m_iYNumer,
        *(unsigned int*)&m_iYDenom
    };

    unsigned int auiValue1[4] =
    {
        *(unsigned int*)&rkVertex.m_iXNumer,
        *(unsigned int*)&rkVertex.m_iXDenom,
        *(unsigned int*)&rkVertex.m_iYNumer,
        *(unsigned int*)&rkVertex.m_iYDenom
    };

    for (int i = 0; i < 4; i++)
    {
        if ( auiValue0[i] < auiValue1[i] )
            return true;
        if ( auiValue0[i] > auiValue1[i] )
            return false;
    }

    return false;
}
//----------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -