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

📄 gatherdlg.cpp

📁 一个关于聚类应用的程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			}
			if(single[0]==0&&single[1]==0&&single[2]==0&&single[3]==0&&single[4]==0
				&&single[5]==1&&single[6]==0&&single[7]==0&&single[8]==0&&single[9]==0)
			{
				crColor1=pDC4.SetPixel( i+600,j, RGB(0,255,255));
			}
			if(single[0]==0&&single[1]==0&&single[2]==0&&single[3]==0&&single[4]==0
				&&single[5]==0&&single[6]==1&&single[7]==0&&single[8]==0&&single[9]==0)
			{
				crColor1=pDC4.SetPixel( i+600,j, RGB(128,0,128));
			}
			if(single[0]==0&&single[1]==0&&single[2]==0&&single[3]==0&&single[4]==0
				&&single[5]==0&&single[6]==0&&single[7]==1&&single[8]==0&&single[9]==0)
			{
				crColor1=pDC4.SetPixel( i+600,j, RGB(0,128,128));
			}
			if(single[0]==0&&single[1]==0&&single[2]==0&&single[3]==0&&single[4]==0
				&&single[5]==0&&single[6]==0&&single[7]==0&&single[8]==1&&single[9]==0)
			{
				crColor1=pDC4.SetPixel( i+600,j, RGB(116,202,240));
			}
			if(single[0]==0&&single[1]==0&&single[2]==0&&single[3]==0&&single[4]==0
				&&single[5]==0&&single[6]==0&&single[7]==0&&single[8]==0&&single[9]==1)
			{
				crColor1=pDC4.SetPixel( i+600,j, RGB(0,0,0));
			}
			
		
		ii++;

	
		}
	
	}

	JuLeiCiShuXianShi++;
	UpdateData(FALSE);
	ReleaseDC(&pDC4);

}

void CGatherDlg::ChargeAndGive(int kk)///kk是类数的参数调用此函数时要用到循环
{
		int ii=0;
	leineiyangbengeshu=0;
	for(i=0;i<wide;i++)
	{
		for(j=0;j<hieght;j++)
		{
             
/////////////////////一维模式的聚类////////////////	
			if(juleimoshi==2)
			{
			 if(gdt[kk][ii]==1)
			 {
				 gdata1[i][j]=gdata[i][j];
				 leineiyangbengeshu++;
			 }
			 if(gdt[kk][ii]==0)
			 {
				 gdata1[i][j]=0;	
			 }
			}


			if(juleimoshi==1)
			{
			 if(rdt[kk][ii]==1)
			 {
				 rdata1[i][j]=rdata[i][j];
				 leineiyangbengeshu++;
			 }
			 if(rdt[kk][ii]==0)
			 {
				 rdata1[i][j]=0;
			 }
			}
			 
			 if(juleimoshi==3)
			 {
			 if(bdt[kk][ii]==1)
			 {
				 bdata1[i][j]=bdata[i][j];
				 leineiyangbengeshu++;
			 }
			 if(bdt[kk][ii]==0)
			 {
				 bdata1[i][j]=0;
			 }
			 }
////////////////////////二维模式的///////////////////////////////
			 if(juleimoshi==4)
			 {
             if(gdt[kk][ii]==1&&rdt[kk][ii]==1)
			 {
             gdata1[i][j]=gdata[i][j];
			 rdata1[i][j]=rdata[i][j];
			 leineiyangbengeshu++;
			 }
             if(gdt[kk][ii]==0&&rdt[kk][ii]==0)
			 {
             gdata1[i][j]=0;
			 rdata1[i][j]=0;
			 }
             }
  
			 if(juleimoshi==5)
			 {
			 if(rdt[kk][ii]==1&&bdt[kk][ii]==1)
			 {
			 rdata1[i][j]=rdata[i][j];
			 bdata1[i][j]=bdata[i][j];
			 leineiyangbengeshu++;
			 }
			 if(rdt[kk][ii]==0&&bdt[kk][ii]==0)
			 {
			 rdata1[i][j]=0;
			 bdata1[i][j]=0;
			 }
			 }
			   
			 if(juleimoshi==6)
			 {
			 if(bdt[kk][ii]==1&&gdt[kk][ii]==1)
			 {
			 bdata1[i][j]=bdata[i][j];
			 gdata1[i][j]=gdata[i][j];
			 leineiyangbengeshu++;
			 }
			 if(bdt[kk][ii]==0&&gdt[kk][ii]==0)
			 {
		     bdata1[i][j]=0;
			 gdata1[i][j]=0;
			 }
             }

///////////////////////三位模式的聚类///////////////////////////
			 if(juleimoshi==7)
			 {
			 if(bdt[kk][ii]==1&&gdt[kk][ii]==1&&rdt[kk][ii]==1)
			 {
				 bdata1[i][j]=bdata[i][j];
				 gdata1[i][j]=gdata[i][j];
				 rdata1[i][j]=rdata[i][j];
				 leineiyangbengeshu++;
			 }
			 if(bdt[kk][ii]==0&&gdt[kk][ii]==0&&rdt[kk][ii]==0)
			 {
				 bdata1[i][j]=0;
				 gdata1[i][j]=0;
				 rdata1[i][j]=0;
			 }
             }

			ii++;
		}
	}

}

void CGatherDlg::Check(int lei)
{
	int c=0;
	int c11=0;
	int c12=0;
	for(i=0;i<wide*hieght;i++)
	{
		for(j=0;j<lei;j++)
		{
			if(gdt[j][i]==1)
			{
				c++;
			}
			if(c>1)
			{
				c11++;//错误个数
			}
			if(c==1)
			{
				c12++;//1的个数
			}
			
		}
		c=0;
	}
	

}

void CGatherDlg::Gather(float yuzhi, int shangxian, int leishu, myRGB rgbGther[])
{
		
	int ii=0;
	int cishu=0;
	int mincount_dis;//最小距离在数组中的序号
    int mincount_g,mincount_r,mincount_b,mincount_rg,mincount_rb,mincount_bg;
	double  gd[10],rd[10],bd[10];
	double  dis[10],dis_rg[10],dis_rb[10],dis_bg[10];
	double a=0,b=0,c=0;//分别为G,R,B的平均值
	//double  *d1,*d2,*d3;

 while(cishu<shangxian)
 {
    /////////////////////////////////////////////	 
	 //pDC5.SetPixelV(700+zhongxin1,10,(0,0,255));
     //pDC5.SetPixelV(700+zhongxin2,10,(0,0,255));
	 SetZero(leishu,0);
	 ii=0;
	 for(i=0;i<wide;i++)
		 {
			 for(j=0;j<hieght;j++)
			 {
				 for(int lei=0;lei<leishu;lei++)
				 {
					 if(juleimoshi==2)
					 {gd[lei]=fabs((gdata[i][j]-rgbGther[lei].G));}
                     
					 if(juleimoshi==1)
                     {rd[lei]=fabs((rdata[i][j]-rgbGther[lei].R));}

                     if(juleimoshi==3)
					 {bd[lei]=fabs((bdata[i][j]-rgbGther[lei].B));}
					 
					 if(juleimoshi==7)
					 {
						 bd[lei]=fabs((bdata[i][j]-rgbGther[lei].B));
						 gd[lei]=fabs((gdata[i][j]-rgbGther[lei].G));
						 rd[lei]=fabs((rdata[i][j]-rgbGther[lei].R));
						 dis[lei]=(pow(gd[lei],2)+pow(rd[lei],2)+pow(bd[lei],2));}
                     
					 if(juleimoshi==4)
                     {
						 gd[lei]=fabs((gdata[i][j]-rgbGther[lei].G));
						 rd[lei]=fabs((rdata[i][j]-rgbGther[lei].R));
						 dis_rg[lei]=(pow(gd[lei],2)+pow(rd[lei],2));}

                     if(juleimoshi==5) 
					 {
						 bd[lei]=fabs((bdata[i][j]-rgbGther[lei].B));
						 rd[lei]=fabs((rdata[i][j]-rgbGther[lei].R));
						 dis_rb[lei]=(pow(bd[lei],2)+pow(rd[lei],2));}
                     
					 if(juleimoshi==6)
					 {
						 gd[lei]=fabs((gdata[i][j]-rgbGther[lei].G));
						 bd[lei]=fabs((bdata[i][j]-rgbGther[lei].B));
						 dis_bg[lei]=(pow(gd[lei],2)+pow(bd[lei],2));}

					 //ShowCenter(rgbGther,lei);

				 }
 //////////////////三维模式的聚类///////////////////////////////
				 if(juleimoshi==7)
				 {
				 
					 mincount_dis=Min(dis,leishu);				
				 for(lei=0;lei<leishu;lei++)
				 {
					 if(lei==mincount_dis)
					 {
                          gdt[lei][ii]=1;
						  rdt[lei][ii]=1;
						  bdt[lei][ii]=1;

					 }
					 if(lei!=mincount_dis)
					 {
						 gdt[lei][ii]=0;
						 rdt[lei][ii]=0;
						 bdt[lei][ii]=0;

					 }
				 }
				 }
/////////////////////////一维模式R的///////////////////////////
				 if(juleimoshi==1)
				 {
				 
				 mincount_r=Min(rd,leishu);
				 for(lei=0;lei<leishu;lei++)
				 {
					 if(lei==mincount_r)
					 {
						 rdt[lei][ii]=1;	 
					 }
					 if(lei!=mincount_r)
					 {
						 rdt[lei][ii]=0;						 
					 }
				 }
				 }
/////////////////////////一维模式G的///////////////////////////
				 if(juleimoshi==2)
				 {
				 
				 mincount_g=Min(gd,leishu);
				 for(lei=0;lei<leishu;lei++)
				 {
					 if(lei==mincount_g)
					 {
						 gdt[lei][ii]=1;	 
					 }
					 if(lei!=mincount_g)
					 {
						 gdt[lei][ii]=0;						 
					 }
				 }
				 }
/////////////////////////一维模式B的///////////////////////////
				 if(juleimoshi==3)
				 {
				 
				 mincount_b=Min(bd,leishu);
				 for(lei=0;lei<leishu;lei++)
				 {
					 if(lei==mincount_b)
					 {
						 bdt[lei][ii]=1;	 
					 }
					 if(lei!=mincount_b)
					 {
						 bdt[lei][ii]=0;						 
					 }
				 }
				 }
/////////////////////////二维模式RG的///////////////////////////
				 if(juleimoshi==4)
				 {
				 
				 mincount_rg=Min(dis_rg,leishu);
				 for(lei=0;lei<leishu;lei++)
				 {
					 if(lei==mincount_rg)
					 {
						 gdt[lei][ii]=1;
						 rdt[lei][ii]=1;	 
					 }
					 if(lei!=mincount_rg)
					 {
						 gdt[lei][ii]=0;
						 rdt[lei][ii]=0;
					 }
				 }
				 }
/////////////////////////二维模式RB的///////////////////////////
				 if(juleimoshi==5)
				 {
				 
				 mincount_rb=Min(dis_rb,leishu);
				 for(lei=0;lei<leishu;lei++)
				 {
					 if(lei==mincount_rb)
					 {
						 bdt[lei][ii]=1;
						 rdt[lei][ii]=1;	 
					 }
					 if(lei!=mincount_rb)
					 {
						 bdt[lei][ii]=0;
						 rdt[lei][ii]=0;
					 }
				 }
				 }
/////////////////////////二维模式BG的///////////////////////////
				 if(juleimoshi==6)
				 {
				 
				 mincount_bg=Min(dis_bg,leishu);
				 for(lei=0;lei<leishu;lei++)
				 {
					 if(lei==mincount_bg)
					 {
						 gdt[lei][ii]=1;
						 bdt[lei][ii]=1;	 
					 }
					 if(lei!=mincount_bg)
					 {
						 gdt[lei][ii]=0;
						 bdt[lei][ii]=0;
					 }
				 }
				 }
////////////////////////////////////////////////////////////////
				ii++; 
				 
			 }
		 }
	 //Check(leishu);
	 GatherPintRGB(leishu);

	/////////////////逐类K平均判断//////////////////////////////
	for(int lei=0;lei<leishu;lei++) 
    
	
	{ 
		a=0;
		b=0;
		c=0;
		ChargeAndGive(lei);
		ShowRGB(0, 0, 0, lei,2);//循环显示
    //////////求平均值RGB的//////////////////////////
	if(leineiyangbengeshu!=0)	
		
	{	
		
		for(i=0;i<wide;i++)
	 
		{
		 
			for(j=0;j<hieght;j++)
		 
			{
			a=a+gdata1[i][j];
			b=b+rdata1[i][j];
			c=c+bdata1[i][j];
			 
		 
			}
	 
		}

		
		a=a/leineiyangbengeshu;
	    b=b/leineiyangbengeshu;
		c=c/leineiyangbengeshu;
		
  ///////////////////////////////////////////////
		rgb1[lei].R=b;
		rgb1[lei].G=a;
		rgb1[lei].B=c;
	}

	if(leineiyangbengeshu==0)
	{
		b=rgb1[lei].R;
		a=rgb1[lei].G;
		c=rgb1[lei].B;

	}
   ///////////////////判断点是否移动////////////////////
	if(a!=rgbGther[lei].G||b!=rgbGther[lei].R||c!=rgbGther[lei].B)
    {
    
		WetherMove(lei,cishu+1);
	}
	///////////////////////////////////////////////////
	/////////////////画曲线图///////////////////////////
		
	    PintCenterPoint(rgb1,rgbGther,leishu,lei);

	 
	 
  ////////////根据新求得的平均值与原来的中心点相减和域值比较大小//////////
		

  //////////////三维模式的聚类///////////////////////
     if(leineiyangbengeshu!=0)
	 {
	 
	 if(juleimoshi==7)
	 {
	 if(sqrt(pow(a-rgbGther[lei].G,2)+pow(b-rgbGther[lei].R,2)+pow(c-rgbGther[lei].B,2))>=yuzhi)
	 {
		 rgbGther[lei].G=a;
		 rgbGther[lei].R=b;
		 rgbGther[lei].B=c;
	 }
	 //else
	//	 break;
	 }
 //////////////二维模式/////////////////////////////
	 if(juleimoshi==4)
	 {
	 if(sqrt(pow(a-rgbGther[lei].G,2)+pow(b-rgbGther[lei].R,2))>=yuzhi)
	 {
		 rgbGther[lei].G=a;
		 rgbGther[lei].R=b;
		
	 }
	// else
	//	 break;
	 }
	 if(juleimoshi==6)
	 {
	 if(sqrt(pow(a-rgbGther[lei].G,2)+pow(c-rgbGther[lei].B,2))>=yuzhi)
	 {
		 rgbGther[lei].G=a;
		 rgbGther[lei].B=c;
	 }
	 //else
	//	 break;
	 }

	 if(juleimoshi==5)
	 {
	 if(sqrt(pow(b-rgbGther[lei].R,2)+pow(c-rgbGther[lei].B,2))>=yuzhi)
	 {
		 rgbGther[lei].R=b;
		 rgbGther[lei].B=c;
	 }
	// else
	//	 break;
	 }
/////////////////////////////////一维模式/////////////////////////////
	 if(juleimoshi==2)
	 {
	 if(fabs(a-rgbGther[lei].G)>=yuzhi)
	 {   
		 rgbGther[lei].G=a;
	 }
	// else
	//	 break;
	 }

	 if(juleimoshi==1)
	 {
	 if(fabs(b-rgbGther[lei].R)>=yuzhi)
	 {
		 rgbGther[lei].R=b;
	 }
	 //if(fabs(b-rgbGther[lei].R)<yuzhi)
	//	 break;
	 }

     if(juleimoshi==3)
	 {
	 if(fabs(c-rgbGther[lei].B)>=yuzhi)
	 {
		 rgbGther[lei].B=c;
	 }
	 //else
	//	 break;
	 }


	 }
	 
 }
 cishu++;
 }
////////////////绘图部分/////////////////////

 //Check(leishu);

MessageBox("完成聚类!!");

}

/*void CGatherDlg::OnButton3() 
{
	// TODO: Add your control notification handler code here
	dian=1;
	kuang=0;
	

⌨️ 快捷键说明

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