📄 ierag.cpp
字号:
// IERag.cpp: implementation of the IERag class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "IERag.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// IERegionVertax 努贰胶 备泅
//////////////////////////////////////////////////////////////////////
IERegionVertax::IERegionVertax()
{
m_nIndex = -1;
m_nArea = 0;
m_nStart = m_nEnd = -1;
m_nValue = 0;
m_fWeight = 0;
m_nBoundary = 0;
m_pMotion[0] = m_pMotion[1] = 0;
m_pNext = NULL;
m_pNextHead = NULL;
}
IERegionVertax::~IERegionVertax()
{
}
void IERegionVertax::Clone(IERegionVertax* pVertax)
{
this->m_nIndex = pVertax->m_nIndex;
this->m_nArea = pVertax->m_nArea;
this->m_nStart = pVertax->m_nStart;
this->m_nEnd = pVertax->m_nEnd;
this->m_nValue = pVertax->m_nValue;
// 捞巴篮 head vertax客狼 惑包 包拌甫 唱鸥郴绰 巴捞骨肺
// vertax 绊蜡狼 沥焊扼绊 杭 荐 绝促. 弊矾骨肺 汗荤窍瘤 臼绰促.
// this->m_fWeight = pVertax->m_fWeight;
// this->m_nBoundary = pVertax->m_nBoundary;
this->m_pMotion[0] = pVertax->m_pMotion[0];
this->m_pMotion[1] = pVertax->m_pMotion[1];
this->m_nSelect = pVertax->m_nSelect;
// 器牢磐绰 汗荤窍瘤 臼绰促. NULL肺 檬扁拳 矫挪促.
this->m_pNext = NULL;
this->m_pNextHead = NULL;
}
//////////////////////////////////////////////////////////////////////
// IERag 努贰胶 备泅
//////////////////////////////////////////////////////////////////////
IERag::IERag()
{
m_nVertax = 0;
m_nMaxIndex = 0;
m_pHeadArray = NULL;
m_pHead = new IERegionVertax();
m_pHead->m_nIndex = 0; // head狼 index绰 0栏肺 绊沥茄促.
m_pLast = m_pHead;
}
IERag::~IERag()
{
// Adjacency list 郴何狼 葛电 畴靛甫 昏力茄促.
RemoveAll();
// Graph狼 head 畴靛甫 昏力茄促.
if( m_pHead != NULL )
delete m_pHead;
// Head vertax 府胶飘甫 啊府虐绰 器牢磐 硅凯狼 皋葛府 秦力
if( m_pHeadArray != NULL )
delete m_pHeadArray;
}
// 货肺款 vertax甫 眠啊茄促.
// 货肺款 vertax绰 head vertax 府胶飘狼 盖 付瘤阜俊 积己等促.
void IERag::AddVertax(IERegionVertax* pVertax)
{
// pVertax狼 m_nIndex甫 扁粮狼 RAG俊 乐绰 vertax客 吝汗登绰瘤甫
// 犬牢窍绰 巴捞 鞘夸且 巴栏肺 积阿等促.
// 弊矾唱, 快急篮 弊 苞沥阑 积帆窍磊.
// 货肺 眠啊登绰 vertax狼 牢郸胶甫 绢叼辑 瘤沥且 瘤甫 搬沥秦具茄促.
// 盔贰绰 IERag 努贰胶狼 m_nNewIndex甫 窍唱究 刘啊矫虐搁辑 且寸窍绰
// 巴捞 官恩流窍瘤父, 夯 橇肺弊伐俊辑绰 Merger 努贰胶俊辑 瘤沥窍绰 巴栏肺 茄促.
// m_pLast绰 亲惑 蜡夸茄 盖 付瘤阜 head vertax甫 啊府虐绊 乐绢具 茄促.
// m_pLast 第俊 货肺款 vertax甫 眠啊窍绊, m_pLast甫 盎脚茄促.
pVertax->m_pNextHead = NULL;
m_pLast->m_pNextHead = pVertax;
m_pLast = pVertax;
m_nVertax++;
}
// nIndex1俊 秦寸窍绰 vertax客 nIndex2俊 秦寸窍绰 vertax 荤捞俊
// nWeight 农扁狼 楷搬阑 眠啊茄促.
// 滴 vertax 荤捞俊 盔贰 楷搬捞 粮犁窍看促搁 weight 父阑 歹秦林绊,
// 弊犯瘤 臼疽促搁 vertax list俊 货肺款 vertax甫 眠啊茄促.
// nWeight绰 亲惑 0焊促 目具父 茄促.
void IERag::AddEdge(int nIndex1, int nIndex2, float fWeight, int nBoundary)
{
ASSERT( fWeight > 0 );
IERegionVertax* pHeadVertax1;
IERegionVertax* pHeadVertax2;
IERegionVertax* pVertax;
pHeadVertax1 = m_pHeadArray[nIndex1];
pHeadVertax2 = m_pHeadArray[nIndex2];
ASSERT( pHeadVertax1 != NULL && pHeadVertax2 != NULL );
///////////////////////////////////////////////////////////////////////
// pHeadVertax1狼 府胶飘俊辑 nIndex2甫 茫绰促.
pVertax = pHeadVertax1->m_pNext;
while( pVertax != NULL )
{
if( pVertax->m_nIndex == nIndex2 )
{
// 茫疽阑 版快, nWeight甫 刘啊矫挪促.
pVertax->m_fWeight += fWeight;
pVertax->m_nBoundary += nBoundary;
break;
}
else
{
pVertax = pVertax->m_pNext;
}
}
// 滴 vertax啊 傈囚 楷搬捞 绝菌阑 版快
if( pVertax == NULL )
{
// pHeadVertax1狼 vertax list俊 货肺款 vertax甫 眠啊茄促.
IERegionVertax* pNewVertax1 = new IERegionVertax();
pNewVertax1->Clone(pHeadVertax2);
pNewVertax1->m_fWeight = fWeight;
pNewVertax1->m_nBoundary = nBoundary;
pNewVertax1->m_pNext = pHeadVertax1->m_pNext;
pHeadVertax1->m_pNext = pNewVertax1;
// nIndex1苞 nIndex2俊 秦寸窍绰 滴 vertax啊 楷搬捞 绝绰 巴捞
// 犬角窍骨肺, pHeadVertax2俊档 货肺款 vertax甫 眠啊茄促.
IERegionVertax* pNewVertax2 = new IERegionVertax();
pNewVertax2->Clone(pHeadVertax1);
pNewVertax2->m_fWeight = fWeight;
pNewVertax2->m_nBoundary = nBoundary;
pNewVertax2->m_pNext = pHeadVertax2->m_pNext;
pHeadVertax2->m_pNext = pNewVertax2;
// 咯扁辑 且 老捞 场车栏骨肺 return 茄促.
return;
}
///////////////////////////////////////////////////////////////////////
// pHeadVertax2狼 府胶飘俊辑 nIndex1甫 茫绰促.
pVertax = pHeadVertax2->m_pNext;
while( pVertax != NULL )
{
if( pVertax->m_nIndex == nIndex1 )
{
// 茫疽阑 版快, nWeight甫 刘啊矫挪促.
pVertax->m_fWeight += fWeight;
pVertax->m_nBoundary += nBoundary;
break;
}
else
{
pVertax = pVertax->m_pNext;
}
}
}
// nHeadIndex俊 秦寸窍绰 head vertax 俊辑 nIndex俊 秦寸窍绰
// vertax 沥焊甫 昏力茄促.
BOOL IERag::RemoveVertaxFromList(int nHeadIndex, int nIndex)
{
IERegionVertax* pHeadVertax;
IERegionVertax* pVertax;
IERegionVertax* pTemp;
pHeadVertax = m_pHeadArray[nHeadIndex];
// 父距 秦寸窍绰 head vertax啊 粮犁窍瘤 臼绰 版快
if( pHeadVertax == NULL )
return FALSE;
pVertax = pHeadVertax;
while( pVertax->m_pNext != NULL )
{
// 府胶飘俊辑 泅犁 促澜狼 vertax啊 nIndex 蔼阑 啊瘤绰 版快
if( pVertax->m_pNext->m_nIndex == nIndex )
{
// 促澜 vertax狼 林家甫 pTemp俊 汗荤窍绊,
pTemp = pVertax->m_pNext;
// 府胶飘俊辑 促澜 vertax甫 扒呈顿霸 父电 饶,
pVertax->m_pNext = pVertax->m_pNext->m_pNext;
// 促澜 vertax绰 皋葛府俊辑 昏力茄促.
delete pTemp;
return TRUE;
}
pVertax = pVertax->m_pNext;
}
return FALSE;
}
// m_pHead 关俊 叠赴 vertax甸阑 昏力茄促.
void IERag::RemoveAll()
{
IERegionVertax* pHeadVertax;
IERegionVertax* pVertax;
IERegionVertax* pTemp;
pHeadVertax = m_pHead->m_pNextHead;
while( pHeadVertax != NULL )
{
// head vertax俊 叠妨乐绰 vertax甫 葛滴 瘤款促.
pVertax = pHeadVertax->m_pNext;
while( pVertax != NULL )
{
pTemp = pVertax->m_pNext;
delete pVertax;
pVertax = pTemp;
}
pTemp = pHeadVertax->m_pNextHead;
delete pHeadVertax;
pHeadVertax = pTemp;
}
m_pHead->m_pNextHead = NULL;
m_pLast = m_pHead;
}
// nSmall俊 秦寸窍绰 vertax甫 nLarge俊 秦寸窍绰 vertax肺 merge 矫挪促.
// 扁夯利栏肺 RemoveVertax 窃荐客 厚搅茄 榜拜捞瘤父, weight俊 措茄 贸府啊 鞘夸窍促.
void IERag::MergeVertax(int nSmall, int nLarge)
{
IERegionVertax* pHeadVertax;
IERegionVertax* pVertax;
IERegionVertax* pTemp;
pHeadVertax = m_pHeadArray[nSmall];
// nSmall俊 秦寸窍绰 vertax啊 粮犁窍瘤 臼篮 版快
ASSERT( pHeadVertax != NULL );
// Head vertax俊 粮犁窍绰 vertax甸阑 茫酒辑 弊巴甸阑 head vertax肺 啊瘤绰
// 府胶飘甫 茫绰促. 弊 府胶飘俊辑 head vertax 沥焊甫 刚历 昏力茄促.
pVertax = pHeadVertax;
while( pVertax->m_pNext != NULL )
{
if( pVertax->m_pNext->m_nIndex != nLarge )
{
// S客 楷搬等 沥痢 府胶飘 吝俊辑 L捞寇狼 沥痢 K俊 措窍咯,
// (1) L苞 K啊 楷搬捞 登绢乐绰 版快,
// S客 K 荤捞狼 埃急 农扁父怒 L苞 K狼 埃急 农扁甫 刘啊矫挪促.
// (2) L苞 K啊 楷搬捞 登绢乐瘤 臼篮 版快,
// L苞 K甫 楷搬窍绊 S客 K狼 埃急 农扁甫 硅沥茄促.
AddEdge(pVertax->m_pNext->m_nIndex, nLarge,
pVertax->m_pNext->m_fWeight, pVertax->m_pNext->m_nBoundary);
// K俊辑 S狼 楷搬阑 昏力茄促.
RemoveVertaxFromList(pVertax->m_pNext->m_nIndex, nSmall);
}
// pVertax 促澜 vertax甫 pTemp俊 烙矫 历厘窍绊, 昏力.
pTemp = pVertax->m_pNext;
pVertax->m_pNext = pTemp->m_pNext;
delete pTemp;
}
// 沥痢 L俊 沥痢 S狼 沥焊甫 眠啊茄促.
MergeVertaxInfo(nSmall, nLarge);
// 沥痢 L俊辑 沥痢 S客狼 楷搬阑 昏力茄促.
RemoveVertaxFromList(nLarge, nSmall);
// 沥痢 S俊辑 矫累窍绰 沥痢 府胶飘甫 昏力茄促.
// head vertax 磊眉甫 昏力窍扁 困窍咯, head vertax 府胶飘俊辑
// NULL捞 酒囱 惑困 head vertax甫 茫绰促.
int nTemp = nSmall - 1;
while( nTemp > 0 && m_pHeadArray[nTemp] == NULL )
{
nTemp--;
}
// 角力肺 瘤快扁 傈俊, 父距 泅犁 瘤快妨绰 head vertax啊 head vertax 府胶飘狼
// 盖 付瘤阜捞扼搁, m_pLast甫 荐沥秦林绢具 茄促.
if( m_pLast == pHeadVertax )
m_pLast = m_pHeadArray[nTemp];
// 角力肺 瘤款促.
pTemp = m_pHeadArray[nTemp];
pTemp->m_pNextHead = pHeadVertax->m_pNextHead;
delete pHeadVertax;
m_pHeadArray[nSmall] = NULL;
m_nVertax--;
}
void IERag::Clone(IERag* pRag)
{
RemoveAll();
IERegionVertax* pHeadVertax;
IERegionVertax* pVertax;
IERegionVertax* pNewHead;
IERegionVertax* pNew;
IERegionVertax* pTemp;
pHeadVertax = pRag->m_pHead->m_pNextHead;
while( pHeadVertax != NULL )
{
// head vertax 眠啊
pNewHead = new IERegionVertax();
pNewHead->Clone(pHeadVertax);
AddVertax(pNewHead);
pTemp = pNewHead;
pVertax = pHeadVertax->m_pNext;
while( pVertax != NULL )
{
pNew = new IERegionVertax();
pNew->Clone(pVertax);
pTemp->m_pNext = pNew;
pTemp = pNew;
pVertax = pVertax->m_pNext;
}
pHeadVertax = pHeadVertax->m_pNextHead;
}
m_nMaxIndex = pRag->m_nMaxIndex;
m_nVertax = pRag->m_nVertax;
// m_pHead 畴靛甫 困窍咯 角力 vertax 俺荐焊促 窍唱 腹霸 硅凯阑 且寸茄促.
m_pHeadArray = new IERegionVertax*[m_nMaxIndex+1];
memset(m_pHeadArray, 0, sizeof(int)*(m_nMaxIndex+1));
// 器牢磐 硅凯狼 阿 夸家客 head vertax 府胶飘狼 林家甫 概摹矫挪促.
int count = 1;
pTemp = m_pHead->m_pNextHead;
while( pTemp != NULL )
{
m_pHeadArray[pTemp->m_nIndex] = pTemp;
pTemp = pTemp->m_pNextHead;
}
m_pHeadArray[0] = m_pHead;
}
void IERag::UpdateArray()
{
if( m_pHeadArray != NULL )
delete [] m_pHeadArray;
// m_pHead 畴靛甫 困窍咯 角力 vertax 俺荐焊促 窍唱 腹霸 硅凯阑 且寸茄促.
m_pHeadArray = new IERegionVertax*[m_nMaxIndex+1];
// 器牢磐 硅凯狼 阿 夸家客 head vertax 府胶飘狼 林家甫 概摹矫挪促.
int count = 1;
IERegionVertax* pTemp = m_pHead->m_pNextHead;
while( pTemp != NULL )
{
m_pHeadArray[count++] = pTemp;
pTemp = pTemp->m_pNextHead;
}
m_pHeadArray[0] = m_pHead;
}
void IERag::MergeVertaxInfo(int nSmall, int nLarge)
{
// nSmall俊 秦寸窍绰 vertax狼 沥焊甫 nLarge俊 秦寸窍绰 vertax肺
// 颗变促.
IERegionVertax* pLarge = m_pHeadArray[nLarge];
IERegionVertax* pSmall = m_pHeadArray[nSmall];
ASSERT(pLarge);
ASSERT(pSmall);
int r1, g1, b1, r2, g2, b2, rr, gg, bb;
if( pSmall->m_nIndex == 484 )
int a = 10;
r1 = GetRValue(pLarge->m_nValue);
g1 = GetGValue(pLarge->m_nValue);
b1 = GetBValue(pLarge->m_nValue);
r2 = GetRValue(pSmall->m_nValue);
g2 = GetGValue(pSmall->m_nValue);
b2 = GetBValue(pSmall->m_nValue);
int total_area = pLarge->m_nArea + pSmall->m_nArea;
rr = ( r1*pLarge->m_nArea + r2*pSmall->m_nArea );
gg = ( g1*pLarge->m_nArea + g2*pSmall->m_nArea );
bb = ( b1*pLarge->m_nArea + b2*pSmall->m_nArea );
rr = (int)( (float)rr / total_area + 0.5 );
gg = (int)( (float)gg / total_area + 0.5 );
bb = (int)( (float)bb / total_area + 0.5 );
pLarge->m_nValue = RGB(rr, gg, bb);
// pLarge->m_nValue = ( (pLarge->m_nValue * pLarge->m_nArea) + (pSmall->m_nValue * pSmall->m_nArea) ) /
// ( pLarge->m_nArea + pSmall->m_nArea );
pLarge->m_nArea += pSmall->m_nArea;
pLarge->m_nEnd = pSmall->m_nEnd;
// TODO: 捞饶 眠啊且 沥焊啊 乐促搁 咯扁俊 歹 敬促.
// 货肺 诀单捞飘等 pLarge绰 head vertax父捞 盎脚等 巴捞骨肺,
// head vertax啊 酒囱 老馆 vertax 府胶飘俊 乐绰 巴甸档
// 弊 沥焊甫 盎脚茄促.
IERegionVertax* pVertax;
IERegionVertax* pTemp;
IERegionVertax* pAux;
pVertax = pLarge->m_pNext;
while( pVertax != NULL )
{
pTemp = m_pHeadArray[pVertax->m_nIndex];
ASSERT(pTemp);
pAux = pTemp->m_pNext;
while( pAux != NULL )
{
if( pAux->m_nIndex == nLarge )
{
pAux->m_nArea = pLarge->m_nArea;
pAux->m_nStart = pLarge->m_nStart;
pAux->m_nEnd = pLarge->m_nEnd;
pAux->m_nValue = pLarge->m_nValue;
break;
}
pAux = pAux->m_pNext;
}
pVertax = pVertax->m_pNext;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -