📄 imageinterp2d.cpp
字号:
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 + -