永发信息网

计算机图形学裁剪试验报告怎么写

答案:2  悬赏:60  手机版
解决时间 2021-07-22 08:09
运行后讨显示图形
最佳答案
该算法的思想是:对于每条线段P1P2分为三种情况处理。(1)若P1P2完全在窗口内,则显示该线段P1P2简称“取”之。(2)若P1P2明显在窗口外,则丢弃该线段,简称“弃”之。(3)若线段既不满足“取”的条件,也不满足“弃”的条件,则在交点处把线段分为两段。其中一段完全在窗口外,可弃之。然后对另一段重复上述处理。

为使计算机能够快速判断一条直线段与窗口属何种关系,采用如下编码方法。延长窗口的边,将二维平面分成九个区域。每个区域赋予4位编码CtCbCrCl。其中各位编码的定义如下:



图2.5.2 多边形裁剪区域编码 图2.5.3 线段裁剪


裁剪一条线段时,先求出P1P2所在的区号code1,code2。若code1=0,且code2=0,则线段P1P2在窗口内,应取之。若按位与运算code1&code2≠0,则说明两个端点同在窗口的上方、下方、左方或右方。可判断线段完全在窗口外,可弃之。否则,按第三种情况处理。求出线段与窗口某边的交点,在交点处把线段一分为二,其中必有一段在窗口外,可弃之。在对另一段重复上述处理。在实现本算法时,不必把线段与每条窗口边界依次求交,只要按顺序检测到端点的编码不为0,才把线段与对应的窗口边界求交。


Cohen-Sutherland裁减算法


#define LEFT 1


#define RIGHT 2


#define BOTTOM 4


#define TOP 8


int encode(float x,float y)


{ int c=0;


if(x<XL) c|=LEFT;


if(x>XR) c|=RIGHT;


if(x<YB) c|=BOTTOM;


if(x<YT) c|=TOP;


retrun c;


}


void CS_LineClip(x1,y1,x2,y2,XL,XR,YB,YT)


float x1,y1,x2,y2,XL,XR,YB,YT;


//(x1,y1)(x2,y2)为线段的端点坐标,其他四个参数定义窗口的边界


{ int code1,code2,code;


code1=encode(x1,y1);


code2=encode(x2,y2);


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; code1 =encode(x,y);}


else


{ x2=x;y2=y; code2 =encode(x,y);}


}


displayline(x1,y1,x2,y2);


}


页首


动画演示:Cohen-Sutherland直线段裁剪算法

全部回答

不知你的要求是什么

我把我报告的一部分关于裁剪的粘给你

裁剪(clipping)是裁去窗口之外物体或物体部分的一

种操作。

2.1 直线的剪裁

Cohen-Sutherland算法;

2.2 多边形的剪裁

Sutlerland_Hodgman算法

2.3 字符串的剪裁

裁剪:确定图形中哪些部分落在显示区之内,哪些落在显示区之外,以便只显示落在显示区内的那部分图形。这个选择过程称为裁剪。

窗口:画面上对应于屏幕显示的那部分区域成为窗口。一般定义为矩形。

2.1  直线的剪裁

直线和窗口的关系可以分为

如下3类(图2.20):

⑴ 整条直线在窗口内。此时,不需

剪裁,显示整条直线。

⑵ 整条直线在窗口外,此时,不需

剪裁,不显示整条直线。

 ⑶ 部分直线在窗口内,部分直线在

窗口外。此时,需要求出直线与窗框

的交点,并将窗口外的直线部分剪裁

掉,显示窗口内的直线部分。

直线剪裁算法有两个主要步骤。首先将不需剪裁的直线挑出,即删去在窗外的直线。然后,对其余直线,逐条与窗框求交点,并将窗口外的 部分删去。

Cohen-Sutherland直线剪裁算法

以区域编码为基础,将窗口及其周围的

8个方向以4 bit的二进制数进行编码。

各编码分别代表窗外上下右左空间的编码

图2.21所示的编码方法将窗口及其邻域

分为5个区域:

⑴ 内域:区域(0000)。

⑵ 上域:区域(1001, 1000, 1010)。

⑶ 下域:区域(0101, 0100, 0110)。

⑷ 左域:区域(1001, 0001, 0101)。

⑸ 右域:区域(1010, 0010, 0110)。

 当线段的两个端点的编码的逻辑“与”非零时 ,线段为显然不可见的  对某线段的两个端点的区号进行位与运算,可知这两个端点是否同在视区的上、下、左、右;

算法的主要思想是,对每条直线P1P2:

 ⑴ 对直线两端点P1、P2编码分别记为 

C1(P1)={a1, b1, c1, d1},C2(P2)={a2,

b2, c2, d2}其中,ai、bi、ci、di取值范

围为{1, 0},i∈{1, 2}。

 ⑵ 如果ai=bi=ci=di=0,则显示整条直

线,取出下一条直线,返步骤(1)。否则

,进入步骤(3)。

 ⑶如果|a1-a2|=1,则求直线与窗上边

(y=yw-max)的交点,并删去交点以上部分。如果|b1-b2|=1,

|c1-c2= |=1,|d1-d2|=1,作类似处理。

 ⑷ 返步骤(1)。

Cohen-Sutherland算法——C语言程序

#define LEFT 1

#define RIGHT 2

#define BOTTOM 4

#define TOP 8

int encode(float x,float y)

{ int c=0;

if(x<XL) c|=LEFT;

if(x>XR) c|=RIGHT;

if(x<YB) c|=BOTTOM;

if(x>YT) c|=TOP;

retrun c;

}

void CS_LineClip(x1,y1,x2,y2,XL,XR,YB,YT)

float x1,y1,x2,y2,XL,XR,YB,YT;//(x1,y1)(x2,y2)为线段的端点坐标,其他四个参数定义窗口的边界

{ int code1,code2,code;

code1=encode(x1,y1);

code2=encode(x2,y2);

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; code1 =encode(x,y);

}

else

{

x2=x;y2=y; code2 =encode(x,y);

}

}

displayline(x1,y1,x2,y2); //线段位于窗口内

}

2.6.2  多边形的剪裁

多边形剪裁算法的关键在于,通过剪裁,要保持窗口内多边形的边界部分,而且要将窗框的有关部分按一定次序插入多边形的保留边界之间,从而使剪裁后的多边形的边仍然保持封闭状态,以便填色算法得以正确实现(图2.22(c))。

Sutherland-Hodgeman算法—逐次多边形裁剪算法

基本思想:通过简单地一次用窗口的一条边裁剪多边形

算法:

(1) 将多边形表示为顶点表,即{P1,P2,… … Pn-1,Pn }, 并生成边表P1P2, P2P3, … … Pn-1Pn, PnP1,

(2) 用窗口边裁剪原多边形,生成中间多边形

(3) 对中间多边形重复步骤(2), 直至被窗口所有边裁剪完为止

关键:根据多边形的边表,逐次对每一段边与裁剪线(窗口边)比较,判别输入顶点的个数和坐标,并联结成封闭多边形

实现方法:

①设置二个表

输入顶点表(向量)—用于存放被裁剪多边形的顶点p1-pm。

输出顶点表(线性链表)—用于存放裁剪过程中及结果的顶点 q1-qn。

②输入顶点表中各顶点要求按一定顺序排列,一般可采用顺时针或逆时针方向。

③相对于裁剪窗口的各条边界,按顶点表中的顺序,逐边进行裁剪。

具体操作:

Pi 若位于边界线的可见一侧,则 Pi 送输出顶点表

Pi 若位于边界线的不可见一侧,则将其舍弃。

除第一个顶点外,还要检查每一个 Pi 和前一顶点 Pi-1是否位于窗口边界的同一侧,若不在同一侧,则需计算出交点送输出顶点表。最后一个顶点 Pn则还要与 P1 一起进行同样的检查。

裁剪前: 裁剪后:

输入顶点表:p1p2p3p4p5 输入顶点表: 不变

输出顶点表:空 输出顶点表: q1q2p3q7q8q5q6q4q3

•考虑窗口的一条边以及延长线构成的裁剪线该线把平面分成两个部分:可见一侧;不可见一侧 •多边形的各条边的两端点S、P。它们与裁剪线的位置关系只有四种

2.3 字符串的剪裁

字符串剪裁有3种可选择的方法。

⒈ 字符串的有或无剪裁

(all-or-none-text)

⒉ 字符的有或无剪裁

(all-or-none-character)

⒊ 字符的精密剪裁

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
赤壁市咸宁馋嘴屋这个地址在什么地方,我要去
DNF力驱怎么加点?
鸭子的由来?
发展现状英语怎么说,人们显示出……精神用英
卧龙区南阳市住房公积金管理中心哪位知道具体
请问日支上有将星,亡神是什么意思
谁知道刀郎现在在哪“(发展)”?
双清区邵阳双清区春云学校心理咨询室在什么地
需要哪些配件才能做出一张桌面可折叠的书桌?
求一首90年代香港粤语劲歌~
捷波HA03-GT2能破解是四核嗎?
DNF叫人帮你附魔安全吗?
信阳那个群人气旺?
安踏是什么样的企业?
为什么我进不了战地之王
推荐资讯
当both作为代词时 什么时候用both of +复数名
iphone 3G(8G) 上海哪有买?多少钱,最便宜的
新蔡县驻马店新蔡作物营养医院我想知道这个在
我是农历1991年10月初9出生的,我想知道我以
混凝土顶管怎么套定额,轻集料混凝土垫层套什
一到六年级的爱国诗句,诗人出处朝代,急!!
暗香这首歌是什么意思,怎么理解《人质》这首
豆科植物根瘤菌固氮,有根瘤菌的植物只有豆科
形容老人病缠身的诗句,老人重病缠身怎样安慰
请问"文科"有哪些,"理科"有哪些
刺槐林的意思是什么,刺槐林是什么意思?
祝福好朋友幸福的歌,祝福别人幸福的话?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?