📄 编码法剪裁.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 + -