计算机图形学算法处理线段,急
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 展开
现在已有程序
#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 展开
3个回答
展开全部
修改了一下,主要是移动了一下位置。
你的代码好老啊,比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;
}
你的代码好老啊,比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 广告
2024-11-10 广告
图形化编程是一种直观的编程方式,它通过拖拽图形化的编程积木来构建程序,降低了编程的学习门槛。在上海智位机器人股份有限公司,我们致力于将图形化编程应用于机器人教育等领域,使学习者能够以更加轻松、有趣的方式掌握编程技能。我们的图形化编程平台界面...
点击进入详情页
本回答由DFRobot提供
展开全部
下面修改成任意四只角裁剪, 只要你输入的点是在四边的任意点,就能正确显示.
只是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();
}
只是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();
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
输入矩形剪裁窗口的大小以后,你把剪裁以后的线的端点坐标记录下来,重新画一次就行了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询