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

📄 textoutview.cpp

📁 这是用来进行模式识别的参考程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
   for(Temp=0;Temp<MyArea[iArea].Cnt&&flag<2;Temp++)
   {
       k2=MyArea[iArea].myLine[Temp].Getk();
       x2=MyArea[iArea].myLine[Temp].point[0].x;
	   y2=MyArea[iArea].myLine[Temp].point[0].y;

       if(k1-k2>=-0.001&&k1-k2<=0.001) continue;//两条线不能太平行,交点太远,一定不符合要求

	   x=(int)((y2-y1+k1*x1-k2*x2)/(k1-k2)); //算出中垂线与区域边界的交点 
	   if(k2==10000&&x!=x2) x++;             //补回取整的损失
	   y=(int)((k1*k2*(x2-x1)+k2*y1-k1*y2)/(k2-k1));//算出中垂线与区域边界的交点
	   if(k2==0&&y!=y2) y++;                 //不会取整的损失
	
	   if(((x-x2)*(x-MyArea[iArea].myLine[Temp].point[1].x)<=0)&&((y-y2)*(y-MyArea[iArea].myLine[Temp].point[1].y)<=0))
	   {//看该交点是不是在该边界线段内
		   if(flag==0)//找第一个线段内的交点
		   {
			   p1.x=x;
			   p1.y=y;
			   for(int s1=0;s1<AreaCnt;s1++)
			   {
				   if(s1!=iArea)
				   {
					   for(int s2=0;s2<MyArea[s1].Cnt;s2++)
					   {//把所有拥有这个边界的区域的相应边界分开
					       if(SameLine(MyArea[iArea].myLine[Temp],MyArea[s1].myLine[s2]))
						   {
						       MyArea[s1].myLine[MyArea[s1].Cnt].point[0]=MyArea[s1].myLine[s2].point[1];
			                   MyArea[s1].myLine[s2].point[1]=p1;
			                   MyArea[s1].myLine[MyArea[s1].Cnt].point[1]=p1;

						       MyArea[s1].Cnt++;
						   }
					   }
				   }
				   
			   }
		   

			   //把该边界的末头付给新边界的开头
               MyArea[iArea].myLine[MyArea[iArea].Cnt].point[0]=MyArea[iArea].myLine[Temp].point[1];
			   MyArea[iArea].myLine[Temp].point[1]=p1;
			   MyArea[iArea].myLine[MyArea[iArea].Cnt].point[1]=p1;
			   //并把交点付给新旧边界的末头
			   MyArea[iArea].Cnt++;//边界数加一
			   flag++;//去找第二个交点
			   continue;
		   }
		   if(flag==1)//找线段内的第二个交点
		   {
			   p2.x=x;
			   p2.y=y;

			   if(Distance(p1,p2)<=1)  continue;//如果是两个边界的交点,就接着找下一个边界.
			   for(int s1=0;s1<AreaCnt;s1++)
			   {
				   if(s1!=iArea)
				   {
					   for(int s2=0;s2<MyArea[s1].Cnt;s2++)
					   {//把所有拥有这个边界的区域的相应边界分开
					        if(SameLine(MyArea[iArea].myLine[Temp],MyArea[s1].myLine[s2]))
							{
						         MyArea[s1].myLine[MyArea[s1].Cnt].point[0]=MyArea[s1].myLine[s2].point[1];
			                     MyArea[s1].myLine[s2].point[1]=p2;
			                     MyArea[s1].myLine[MyArea[s1].Cnt].point[1]=p2;

						         MyArea[s1].Cnt++;
							}
					   }
				   }
				   
			   }

			   MyArea[iArea].myLine[MyArea[iArea].Cnt].point[0]=MyArea[iArea].myLine[Temp].point[1];
			   MyArea[iArea].myLine[Temp].point[1]=p2;
			   MyArea[iArea].myLine[MyArea[iArea].Cnt].point[1]=p2;

			   MyArea[iArea].Cnt++;
			   flag++;//两个交点全找到,跳出循环
		   }
	   }
   }
   if(flag<=1) 
   {
	   AfxMessageBox("您把两个不同的样本重叠在一起了,无法分开!");
	   ::PostQuitMessage(1);
   }
   area temparea;
   temparea=MyArea[iArea];//用临时变量来存储要分开的区域
   MyArea[iArea].Cnt=0;//清空原来的区域

   for(Temp=0;Temp<temparea.Cnt;Temp++)
   {
	  CPoint p;
	  p=temparea.myLine[Temp].GetMid();
      if(p.y-midline.point[0].y-midline.Getk()*(p.x-midline.point[0].x)<0)//若边界中点在中垂线负边
	  {//存放于原来的区域地址中
		  MyArea[iArea].myLine[MyArea[iArea].Cnt]=temparea.myLine[Temp];
		  MyArea[iArea].Cnt++;
	  }
	  else
	  {//其他的存放于区域数组的末尾的新区域
		  MyArea[AreaCnt].myLine[MyArea[AreaCnt].Cnt]=temparea.myLine[Temp];
		  MyArea[AreaCnt].Cnt++;
	  }
   }
   MyArea[iArea].myLine[MyArea[iArea].Cnt].point[0]=p1;
   MyArea[iArea].myLine[MyArea[iArea].Cnt].point[1]=p2;
   MyArea[iArea].myLine[MyArea[iArea].Cnt].LineSide=0;
   MyArea[iArea].Cnt++;
   //加入负边中垂线到原区域
   MyArea[AreaCnt].myLine[MyArea[AreaCnt].Cnt].point[0]=p1;
   MyArea[AreaCnt].myLine[MyArea[AreaCnt].Cnt].point[1]=p2;
   MyArea[AreaCnt].myLine[MyArea[AreaCnt].Cnt].LineSide=1;
   MyArea[AreaCnt].Cnt++;
   //正边中垂线加入新区域

   
   for(Temp=0;Temp<oCnt;Temp++)
   {
	   if(mpO[Temp].iBelong==iArea)
	   {
		   if(mpO[Temp].y-midline.point[0].y-midline.Getk()*(mpO[Temp].x-midline.point[0].x)>0)
		   {//处于正边的点放到新的区域中去
			   mpO[Temp].iBelong=AreaCnt;
		   }
		   else if(mpO[Temp].y-midline.point[0].y-midline.Getk()*(mpO[Temp].x-midline.point[0].x)==0)
		   {//如果该点在中垂线上
			   if(minline.point[0].y-midline.point[0].y-midline.Getk()*(minline.point[0].x-midline.point[0].x)>0)
			   {//被分开的最近距离两点中的x在中垂线的正边
				   mpO[Temp].iBelong=AreaCnt;//把在中垂线上的o点也分到正边,以便以后接着分
			   }
		   }
	   }
   }
   for(Temp=0;Temp<xCnt;Temp++)
   {
	   if(mpX[Temp].iBelong==iArea)
	   {//处于正边的点放到新的区域中去
		   if(mpX[Temp].y-midline.point[0].y-midline.Getk()*(mpX[Temp].x-midline.point[0].x)>0)
		   {
			   mpX[Temp].iBelong=AreaCnt;
		   }
		   else if(mpX[Temp].y-midline.point[0].y-midline.Getk()*(mpX[Temp].x-midline.point[0].x)==0)
		   {//如果该点在中垂线上
			   if(minline.point[1].y-midline.point[0].y-midline.Getk()*(minline.point[1].x-midline.point[0].x)>0)
			   {//被分开的最近距离两点中的o在中垂线的正边
				   mpX[Temp].iBelong=AreaCnt;//把中垂线上的x点也分到正边,以便以后接着分
			   }
		   }
	   }
   }

   AreaCnt++;//区域数加一
}
  
int CTextoutView::IsPure(int iArea)
{
	int iflag=0;
	int Temp;
	for(Temp=0;Temp<oCnt;Temp++)
   {
	   if(mpO[Temp].iBelong==iArea)
	   {
		   iflag++;
		   break;
	   }
   }
   for(Temp=0;Temp<xCnt;Temp++)
   {
	   if(mpX[Temp].iBelong==iArea)
	   {
		   iflag++;
		   break;
	   }
   }
   return iflag;
}

BOOL CTextoutView::SameLine(line l1,line l2)
{
	BOOL t1,t2;
	t1=(l1.point[0]==l2.point[0]&&l1.point[1]==l2.point[1]);
	t2=(l1.point[0]==l2.point[1]&&l1.point[1]==l2.point[0]);
	if(t1||t2)
	{
		return 1;
	}
	else 
		return 0;
}

BOOL CTextoutView::SameArea(int i1,int i2)
{
	int f1=0;
	int	f2=0;
	for(int Temp=0;Temp<oCnt;Temp++)
   {
	   if(mpO[Temp].iBelong==i1)
	   {
		   f1=1;
		   break;
	   }
   }
   for(Temp=0;Temp<xCnt&&f1==0;Temp++)
   {
	   if(mpX[Temp].iBelong==i1)
	   {
		   f1=2;
		   break;
	   }
   }
   for(Temp=0;Temp<oCnt;Temp++)
   {
	   if(mpO[Temp].iBelong==i2)
	   {
		   f2=1;
		   break;
	   }
   }
   for(Temp=0;Temp<xCnt&&f2==0;Temp++)
   {
	   if(mpX[Temp].iBelong==i2)
	   {
		   f2=2;
		   break;
	   }
   }
   if(f1==f2) return 1;
   else return 0;
}


void CTextoutView::Result()
{
	for(int t1=0;t1<AreaCnt;t1++)
	{//依次找出相同种类区域的相同边界,然后删掉
		for(int t2=t1+1;t2<AreaCnt;t2++)
		{
			if(SameArea(t1,t2))
			{
				for(int t3=0;t3<MyArea[t1].Cnt;t3++)
				{
					for(int t4=0;t4<MyArea[t2].Cnt;t4++)
						if(SameLine(MyArea[t2].myLine[t4],MyArea[t1].myLine[t3]))
						{
							MyArea[t2].DelLine(t4);
							MyArea[t1].DelLine(t3);
						}
				}
			}
		}
	}
    for(t1=0;t1<AreaCnt;t1++)
	{//把结果放到一个line数组里面
		for(int t2=0;t2<MyArea[t1].Cnt;t2++)
		{
			for(int t3=0;t3<iCnt;t3++)
			{
				if(SameLine(MyArea[t1].myLine[t2],ResultLine[t3]))
					break;//如果结果line数组里面已经有了这条线,跳出,找该区的下一条线
			}
			if((t3==iCnt)&&(!MyArea[t1].myLine[t2].IsFrame()))
			{//把是边界的线去掉
				ResultLine[iCnt].point[0]=MyArea[t1].myLine[t2].point[0];
                ResultLine[iCnt].point[1]=MyArea[t1].myLine[t2].point[1];
				iCnt++;
			}
		}

	}   
}
void CTextoutView::FindMin1(int iArea)
{
    long Temp1,Temp2;
	long MinDis=1000000;
	long CurDis;
	for(Temp1=0;Temp1<wCnt;Temp1++)
	{
        for(Temp2=0;Temp2<sCnt;Temp2++)
		{
			if(mpW[Temp1].iBelong==iArea&&mpS[Temp2].iBelong==iArea)
			{
				CurDis=Distance(mpS[Temp2],mpW[Temp1]);
				if(CurDis<MinDis)
				{
					MinDis=CurDis;
					minline1.point1[0].x=mpS[Temp2].x;//最近距离连线的第一个点是x
					minline1.point1[0].y=mpS[Temp2].y;
					minline1.point1[1].x=mpW[Temp1].x;//第二个点是o
					minline1.point1[1].y=mpW[Temp1].y;
				}
			}
		}
	}
}

 

void CTextoutView::midlinee()
{
   double k1,k2;
   CPoint p1,p2;
   double x,y;
   x=(minline1.point1[0].x+minline1.point1[1].x)/2;
   y=(minline1.point1[0].y+minline1.point1[1].y)/2;
   k1=minline1.Getk1();
   if(k1==0)
	   k2=10000;
   else k2=-1/k1;
   if(k2>1||k2<-1)
   {
	   p1.y=0;
	   p1.x=(int)(x-y/k2);
	   p2.y=1000;
	   p2.x=(int)((1000-y)/k2+x);
   }
   else
   {
	   p1.x=0;
	   p1.y=(int)(y-k2*x);
	   p2.x=1000;
	   p2.y=(int)(y+k2*(1000-x));
   }
   midline1.point1[0].x=p1.x;
   midline1.point1[0].y=p1.y;
   midline1.point1[1].x=p2.x;
   midline1.point1[1].y=p2.y;
}

void CTextoutView::SplitArea1(int iArea)
{
   CPoint p1;
   CPoint p2;
   int flag=0;
   int Temp;
   double k1,k2;
   int x,y,x1,y1,x2,y2;
   k1=midline1.Getk1();
   x1=midline1.point1[0].x;
   y1=midline1.point1[0].y;
   for(Temp=0;Temp<MyArea1[iArea].Cnt1&&flag<2;Temp++)
   {
       k2=MyArea1[iArea].myLine1[Temp].Getk1();
       x2=MyArea1[iArea].myLine1[Temp].point1[0].x;
	   y2=MyArea1[iArea].myLine1[Temp].point1[0].y;

       if(k1-k2>=-0.001&&k1-k2<=0.001) continue;//两条线不能太平行,交点太远,一定不符合要求

	   x=(int)((y2-y1+k1*x1-k2*x2)/(k1-k2)); //算出中垂线与区域边界的交点 
	   if(k2==10000&&x!=x2) x++;             //补回取整的损失
	   y=(int)((k1*k2*(x2-x1)+k2*y1-k1*y2)/(k2-k1));//算出中垂线与区域边界的交点
	   if(k2==0&&y!=y2) y++;                 //不会取整的损失
	
	   if(((x-x2)*(x-MyArea1[iArea].myLine1[Temp].point1[1].x)<=0)&&((y-y2)*(y-MyArea1[iArea].myLine1[Temp].point1[1].y)<=0))
	   {//看该交点是不是在该边界线段内
		   if(flag==0)//找第一个线段内的交点
		   {
			   p1.x=x;
			   p1.y=y;
			   for(int s1=0;s1<AreaCnt1;s1++)
			   {
				   if(s1!=iArea)
				   {
					   for(int s2=0;s2<MyArea1[s1].Cnt1;s2++)
					   {//把所有拥有这个边界的区域的相应边界分开
					       if(SameLine1(MyArea1[iArea].myLine1[Temp],MyArea1[s1].myLine1[s2]))
						   {
						       MyArea1[s1].myLine1[MyArea1[s1].Cnt1].point1[0]=MyArea1[s1].myLine1[s2].point1[1];
			                   MyArea1[s1].myLine1[s2].point1[1]=p1;
			                   MyArea1[s1].myLine1[MyArea1[s1].Cnt1].point1[1]=p1;

						       MyArea1[s1].Cnt1++;
						   }
					   }
				   }
				   
			   }
		   

			   //把该边界的末头付给新边界的开头
               MyArea1[iArea].myLine1[MyArea1[iArea].Cnt1].point1[0]=MyArea1[iArea].myLine1[Temp].point1[1];
			   MyArea1[iArea].myLine1[Temp].point1[1]=p1;
			   MyArea1[iArea].myLine1[MyArea1[iArea].Cnt1].point1[1]=p1;
			   //并把交点付给新旧边界的末头
			   MyArea1[iArea].Cnt1++;//边界数加一
			   flag++;//去找第二个交点
			   continue;
		   }
		   if(flag==1)//找线段内的第二个交点
		   {
			   p2.x=x;
			   p2.y=y;

			   if(Distance(p1,p2)<=1)  continue;//如果是两个边界的交点,就接着找下一个边界.
			   for(int s1=0;s1<AreaCnt1;s1++)
			   {
				   if(s1!=iArea)
				   {
					   for(int s2=0;s2<MyArea1[s1].Cnt1;s2++)
					   {//把所有拥有这个边界的区域的相应边界分开
					        if(SameLine1(MyArea1[iArea].myLine1[Temp],MyArea1[s1].myLine1[s2]))
							{
						         MyArea1[s1].myLine1[MyArea1[s1].Cnt1].point1[0]=MyArea1[s1].myLine1[s2].point1[1];
			                     MyArea1[s1].myLine1[s2].point1[1]=p2;
			                     MyArea1[s1].myLine1[MyArea1[s1].Cnt1].point1[1]=p2;

						         MyArea1[s1].Cnt1++;
							}
					   }
				   }
				   
			   }

			   MyArea1[iArea].myLine1[MyArea1[iArea].Cnt1].point1[0]=MyArea1[iArea].myLine1[Temp].point1[1];
			   MyArea1[iArea].myLine1[Temp].point1[1]=p2;
			   MyArea1[iArea].myLine1[MyArea1[iArea].Cnt1].point1[1]=p2;

			   MyArea1[iArea].Cnt1++;
			   flag++;//两个交点全找到,跳出循环
		   }
	   }
   }
   if(flag<=1) 
   {
	   AfxMessageBox("您把两个不同的样本重叠在一起了,无法分开!");
	   ::PostQuitMessage(1);
   }
   area1 temparea;

⌨️ 快捷键说明

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