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

📄 testdlg.cpp

📁 DGCL (An Efficient Density and Grid Based Clustering Algorithm for Large Spatial Database)的实现代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			{
				//				if(pGrid[gridX+1][gridY].used == false)
				//					pGrid[gridX+1][gridY].used = true;
				pGrid[gridX+1][gridY].density++;
				
				//				if(pGrid[gridX][gridY+1].used == false)
				//					pGrid[gridX][gridY+1].used = true;
				pGrid[gridX][gridY+1].density++;
				
				//				if(pGrid[gridX+1][gridY+1].used == false)
				//					pGrid[gridX+1][gridY+1].used = true;
				pGrid[gridX+1][gridY+1].density++;
				break;
			}
			break;
			
		case 4:   //5 neighbors
			if(nNghCheckResult == 8)
			{
				//				if(pGrid[gridX][gridY-1].used == false)
				//					pGrid[gridX][gridY-1].used = true;
				pGrid[gridX][gridY-1].density++;
				break;
			}
			if(nNghCheckResult == 2)
			{
				//				if(pGrid[gridX][gridY+1].used == false)
				//					pGrid[gridX][gridY+1].used = true;
				pGrid[gridX][gridY+1].density++;
				break;
			}
			if(nNghCheckResult == 1)
			{
				//				if(pGrid[gridX-1][gridY].used == false)
				//					pGrid[gridX-1][gridY].used = true;
				pGrid[gridX-1][gridY].density++;
				break;
			}
			if(nNghCheckResult == 3)
			{
				//				if(pGrid[gridX-1][gridY].used == false)
				//					pGrid[gridX-1][gridY].used = true;
				pGrid[gridX-1][gridY].density++;
				
				//				if(pGrid[gridX][gridY+1].used == false)
				//					pGrid[gridX][gridY+1].used = true;
				pGrid[gridX][gridY+1].density++;
				
				//				if(pGrid[gridX-1][gridY+1].used == false)
				//					pGrid[gridX-1][gridY+1].used = true;
				pGrid[gridX-1][gridY+1].density++;
				break;
			}
			
            if(nNghCheckResult == 9)
			{
				//				if(pGrid[gridX-1][gridY].used == false)
				//					pGrid[gridX-1][gridY].used = true;
				pGrid[gridX-1][gridY].density++;
				
				//				if(pGrid[gridX][gridY-1].used == false)
				//					pGrid[gridX][gridY-1].used = true;
				pGrid[gridX][gridY-1].density++;
				
				//				if(pGrid[gridX-1][gridY-1].used == false)
				//					pGrid[gridX-1][gridY-1].used = true;
				pGrid[gridX-1][gridY-1].density++;
				break;
			}
			break;
			
		case 8: //5 neighbors
			if(nNghCheckResult == 8)
			{
				//				if(pGrid[gridX][gridY-1].used == false)
				//					pGrid[gridX][gridY-1].used = true;
				pGrid[gridX][gridY-1].density++;
				break;
			}
			if(nNghCheckResult == 2)
			{
				//				if(pGrid[gridX][gridY+1].used == false)
				//					pGrid[gridX][gridY+1].used = true;
				pGrid[gridX][gridY+1].density++;
				break;
			}
			if(nNghCheckResult == 4)
			{
				//				if(pGrid[gridX+1][gridY].used == false)
				//					pGrid[gridX+1][gridY].used = true;
				pGrid[gridX+1][gridY].density++;
				break;
			}
			if(nNghCheckResult == 6)
			{
				//				if(pGrid[gridX+1][gridY].used == false)
				//					pGrid[gridX+1][gridY].used = true;
				pGrid[gridX+1][gridY].density++;
				
				//				if(pGrid[gridX][gridY+1].used == false)
				//					pGrid[gridX][gridY+1].used = true;
				pGrid[gridX][gridY+1].density++;
				
				//				if(pGrid[gridX+1][gridY+1].used == false)
				//					pGrid[gridX+1][gridY+1].used = true;
				pGrid[gridX+1][gridY+1].density++;
				break;
			}
            if(nNghCheckResult == 12)
			{
				//				if(pGrid[gridX+1][gridY].used == false)
				//					pGrid[gridX+1][gridY].used = true;
				pGrid[gridX+1][gridY].density++;
				
				//				if(pGrid[gridX][gridY-1].used == false)
				//					pGrid[gridX][gridY-1].used = true;
				pGrid[gridX][gridY-1].density++;
				
				//				if(pGrid[gridX+1][gridY-1].used == false)
				//					pGrid[gridX+1][gridY-1].used = true;
				pGrid[gridX+1][gridY-1].density++;
				break;
			}
			break;
			
		case 5: //3 neighbors
			if(nNghCheckResult == 8)
			{
				//				if(pGrid[gridX][gridY-1].used == false)
				//					pGrid[gridX][gridY-1].used = true;
				pGrid[gridX][gridY-1].density++;
				break;
			}
			if(nNghCheckResult == 1)
			{
				//				if(pGrid[gridX-1][gridY].used == false)
				//					pGrid[gridX-1][gridY].used = true;
				pGrid[gridX-1][gridY].density++;
				break;
			}
            if(nNghCheckResult == 9)
			{
				//				if(pGrid[gridX-1][gridY].used == false)
				//					pGrid[gridX-1][gridY].used = true;
				pGrid[gridX-1][gridY].density++;
				
				//				if(pGrid[gridX][gridY-1].used == false)
				//					pGrid[gridX][gridY-1].used = true;
				pGrid[gridX][gridY-1].density++;
				
				//				if(pGrid[gridX-1][gridY-1].used == false)
				//					pGrid[gridX-1][gridY-1].used = true;
				pGrid[gridX-1][gridY-1].density++;
				break;
			}
			break;
			
		case 6:  //3 neighbors
			if(nNghCheckResult == 2)
			{
				//				if(pGrid[gridX][gridY+1].used == false)
				//					pGrid[gridX][gridY+1].used = true;
				pGrid[gridX][gridY+1].density++;
				break;
			}
			
			if(nNghCheckResult == 1)
			{
				//				if(pGrid[gridX-1][gridY].used == false)
				//					pGrid[gridX-1][gridY].used = true;
				pGrid[gridX-1][gridY].density++;
				break;
			}
			if(nNghCheckResult == 3)
			{
				//				if(pGrid[gridX-1][gridY].used == false)
				//					pGrid[gridX-1][gridY].used = true;
				pGrid[gridX-1][gridY].density++;
				
				//				if(pGrid[gridX][gridY+1].used == false)
				//					pGrid[gridX][gridY+1].used = true;
				pGrid[gridX][gridY+1].density++;
				
				//				if(pGrid[gridX-1][gridY+1].used == false)
				//					pGrid[gridX-1][gridY+1].used = true;
				pGrid[gridX-1][gridY+1].density++;
				break;
			}
			break;
			
		case 9:  //3 neighbors
			if(nNghCheckResult == 8)
			{
				//				if(pGrid[gridX][gridY-1].used == false)
				//					pGrid[gridX][gridY-1].used = true;
				pGrid[gridX][gridY-1].density++;
				break;
			}
			if(nNghCheckResult == 4)
			{
				//				if(pGrid[gridX+1][gridY].used == false)
				//					pGrid[gridX+1][gridY].used = true;
				pGrid[gridX+1][gridY].density++;
				break;
			}
            if(nNghCheckResult == 12)
			{
				//				if(pGrid[gridX+1][gridY].used == false)
				//					pGrid[gridX+1][gridY].used = true;
				pGrid[gridX+1][gridY].density++;
				
				//				if(pGrid[gridX][gridY-1].used == false)
				//					pGrid[gridX][gridY-1].used = true;
				pGrid[gridX][gridY-1].density++;
				
				//				if(pGrid[gridX+1][gridY-1].used == false)
				//					pGrid[gridX+1][gridY-1].used = true;
				pGrid[gridX+1][gridY-1].density++;
				break;
			}
			break;
			
		case 10:  //3 neighbors
			if(nNghCheckResult == 2)
			{
				//				if(pGrid[gridX][gridY+1].used == false)
				//					pGrid[gridX][gridY+1].used = true;
				pGrid[gridX][gridY+1].density++;
				break;
			}
			if(nNghCheckResult == 4)
			{
				//				if(pGrid[gridX+1][gridY].used == false)
				//					pGrid[gridX+1][gridY].used = true;
				pGrid[gridX+1][gridY].density++;
				break;
			}
			if(nNghCheckResult == 6)
			{
				//				if(pGrid[gridX+1][gridY].used == false)
				//					pGrid[gridX+1][gridY].used = true;
				pGrid[gridX+1][gridY].density++;
				
				//				if(pGrid[gridX][gridY+1].used == false)
				//					pGrid[gridX][gridY+1].used = true;
				pGrid[gridX][gridY+1].density++;
				
				//				if(pGrid[gridX+1][gridY+1].used == false)
				//					pGrid[gridX+1][gridY+1].used = true;
				pGrid[gridX+1][gridY+1].density++;
				break;
			}
			break;
		}//end switch	
		
	}//end for
	
	//计算密度量度,此过程可以利用前面的count变量简化。先计算总数量,再计算平均密度。空格子不包含在内!
	double nAvgDensity = 0;
	int num=0;
	for(i=0;i<m_IntervalNum;i++)
	{
		for(j=0;j<m_IntervalNum;j++)
		{
			//			pGrid[i][j].groupID = -1;
			if(pGrid[i][j].used == true)
			{
				nAvgDensity = (nAvgDensity*num + pGrid[i][j].density)/(num + 1);
				num++;
			}
		}
	}
	m_DensityLevel = nAvgDensity*m_CoefDensity/log10(m_IntervalNum*m_IntervalNum);  //也许这里面的参数是点的个数而不是网格的个数
//	m_DensityLevel = nAvgDensity;
	//  m_DensityLevel = nAvgDensity*m_CoefDensity/log10(count);
	m_avgDens.Format("%f",nAvgDensity);
	m_dl.Format("%d",m_DensityLevel);
	UpdateData(FALSE);
	//test	
/*	
	for(i=0;i<m_IntervalNum;i++)
	{
		for(j=0;j<m_IntervalNum;j++)
		{
			if(pGrid[i][j].used == true)
				if(pGrid[i][j].density > nAvgDensity)
					count++;
		}
		
	}
	*/
//	m_cellNum.Format("%d",count);
//	UpdateData(FALSE);
	
	delete dataBuf;   //到此为止,不在需要点的数组了
	
	//group assignment
	for(i=0;i<m_IntervalNum;i++)     //过滤掉单元密度小于密度量度的网格
	{
		for(j=0;j<m_IntervalNum;j++)
			if(pGrid[i][j].used == true)
			{
//				if(pGrid[i][j].density <= m_DensityLevel || pGrid[i][j].realNum < (pGrid[i][j].density/9))//不知道<=会不会让网格的数量再减少一些,
				if(pGrid[i][j].density <= m_DensityLevel)
				{
					pGrid[i][j].used = false;	//精度是不是会受到影响
					count--;
				}
			}
	}
	m_cellNum.Format("%d",count);
	UpdateData(FALSE);
				
	int nGroupNum=0;            
	//				int nGridNumInGroup[1000];  //记录每一组中包含网格的个数。其中[0]元素用于存放所存聚簇的个数,聚簇的id范围从1~999。
	//假设最大支持999个聚簇,每一个下标对应的是group的ID
	//				memset(nGridNumInGroup,0x00,sizeof(int)*1000);
	//////////////////////////////////////////////////////////////////////////
	int nMaxDens,nGroupID;
	bool nUsedTab = false;  //用于判断used=true的所有邻居的groupID是否全为0
	for(i=0;i<m_IntervalNum;i++)
	{
		for(j=0;j<m_IntervalNum;j++)
		{
			if(pGrid[i][j].used == true)
			{
				nCheckResult = CheckCondition(i,j);
				nUsedTab = false;
				nMaxDens = nGroupID = 0;
				
				switch(nCheckResult) {
				case 0:  //check 8 neighbors
					while (true) {
						
						if(pGrid[i-1][j-1].used == true)  //1
						{
							if(pGrid[i-1][j-1].groupID ==0) nUsedTab = true;
							else {
								nUsedTab = false;
								break;
							}
						}
						if(pGrid[i][j-1].used == true)  //2
						{
							if(pGrid[i][j-1].groupID == 0) nUsedTab = true;
							else{
								nUsedTab = false;
								break;
							}
						}
						if(pGrid[i+1][j-1].used == true)  //3
						{
							if(pGrid[i+1][j-1].groupID == 0) nUsedTab = true; 
							else{
								nUsedTab = false;
								break;
							}
						}
						if(pGrid[i-1][j].used == true)  //4
						{
							if(pGrid[i-1][j].groupID == 0) nUsedTab = true;
							else{
								nUsedTab = false;
								break;
							}
						}
						if(pGrid[i+1][j].used == true)  //5
						{
							if(pGrid[i+1][j].groupID == 0) nUsedTab =  true; 
							else{
								nUsedTab = false;
								break;
							}
						}
						if(pGrid[i-1][j+1].used == true)  //6
						{
							if(pGrid[i-1][j+1].groupID == 0) nUsedTab = true;
							else{
								nUsedTab = false;
								break;
							}
						}
						if(pGrid[i][j+1].used == true)  //7
						{
							if(pGrid[i][j+1].groupID == 0) nUsedTab = true;
							else{
								nUsedTab = false;
								break;
							}
						}
						if(pGrid[i+1][j+1].used == true)  //8
						{
							if(pGrid[i+1][j+1].groupID == 0) nUsedTab = true;
							else{
								nUsedTab = false;
								break;
							}
						}						
						break;
					}//end while
					
					if(pGrid[i][j].groupID == 0 && nUsedTab == true)  
					{//used=true的所有邻居,如果其groupID也为0时执行这一部分
						//									pGrid[i][j].groupID = ++nGridNumInGroup[0];
						pGrid[i][j].groupID = ++nGroupNum;
						pGrid[i-1][j-1].groupID = pGrid[i][j].groupID;
						pGrid[i][j-1].groupID = pGrid[i][j].groupID;
						pGrid[i+1][j-1].groupID = pGrid[i][j].groupID;
						pGrid[i-1][j].groupID = pGrid[i][j].groupID;
						pGrid[i+1][j].groupID = pGrid[i][j].groupID;
						pGrid[i-1][j+1].groupID = pGrid[i][j].groupID;
						pGrid[i][j+1].groupID = pGrid[i][j].groupID;
						pGrid[i+1][j+1].groupID = pGrid[i][j].groupID;
					}else{
						if(pGrid[i-1][j-1].used == true && pGrid[i-1][j-1].groupID != 0)  //1
						{
							nMaxDens = pGrid[i-1][j-1].density;
							nGroupID = pGrid[i-1][j-1].groupID;
						}
						if(pGrid[i][j-1].used == true && pGrid[i][j-1].groupID != 0)   //2
						{
							if(nMaxDens < pGrid[i][j-1].density)
							{
								nMaxDens = pGrid[i][j-1].density;
								nGroupID = pGrid[i][j-1].groupID;
							}
						}
						if(pGrid[i+1][j-1].used == true && pGrid[i+1][j-1].groupID != 0)  //3
						{
							if(nMaxDens < pGrid[i+1][j-1].density)
							{
								nMaxDens = pGrid[i+1][j-1].density;
								nGroupID = pGrid[i+1][j-1].groupID;
							}
						}
						if(pGrid[i-1][j].used == true && pGrid[i-1][j].groupID != 0)   //4
						{
							if(nMaxDens < pGrid[i-1][j].density)
							{
								nMaxDens = pGrid[i-1][j].density;
								nGroupID = pGrid[i-1][j].groupID;
							}

⌨️ 快捷键说明

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