📄 testdlg.cpp
字号:
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 + -