📄 tonfaview.cpp
字号:
if(table.tableList[j1].point.x==table.tableList[i1].point.x)
{
if(table.tableList[j1].point.y>table.tableList[i1].point.y)
table.tableList[j1].point.y=table.tableList[j1].point.y+(table.tableList[i1].count-1)*2*SetDFAPos.LO;
}
}//下面的结点下移
table.tableList[i1].point.y=table.tableList[i1].point.y+(table.tableList[i1].count-1)*SetDFAPos.LO;
//自己居中
/////////////////设置孩子位置x,y
ListNode * p;
p=table.tableList[i1].next;
int i2=0;
while(p!=NULL)
{
//for(int i2=0;i2<table.tableList[i1].count;i2++)
//{
if(table.tableList[p->data].point.x==SetDFAPos.LOx)
{
table.tableList[p->data].point.x=table.tableList[i1].point.x+4*SetDFAPos.LO;
table.tableList[p->data].point.y=table.tableList[i1].point.y+i2*2*SetDFAPos.LO-(table.tableList[i1].count-1)*SetDFAPos.LO;
}
i2++;
p=p->next;
}
}
}
}
void CTONFAView::InitMINPosition(StateTable &table)
{
for(int i=0;i<TABNUM;i++)
{
table.tableList[i].point.x=SetMINPos.LOx;
table.tableList[i].point.y=SetMINPos.LOy;
}
int tempmax=SetMINPos.LOy-2*SetMINPos.LO;
if(table.tableList[0].count!=0)
{
ListNode * p;
p=table.tableList[0].next;
while(p!=NULL)
{
// for(int i=0;i<table.tableList[0].count;i++)
// {
for(int j=0;j<TABNUM;j++)
{
if(table.tableList[j].point.x==table.tableList[0].point.x+4*SetMINPos.LO)
table.tableList[j].point.y=table.tableList[j].point.y-SetMINPos.LO;
}
for(int k=0;k<TABNUM;k++)
{
if(table.tableList[k].point.x==table.tableList[0].point.x+4*SetMINPos.LO)
{
if(table.tableList[k].point.y>tempmax)
tempmax=table.tableList[k].point.y;
}
}
table.tableList[p->data].point.x=table.tableList[0].point.x+4*SetMINPos.LO;
table.tableList[p->data].point.y=tempmax+2*SetMINPos.LO;
tempmax=-100;
p=p->next;
}
}
for(int i1=1;i1<TABNUM;i1++)
{
if(table.tableList[i1].count==1)
{
if(table.tableList[i1].next==NULL)
continue;
if(table.tableList[table.tableList[i1].next->data].point.x==SetMINPos.LOx)
{
table.tableList[table.tableList[i1].next->data].point.x=table.tableList[i1].point.x+4*SetMINPos.LO;
table.tableList[table.tableList[i1].next->data].point.y=table.tableList[i1].point.y;
}
}
if(table.tableList[i1].count>1)
{
for(int j1=0;j1<TABNUM;j1++)
{
if(table.tableList[j1].point.x==table.tableList[i1].point.x)
{
if(table.tableList[j1].point.y>table.tableList[i1].point.y)
table.tableList[j1].point.y=table.tableList[j1].point.y+(table.tableList[i1].count-1)*2*SetMINPos.LO;
}
}//下面的结点下移
table.tableList[i1].point.y=table.tableList[i1].point.y+(table.tableList[i1].count-1)*SetMINPos.LO;
//自己居中
/////////////////设置孩子位置x,y
ListNode * p;
p=table.tableList[i1].next;
int i2=0;
while(p!=NULL)
{
//for(int i2=0;i2<table.tableList[i1].count;i2++)
//{
if(table.tableList[p->data].point.x==SetMINPos.LOx)
{
table.tableList[p->data].point.x=table.tableList[i1].point.x+4*SetMINPos.LO;
table.tableList[p->data].point.y=table.tableList[i1].point.y+i2*2*SetMINPos.LO-(table.tableList[i1].count-1)*SetMINPos.LO;
}
i2++;
p=p->next;
}
}
}
}
void CTONFAView::DrawNFA(CDC* pDC)
{
CRect rc;
GetClientRect(rc);
CPoint MyScroll=GetScrollPosition();
CRect rc1(MyScroll.x,MyScroll.y,rc.right+MyScroll.x,rc.bottom+MyScroll.y);
//CRect rc(0,0,10000,10000);
COLORREF crBackGroundColor=RGB(255,255,255);
//pDC->FillSolidRect(rc, crBackGroundColor);
if(flag==0)
pDC->FillSolidRect(rc1, crBackGroundColor);
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=SetNFAPos.LO;
pDC->SelectObject(&stockbrush);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(24,71,133));
pDC->TextOut(SetNFAPos.LOx,SetNFAPos.LOy-20,"NFA状态图");
//StateTable NFATable;GetDocument()->NFATable;
for(int i2=0;i2<=SetNFAPos.num;i2++)
{
ListNode * p;
p=GetDocument()->NFATable.tableList[i2].next;
while(p!=NULL)
{
//判断直接后趋的结点的状态值
if(i2<p->data) //大 画直线
{
pDC->SelectObject(&colorpen);
pDC->MoveTo(GetDocument()->NFATable.tableList[i2].point.x+LO/2,GetDocument()->NFATable.tableList[i2].point.y+LO/2);
pDC->LineTo(GetDocument()->NFATable.tableList[p->data].point.x+LO/2,GetDocument()->NFATable.tableList[p->data].point.y+LO/2);
//画箭头
float k;//斜率
float af=0.5;//角度
double x1,y1,x2,y2,x3,y3,x4,y4,r;
r=SetNFAPos.LO/2;
x2=GetDocument()->NFATable.tableList[i2].point.x+LO/2;
y2=GetDocument()->NFATable.tableList[i2].point.y+LO/2;
x1=GetDocument()->NFATable.tableList[p->data].point.x+LO/2;
y1=GetDocument()->NFATable.tableList[p->data].point.y+LO/2;
k=(y2-y1)/(x2-x1);
//k=(float)((y2-y1)/(x2-x1));
x3=x1-x2+0.0001;
y3=y1-y2;
k=y3/x3;
x4=x1-sqrt(pow(r,2)/(1+pow(k,2)));
y4=y1+k*(x4-x1);
pDC->SelectObject(&Dirbrush);
pDC->Ellipse(x4-SetNFAPos.LO/6,y4-SetNFAPos.LO/6,x4+SetNFAPos.LO/6,y4+SetNFAPos.LO/6);
//---------------------------
pDC->SetTextColor(RGB(0,0,0));
pDC->TextOut((GetDocument()->NFATable.tableList[i2].point.x+LO/2+GetDocument()->NFATable.tableList[p->data].point.x+LO/2)/2,(GetDocument()->NFATable.tableList[i2].point.y+LO/2+GetDocument()->NFATable.tableList[p->data].point.y+LO/2)/2-15,p->token);
}
if(i2==p->data) //等于 画回路到自己
{
pDC->SelectObject(&stockbrush);
pDC->Ellipse(GetDocument()->NFATable.tableList[i2].point.x+LO/6,GetDocument()->NFATable.tableList[i2].point.y-LO+LO/3+LO/6,GetDocument()->NFATable.tableList[i2].point.x+5*LO/6,GetDocument()->NFATable.tableList[i2].point.y+LO/6);
pDC->SetTextColor(RGB(241,147,115));
pDC->TextOut((GetDocument()->NFATable.tableList[i2].point.x+LO/6+GetDocument()->NFATable.tableList[i2].point.x+5*LO/6)/2,GetDocument()->NFATable.tableList[i2].point.y-LO+5,p->token);
}
if(i2>p->data) //小于 画弧线
{
pDC->SelectObject(&redpen);
PO[0]=CPoint(GetDocument()->NFATable.tableList[p->data].point.x+LO/2,GetDocument()->NFATable.tableList[p->data].point.y+LO/2);
PO[3]=CPoint(GetDocument()->NFATable.tableList[i2].point.x+LO/2,GetDocument()->NFATable.tableList[i2].point.y+LO/2);
// 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)/8);
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);
//画箭头
float k;//斜率
float af=0.5;//角度
double x1,y1,x2,y2,x3,y3,x4,y4,r;
r=SetNFAPos.LO/2;
x2=PO[1].x;
y2=PO[1].y;
x1=PO[0].x;
y1=PO[0].y;
k=(y2-y1)/(x2-x1);
x3=x1-x2+0.0001;
y3=y1-y2;
k=y3/x3;
x4=x1+sqrt(pow(r,2)/(1+pow(k,2)));
y4=y1+k*(x4-x1);
pDC->SelectObject(&Dirbrush);
pDC->Ellipse(x4-SetNFAPos.LO/6,y4-SetNFAPos.LO/6,x4+SetNFAPos.LO/6,y4+SetNFAPos.LO/6);
//---------------------------
pDC->SetTextColor(RGB(54,54,54));
pDC->TextOut(PO[1].x,PO[1].y,p->token);
}
p=p->next;
}
}
//画结点
pDC->SelectObject(&colorbrush);
for(int i=0;i<=SetNFAPos.num;i++)
{
if(GetDocument()->NFATable.tableList[i].next!=NULL)
{
pDC->SelectObject(&colorbrush);
pDC->Ellipse(GetDocument()->NFATable.tableList[i].point.x,GetDocument()->NFATable.tableList[i].point.y,GetDocument()->NFATable.tableList[i].point.x+SetNFAPos.LO,GetDocument()->NFATable.tableList[i].point.y+SetNFAPos.LO);
}
else //终结点
{
pDC->SelectObject(&Tbrush);
pDC->Ellipse(GetDocument()->NFATable.tableList[i].point.x,GetDocument()->NFATable.tableList[i].point.y,GetDocument()->NFATable.tableList[i].point.x+SetNFAPos.LO,GetDocument()->NFATable.tableList[i].point.y+SetNFAPos.LO);
pDC->Ellipse(GetDocument()->NFATable.tableList[i].point.x+SetNFAPos.LO/10,GetDocument()->NFATable.tableList[i].point.y+SetNFAPos.LO/10,GetDocument()->NFATable.tableList[i].point.x+SetNFAPos.LO-SetNFAPos.LO/10,GetDocument()->NFATable.tableList[i].point.y+SetNFAPos.LO-SetNFAPos.LO/10);
}
//输出数字
CString CtrNum;
CtrNum.Format("%d",i);
int m_length=CtrNum.GetLength();
pDC->SetTextColor(RGB(255,255,0));
pDC->TextOut(GetDocument()->NFATable.tableList[i].point.x-3+(SetNFAPos.LO/1.7)-m_length*4,GetDocument()->NFATable.tableList[i].point.y-10+(SetNFAPos.LO/2),CtrNum);
}
//区域
//
pDC->BeginPath();
// CClientDC dc(this);
// CPoint MyPoint=MyScroll;
// pDC->DPtoLP(&MyPoint);
for(i=0;i<=SetNFAPos.num;i++)
{
pDC->Ellipse(GetDocument()->NFATable.tableList[i].point.x-MyScroll.x,GetDocument()->NFATable.tableList[i].point.y-MyScroll.y,GetDocument()->NFATable.tableList[i].point.x-MyScroll.x+SetNFAPos.LO,GetDocument()->NFATable.tableList[i].point.y-MyScroll.y+SetNFAPos.LO);
//pDC->Ellipse(GetDocument()->NFATable.tableList[i].point.x-MyPoint.x,GetDocument()->NFATable.tableList[i].point.y-MyPoint.y,GetDocument()->NFATable.tableList[i].point.x+MyPoint.x+SetNFAPos.LO,GetDocument()->NFATable.tableList[i].point.y+MyPoint.y+SetNFAPos.LO);
}
pDC->EndPath();
CRgn trgn;
trgn.CreateFromPath(pDC);// (&dc);
m_NFA.CopyRgn(&trgn);
trgn.DeleteObject();
//
stockbrush.DeleteObject();
colorbrush.DeleteObject();
Tbrush.DeleteObject();
Dirbrush.DeleteObject();
colorpen.DeleteObject();
redpen.DeleteObject();//bezier
quanpen.DeleteObject();
zihuanpen.DeleteObject();
}
void CTONFAView::DrawTABLE(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==1)
//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_TABLE_LEFT,DFA_TABLE_TOP-20,"NFA->DFA转换表");
pDC->SetTextColor(RGB(182,41,43));
//-----------------------------画出NFA->DFA转换表
pDC->Rectangle(DFA_TABLE_LEFT,DFA_TABLE_TOP,DFA_TABLE_LEFT+DFA_TABLE_WIDTH*(GetDocument()->letternum+1),DFA_TABLE_TOP+DFA_TABLE_HEIGHT);
pDC->MoveTo(DFA_TABLE_LEFT,DFA_TABLE_TOP);
pDC->LineTo(DFA_TABLE_LEFT+DFA_TABLE_WIDTH,DFA_TABLE_TOP+DFA_TABLE_HEIGHT);
pDC->TextOut(DFA_TABLE_LEFT+100,DFA_TABLE_TOP+2,"字符");
pDC->TextOut(DFA_TABLE_LEFT+2,DFA_TABLE_TOP+13,"状态集");
for(int i=0;i<GetDocument()->letternum;i++)
{
pDC->MoveTo(DFA_TABLE_LEFT+(i+1)*DFA_TABLE_WIDTH,DFA_TABLE_TOP);
pDC->LineTo(DFA_TABLE_LEFT+(i+1)*DFA_TABLE_WIDTH,DFA_TABLE_TOP+DFA_TABLE_HEIGHT);
pDC->TextOut(DFA_TABLE_LEFT+DFA_TABLE_WIDTH*(i+1)+40+DFA_TABLE_HEIGHT,DFA_TABLE_TOP+10,CString(GetDocument()->character[i]));
}
pDC->SetTextColor(RGB(150,100,50));
for(i=0;i<=SetDFAPos.num;i++)
{
//画区域
pDC->Rectangle(DFA_TABLE_LEFT,DFA_TABLE_TOP+DFA_TABLE_HEIGHT*(i+1),DFA_TABLE_LEFT+DFA_TABLE_WIDTH*(GetDocument()->letternum+1),DFA_TABLE_TOP+DFA_TABLE_HEIGHT*(i+2));
pDC->TextOut(DFA_TABLE_LEFT+5,DFA_TABLE_TOP+DFA_TABLE_HEIGHT*(i+1)+5,GetDocument()->ListStr(i));
ListNode * p;
int j=0;
p=GetDocument()->DFATable.tableList[i].next;
//for(int j=0;j<GetDocument()->letternum;j++)
while(p!=NULL)
{
pDC->MoveTo(DFA_TABLE_LEFT+DFA_TABLE_WIDTH*(j+1),DFA_TABLE_TOP+DFA_TABLE_HEIGHT*(i+1));
pDC->LineTo(DFA_TABLE_LEFT+DFA_TABLE_WIDTH*(j+1),DFA_TABLE_TOP+DFA_TABLE_HEIGHT*(i+2));
//if(p->data!='$')
if(p->data!=-1)
pDC->TextOut(DFA_TABLE_LEFT+DFA_TABLE_WIDTH*(j+1)+5,DFA_TABLE_TOP+DFA_TABLE_HEIGHT*(i+1)+5,GetDocument()->ListStr(p->data));
j++;
p=p->next;
}
}
pDC->BeginPath();
pDC->Rectangle(DFA_TABLE_LEFT-MyScroll.x,DFA_TABLE_TOP-MyScroll.y,DFA_TABLE_LEFT+DFA_TABLE_WIDTH*(GetDocument()->letternum+1)-MyScroll.x,DFA_TABLE_TOP+DFA_TABLE_HEIGHT*(SetDFAPos.num+1)-MyScroll.y);
pDC->EndPath();
CRgn trgn;
trgn.CreateFromPath(pDC);
m_TABLE.CopyRgn(&trgn);
trgn.DeleteObject();
brush.DeleteObject();
}
void CTONFAView::DrawDFA(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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -