xTZ8PointDiamondSearch函数在xTZSearch函数中被调用,实现8点菱形搜索
搜索步长为1时,搜索2,4,5,7四个点;
搜索步长大于1,小于等于8时,8点菱形搜索;
搜索步长大于8时,16点菱形搜索,每条菱形边上5个点。
inline Void InterSearch::xTZ8PointDiamondSearch( IntTZSearchStruct& rcStruct,
const Int iStartX,
const Int iStartY,
const Int iDist,
const Bool bCheckCornersAtDist1 )
{
const SearchRange& sr = rcStruct.searchRange; //搜索范围
// 8 point search, // 1 2 3
// search around the start point // 4 0 5
// with the required distance // 6 7 8
CHECK( iDist == 0, "Invalid distance" ); //这些0到8所标注的位置,就是IntTZSearchStruct中的ucPointNr
const Int iTop = iStartY - iDist; //菱形顶点 2
const Int iBottom = iStartY + iDist; //菱形底点 7
const Int iLeft = iStartX - iDist; //菱形左点 4
const Int iRight = iStartX + iDist; //菱形右点 5
rcStruct.uiBestRound += 1; //搜索圈数+1
if ( iDist == 1 ) //搜索步长为1时,搜索2,4,5,7四个点
{
if ( iTop >= sr.top ) // check top //菱形顶点在搜索范围内
{
if (bCheckCornersAtDist1)
{
if ( iLeft >= sr.left) // check top-left
{
xTZSearchHelp( rcStruct, iLeft, iTop, 1, iDist );
}
xTZSearchHelp( rcStruct, iStartX, iTop, 2, iDist );
if ( iRight <= sr.right ) // check middle right
{
xTZSearchHelp( rcStruct, iRight, iTop, 3, iDist );
}
}
else
{
xTZSearchHelp( rcStruct, iStartX, iTop, 2, iDist ); //2
}
}
if ( iLeft >= sr.left ) // check middle left //菱形左点在搜索范围内
{
xTZSearchHelp( rcStruct, iLeft, iStartY, 4, iDist ); //4
}
if ( iRight <= sr.right ) // check middle right //菱形右点在搜索范围内
{
xTZSearchHelp( rcStruct, iRight, iStartY, 5, iDist ); //5
}
if ( iBottom <= sr