计算机图形学裁剪试验报告怎么写
- 提问者网友:沉默菋噵
- 2021-07-21 17:29
- 五星知识达人网友:山君与见山
- 2021-07-21 17:52
为使计算机能够快速判断一条直线段与窗口属何种关系,采用如下编码方法。延长窗口的边,将二维平面分成九个区域。每个区域赋予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直线段裁剪算法
- 1楼网友:一秋
- 2021-07-21 18:45
不知你的要求是什么
我把我报告的一部分关于裁剪的粘给你
裁剪(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)
⒊ 字符的精密剪裁
正方形一边上任一点到这个正方形两条对角线的 |
阴历怎么看 ? |