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

📄 dsshh.c

📁 计算机图形学
💻 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 + -