计算机图形学算法处理线段,急
发布网友
发布时间:2022-04-28 19:39
我来回答
共3个回答
热心网友
时间:2023-09-14 16:46
修改了一下,主要是移动了一下位置。
你的代码好老啊,比C99老多了,比C89还老。
我简单的改了下,不知道是不是你的要求。
也没TC,无法运行验证。
#include <stdio.h>
#include <graphics.h>
#define LEFT 1
#define RIGHT 2
#define BOTTOM 4
#define TOP 8
/*
#define XL 100
#define XR 400
#define YB 100
#define YT 400
*/ //去掉的代码
float XL,YB,XR,YT; ///添加的代码 //从main函数中移动过来
void encode(float x,float 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;
}
/*(x1,y1)与(x2,y2)是线段端点坐标,
其它四个参数分别定义窗口的左,下,右,上边界*/
void C_S_LineCLip(float x1, float y1, float x2, float y2)
{
int code1,code2,code;
float x,y;
encode(x1,y1,&code1);
encode(x2,y2,&code2);
while((code1!=0) || (code2!=0))
{
if((code1&code2)!=0)return;
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);}
}
line((int)x1,(int)y1,(int)x2,(int)y2);
return;
}
int main()
{
int graphdriver=VGA;
int graphmode=VGAHI;
float px1,py1,px2,py2;
//float XL,YB,XR,YT; ///添加的代码 移动到最前面
initgraph(&graphdriver,&graphmode,"c:\\turboc2");
scanf("%f%f%f%f",&XL,&YB,&XR,&YT); ///添加的代码
rectangle(XL,YB,XR,YT);
printf("Please input two end points of the line that will be cilped: ");
scanf("%f%f%f%f",&px1,&py1,&px2,&py2);
C_S_LineCLip(px1, py1, px2, py2);
closegraph();
getchar();
return 0;
}
热心网友
时间:2023-09-14 16:46
下面修改成任意四只角裁剪, 只要你输入的点是在四边的任意点,就能正确显示.
只是BGI 路径要改成你自己的,如要裁剪长方形,因要确定是上部还是下,或左还是右。
#include<stdio.h>
#include<graphics.h>
#define LEFT 1
#define RIGHT 2
#define BOTTOM 4
#define TOP 8
#define XL 100
#define XR 400
#define YB 100
#define YT 400
void encode();
void C_S_LineCLip(x1, y1, x2, y2)
float x1, y1, x2, y2;
/*(x1,y1)与(x2,y2)是线段端点坐标,
其它四个参数分别定义窗口的左,下,右,上边界*/
{
int code1,code2,code;
float x,y;
encode(x1,y1,&code1);
encode(x2,y2,&code2);
while((code1!=0) || (code2!=0))
{
if((code1&code2)!=0)return;
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);}
}
line((int)x1,(int)y1,(int)x2,(int)y2);
return;
}
void encode(x, y, code)
float x, y;
int *code;
{
int c;
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;
}
main()
{
int graphdriver=VGA;
int graphmode=VGAHI;
float px1,py1,px2,py2;
initgraph(&graphdriver,&graphmode,"d:\\tc3\\bgi");
setwritemode(1);
rectangle(XL,YB,XR,YT);
printf("Please input two end points of the line that will be cilped: ");
scanf("%f%f%f%f",&px1,&py1,&px2,&py2);
C_S_LineCLip(px1, py1, px2, py2);
getch();
if(px1<=XL&&py1>=YB){
if(px2>XL&&py2<=YB){
line(XL,YB,px1,py1);
line(XL,YB,px2,py2);
}
if(px2>XL&&py2>=YT){
line(XL,YT,px1,py1);
line(XL,YT,px2,py2);
}
}
if(px1>=XR&&py1>=YB){
if(px2<XR&&py2<=YB){
line(XR,YB,px1,py1);
line(XR,YB,px2,py2);
}
if(px2<XR&&py2>=YT){
line(XR,YT,px1,py1);
line(XR,YT,px2,py2);
}
}
getch();
closegraph();
}
热心网友
时间:2023-09-14 16:46
输入矩形剪裁窗口的大小以后,你把剪裁以后的线的端点坐标记录下来,重新画一次就行了。