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

📄 textoutview.cpp

📁 这是用来进行模式识别的参考程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
   temparea=MyArea1[iArea];//用临时变量来存储要分开的区域
   MyArea1[iArea].Cnt1=0;//清空原来的区域

   for(Temp=0;Temp<temparea.Cnt1;Temp++)
   {
	  CPoint p;
	  p=temparea.myLine1[Temp].GetMid1();
      if(p.y-midline1.point1[0].y-midline1.Getk1()*(p.x-midline1.point1[0].x)<0)//若边界中点在中垂线负边
	  {//存放于原来的区域地址中
		  MyArea1[iArea].myLine1[MyArea1[iArea].Cnt1]=temparea.myLine1[Temp];
		  MyArea1[iArea].Cnt1++;
	  }
	  else
	  {//其他的存放于区域数组的末尾的新区域
		  MyArea1[AreaCnt1].myLine1[MyArea1[AreaCnt1].Cnt1]=temparea.myLine1[Temp];
		  MyArea1[AreaCnt1].Cnt1++;
	  }
   }
   MyArea1[iArea].myLine1[MyArea1[iArea].Cnt1].point1[0]=p1;
   MyArea1[iArea].myLine1[MyArea1[iArea].Cnt1].point1[1]=p2;
   MyArea1[iArea].myLine1[MyArea1[iArea].Cnt1].LineSide1=0;
   MyArea1[iArea].Cnt1++;
   //加入负边中垂线到原区域
   MyArea1[AreaCnt1].myLine1[MyArea1[AreaCnt1].Cnt1].point1[0]=p1;
   MyArea1[AreaCnt1].myLine1[MyArea1[AreaCnt1].Cnt1].point1[1]=p2;
   MyArea1[AreaCnt1].myLine1[MyArea1[AreaCnt1].Cnt1].LineSide1=1;
   MyArea1[AreaCnt1].Cnt1++;
   //正边中垂线加入新区域
   
   for(Temp=0;Temp<wCnt;Temp++)
   {
	   if(mpW[Temp].iBelong==iArea)
	   {
		   if(mpW[Temp].y-midline1.point1[0].y-midline1.Getk1()*(mpW[Temp].x-midline1.point1[0].x)>0)
		   {//处于正边的点放到新的区域中去
			   mpW[Temp].iBelong=AreaCnt1;
		   }
		   else if(mpW[Temp].y-midline1.point1[0].y-midline1.Getk1()*(mpW[Temp].x-midline1.point1[0].x)==0)
		   {//如果该点在中垂线上
			   if(minline1.point1[0].y-midline1.point1[0].y-midline1.Getk1()*(minline1.point1[0].x-midline1.point1[0].x)>0)
			   {//被分开的最近距离两点中的x在中垂线的正边
				   mpW[Temp].iBelong=AreaCnt1;//把在中垂线上的o点也分到正边,以便以后接着分
			   }
		   }
	   }
   }
   for(Temp=0;Temp<sCnt;Temp++)
   {
	   if(mpS[Temp].iBelong==iArea)
	   {//处于正边的点放到新的区域中去
		   if(mpS[Temp].y-midline1.point1[0].y-midline1.Getk1()*(mpS[Temp].x-midline1.point1[0].x)>0)
		   {
			   mpS[Temp].iBelong=AreaCnt1;
		   }
		   else if(mpS[Temp].y-midline1.point1[0].y-midline1.Getk1()*(mpS[Temp].x-midline1.point1[0].x)==0)
		   {//如果该点在中垂线上
			   if(minline1.point1[1].y-midline1.point1[0].y-midline1.Getk1()*(minline1.point1[1].x-midline1.point1[0].x)>0)
			   {//被分开的最近距离两点中的o在中垂线的正边
				   mpS[Temp].iBelong=AreaCnt1;//把中垂线上的x点也分到正边,以便以后接着分
			   }
		   }
	   }
   }

   AreaCnt1++;//区域数加一
}
  
int CTextoutView::IsPure1(int iArea)
{
	int iflag=0;
	int Temp;
	for(Temp=0;Temp<wCnt;Temp++)
   {
	   if(mpW[Temp].iBelong==iArea)
	   {
		   iflag++;
		   break;
	   }
   }
   for(Temp=0;Temp<sCnt;Temp++)
   {
	   if(mpS[Temp].iBelong==iArea)
	   {
		   iflag++;
		   break;
	   }
   }
   return iflag;
}

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

BOOL CTextoutView::SameArea1(int i1,int i2)
{
	int f1=0;
	int	f2=0;
	for(int Temp=0;Temp<wCnt;Temp++)
   {
	   if(mpW[Temp].iBelong==i1)
	   {
		   f1=1;
		   break;
	   }
   }
   for(Temp=0;Temp<sCnt&&f1==0;Temp++)
   {
	   if(mpS[Temp].iBelong==i1)
	   {
		   f1=2;
		   break;
	   }
   }
   for(Temp=0;Temp<wCnt;Temp++)
   {
	   if(mpW[Temp].iBelong==i2)
	   {
		   f2=1;
		   break;
	   }
   }
   for(Temp=0;Temp<sCnt&&f2==0;Temp++)
   {
	   if(mpS[Temp].iBelong==i2)
	   {
		   f2=2;
		   break;
	   }
   }
   if(f1==f2) return 1;
   else return 0;
}


void CTextoutView::Result1()
{
	for(int t1=0;t1<AreaCnt1;t1++)
	{//依次找出相同种类区域的相同边界,然后删掉
		for(int t2=t1+1;t2<AreaCnt1;t2++)
		{
			if(SameArea1(t1,t2))
			{
				for(int t3=0;t3<MyArea1[t1].Cnt1;t3++)
				{
					for(int t4=0;t4<MyArea1[t2].Cnt1;t4++)
						if(SameLine1(MyArea1[t2].myLine1[t4],MyArea1[t1].myLine1[t3]))
						{
							MyArea1[t2].DelLine1(t4);
							MyArea1[t1].DelLine1(t3);
						}
				}
			}
		}
	}
    for(t1=0;t1<AreaCnt1;t1++)
	{//把结果放到一个line数组里面
		for(int t2=0;t2<MyArea1[t1].Cnt1;t2++)
		{
			for(int t3=0;t3<iCnt1;t3++)
			{
				if(SameLine1(MyArea1[t1].myLine1[t2],ResultLine1[t3]))
					break;//如果结果line数组里面已经有了这条线,跳出,找该区的下一条线
			}
			if((t3==iCnt1)&&(!MyArea1[t1].myLine1[t2].IsFrame1()))
			{//把是边界的线去掉
				ResultLine1[iCnt1].point1[0]=MyArea1[t1].myLine1[t2].point1[0];
                ResultLine1[iCnt1].point1[1]=MyArea1[t1].myLine1[t2].point1[1];
				iCnt1++;
			}
		}

	}   
}

void CTextoutView::OnStart() //分类函数
{
	for(int i=0;i<wCnt;i++){
		mpX[xCnt].x=mpW[i].x;
		mpX[xCnt].y=mpW[i].y;
		mpX[xCnt].iBelong=0;
		xCnt++;
	}
	for(i=0;i<sCnt;i++){
		mpX[xCnt].x=mpS[i].x;
		mpX[xCnt].y=mpS[i].y;
		mpX[xCnt].iBelong=0;
		xCnt++;
	}
	int Temp=0;
	int flag;
	do
	{
 		flag=0;
		for(Temp=0;Temp<AreaCnt;Temp++)
		{
			if(IsPure(Temp)<=1) continue;
			else
			{
				FindMin(Temp);
				MidLine();
				SplitArea(Temp);
				flag=1;
			}
		}
	}while(flag);

	Result();
    do
	{
 		flag=0;
		for(Temp=0;Temp<AreaCnt1;Temp++)
		{
			if(IsPure1(Temp)<=1) continue;
			else
			{
				FindMin1(Temp);
				midlinee();
				SplitArea1(Temp);
				flag=1;
			}
		}
	}while(flag);

	Result1();

	CTextoutView::Invalidate(1);
}


void CTextoutView::OnRestart() 
{
	oCnt=0;
	xCnt=0;
	iCnt=0;
	sCnt=0;
    wCnt=0;
	MyArea[0].myLine[0].point[0].x=0;
    MyArea[0].myLine[0].point[0].y=0;
	MyArea[0].myLine[0].point[1].x=1000;
	MyArea[0].myLine[0].point[1].y=0;
	MyArea[0].myLine[0].LineSide=1;

    MyArea[0].myLine[1].point[0].x=0;
    MyArea[0].myLine[1].point[0].y=0;
	MyArea[0].myLine[1].point[1].x=0;
	MyArea[0].myLine[1].point[1].y=1000;
	MyArea[0].myLine[1].LineSide=1;

	MyArea[0].myLine[2].point[0].x=1000;
    MyArea[0].myLine[2].point[0].y=0;
	MyArea[0].myLine[2].point[1].x=1000;
	MyArea[0].myLine[2].point[1].y=1000;
	MyArea[0].myLine[2].LineSide=0;

	MyArea[0].myLine[3].point[0].x=0;
    MyArea[0].myLine[3].point[0].y=1000;
	MyArea[0].myLine[3].point[1].x=1000;
	MyArea[0].myLine[3].point[1].y=1000;
	MyArea[0].myLine[3].LineSide=0;

	MyArea[0].Cnt=4;
	
	AreaCnt=1;

	for(int temp=1;temp<100;temp++)
	{
		MyArea[temp].Cnt=0;
	}
    /////
		iCnt1=0;
    
	MyArea1[0].myLine1[0].point1[0].x=0;
    MyArea1[0].myLine1[0].point1[0].y=0;
	MyArea1[0].myLine1[0].point1[1].x=1000;
	MyArea1[0].myLine1[0].point1[1].y=0;
	MyArea1[0].myLine1[0].LineSide1=1;

    MyArea1[0].myLine1[1].point1[0].x=0;
    MyArea1[0].myLine1[1].point1[0].y=0;
	MyArea1[0].myLine1[1].point1[1].x=0;
	MyArea1[0].myLine1[1].point1[1].y=1000;
	MyArea1[0].myLine1[1].LineSide1=1;

	MyArea1[0].myLine1[2].point1[0].x=1000;
    MyArea1[0].myLine1[2].point1[0].y=0;
	MyArea1[0].myLine1[2].point1[1].x=1000;
	MyArea1[0].myLine1[2].point1[1].y=1000;
	MyArea1[0].myLine1[2].LineSide1=0;

	MyArea1[0].myLine1[3].point1[0].x=0;
    MyArea1[0].myLine1[3].point1[0].y=1000;
	MyArea1[0].myLine1[3].point1[1].x=1000;
	MyArea1[0].myLine1[3].point1[1].y=1000;
	MyArea1[0].myLine1[3].LineSide1=0;

	MyArea1[0].Cnt1=4;
	
	AreaCnt1=1;

	for(temp=1;temp<100;temp++)
	{
		MyArea1[temp].Cnt1=0;
	}
	CTextoutView::Invalidate(1);
}

void CTextoutView::OnUndosort() 
{
	iCnt=0;
    
	MyArea[0].myLine[0].point[0].x=0;
    MyArea[0].myLine[0].point[0].y=0;
	MyArea[0].myLine[0].point[1].x=1000;
	MyArea[0].myLine[0].point[1].y=0;
	MyArea[0].myLine[0].LineSide=1;

    MyArea[0].myLine[1].point[0].x=0;
    MyArea[0].myLine[1].point[0].y=0;
	MyArea[0].myLine[1].point[1].x=0;
	MyArea[0].myLine[1].point[1].y=1000;
	MyArea[0].myLine[1].LineSide=1;

	MyArea[0].myLine[2].point[0].x=1000;
    MyArea[0].myLine[2].point[0].y=0;
	MyArea[0].myLine[2].point[1].x=1000;
	MyArea[0].myLine[2].point[1].y=1000;
	MyArea[0].myLine[2].LineSide=0;

	MyArea[0].myLine[3].point[0].x=0;
    MyArea[0].myLine[3].point[0].y=1000;
	MyArea[0].myLine[3].point[1].x=1000;
	MyArea[0].myLine[3].point[1].y=1000;
	MyArea[0].myLine[3].LineSide=0;

	MyArea[0].Cnt=4;
	
	AreaCnt=1;

	for(int temp=1;temp<100;temp++)
	{
		MyArea[temp].Cnt=0;
	}

	for(temp=0;temp<oCnt;temp++)
	{
		mpO[temp].iBelong=0;
	}

	for(temp=0;temp<xCnt;temp++)
	{
		mpX[temp].iBelong=0;
	}
	/////
	iCnt1=0;
    
	MyArea1[0].myLine1[0].point1[0].x=0;
    MyArea1[0].myLine1[0].point1[0].y=0;
	MyArea1[0].myLine1[0].point1[1].x=1000;
	MyArea1[0].myLine1[0].point1[1].y=0;
	MyArea1[0].myLine1[0].LineSide1=1;

    MyArea1[0].myLine1[1].point1[0].x=0;
    MyArea1[0].myLine1[1].point1[0].y=0;
	MyArea1[0].myLine1[1].point1[1].x=0;
	MyArea1[0].myLine1[1].point1[1].y=1000;
	MyArea1[0].myLine1[1].LineSide1=1;

	MyArea1[0].myLine1[2].point1[0].x=1000;
    MyArea1[0].myLine1[2].point1[0].y=0;
	MyArea1[0].myLine1[2].point1[1].x=1000;
	MyArea1[0].myLine1[2].point1[1].y=1000;
	MyArea1[0].myLine1[2].LineSide1=0;

	MyArea1[0].myLine1[3].point1[0].x=0;
    MyArea1[0].myLine1[3].point1[0].y=1000;
	MyArea1[0].myLine1[3].point1[1].x=1000;
	MyArea1[0].myLine1[3].point1[1].y=1000;
	MyArea1[0].myLine1[3].LineSide1=0;

	MyArea1[0].Cnt1=4;
	
	AreaCnt1=1;

	for(temp=1;temp<100;temp++)
	{
		MyArea1[temp].Cnt1=0;
	}

	for(temp=0;temp<wCnt;temp++)
	{
		mpW[temp].iBelong=0;
	}

	for(temp=0;temp<sCnt;temp++)
	{
		mpS[temp].iBelong=0;
	}
	CTextoutView::Invalidate(1);
}

void CTextoutView::OnOne(CPoint point) 
{
        flag=1;
		CTextoutView::Invalidate(1);
}

void CTextoutView::OnTwo(CPoint point) 
{
	    flag=2;
		CTextoutView::Invalidate(1);
 
}

void CTextoutView::OnThree(CPoint point) 
{
 	    flag=3;
		CTextoutView::Invalidate(1);
}

⌨️ 快捷键说明

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