计算机图形学算法处理线段,急

Cohen-SutherLand的线段裁剪算法,在tc上运行现在已有程序#include<graphics.h>#defineLEFT1#defineRIGHT2#def... Cohen-SutherLand的线段裁剪算法,在tc上运行
现在已有程序
#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,"c:\\turboc2");

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();

closegraph();

}
这个程序是直接显示处理完的图形
现在想加上 能自己输入矩形剪裁窗口的大小,并且能够看到没剪裁的时候的图形,然后一回车就是剪裁后的图形,应该怎么改?在线等,急需!0
展开
 我来答
高金山
2008-11-17 · TA获得超过1万个赞
知道大有可为答主
回答量:4101
采纳率:0%
帮助的人:1715万
展开全部
修改了一下,主要是移动了一下位置。

你的代码好老啊,比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;
}
DFRobot
2024-11-10 广告
图形化编程是一种直观的编程方式,它通过拖拽图形化的编程积木来构建程序,降低了编程的学习门槛。在上海智位机器人股份有限公司,我们致力于将图形化编程应用于机器人教育等领域,使学习者能够以更加轻松、有趣的方式掌握编程技能。我们的图形化编程平台界面... 点击进入详情页
本回答由DFRobot提供
ryw12403
2008-11-20 · TA获得超过1899个赞
知道大有可为答主
回答量:2501
采纳率:0%
帮助的人:2105万
展开全部
下面修改成任意四只角裁剪, 只要你输入的点是在四边的任意点,就能正确显示.
只是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();

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友aa20ab896
2008-11-17 · TA获得超过400个赞
知道小有建树答主
回答量:1601
采纳率:0%
帮助的人:1139万
展开全部
输入矩形剪裁窗口的大小以后,你把剪裁以后的线的端点坐标记录下来,重新画一次就行了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式