问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间: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

输入矩形剪裁窗口的大小以后,你把剪裁以后的线的端点坐标记录下来,重新画一次就行了。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
什么网址更新火影忍者集数最快 如果你跟男朋友分手了,他的回答是顺其自然这是什么意思,我该怎么办... 一个女人像男人提分手男人说顺其自然是什么意思 上线两年《X-HERO》如何做到登顶多个国家榜首的? 龙武游戏怎么样费钱吗 Q1游戏公司产品 中国现有什么银行 x.最近六个月的通话记录? 爱奇艺会员哪里买便宜 爱奇艺会员免费领取 iphone4 怎样删除原来的旧凯立德地图 计算机图形学,要怎么入门。 涉及算法的部分,对我来说太难了,求指导... 计算机图形学中直线的生成算法 高分!!!急~~~一道计算机图形学算法的问题。。 bresenham画线算法与计算机图形学画线算法有什么不同? 计算机图形学的介绍 计算机图形学直线生成算法 &quot;至圣亚圣&quot;指谁?你们对他们有什么看法,最欣赏谁? 计算机图形学里面涉及的遮挡剔除算法? 谁是亚圣 计算机图形学所涉及的算法有哪些 在先秦诸子中,被后世称为“亚圣”的人是谁? 学好计算机图形学需要学习那些相关的知识? 求计算机图形学中的直线绘制函数法、DDA算法、中点法和Bresenham算法的优缺点以及比较. 为什么师旷被尊为“亚圣”?和历史上哪件事情有关? 计算机图形学有什么特点? 计算机图形学旋转算法? 亚圣是什么圣 什么是&quot;亚圣&quot;? 孔子是至圣,那么亚圣和复圣是谁呢 亚圣是什么意思? 计算机图形学编程 计算机图形学程序 王字开头高雅的词语 王字开头的词语 以王字开头的七字诗句? 王字开头的成语接龙 以“王”字开头的名字 王字打头地名? 以“王”字开头的四字祝福语有哪些? 王字打头的四个字词语 字以王字开头的四字祝福语 “王”字开头的对联的横批 王字开头的诗句 征信花了,负债有些高急需贷款 水星无线路由那个型号好,水星(MERCURY)MW310R和水星(Mercury)MW300R ,或有什么品牌介绍, 水星(Mercury)MW300R 300M无线路由器 路由器mercury-v后面一般是什么型号? 水星MERCURY无线扩展器,型号:MW300RE,怎样使用? MERCURY水星300M无线路由器 型号MW313R. 主DNS服务器Ping失败怎么办 最近从朋友那里拿了个mercury的无线路由器,型号:MW54R,54M的。进不了192.168.1.1,怎么回事?