📄 dsshh.c
字号:
#include "stdio.h"
#include "conio.h"
#include "graphics.h"
#define closegr closegraph
typedef struct{
float x,y;
}Vertex;
typedef Vertex Edge[2];
typedef Vertex VArray[10];
void initgr(void) /* BGI初始化 */
{int gd=DETECT,gm=0; /* 和gd=VGA,gm=VGAHI是同样效果 */
registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */
initgraph(&gd,&gm,"");
}
void Intersect(Vertex *s,Vertex *p,Edge clipB,Vertex *I)
{float dx,dy,b,Dx,Dy;dx=clipB[1].x-clipB[0].x;dy=clipB[1].y-clipB[0].y;
b=dx*clipB[0].y-dy*clipB[0].x;Dx=p->x-s->x;Dy=p->y-s->y;
if(clipB[0].y==clipB[1].y)
{I->y=clipB[0].y;
I->x=s->x+(clipB[0].y-s->y)*(p->x-s->x)/(p->y-s->y);
}
else if(clipB[0].x==clipB[1].x)
{I->x=clipB[0].x;
I->y=s->y+(clipB[0].x-s->x)*(p->y-s->y)/(p->x-s->x);
} else
{I->x=(-dx*Dy*p->x+dx*Dx*p->y-b*Dx)/(dy*Dx-dx*Dy);
I->y=(dy*I->x+b)/dx;}
}
int Inside(Vertex *testV,Edge clipB)
{ float dx,dy,b;dx=clipB[1].x-clipB[0].x;dy=clipB[1].y-clipB[0].y;
b=dx*clipB[0].y-dy*clipB[0].x;
if(clipB[1].x>clipB[0].x)
{if(dy*testV->x-dx*testV->y+b>=0)
return 1;else return 0;
}
else if(clipB[1].x<clipB[0].x)
{if(dy*testV->x-dx*testV->y+b>=0)
return 1;else return 0;
}else if(clipB[0].y>clipB[1].y)
{if(testV->x<=clipB[0].x)return 1;else return 0;}
else if(clipB[0].y<clipB[1].y)
{if(testV->x>=clipB[0].x)return 1;else return 0;}
}
void Output(Vertex *newV,int *outL,VArray outVA)
{outVA[*outL].x=newV->x;
outVA[*outL].y=newV->y;
(*outL)++;
}
void SHPC(VArray inVA,int *outL,VArray outVA,Edge clipB)
{Vertex *s,*p,I;
int j,inL,i;
for(i=0;inVA[i].x!=0;i++){}
inL=i;
*outL=0;
s=&(inVA[inL-1]);
for(j=0;j<inL;j++)
{p=&(inVA[j]);
if(Inside(p,clipB)==1)
{if(Inside(s,clipB)==1)
Output(p,outL,outVA);
else
{Intersect(s,p,clipB,&I);
Output(&I,outL,outVA);
Output(p,outL,outVA);
}
}
else if(Inside(s,clipB)==1)
{Intersect(s,p,clipB,&I);
Output(&I,outL,outVA);
}
s=p;
}
}
xian(Vertex a,Vertex b)
{line(a.x,a.y,b.x,b.y);}
huatu(VArray a)
{int i,j;
for(i=0;a[i].x!=0;i++){}
j=i;
for(i=0;i<j-1;i++)
xian(a[i],a[i+1]);xian(a[j-1],a[0]);getch();}
EQ(VArray a,VArray b)
{int i;
for(i=0;i<10;i++)
{a[i].x=b[i].x;a[i].y=b[i].y;}
}
caijian(VArray inVA,VArray doVA,VArray outVA)
{
Edge CB;int i,*o,L;VArray OVA;
for(i=0;i<10;i++)
{OVA[i].x=0;OVA[i].y=0;}
for(i=0;doVA[i].x!=0;i++){}
L=i;
for(i=0;i<L-1;i++)
{CB[0].x=doVA[i].x;CB[0].y=doVA[i].y;CB[1].x=doVA[i+1].x;CB[1].y=doVA[i+1].y;
SHPC(inVA,o,outVA,CB);
EQ(inVA,outVA);EQ(outVA,OVA);}
CB[0].x=doVA[L-1].x;CB[0].y=doVA[L-1].y;CB[1].x=doVA[0].x;CB[1].y=doVA[0].y;
SHPC(inVA,o,outVA,CB);
huatu(outVA);
}
main()
{int l,*o,i;
VArray IVA,OVA,DVA,outVA;
Edge CB;
initgr();
l=4;IVA[0].x=150;IVA[0].y=50;IVA[1].x=102;IVA[1].y=200;
IVA[2].x=160;IVA[2].y=400;IVA[3].x=510;IVA[3].y=200;
CB[0].x=200;CB[0].y=400;CB[1].x=200;CB[1].y=2;
DVA[0].x=102;DVA[0].y=2;DVA[1].x=103;DVA[1].y=350;
DVA[2].x=200;DVA[2].y=350;DVA[3].x=200;DVA[3].y=5;
huatu(IVA);
huatu(DVA); /* SHPC(IVA,o,outVA,CB);*/
cleardevice();
caijian(IVA,DVA,outVA);
getch(); /* 暂停一下,看看前面绘图代码的运行结果 */
closegr(); /* 恢复TEXT屏幕模式 */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -