📄 graph2.h
字号:
if (visitegraphmodes[i].ifwrite)
cout<<v<<" ";
if (visitegraphmodes[i].ifcurcovermove||visitegraphmodes[i].ifcurcoverkeep)
cur_gnode_onoff(g,v);
if (visitegraphmodes[i].ifuseptr)
gptr_point_to(visitegraphmodes[i].ptr,g,v);
if (visitegraphmodes[i].ifusenum)
visitegraphmodes[i].num=visitegraphmodes[i].num+1;
if (visitegraphmodes[i].ifusenum&& visitegraphmodes[i].ifdispnum)
dispint_atgnode_angle(visitegraphmodes[i].num,g,v,visitegraphmodes[i].numangle);
if (visitegraphmodes[i].ifwaitkey)
getch();
else
if(visitegraphmodes[i].ifdelay)
delay(visitegraphmodes[i].delaytime);
if (visitegraphmodes[i].ifcurcovermove)
cur_gnode_onoff(g,v);
}
}
//{==== 2 ====}
void rangeerror()
{
cout<<'\007'<<endl;
Error("数据范围错!");
}
void handle_visite2_event(pmenunode& pmenu, vstmdarr& visitemodes)
{int state=1;
boolean sv;
if ( (pmenu->command>=800)&&(pmenu->command<=815) )
switch(pmenu->command)
{
case ComSelectModeNo:
do
{
Editintinwnd(20,4,60,"选择采用的访问方式号[0..3]", vstno);
if (vstno!=0&&vstno!=1&&vstno!=2&&vstno!=3)
Error("数据范围错!");
}
while(vstno!=0&&vstno!=1&&vstno!=2&&vstno!=3);
break;
case ComWriteData: do
{
state=2-int(visitemodes[vstno].ifwrite);
Editintinwnd(20,4,60,"1--打印元素值 2--不打印元素值",state);
if(state!=1&&state!=2)
Error("数据范围错!");
else
visitemodes[vstno].ifwrite=boolean(state==1);
}
while(state!=1&&state!=2);
break;
case ComUseCurMove: do
{
state=3-(2*int(visitemodes[vstno].ifcurcovermove)+int(visitemodes[vstno].ifcurcoverkeep) );
Editintinwnd(10,4,70,"1--覆盖光棒然后移去 2--使用光棒不移去 3--不使用光棒",state);
if(state!=1&&state!=2&&state!=3)
Error("数据范围错!");
else
visitemodes[vstno].ifcurcovermove=boolean(state==1);
visitemodes[vstno].ifcurcoverkeep=boolean(state==2);
}
while(state!=1&&state!=2&&state!=3);
break;
case ComWaitKey: do
{
state=3-(2*int(visitemodes[vstno].ifwaitkey)+int(visitemodes[vstno].ifdelay) );
Editintinwnd(10,4,70,"1--等待按键继续 2--自动延迟时间 3--访问后不停顿",state);
if(state!=1&&state!=2&&state!=3)
Error("数据范围错!");
else
{
visitemodes[vstno].ifwaitkey=boolean(state==1);
visitemodes[vstno].ifdelay=boolean(state==2);
if (state==2)
do
{
Editintinwnd(20,6,60,"延迟时间[0..10000]毫秒: ",visitemodes[vstno].delaytime);
if ( (visitemodes[vstno].delaytime<0)||(visitemodes[vstno].delaytime>10000) )
Error("数据范围错!");
}
while(visitemodes[vstno].delaytime<0||visitemodes[vstno].delaytime>10000) ;
}
}
while(state!=1&&state!=2&&state!=3);
break;
case ComUsePtr: do
{
state=2-int(visitemodes[vstno].ifuseptr);
visitemodes[vstno].ifuseptr=false;
Editintinwnd(20,4,60,"1--使用指示器 2--不使用指示器",state);
if (state==1)
{
do
{
Editstrinwnd(20,6,60,"所使用的指示器名称为:",visitemodes[vstno].ptrname);
if(have_gptr(visitemodes[vstno].ptrname) )
Error("数据范围错!");
else
visitemodes[vstno].ifuseptr=true;
}
while(have_gptr(visitemodes[vstno].ptrname) ) ;
create_gptr(visitemodes[vstno].ptr,visitemodes[vstno].ptrname);
}
else
visitemodes[vstno].ifuseptr=false;
}
while(state!=1&&state!=2);
break;
case ComNeedNo: do
{
state=2-int(visitemodes[vstno].ifusenum);
Editintinwnd(20,4,60,"1--显示序号 2--不显示序号",state);
if (state==1)
do
{
Editintinwnd(20,6,60,"显示序号的角度[0..360]:",visitemodes[vstno].numangle);
if ( (visitemodes[vstno].numangle<0)||(visitemodes[vstno].numangle>360) )
Error("数据范围错!");
}
while(visitemodes[vstno].numangle<0||visitemodes[vstno].numangle>360) ;
visitemodes[vstno].ifusenum=boolean(state==1);
}
while(state!=1&&state!=2) ;
break;
}
}
void handle_visite2_menu(mymenu& vstmenu2,boolean& selectorno,
pmenunode& pmenu,vstmdarr& visitemodes)
{
Mymenu_selectmenu(vstmenu2,pmenu,selectorno);
if (selectorno )
if (Mymenu_issubmenuitem(vstmenu2))
{ Mymenu_disabledispsubmenu(vstmenu2,pmenu->numofmenu/100);
handle_visite2_event(pmenu,visitemodes);
}
else
return;
else
return;
}
void handle_visite2_mode(vstmdarr& visitemodes)
{ /*for (int i=0;i< 4 ;i++)
visitemodes[i]=onevisitemode;
*/
pmenunode vstmp2=Newmenu1(
Newsubmenu1("置访问方式",
Newmenu1(
Newitem1("选择访问方式号","选择访问方式号... ",0,0,ComSelectModeNo,
Newitem1("设置打印元素值","设置是否打印元素的值... ",0,0,ComWriteData,
Newitem1("使用光棒方式","设置是否使用光标... ",0,0,ComUseCurMove,
Newitem1("设置停顿方式","设置在两次访问之间是否需要停顿... ",0,0,ComWaitKey,
Newitem1("设置使用指示器","设置是否需要指示器指示结点.. ",0,0,ComUsePtr,
Newitem1("显示序号","设置是否需要显示序号...",0,0,ComNeedNo,
nil))))))),
Newsubmenu1("返回",nil,nil)));
Mymenu_init(vstmenu2,vstmp2);
do
handle_visite2_menu(vstmenu2,selectorno,pmenu,visitemodes);
while(strcmp(pmenu->menuname,"返回") );
Mymenu_clearmainmenu(vstmenu2);
Mymenu_done(vstmenu2);
initial_visitemode(visitegraphmodes);
}
void set_vgnode_mode()
{ handle_visite2_mode(visitegraphmodes);
}
void two_point_angle(int x1,int y1,int x2,int y2,int& sa)
{int sgx,sgy;
sgx=Sgn(x1,x2);
sgy=Sgn(y1,y2);
if(x2==x1)
sa=180+sgy*90;
else
sa=270+sgx*90-sgx*sgy*Round(atan(abs((y2-y1)/(x2-x1)))*180/PI);
sa=(sa+360)%360;
}
void get_arc_cord(int x1,int y1,int sa,int& sx,int& sy,int& ex,int& ey)
{ struct arccoordstype far * a;
arc(x1,y1,(sa-25+360)%360,(sa+25)%360,rdx);
getarccoords(a);
sx=a->xstart;
sy=a->ystart;
ex=a->xend;
ey=a->yend;
}
void weight_cord(int mx,int my,int sa,int& wx,int& wy)
{ const int ll=5;
float s;
s=sa/180*PI;
wx=Round(mx-ll*sin(s));
wy=Round(my-ll*cos(s));
}
void join1(float x,float y,float x1,float y1,int& nx,int& ny)
{float dx,dy,l;
l=(sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1)));
dx=((x-x1)*rdx/l);
dy=((y-y1)*rdy/l);
nx=Round(x1+dx);
ny=Round(y1+dy);
}
void join_single_edge(adjhlink h1,adjhlink h2,int& sx,int& sy,int& ex,int& ey,int& wx,int& wy)
{ int sa;
join1(h1->x+rdx,h1->y+rdy,h2->x+rdx,h2->y+rdy,ex,ey);
join1(h2->x+rdx,h2->y+rdy,h1->x+rdx,h1->y+rdy,sx,sy);
two_point_angle(h1->x,h1->y,h2->x,h2->y,sa);
weight_cord((sx+ex)/2,(sy+ey)/2,sa,wx,wy);
}
void join_double_edge(adjhlink h1,adjhlink h2,int& sx,int& sy,int& ex,int& ey,int& wx,int& wy)
{int sa,sx1,sy1,ex1,ey1;
two_point_angle(h1->x,h1->y,h2->x,h2->y,sa);
get_arc_cord(h1->x+rdx,h1->y+rdy,sa,sx1,sy1,sx,sy);
get_arc_cord(h2->x+rdx,h2->y+rdy,sa+180,ex,ey,ex1,ey1);
weight_cord((sx+ex)/2,(sy+ey)/2,sa,wx,wy);
}
void initial_graph()
{
int size;
Into_graph();
/* if(fdd1==nil)
{
for (int i=0;i< 4 ;i++)
visitegraphmodes[i]=onevisitemode;
initial_visitemode(visitegraphmodes);
}*/
Clear_range(0,0,getmaxx(),getmaxy() );
setcolor(forecolor);// DIRECTVIDEO:=FALSE;
if(fdd1==nil)
{
size=imagesize(1,1,5,20);
fdd1=malloc(size);
Arrow(3,1,3,20);
getimage(1,1,5,20,fdd1);
putimage(1,1,fdd1,1);
}
if(fdd2==nil)
{size=imagesize(1,1,5,20);
fdd2=malloc(size);
Arrow(3,20,3,1);
getimage(1,1,5,20,fdd2);
putimage(1,1,fdd2,1);
}
if(fdd3==nil)
{
size=imagesize(1,1,20,5);
fdd3=malloc(size);
Arrow(1,3,20,3);
getimage(1,1,20,5,fdd3);
putimage(1,1,fdd3,1);
}
if(fdd4==nil)
{size=imagesize(1,1,20,5);
fdd4=malloc(size);
Arrow(20,3,1,3);
getimage(1,1,20,5,fdd4);
putimage(1,1,fdd4,1);
}
if(nilnd==nil)
{
size=imagesize(1,1,2*rdx+2,2*rdy+2);
nilnd=malloc(size);
circle(rdx+1,rdy+1,rdy);
getimage(1,1,2*rdx+2,2*rdy+2,nilnd);
}
if(datafild==nil)
{
size=imagesize(1,1,2*rdx,2*rdy);
datafild=malloc(size);
circle(rdx+1,rdy+1,rdy-1);
getimage(1,1,2*rdx,2*rdy,datafild);
//putimage(1,1,datafild,1);
}
if(vn==nil)
{
size=imagesize(1,1,2*rdx+2,2*rdy+2);
vn=malloc(size);
getimage(1,1,2*rdx+2,2*rdy+2,vn);
setfillpattern(fillmode,fillcolor);
pieslice(rdx+1,rdy+1,0,360,rdy-1);
putimage(1,1,datafild,1);
getimage(2,2,2*rdx,2*rdy,datafild);
}
if(cursor==nil)
{
size=imagesize(1,1,6,3);
cursor=malloc(size);
bar(1,1,6,3);
getimage(1,1,6,3,cursor);
}
if(curblk==nil)
{
rectangle(20,20,20+3*rdx,20+5*rdy/2);
floodfill(22,22,getcolor());
size=imagesize(21,21,19+3*rdx,19+5*rdy/2);
curblk=malloc(size);
bar(21,21,19+3*rdx,19+5*rdy/2);
getimage(21,21,19+3*rdx,19+5*rdy/2,curblk);
}
setfillstyle(1,0);
bar(0,0,getmaxx(),getmaxy());
setfillstyle(1,WHITE);
}
boolean have_gptr(string title)
{ boolean have_gptr=false;
gptrlink p;
if (gnum==0 )
frstgptr=nil;
p=frstgptr;
while(p!=nil)
{
if(!boolean(stricmp(p->ptrname,title) ))
have_gptr=true;
p=p->next;
}
return have_gptr;
}
void create_gptr(gptrlink& sptr,string title)
{gptrlink p; int l,size;
if (gnum==0)
frstgptr=nil;
p=frstgptr;
while( p!=nil)
{if(strcmp(p->ptrname,title))
p=p->next;
else
Error("The pointer have exist!");
}
sptr=new gnodeptr;
gnum=gnum+1;
if(gnum==1)
sptr->next=nil;
else
sptr->next=frstgptr;
frstgptr=sptr;
strcpy(sptr->ptrname,title);
sptr->x=-1;
sptr->y=-1;
sptr->ptr=nil;
l=16*strlen(title)/2;
size=imagesize(1,2,2*l,14);
void far * q=farmalloc(size);
getimage(1,2,2*l,14,q);
setfillstyle(1,0);
bar(1,2,2*l,14);
sptr->fdd0=farmalloc(size);
outtextxy(l,6,title);
getimage(1,2,2*l,14,sptr->fdd0);
putimage(1,2,sptr->fdd0,1);
putimage(1,2,q,0);
}
void ptrcases(gptrlink& sptr,int l)
{ putimage(sptr->x,sptr->y,sptr->fdd0,1);
switch(sptr->num)
{ case 1: putimage( sptr->x+l, sptr->y+8, fdd1,1);break;
case 2: putimage( sptr->x+l, sptr->y-20,fdd2,1); break;
case 3: putimage( sptr->x+2*l, sptr->y+4, fdd3,1);break;
case 4: putimage( sptr->x-20, sptr->y+4, fdd4,1) ;break;
}
}
void gptr_point_to(gptrlink& sptr,datagraph& g ,int v)
{gptrlink p;
int k,n,l,sg;
adjhlink hh;
n=0;
l=8*strlen(sptr->ptrname)/2;
k=0;
if( (v<=g.nodes) && (v>0))
{ p=frstgptr;
hh=get_ver_head(g,v);
while (p!=nil)
{ if ((p->ptr==hh) &&(strcmp(p->ptrname,sptr->ptrname)) )
n=n+1;
p=p->next;
k=k+1;
}
if (sptr->x>0)
ptrcases(sptr,l);
sptr->ptr=hh;
sptr->num=n%4+1;
switch(sptr->num)
{case 1:{ sptr->x=hh->x-l; sptr->y=hh->y-36 ;break;}
case 2:{ sptr->x=hh->x-l; sptr->y=hh->y+28;break; }
case 3:{ sptr->x=hh->x-2*l-28; sptr->y=hh->y-4;break; }
case 4:{ sptr->x=hh->x+28; sptr->y=hh->y-4 ;break;}
}
sptr->x=sptr->x+rdx;sptr->y=sptr->y+rdy;
ptrcases(sptr,l);
}
else if (v==0)
{sptr->x=0; sptr->y=0;sptr->ptr=nil;
}
}
void disp_gptr_atgnode(gptrlink& sptr,datagraph& g ,int v)
{gptrlink p;
int k,n,l,sg;
adjhlink hh;
n=0;
l=8*strlen(sptr->ptrname)/2;
k=0;
if ((v<=g.nodes)&&(v>0))
{ p=frstgptr;
hh=get_ver_head(g,v);
while (p!=nil)
{ if ((p->ptr==hh)&&(strcmp(p->ptrname,sptr->ptrname)) )
n=n+1;
p=p->next;
k=k+1;
}
sptr->ptr=hh;
sptr->num=n%4+1;
switch(sptr->num)
{case 1:{ sptr->x=hh->x-l; sptr->y=hh->y-36;break; }
case 2:{ sptr->x=hh->x-l; sptr->y=hh->y+28;break; }
case 3:{ sptr->x=hh->x-2*l-28; sptr->y=hh->y-4;break; }
case 4:{ sptr->x=hh->x+28; sptr->y=hh->y-4; }
}
sptr->x=sptr->x+rdx;sptr->y=sptr->y+rdy;
ptrcases(sptr,l);
}
else if( v==0)
{ sptr->x=0;sptr->y=0;sptr->ptr=nil ;}
}
void fifild(adjhlink& t,int orxor)
{ putimage(t->x+1,t->y+1,datafild,orxor) ; }
void cur_cover(adjhlink& t,int orxor)
{ putimage(t->x-rdx/2,t->y-rdy/4,curblk,orxor); }
void cur_gnode_onoff(datagraph& g ,int gnode)
{ cur_cover_node(g,gnode,1); }
void write_atgnode_angle(datagraph& g ,int v,int an,string ss)
{int x1,y1,l; adjhlink t; float angle;
l=an/360; t=get_ver_head(g,v); angle=an*2*PI/360;
x1=t->x+Round(rdx*(2+l)*cos(angle))+rdx;
y1=t->y-Round(rdy*(2+l)*sin(angle))+rdy;
outtextxy(x1,y1,ss) ;
}
void writestr_atgnode_angle(datagraph& g ,int v,int an,string ss)
{ write_atgnode_angle(g,v,an,ss) ; }
void writeint_atgnode_angle(datagraph& g ,int v,int an,int ii)
{unsigned char ss[10]="";
Convs(ii,ss);
write_atgnode_angle(g,v,an,ss); }
void dispstr_atgnode_angle(string ss, datagraph& g ,int v,int an)
{ write_atgnode_angle(g,v,an,ss) ; }
void dispint_atgnode_angle(int ii,datagraph& g,int v,int an)
{unsigned char ss[10]="";
Convs(ii,ss);
write_atgnode_angle(g,v,an,ss);
}
void writeint_gnode(datagraph& g ,int v,int ld,int xe)
{ adjhlink h;
int xx,yy;
h=get_ver_head(g,v);
if (ld==up||ld==down||ld==left||ld==right )
switch(ld)
{
case up: { xx=h->x+rdx; yy=h->y-rdy; } break;
case down: { xx=h->x+rdx; yy=h->y+3*rdy; }break;
case left: { xx=h->x-rdx; yy=h->y+rdy; } break;
case right:{ xx=h->x+3*rdx;yy=h->y+rdy;} break;
}
Convs(xe,st);
outtextxy(xx,yy,st);
getch();
}
void cur_cover_node(datagraph& g ,int v,int orxor)
{adjhlink h=nil;
h=get_ver_head(g,v);
cur_cover(h,orxor) ;
}
void disnodedat(adjhlink& t)
{ unsigned char ss[10];
Convs(t->nodenum,ss);
fifild(t,2);
fifild(t,1);
outtextxy(t->x+rdx-5,t->y+rdy-3,ss);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -