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

📄 ierag.cpp

📁 刚上传内容的相关CODEC不能单独上传。于是
💻 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 + -