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

📄 tonfaview.cpp

📁 正规(则)表达式转化为NFA
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	CPen zihuanpen;
	stockbrush.CreateStockObject(5);
	colorbrush.CreateSolidBrush(RGB(0,0,0));//清绿色
	Tbrush.CreateSolidBrush(RGB(0,0,0));//鲜澄色
	Dirbrush.CreateSolidBrush(RGB(0,0,0));//清紫色


	colorpen.CreatePen(PS_SOLID,1,RGB(54,54,54));
	redpen.CreatePen(PS_SOLID,1,RGB(223,53,57));//bezier

	quanpen.CreatePen(PS_SOLID,1,RGB(54,54,54));
	zihuanpen.CreatePen(PS_SOLID,1,RGB(54,54,54));

	CPoint PO[4];


	//InitPosition();
	//终结点
	//CString ST;
	//ST.Format("%d",pDoc->T);

	//画线
	int LO=SetDFAPos.LO;
	pDC->SelectObject(&stockbrush);
	pDC->SetBkMode(TRANSPARENT);

	pDC->SetTextColor(RGB(24,71,133));
	pDC->TextOut(SetDFAPos.LOx,SetDFAPos.LOy-50,"DFA状态图");
	//StateTable DFATable;GetDocument()->DFATable;
	ListNode * p;
	for(int i2=0;i2<=SetDFAPos.num;i2++)
	{
				
		p=GetDocument()->DFATable.tableList[i2].next;
		while(p!=NULL)
		{
		//判断直接后趋的结点的状态值
			if((i2<p->data)&&(p->data!=-1)) //大 画直线
			//if((i2<p->data)&&(p->data!='$'))
			{
				pDC->SelectObject(&colorpen);
				pDC->MoveTo(GetDocument()->DFATable.tableList[i2].point.x,GetDocument()->DFATable.tableList[i2].point.y);
				pDC->LineTo(GetDocument()->DFATable.tableList[p->data].point.x,GetDocument()->DFATable.tableList[p->data].point.y);
				//画箭头//10|(01|1)*0|1*# 
				CString sinfo=GetDocument()->ListStr(p->data);
				double h,w;
				w=SetDFAPos.LO*0.2*sinfo.GetLength()/2.0;//椭圆的Width
				h=SetDFAPos.LO*0.5/2.0;//椭圆的Heigth;
				float k;//斜率
		        float af=0.5;//角度
				double x1,y1,x2,y2,ox,oy;

				x1=GetDocument()->DFATable.tableList[i2].point.x;
				y1=GetDocument()->DFATable.tableList[i2].point.y;
				x2=GetDocument()->DFATable.tableList[p->data].point.x;
				y2=GetDocument()->DFATable.tableList[p->data].point.y;	
				k=(y2-y1)/(x2-x1+0.000001);

				ox=x2-w*h/sqrt(pow(h,2)+pow(w,2)*pow(k,2));
				oy=y2-w*h*k/sqrt(pow(h,2)+pow(w,2)*pow(k,2));

					
				pDC->SelectObject(&Dirbrush);
				//pDC->Ellipse(x4-SetDFAPos.LO/6,y4-SetDFAPos.LO/6,x4+SetDFAPos.LO/6,y4+SetDFAPos.LO/6);
				pDC->Ellipse(ox-SetDFAPos.LO/6,oy-SetDFAPos.LO/6,ox+SetDFAPos.LO/6,oy+SetDFAPos.LO/6);

					//---------------------------
				pDC->SetTextColor(RGB(0,0,0));
				//pDC->TextOut((GetDocument()->DFATable.tableList[i2].point.x+LO/2+GetDocument()->DFATable.tableList[p->data].point.x+LO/2)/2,(GetDocument()->DFATable.tableList[i2].point.y+LO/2+GetDocument()->DFATable.tableList[p->data].point.y+LO/2)/2-15,p->token);
				pDC->TextOut((GetDocument()->DFATable.tableList[i2].point.x+GetDocument()->DFATable.tableList[p->data].point.x)/2,(GetDocument()->DFATable.tableList[i2].point.y+LO/2+GetDocument()->DFATable.tableList[p->data].point.y+LO/2)/2-15,p->token);
			
			}
			if((i2==p->data)&&(p->data!=-1))
			//if((i2==p->data)&&(p->data!='$')) //等于 画回路到自己
			{

				pDC->SelectObject(&stockbrush);
				//pDC->SelectObject(&zihuanpen);
				//pDC->Ellipse(GetDocument()->DFATable.tableList[i2].point.x+LO/6,GetDocument()->DFATable.tableList[i2].point.y-LO+LO/3+LO/6,GetDocument()->DFATable.tableList[i2].point.x+5*LO/6,GetDocument()->DFATable.tableList[i2].point.y+LO/6);
				pDC->Ellipse(GetDocument()->DFATable.tableList[i2].point.x-LO/6,GetDocument()->DFATable.tableList[i2].point.y-LO,GetDocument()->DFATable.tableList[i2].point.x+4*LO/6,GetDocument()->DFATable.tableList[i2].point.y+LO/6);
				pDC->SetTextColor(RGB(241,147,115));
			//	pDC->TextOut((GetDocument()->DFATable.tableList[i2].point.x+LO/6+GetDocument()->DFATable.tableList[i2].point.x+5*LO/6)/2,GetDocument()->DFATable.tableList[i2].point.y-LO+5,p->token);
				pDC->TextOut((GetDocument()->DFATable.tableList[i2].point.x+GetDocument()->DFATable.tableList[i2].point.x+4*LO/6)/2,GetDocument()->DFATable.tableList[i2].point.y-LO*4/3,p->token);
			}
			if((i2>p->data)&&(p->data!=-1))
			//if((i2>p->data)&&(p->data!='$')) //小于 画弧线
			{
				pDC->SelectObject(&redpen);
				PO[0]=CPoint(GetDocument()->DFATable.tableList[p->data].point.x,GetDocument()->DFATable.tableList[p->data].point.y);
				PO[3]=CPoint(GetDocument()->DFATable.tableList[i2].point.x,GetDocument()->DFATable.tableList[i2].point.y);
			//	PO[2]=CPoint((PO[0].x+PO[3].x)/2+abs(PO[0].y-PO[3].y)/1.5,(PO[0].y+PO[3].y)/2-abs(PO[0].x-PO[3].x)/6);
				PO[2]=CPoint((PO[0].x+PO[3].x)/2+abs(PO[0].y-PO[3].y)/1.5,(PO[0].y+PO[3].y)/2-abs(PO[0].x-PO[3].x)/6);
				PO[1]=PO[2];//CPoint(((p[0].x+p[3].x)*1)/2+10,((p[0].y+p[3].y)*1)/2-50);					
				pDC->PolyBezier(PO,4);

					//画箭头
	//MessageBox("");
				CString sinfo=GetDocument()->ListStr(p->data);
				double h,w;
				w=SetDFAPos.LO*0.2*sinfo.GetLength()/2.0;//椭圆的Width
				h=SetDFAPos.LO*0.5/2.0;//椭圆的Heigth;
				float k;//斜率
		        float af=0.5;//角度
				double x1,y1,x2,y2,ox,oy;

				x1=PO[1].x;
				y1=PO[1].y;
				x2=PO[0].x;
				y2=PO[0].y;
                   
				k=(y2-y1)/(x2-x1+0.000001);
	
				ox=x2+w*h/sqrt(pow(h,2)+pow(w,2)*pow(k,2));
				oy=y2+w*h*k/sqrt(pow(h,2)+pow(w,2)*pow(k,2));

				pDC->SelectObject(&Dirbrush);
				pDC->Ellipse(ox-SetDFAPos.LO/6,oy-SetDFAPos.LO/6,ox+SetDFAPos.LO/6,oy+SetDFAPos.LO/6);
//10|(01|1)*0|1*#10|(01|1)*0|1*#
			//	pDC->Ellipse(ox-SetDFAPos.LO/6,oy-SetDFAPos.LO/6,ox+SetDFAPos.LO/6,oy+SetDFAPos.LO/6);
			//	pDC->Ellipse(x4-SetDFAPos.LO/6,y4-SetDFAPos.LO/6,x4+SetDFAPos.LO/6,y4+SetDFAPos.LO/6);

					//---------------------------
				pDC->SetTextColor(RGB(54,54,54));
				pDC->TextOut(PO[1].x,PO[1].y,p->token);
			}
			p=p->next;
		}
	}	

	//画结点
	int maxw=0;
	pDC->SelectObject(&colorbrush);
	for(int i=0;i<=SetDFAPos.num;i++)
	{
		CString sinfo=GetDocument()->ListStr(i);
		double h,w;
		w=SetDFAPos.LO*0.2*sinfo.GetLength()/2;//椭圆的Width
		h=SetDFAPos.LO*0.5/2;//椭圆的Heigth;
		if(maxw<w*2)maxw=w*2;
	
		p=GetDocument()->zList.head;
		while(p!=NULL)
		{
			if(p->data==i)
			{
				pDC->SelectObject(&Tbrush);
		//		pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x,GetDocument()->DFATable.tableList[i].point.y,GetDocument()->DFATable.tableList[i].point.x+SetDFAPos.LO,GetDocument()->DFATable.tableList[i].point.y+SetDFAPos.LO);
		//		pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x+SetDFAPos.LO/10,GetDocument()->DFATable.tableList[i].point.y+SetDFAPos.LO/10,GetDocument()->DFATable.tableList[i].point.x+SetDFAPos.LO-SetDFAPos.LO/10,GetDocument()->DFATable.tableList[i].point.y+SetDFAPos.LO-SetDFAPos.LO/10);
				pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x-w,GetDocument()->DFATable.tableList[i].point.y-h,GetDocument()->DFATable.tableList[i].point.x+w,GetDocument()->DFATable.tableList[i].point.y+h);
				pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x-w+w/10,GetDocument()->DFATable.tableList[i].point.y-h+h/10,GetDocument()->DFATable.tableList[i].point.x+w-w/10,GetDocument()->DFATable.tableList[i].point.y+h-h/10);
	    		break;
			}
			p=p->next;
		}
		if(p==NULL)
		{
			pDC->SelectObject(&colorbrush);
			//pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x,GetDocument()->DFATable.tableList[i].point.y,GetDocument()->DFATable.tableList[i].point.x+SetDFAPos.LO,GetDocument()->DFATable.tableList[i].point.y+SetDFAPos.LO);
			pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x-w,GetDocument()->DFATable.tableList[i].point.y-h,GetDocument()->DFATable.tableList[i].point.x+w,GetDocument()->DFATable.tableList[i].point.y+h);
		}
		/*if(GetDocument()->DFATable.tableList[i].next!=NULL)
		{
			pDC->SelectObject(&colorbrush);
			pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x,GetDocument()->DFATable.tableList[i].point.y,GetDocument()->DFATable.tableList[i].point.x+SetDFAPos.LO,GetDocument()->DFATable.tableList[i].point.y+SetDFAPos.LO);
		}
		else //终结点
		{
			pDC->SelectObject(&Tbrush);
			pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x,GetDocument()->DFATable.tableList[i].point.y,GetDocument()->DFATable.tableList[i].point.x+SetDFAPos.LO,GetDocument()->DFATable.tableList[i].point.y+SetDFAPos.LO);
			pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x+SetDFAPos.LO/10,GetDocument()->DFATable.tableList[i].point.y+SetDFAPos.LO/10,GetDocument()->DFATable.tableList[i].point.x+SetDFAPos.LO-SetDFAPos.LO/10,GetDocument()->DFATable.tableList[i].point.y+SetDFAPos.LO-SetDFAPos.LO/10);
		}*/
		//输出数字
		CString CtrNum;
		CtrNum.Format("%d",i);
		int m_length=CtrNum.GetLength();
		pDC->SetTextColor(RGB(255,255,0));
		pDC->TextOut(GetDocument()->DFATable.tableList[i].point.x+(SetDFAPos.LO/2)-w/1.3-23,GetDocument()->DFATable.tableList[i].point.y-h*1.5+(SetDFAPos.LO/2)-15,sinfo);
		//pDC->TextOut(GetDocument()->DFATable.tableList[i].point.x-30+(SetDFAPos.LO/1.7)-m_length*4,GetDocument()->DFATable.tableList[i].point.y-10+(SetDFAPos.LO/2),sinfo);
	}
	//区域
//	
	pDC->BeginPath();
//	CClientDC dc(this);
//	CPoint MyPoint=MyScroll;
//	pDC->DPtoLP(&MyPoint);
	for(i=0;i<=SetDFAPos.num;i++)
	{
		CString sinfo=GetDocument()->ListStr(i);
		int h,w;
		w=SetDFAPos.LO*0.2*sinfo.GetLength();
		h=SetDFAPos.LO;
		pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x-MyScroll.x-w/2,GetDocument()->DFATable.tableList[i].point.y-MyScroll.y-h/2,GetDocument()->DFATable.tableList[i].point.x-MyScroll.x+w/2,GetDocument()->DFATable.tableList[i].point.y-MyScroll.y+h/2);
	//pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x-MyScroll.x,GetDocument()->DFATable.tableList[i].point.y-MyScroll.y,GetDocument()->DFATable.tableList[i].point.x-MyScroll.x+SetDFAPos.LO,GetDocument()->DFATable.tableList[i].point.y-MyScroll.y+SetDFAPos.LO);
	//pDC->Ellipse(GetDocument()->DFATable.tableList[i].point.x-MyPoint.x,GetDocument()->DFATable.tableList[i].point.y-MyPoint.y,GetDocument()->DFATable.tableList[i].point.x+MyPoint.x+SetDFAPos.LO,GetDocument()->DFATable.tableList[i].point.y+MyPoint.y+SetDFAPos.LO);
	}
	pDC->EndPath();
	CRgn trgn;
	trgn.CreateFromPath(pDC);//	(&dc);
	m_DFA.CopyRgn(&trgn);
	trgn.DeleteObject();
//
	stockbrush.DeleteObject();
	colorbrush.DeleteObject();
	Tbrush.DeleteObject();
	Dirbrush.DeleteObject();
	colorpen.DeleteObject();
	redpen.DeleteObject();//bezier
	quanpen.DeleteObject();
	zihuanpen.DeleteObject();
}

void CTONFAView::DrawMINTABLE(CDC* pDC)
{
	CRect rc;
	GetClientRect(rc);
	CPoint MyScroll=GetScrollPosition();
	CRect rc1(MyScroll.x,MyScroll.y,rc.right+MyScroll.x,rc.bottom+MyScroll.y);
	//COLORREF	crBackGroundColor=RGB(255,255,255);
	//if(flag==2)
		//pDC->FillSolidRect(rc1, crBackGroundColor);
	CBrush brush(RGB(200,225,190));
	pDC->SelectObject(&brush);
	pDC->SetBkMode(TRANSPARENT);
	pDC->SetTextColor(RGB(24,71,133));
	pDC->TextOut(DFA_MINTABLE_LEFT,DFA_MINTABLE_TOP-20,"DFA->MINDFA转换表");
	pDC->SetTextColor(RGB(182,41,43));
	//-----------------------------画出DFA->MINDFA转换表
	pDC->Rectangle(DFA_MINTABLE_LEFT,DFA_MINTABLE_TOP,DFA_MINTABLE_LEFT+DFA_MINTABLE_WIDTH*(GetDocument()->letternum+1),DFA_MINTABLE_TOP+DFA_MINTABLE_HEIGHT);
	pDC->MoveTo(DFA_MINTABLE_LEFT,DFA_MINTABLE_TOP);
	pDC->LineTo(DFA_MINTABLE_LEFT+DFA_MINTABLE_WIDTH,DFA_MINTABLE_TOP+DFA_MINTABLE_HEIGHT);
	pDC->TextOut(DFA_MINTABLE_LEFT+100,DFA_MINTABLE_TOP+2,"字符");
	pDC->TextOut(DFA_MINTABLE_LEFT+2,DFA_MINTABLE_TOP+13,"状态集");

	for(int i=0;i<GetDocument()->letternum;i++)
	{
		pDC->MoveTo(DFA_MINTABLE_LEFT+(i+1)*DFA_MINTABLE_WIDTH,DFA_MINTABLE_TOP);
		pDC->LineTo(DFA_MINTABLE_LEFT+(i+1)*DFA_MINTABLE_WIDTH,DFA_MINTABLE_TOP+DFA_MINTABLE_HEIGHT);
		pDC->TextOut(DFA_MINTABLE_LEFT+DFA_MINTABLE_WIDTH*(i+1)+40+DFA_MINTABLE_HEIGHT,DFA_MINTABLE_TOP+10,CString(GetDocument()->character[i]));
	}

	pDC->SetTextColor(RGB(150,100,50));
	//for(i=0;i<=SetMINPos.num;i++)
	int ko=0;
	for(i=0;i<=SetMINPos.num;i++)
	{
		if(GetDocument()->MA[i]->head==NULL)
			continue;
		//画区域
		pDC->Rectangle(DFA_MINTABLE_LEFT,DFA_MINTABLE_TOP+DFA_MINTABLE_HEIGHT*(ko+1),DFA_MINTABLE_LEFT+DFA_MINTABLE_WIDTH*(GetDocument()->letternum+1),DFA_MINTABLE_TOP+DFA_MINTABLE_HEIGHT*(ko+2));
		pDC->TextOut(DFA_MINTABLE_LEFT+5,DFA_MINTABLE_TOP+DFA_MINTABLE_HEIGHT*(ko+1)+5,GetDocument()->ListStrMIN(i));
		
		ListNode * p;
		int j=0;
		p=GetDocument()->MINTable.tableList[i].next;
		//for(int j=0;j<GetDocument()->letternum;j++)
		while(p!=NULL)
		{
			pDC->MoveTo(DFA_MINTABLE_LEFT+DFA_MINTABLE_WIDTH*(j+1),DFA_MINTABLE_TOP+DFA_MINTABLE_HEIGHT*(ko+1));
			pDC->LineTo(DFA_MINTABLE_LEFT+DFA_MINTABLE_WIDTH*(j+1),DFA_MINTABLE_TOP+DFA_MINTABLE_HEIGHT*(ko+2));
			//if(p->data!='$')
			if(p->data!=-1)
				pDC->TextOut(DFA_MINTABLE_LEFT+DFA_MINTABLE_WIDTH*(j+1)+5,DFA_MINTABLE_TOP+DFA_MINTABLE_HEIGHT*(ko+1)+5,GetDocument()->ListStrMIN(p->data));
			//	10|(01|1)*0|1*#			MessageBox("");
			j++;
			p=p->next;
		}
		ko++;
	}



	pDC->BeginPath();
	pDC->Rectangle(DFA_MINTABLE_LEFT-MyScroll.x,DFA_MINTABLE_TOP-MyScroll.y,DFA_MINTABLE_LEFT+DFA_MINTABLE_WIDTH*(GetDocument()->letternum+1)-MyScroll.x,DFA_MINTABLE_TOP+DFA_MINTABLE_HEIGHT*(SetMINPos.num+1)-MyScroll.y);
	pDC->EndPath();
	CRgn trgn;
	trgn.CreateFromPath(pDC);
	m_MINTABLE.CopyRgn(&trgn);
	trgn.DeleteObject();
	brush.DeleteObject();
}

void CTONFAView::DrawMINDFA(CDC* pDC)
{
	CPoint MyScroll=GetScrollPosition();
	CTONFADoc* pDoc = GetDocument();

	ASSERT_VALID(pDoc);
	CBrush stockbrush;
	CBrush colorbrush;
	CBrush Tbrush;//终态结点
	CBrush Dirbrush;//方向点
	CPen redpen;
	CPen colorpen;
	CPen quanpen;
	CPen zihuanpen;
	stockbrush.CreateStockObject(5);
	colorbrush.CreateSolidBrush(RGB(80,166,37));
	Tbrush.CreateSolidBrush(RGB(236,135,14));
	Dirbrush.CreateSolidBrush(RGB(130,115,176));


	colorpen.CreatePen(PS_SOLID,1,RGB(54,54,54));
	redpen.CreatePen(PS_SOLID,1,RGB(223,53,57));//bezier

	quanpen.CreatePen(PS_SOLID,1,RGB(54,54,54));
	zihuanpen.CreatePen(PS_SOLID,1,RGB(54,54,54));

	CPoint PO[4];


	//InitPosition();
	//终结点
	//CString ST;
	//ST.Format("%d",pDoc->T);

	//画线
	int LO=SetMINPos.LO;
	pDC->SelectObject(&stockbrush);
	pDC->SetBkMode(TRANSPARENT);

	pDC->SetTextColor(RGB(24,71,133));
	pDC->TextOut(SetMINPos.LOx,SetMINPos.LOy-50,"MINDFA状态图");
	ListNode * p;
	for(int i2=0;i2<=SetMINPos.num;i2++)
	{
				
		p=GetDocument()->MINTable.tableList[i2].next;
		while(p!=NULL)
		{
		//判断直接后趋的结点的状态值
			if((i2<p->data)&&(p->data!=-1)) //大 画直线
			//if((i2<p->data)&&(p->data!='$'))
			{
				pDC->SelectObject(&colorpen);
				pDC->MoveTo(GetDocument()->MINTable.tableList[i2].point.x,GetDocument()->MINTable.tableList[i2].point.y);
				pDC->LineTo(GetDocument()->MINTable.tableList[p->data].point.x,GetDocument()->MINTable.tableList[p->data].point.y);
				//画箭头//10|(01|1)*0|1*# 
				CString sinfo=GetDocument()->ListStrMIN(p->data);
				double h,w;
				w=SetMINPos.LO*0.2*sinfo.GetLength()/2.0;//椭圆的Width
				h=SetMINPos.LO*0.5/2.0;//椭圆的Heigth;
				float k;//斜率
		        float af=0.5;//角度
				double x1,y1,x2,y2,ox,oy;

				x1=GetDocument()->MINTable.tableList[i2].point.x;
				y1=GetDocument()->MINTable.tableList[i2].point.y;
				x2=GetDocument()->MINTable.tableList[p->data].point.x;
				y2=GetDocument()->MINTable.tableList[p->data].point.y;	
				k=(y2-y1)/(x2-x1+0.000001);

				ox=x2-w*h/sqrt(pow(h,2)+pow(w,2)*pow(k,2));
				oy=y2-w*h*k/sqrt(pow(h,2)+pow(w,2)*pow(k,2));

					
				pDC->SelectObject(&Dirbrush);
				pDC->Ellipse(ox-SetMINPos.LO/6,oy-SetMINPos.LO/6,ox+SetMINPos.LO/6,oy+SetMINPos.LO/6);

					//---------------------------
				pDC->SetTextColor(RGB(0,0,0));
				pDC->TextOut((GetDocument()->MINTable.tableList[i2].point.x+GetDocument()->MINTable.tableList[p->data].point.x)/2,(GetDocument()->MINTable.tableList[i2].point.y+LO/2+GetDocument()->MINTable.tableList[p->data].point.y+LO/2)/2-15,p->token);
			
			}
			if((i2==p->data)&&(p->data!=-1))
			//if((i2==p->data)&&(p->data!='$')) //等于 画回路到自己
			{

				pDC->SelectObject(&stockbrush);
				pDC->Ellipse(GetDocument()->MINTable.tableList[i2].point.x-LO/6,GetDocument()->MINTable.tableList[i2].point.y-LO,GetDocument()->MINTable.tableList[i2].point.x+4*LO/6,GetDocument()->MINTable.tableList[i2].point.y+LO/6);

⌨️ 快捷键说明

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