📄 cc.c
字号:
#include"stdio.h";
#include"graphics.h"
#include"math.h"
#include"dos.h"
#include"time.h"
typedef struct Rect
{
int xmin;
int ymin;
int xmax;
int ymax;
}Rect;
void CopmOutCode(int x,int y,Rect * r,int *L,int *T,int *R,int *B)
{
/*初始化*/
*L =0;
*T =0;
*R =0;
*B =0;
if(y>r->ymax)
*T = 1;
if(y<r->ymin)
*B = 1;
if(x>r->xmax)
*R = 1;
if(x<r->xmin)
*L = 1;
}
void test1(int x,int y,Rect * r,int *flag)/*测试一点是否在其内部*/
{
int L,T,R,B;
CopmOutCode(x,y,r,&L,&T,&R,&B);
if(L==0&&T==0&&R==0&&B==0)
*flag = 1;/*在内部*/
else
*flag = 0;/*在外部*/
}
void test2(int x0,int y0,int x1,int y1,Rect * r,int *flag)/*测试两点是否在矩形同侧*/
{
int L0,T0,R0,B0;
int L1,T1,R1,B1;
CopmOutCode(x0,y0,r,&L0,&T0,&R0,&B0);
CopmOutCode(x1,y1,r,&L1,&T1,&R1,&B1);
if(L0==L1==1||T0==T1==1||R0==R1==1||B0==B1==1)
*flag = 1;/* 在同侧*/
else
*flag = 0;/* 在异侧*/
}
void CSLine(int x0,int y0,int x1,int y1,Rect * r)
{
int f0,f1,f,x,y;
int k; /*斜率*/
int L0,L1,T0,T1,R0,R1,B0,B1;
k = (y1 - y0)/(x1 - x0);
CopmOutCode(x0,y0,r,&L0,&T0,&R0,&B0);
CopmOutCode(x1,y1,r,&L1,&T1,&R1,&B1);
test1(x0,y0,r,&f0);
test1(x1,y1,r,&f1);
if((f0==1)&&(f1==1))/*是否都在内部*/
line(x0,y0,x1,y1);
else
{
test2(x0,y0,x1,y1,r,&f);
if(f==1);/*是否在同侧*/
else
{
if(f0 == 1&&f1 == 0)/*(x0,y0)在内部,(x1,y1)在外部*/
{
if(L1==1) /*左边求交*/
{
y = y1 - (1/k)*(x1 - r->xmin);
x = r->xmin;
}
else
{
if(T1==1) /*上边求交*/
{
x = x1 - (1/k)*(y1 - r->ymin);
y = r->ymin;
}
else
{
if(R1==1) /*右边求交*/
{
y = y1 - (1/k)*(x1 - r->xmax);
x = r->xmax;
}
else
{
if(B1==1)/*下边求交*/
{
x = x1 - (1/k)*(y1 - r->ymax);
y = r->ymax;
}
}
}
}
CSLine(x0,y0,x,y,r);
}
if(f0 == 0&&f1 == 1) /*(x1,y1)在内部,(x0,y0)在外部*/
{
if(L0==1) /*左边求交*/
{
y = y0 - k*(x0 - r->xmin);
x = r->xmin;
}
else
{
if(T0==1) /*上边求交*/
{
x = x0 - k*(y0 - r->ymin);
y = r->ymin;
}
else
{
if(R0==1) /*右边求交*/
{
y = y0 - k*(x0 - r->xmax);
x = r->xmax;
}
else
{
if(B0==1)/*下边求交*/
{
x = x0 - k*(y0 - r->ymax);
y = r->ymax;
}
}
}
}
CSLine(x,y,x1,y1,r);
}
}
}
;
}
main()
{
Rect r;
int f;
int i,j,k,l;
int graphdriver = DETECT,graphmode;
initgraph(&graphdriver,&graphmode,"");
r.xmin = 200; r.ymin = 200;
r.xmax = 400; r.ymax = 400;
CSLine(100,100,600,600,&r);
getch();
closegraph();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -