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

📄 testdlg.cpp

📁 DGCL (An Efficient Density and Grid Based Clustering Algorithm for Large Spatial Database)的实现代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:

void CTestDlg::OnRect() 
{
	int x,y;
	long nNumBuf = 0; // 记录写入文件中数据的个数
	long nRecordNum;
	long tempRecordNum = 0;
	long random_offset;
	double pi = 3.1415926535;
	long temple = 2000000l;
	
	DATA_FILE *dataBuf;
    dataBuf = (DATA_FILE *) malloc(sizeof(DATA_FILE)*temple);	
	
	if((m_dataFile = fopen("data.txt","rb+")) == NULL)
	{
		MessageBox("open file error!");
		return;
	}
	fread(&nRecordNum,sizeof(int),1,m_dataFile);
	if(nRecordNum != 0)
		tempRecordNum = nRecordNum;
	
	srand( (unsigned)time( NULL ) );	
	while(nNumBuf<500000l){              //上面横边
		dataBuf[nNumBuf].id = nNumBuf+tempRecordNum;
		x = rand()*250/RAND_MAX;		
		random_offset = 30*rand()/RAND_MAX;
		dataBuf[nNumBuf].x = x+150;
		dataBuf[nNumBuf].y = 300+random_offset;
		nNumBuf++;
	}
	while(nNumBuf<1000000l){             //下面横边
		dataBuf[nNumBuf].id = nNumBuf+tempRecordNum;
		x = rand()*250/RAND_MAX;
		random_offset = 30*rand()/RAND_MAX;
		dataBuf[nNumBuf].x = x+150;
		dataBuf[nNumBuf].y = 470+random_offset;
		nNumBuf++;
	}
	while(nNumBuf<1500000l){             //左边竖边
        dataBuf[nNumBuf].id = nNumBuf+tempRecordNum;
		y = rand()*140/RAND_MAX;
        random_offset = 30*rand()/RAND_MAX;
		dataBuf[nNumBuf].x = 150+random_offset;
		dataBuf[nNumBuf].y = y+330;
		nNumBuf++;
	}
    while(nNumBuf<2000000l){             //右边竖边
        dataBuf[nNumBuf].id = nNumBuf+tempRecordNum;
		y = rand()*140/RAND_MAX;
        random_offset = 30*rand()/RAND_MAX;
		dataBuf[nNumBuf].x = 370+random_offset;
		dataBuf[nNumBuf].y = y+330;
		nNumBuf++;
	}
	if(nRecordNum != 0)
	{
		nRecordNum += nNumBuf;
		fseek(m_dataFile,0,SEEK_SET);
		fwrite(&nRecordNum,sizeof(int),1,m_dataFile);
		fseek(m_dataFile,sizeof(int)+sizeof(DATA_FILE)*tempRecordNum,SEEK_SET);
	}
	else{
		fseek(m_dataFile,0,SEEK_SET);
		fwrite(&nNumBuf,sizeof(int),1,m_dataFile);
	}
	fwrite((char*)dataBuf,sizeof(DATA_FILE)*temple,1,m_dataFile);
	fclose(m_dataFile);
	delete dataBuf;
}

int CTestDlg::CheckCondition(int gridx, int gridy)
{//用于检查有多少个邻居单元格需要计算
	int result = 0;
	int maxX, maxY;
    
	maxX = maxY = m_IntervalNum-1;  //和下标统一
    
	if(gridx == 0)
		result += 8;
	if(gridx == maxX)
		result += 4;
	if(gridy == 0)
		result += 2;
	if(gridy == maxY)
		result += 1;
	
	return result;
}


int CTestDlg::CheckNeighbors(int x, int y, int gridx, int gridy, int avgInterval)
{
	int test_distance = avgInterval/2;     //考虑邻居单元L/2距离内的点
	int result = 0;
	
	if((y - gridy*avgInterval)<= test_distance)
		result += 8;
	if(((gridx+1)*avgInterval - x) <= test_distance)
		result += 4;
	if(((gridy+1)*avgInterval - y) <= test_distance)
		result += 2;
	if((x-gridx*avgInterval) <= test_distance)
		result += 1;
	
	return result;
}

COLORREF CTestDlg::SelectColor(int colorIndex)
{
	switch(colorIndex) {
	case 0:
		return RGB(0,0,255);  // blue
		break;
	case 1:
		colorbuf[1]="RGB(125,0,0)";
		return RGB(125,0,0); // brown
		break;
	case 2:
		colorbuf[2].Format("%s ","RGB(255,0,255)");
		return RGB(255,0,255); // pink
		break;
	case 3:
		colorbuf[3].Format("%s ","RGB(0,255,0)");
		return RGB(0,255,0); // green
		break;
	case 4:
		colorbuf[4].Format("%s ","RGB(255,255,0)");
		return RGB(255,255,0); // yellow
		break;
	case 5:
		colorbuf[5].Format("%s ","RGB(0,255,255)");
		return RGB(0,255,255); // sky blue
		break;
	case 6:
		colorbuf[6].Format("%s ","RGB(0,0,0)");
		return RGB(0,0,0); // black
		break;
	case 7:
		colorbuf[7].Format("%s ","RGB(0,0,125)");
		return RGB(0,0,125); // navy blue
		break;
	case 8:
		colorbuf[8].Format("%s ","RGB(0,0,255)");
		return RGB(0,0,255);
		break;
	case 9:
		colorbuf[9].Format("%s ","RGB(60,25,200)");
		return RGB(60,25,200);
		break;
	case 10:
		colorbuf[10].Format("%s ","RGB(100,120,200)");
		return RGB(100,120,200);
		break;
	case 11:
		colorbuf[11].Format("%s ","RGB(50,80,90)");
		return RGB(50,80,90);
		break;
	case 12:
		colorbuf[12].Format("%s ","RGB(112,23,69)");
		return RGB(112,23,69);
		break;
	case 13:
		colorbuf[13].Format("%s ","RGB(20,125,30)");
		return RGB(20,125,30);
		break;
	case 14:
		colorbuf[14].Format("%s ","RGB(120,40,30)");
		return RGB(120,100,50);
		break;
	case 15:
		colorbuf[15].Format("%s ","RGB(50,80,220)");
		return RGB(50,80,220);
		break;
//	default:
//		colorbuf[0].Format("%s ","RGB(0,0,255)");
//		return RGB(0,0,255); //red
//		break;
	}
	
}

void CTestDlg::OnCluster() 
{
	//load data set
	int fLength;      //记录文件长度
	long record_num;   //record the number of the data set
	DATA_FILE* pDataFile;
	int gridX,gridY;  //the coordination of the grid array
	//to test the performance of this program
	int nMin,nSec,nMiliSec;
	SYSTEMTIME st;
	GetSystemTime(&st);
	nMin = st.wMinute;
	nSec = st.wSecond;
	nMiliSec = st.wMilliseconds;
	
	if((m_dataFile = fopen("data.txt","rb")) == NULL)
	{
		MessageBox("open file error!");
		return;
	}
	
    fseek(m_dataFile,0,SEEK_END);   //get the length of the file
	fLength = ftell(m_dataFile);
	fseek(m_dataFile,0,SEEK_SET);
	
    char* dataBuf = new char[fLength];   //don't forget delete the memory
	memset(dataBuf,0x00,sizeof(char)*fLength);
	fread(dataBuf,fLength,1,m_dataFile);
	fclose(m_dataFile);
	
	record_num = ((long*)dataBuf)[0];   //get the numbers of data set & set the pointer
	pDataFile = (DATA_FILE*)(dataBuf + sizeof(int));
	
	//construct cell
	//	m_CoefInterval = 15;    //可能后面需要调整

	m_IntervalNum = (long)sqrt(record_num/m_CoefInterval);  //?????????多一个网格或者少一个网格可能会影响最后的结果
	m_interNum.Format("%d",m_IntervalNum);
	UpdateData(FALSE);
	
//	m_IntervalNum = 200;

	GRID_STRUCT** pGrid;// 
	//	pGrid =(GRID_STRUCT **) new char [sizeof(GRID_STRUCT*)*m_IntervalNum];  
	pGrid = (GRID_STRUCT **) malloc(sizeof (GRID_STRUCT*)*m_IntervalNum);   //don't forget delete the memory
    for(int j=0;j<m_IntervalNum;j++)
	{
		pGrid[j]= new GRID_STRUCT[m_IntervalNum];
        memset(pGrid[j],0x00,sizeof(GRID_STRUCT)*m_IntervalNum);
	}
	
	//cell assignment
	int nCheckResult;
	int nNghCheckResult;
	int nAvg_interval = m_gridWidth/m_IntervalNum;
	int count = 0;
//	int test_distance = nAvg_interval/2;     //考虑邻居单元L/2距离内的点
	//	int real_distanceX,real_distanceY;
	for(int i=0;i<record_num;i++)
	{
		gridX = pDataFile[i].x * m_IntervalNum / m_gridWidth;
		gridY = pDataFile[i].y * m_IntervalNum / m_gridHeight;
        if(gridX == m_IntervalNum || gridY == m_IntervalNum)
			continue;
		if(pGrid[gridX][gridY].used == false)
		{
			pGrid[gridX][gridY].used = true;
			count++;
		}
		pGrid[gridX][gridY].density++;
		pGrid[gridX][gridY].realNum++;   //test
		
		//计算周围邻居单元的密度
        nCheckResult = CheckCondition(gridX,gridY);
		nNghCheckResult = CheckNeighbors(pDataFile[i].x,pDataFile[i].y,gridX,gridY,nAvg_interval);
		switch(nCheckResult) {
		case 0:  //all 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 == 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 == 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 == 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;
			}
            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 1:  //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 == 4)
			{
				//				if(pGrid[gridX+1][gridY].used == false)
				//					pGrid[gridX+1][gridY].used = true;
				pGrid[gridX+1][gridY].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;
			}
            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 2:   //5 neighbors
			if(nNghCheckResult == 4)
			{
				//				if(pGrid[gridX+1][gridY].used == false)
				//					pGrid[gridX+1][gridY].used = true;
				pGrid[gridX+1][gridY].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 == 6)

⌨️ 快捷键说明

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