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

📄 编码法剪裁.c

📁 编码法剪裁 计算机图形学线段利用编码法裁剪
💻 C
字号:
#include "stdio.h"
#include "stdlib.h"
#include "graphics.h"
#define X 200
#define Y 200
#define LEFT 1
#define RIGHT 2
#define BOTTOM 4
#define TOP 8
int color=WHITE;
#define XL 25
#define XR 175
#define YT 25
#define YB 175
int x,y;
int x0,y0,x1,y1;
void midpointline(int x0,int y0,int x1,int y1,int color);
void myinitgraph()
{  int graphdriver;
   int graphmode;
   int errorcode;
   graphdriver=DETECT;
   initgraph(&graphdriver,&graphmode," ");
   errorcode=graphresult();
   if(errorcode!=grOk)
    {printf("graphecssystem init error: %s",grapherrormsg(errorcode));
	exit(1);
    }
}
void newputpixel(int x,int y,int color)
{
  int m;
  m=getmaxy()-y;
  putpixel(x,m,color);
}
main()
{
    printf("Input x0,y0,x1,y1:");
    scanf("%d,%d,%d,%d",&x0,&y0,&x1,&y1);
     myinitgraph();
	 PrintfCut();
	 midpointline(x0,y0+X,x1,y1+X,color);
	 PrintfCover(); 
	 C_S_Disline(x0,y0,x1,y1);
}
void midpointline(int x0,int y0,int x1,int y1,int color)
{ int a,b,x,y;
  float k;
  int temp1,temp2;
  int d1,d2,d3,d4;
  int del1,del2,del3,del4;
  if(x0>x1)
  {
    temp1=x0;
	x0=x1;
	x1=temp1;
	temp2=y0;
	y0=y1;
	y1=temp2;
  }
  a=y0-y1; b=x1-x0;
  d1=2*a+b; d2=a+2*b; d3=2*a-b; d4=a-2*b;
  del1=2*a; del2=2*(a+b); del3=2*b; del4=2*(a-b);
  if(b==0)
  {
    x=x0;
	for(y=y0;y<y1;y++)
    newputpixel(x,y,color);
  }
  if(b!=0) k=-(float)a/(float)b;
   if(k>0&&k<=1)
   {  y=y0;
      for(x=x0;x<=x1;x++)
      {
		newputpixel(x,y,color);
	    if(d1<0) {y++;d1+=del2;}
	    else {d1+=del1;}
      }
   }
 else if(k>1)
   {  x=x0;
      for(y=y0;y<=y1;y++)
      { newputpixel(x,y,color);
	    if(d2<0) {d2=d2+del3;}
	    else {x++;d2=d2+del2;}
      }
   }

 else if(k<0&&k>=-1)
   {  y=y0;
      for(x=x0;x<=x1;x++)
      { newputpixel(x,y,color);
	    if(d3<0) {d3=d3+del1;}
	    else {y--;d3=d3+del4;}
      }
   }
 else if(k<-1)
   {  x=x0;
      for(y=y0;y>=y1;y--)
      {
		 newputpixel(x,y,color);
	     if(d4<0) {x++;d4=d4+del4;}
	     else {d4=d4-del3;}
      }
   }
 else
 {
     y=y0;
	 for(x=x0;x<x1;x++)
	 newputpixel(x,y,color);
 }
}

encode(int x,int y,int *code)
{
  {
    int c=0;
	if(x<XL)      c=c|LEFT;
	else if(x>XR) c=c|RIGHT;
	if(y>YB)      c=c|BOTTOM;
	else if(y<YT) c=c|TOP;
	*code=c;
	return;
  }
}
C_S_Disline(int x1,int y1,int x2,int y2)
{
  int x,y;
  int X1,X2,Y1,Y2;
  int code1,code2,code;
  encode(x1,y1,&code1);
  encode(x2,y2,&code2); 
  if(code1==0) {X1=x1;Y1=y1;}
  if(code2==0) {X2=x2;Y2=y2;}
  while((code1|code2)!=0)
   {
	
   if(((code1&code2)==0)&&((code1|code2)!=0)||code1==0)
	{
	  code=code1;
	  if(code1==0)
	  code=code2;
	  if((LEFT&code)!=0)
	  {
		x=XL;
		y=y1+(y2-y1)*(XL-x1)/(x2-x1);
	  }
	else if((RIGHT&code)!=0)
	  {
		x=XR;
		y=y1+(y2-y1)*(XR-x1)/(x2-x1);
	  }
	else if((BOTTOM&code)!=0)
	  {
		y=YB;
		x=x1+(x2-x1)*(YB-y1)/(y2-y1);
	  }
	else if((TOP&code)!=0)
	  {
		y=YT;
		x=x1+(x2-x1)*(YT-y1)/(y2-y1);
	  }
	 if(code==code1)
	{
	 X1=x;Y1=y; encode(x,y,&code1);
	}
	else
	{
	 X2=x;Y2=y;encode(x,y,&code2);
	}
   }
  }
  midpointline(XL+X,YT+Y,XR+X,YT+Y,color);
  midpointline(XL+X,YT+Y,XL+X,YB+Y,color);
  midpointline(XR+X,YT+Y,XR+X,YB+Y,color);
  midpointline(XR+X,YB+Y,XL+X,YB+Y,color);
  midpointline(X1+X,Y1+Y,X2+X,Y2+Y,color);
}
PrintfCut()
{
     midpointline(XL,YT,XR,YT,color);
     midpointline(XL,YT,XL,YB,color);
     midpointline(XR,YT,XR,YB,color);
     midpointline(XR,YB,XL,YB,color);

}
PrintfCover()
{
     midpointline(XL+X,YT,XR+X,YT,color);
     midpointline(XL+X,YT,XL+X,YB,color);
     midpointline(XR+X,YT,XR+X,YB,color);
     midpointline(XR+X,YB,XL+X,YB,color);
	 midpointline(x0+X,y0,x1+X,y1,color);
}

⌨️ 快捷键说明

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