计算机图形学实验四 :裁剪

合集下载

计算机图形学裁剪技术

计算机图形学裁剪技术


求交测试顺序固定(左右下上) 最坏情形,线段求交四次。
裁剪
直线段裁剪
Cohen-Sutherland算法 中点分割算法 参数化裁剪算法 Liang-Barskey算法
多边形裁剪
Sutlerland_Hodgman算法
Weiler-Athenton算法
字符裁剪
裁剪

裁剪:确定图形中哪些部分落在显示区之内, 哪些落在显示区之外 , 以便只显示落在显示区 内的那部分图形。这个选择过程称为裁剪。在 进行裁剪时,画面中对应于屏幕显示的那部分 区域称为窗口。
Cohen-Sutherland算法

将区域码的各位从右到左编号,则坐标区 域与各位的关系为:
任何位赋值为1,代表端点落在相应的位置上,否则该 位为0。若端点在剪取矩形内,区域码为0000。如果端 点落在矩形的左下角,则区域码为0101。
直线段裁剪

裁剪线段与窗口的关系:(1)线段完全可见;(2) 显然不可见;(3)其它 提高裁剪效率: 快速判断情形(1)(2), 对于情形(3),设法减 少求交次数和每次求 交时所需的计算量。
常用的线段裁剪方法三种:

Cohen-Sutherland算法 中点分割算法 参数化裁剪算法
Cohen-Sutherland裁剪

基本思想:
对于每条线段P1P2分为三种情况处理: (1)若P1P2完全在窗口内,则显示该线段P1P2。 (2)若P1P2明显在窗口外,则丢弃该线段。
(3)若线段不满足(1)或(2)的条件,则在交点处把线段
分为两段。其中一段完全在窗口外,可弃之。然后对另一段 重复上述处理。

如何实现上述的处理呢?
实现方法:采用下面的编码方法

计算机图形学第四讲

计算机图形学第四讲
第一位为1:端点处于上边界的上方 第二位为1:端点处于下边界的下方 第三位为1:端点处于右边界的右方 第四位为1:端点处于左边界的左方 否则,相应位为0
11
1001 0001
xL
A
B
C
1000 0000 E 裁剪窗口 0100
xR
第4讲 图形裁剪算法
1010 D yT 0010
7
第4讲 图形裁剪算法
直线裁减的效率策略
首先,通过方法来快速判断完全在窗口内和完全 在窗口外的直线 若是部分在窗口内的情况,则设法减少直线的求 交次数和每次的求交计算量
8
第4讲 图形裁剪算法
直线裁剪算法
Cohen-Sutherland裁剪算法 中点分割算法 梁友栋-Barsky裁剪算法
9
第4讲 图形裁剪算法
Cohen-Sutherland裁剪算法(编码裁剪法)
基本思想:对于每条待裁剪的线段P1P2分三种情 况处理
若P1P2完全在窗口内,则显示该线段 若P1P2完全在窗口外,则丢弃该线段 若线段不满足上述条件,则求线段与窗口边界的交点, 在交点处把线段分为两段,其中一段完全在窗口外, 可舍弃之,然后对另一段重复上述处理
P1
P1
P1
A
Pm
A Pm A B B P2
B Pm
18
P2
P2
第4讲 图形裁剪算法
算法特点
对分辨率为2N×2N的显示器,上述二分过程至多 进行N次 主要过程只用到加法和除法运算,适合硬件实现, 它可以用左右移位来代替乘除法,这样就大大加 快了速度
19
第4讲 图形裁剪算法
梁友栋-Barsky裁剪算法
13
第4讲 图形裁剪算法

计算机图形学之裁剪算法

计算机图形学之裁剪算法

窗口特别小的场合。
2、中点裁剪法
中点分割裁剪法是将Cohen-Sutherland 算法中求线段与窗口边界的交点的过程用折 半查找(即求中点)的方法来代替。仍然采 用对线段端点进行编码的方式判断完全可见 和显然完全不可见的线段,对于与窗口有交 点的线段,该算法分别求离两个端点最近 (或最远)的可见点。这两个可见点之间的 线段即是原线段的可见部分。
计算P1P2的最近可见点Pma和 Pmb : (一)直线段P1P2的一个端点可见, P1 另一个端点不可见。 只需解算不可见端点的最近的 可见点。 1)设P1不可见,计算P1P2的中点Pm1。
P1
pm
P2
P2
判断中点Pm1如果落在(接近)窗口边上,则 确定该中点为最近可见点。裁剪结束。否则,
2)判断Pm1是否可见: 如果Pm1可见,以Pm1取代P2 ,返回到 1)计算 P1Pm1的中点Pm2,判断Pm2 如果Pm1不可见,以Pm1取代P1 ,返回到 1)计 算Pm1P2的中点Pm2,判断Pm2
关键: 根据多边形的边表,逐 次对每一段边与裁剪线 (窗口边直线)比较,判 别输入顶点的个数和坐 标,并联结成封闭多边 形。
不可见侧
2
多边形边与裁剪线相对位置的四种
情况与处理方法: (1) 位于可见一侧:输出终点作 为新多边形顶点 (2) 位于不可见一侧:不输出 (3) 由可见到不可见:输出与裁剪
P2
两种线段裁剪算法的比较
Cohen-Sutherland算法是最早的、使用最广泛的线
段裁剪算法之一。在裁剪窗口很大,大部分线段完全
可见,或裁剪窗口很小,大部分线段完全不可见的情 况下,该算法特别有效;在一般情况下,该算法有时 要做不必要的求交运算,因而效率不是太高.

计算机图形学变换和裁剪PPT课件

计算机图形学变换和裁剪PPT课件

k a11
k A k a21
k k
a3 1 a4 1
k a12 k a22 k a32 k a42
k a13 k a23 k a33 k a43
k a14 k a24
k k
aa3444
(3)矩阵的乘法
矩阵A的列数和矩阵B的行数相同时可以相乘.设A为
m*n矩阵,B为n*p矩阵,c为乘积矩阵,则c为m*p阶
UU U
8
4.1.2 矢量-矢量的点乘
(5)矢量的点乘
矢量 U和 的V 点乘表示为 。UV定义如下:
U Vuxvxuyvyuzvz
夹角的余弦定义如下: cos UV
Uห้องสมุดไป่ตู้
U V
θ
点乘的几何意义如图4.3所示
V
图4.3 U·V即U在V上的投影乘
以V的模
由以上可得点乘的如下性质: U V0 U V
也就是说两个互相垂直的矢量(一般称为矢量正交) 的点乘为0。
24
2.放大和缩小变换
设点(x, y, z)经缩放变换后得点 (x,y,z)。两点坐标间的关系

x sx x
y sy y
z sz z
其中sx,sy和sz 分别为沿x, y和z轴方向
放缩的比例。
其矩阵形式是
x sx 0 0x
y
0
sy
0 y
z 0 0 sz z
(4.3)
25
以图形中心为中心的缩放
红色为新坐标系ouvw31则axayaz为z轴方向不必变换坐标系ow轴的指向和axayaz的指向一致ou轴可取在经过o点并和ow轴垂直的任一直线上则ow轴方向的单位向量为绕过原点的轴旋转的具体计算32从坐标系oxyz至坐标系ouvw的变换为由于向量uvw是互相正交的单位向量可知矩阵a的逆矩阵就是a的转臵矩阵a33231332221231211133变换公式由以上各式可得变换公式为

计算机图形学的裁剪算法

计算机图形学的裁剪算法

计算机图形学的裁剪算法
计算机图形学的裁剪算法是图形学的一种重要算法,它的基本思想是将一个完整的几何图形(如线段、多边形、圆圈等)按照指定的裁剪窗口(矩形)进行裁剪,只保留在窗口内的部分,而把窗口外的部分抛弃掉。

由于裁剪算法的应用非常广泛,像图形显示系统、图形设备接口(GDI)和图形处理器(GPU)等都广泛使用裁剪算法。

计算机图形学的裁剪算法可以分为两种:2D裁剪算法和
3D裁剪算法。

2D裁剪算法是基于二维空间的,它将一个几何
图形投影到一个平面上,然后按照指定的窗口裁剪;而3D裁
剪算法是基于三维空间的,它将一个几何图形投影到一个三维空间,然后按照指定的窗口裁剪。

2D裁剪算法的基本步骤如下:首先,将要裁剪的几何图
形投影到平面上;其次,计算出投影后的几何图形以及裁剪窗口之间的交点;最后,将裁剪窗口内的部分保留,而把窗口外的部分抛弃掉。

3D裁剪算法的基本步骤如下:首先,将要裁剪的几何图
形投影到三维空间;其次,计算出投影后的几何图形以及裁剪窗口之间的交点;最后,将裁剪窗口内的部分保留,而把窗口外的部分抛弃掉。

计算机图形学的裁剪算法在图形处理中有着重要的作用,它不仅能够有效减少图形处理时间,而且还可以节约存储空间。

此外,它还可以有效提高图形处理效率,提高图形显示效果。

但是,它也存在着一定的局限性,比如,当几何图形的运动变得复杂时,它就会变得费时费力,这就对性能产生了一定的影响。

总之,计算机图形学的裁剪算法是图形学的重要算法,它的应用非常广泛,在图形处理中有着重要的作用。

虽然它也存在着一定的局限性,但是它仍然是一种有效的图形处理算法。

第07部分_计算机图形学_裁剪

第07部分_计算机图形学_裁剪
2015/11/14 第8部分 裁剪 第3页
P(t)=(P2-P1)t+P1
Ni ( P(t ) Ai ) 0(i 1,2,, k ) 0 t 1 Ni ( P 1 Ai ) N i ( P 2 P 1 )t 0 0 t 1
2015/11/14
第8部分 裁剪
第6页
程序实现
void LB_LineClip(x1,y1,x2,y2,XL,XR,YB,YT) float x1,y1,x2,y2,XL,XR,YB,YT; { float dx,dy,u1,u2; tl=0;tu=1;dx =x2-x1;dy =y2-y1; if(ClipT(-dx,x1-Xl,&u1,&u2) if(ClipT(dx,XR-x1, &u1,&u2) if(ClipT(-dy,y1-YB, &u1,&u2) if(ClipT(dy,YT-y1, &u1,&u2) { displayline(x1+u1*dx,y1+u1*dy, x1+u2*dx,y1+u2*dy) return; } }
2015/11/14
第8部分 裁剪
第12页
三维裁剪

编码方法
– Cohen-Sutherland算法 – 中点分割算法

参数化裁剪算法
– Cyrus-Beck算法
• 二维向量换成三维向量 • 边法向量换成面法向量
2015/11/14
第8部分 裁剪
第13页
字符裁剪

字符裁剪分类
– 串精度:将包围字串的外接矩形对窗口作裁剪。 – 字符精度:将包围字的外接矩形对窗口作裁剪。 – 象素精度:将笔划分解成直线段对窗口作裁剪。

计算机图形学-NLN线段剪裁算法


3、点p1的第三种状态
• 点p1在裁剪窗口的左上角区域,这种状态又将p1的位置 分为两种进行讨论,即靠近上边界的和靠近左边界的两 种位置。如图 p1
p1 L2 L2
L1
L3 L4 L4
L3
L1
P1位置判别
kp1a>kab,p1为下图a所示; Kp1a<kab,p1为下图b所示;
如果靠近上边界
• • • • 如果靠近上边界,那么 (1)当k>=k1 && k<=k2时, 当p2在裁剪窗口的内部,求交点 y=YT; x=(y-y1)/(y2-y1)*(x2-x1) ;交点 (x,y),那么点p2与交点的连线就是我们的 裁剪结果 • 当p2在裁剪窗口的外部,此时我们需要求 两个交点 • x0=XR; y0 =(y2-y1)/(x2-x1) *(x0-x1);交 点(x0,y0) • y=YT; x=(y-y1)/(y2-y1)*(x2-x1) ;交点 (x,y),那么两个交点的连线就是我们的裁 剪结果。
2、点p1在裁剪窗口的正左边
L1 L2
p1
p2
L3
L4
• 端点p2的位置有两种选择,在裁剪窗口内部或在裁剪窗口的外 面,利用点p2的编码来判断,即如果codep2==0,那么点p2在 裁剪窗口内部;否则点p2在裁剪窗口外部。???????? • (1)当k>=k2 && k<=k1时, • 当p2在裁剪窗口的内部,求交点 • x=XL;y =k*(x-x1);交点是(x,y),那么点p2与交点的连线就是 的裁剪结果; • 当p2在裁剪窗口的外部,此时我们需要求两个交点 • x0=XL; y0 =k*(x0-x1);交点(x0,y0) • y=YT; x=k*(x2-x1) ;交点(x,y),两个交点的连线就是裁剪结 果。

计算机图形学(编码裁剪)

for(i=0;i<100;i++)
a[i]=rand()%600;
for(i=0;i<25;i++)
{
setcolor(2);
line(a[4*i+0],a[4*i+1],a[4*i+2],a[4*i+3]);
C_S_LineClip(a[4*i+0],a[4*i+1],a[4*i+2],a[4*i+3],100,500,100,400);
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;
}
void C_S_LineClip(float x1,float y1,float x2,float y2,float xl,float xr,float yb,float yt)
{
int code1,code2,code;
float x,y;
XL=xl;
XR=xr;
YB=yb;
YT=yt;
encode(x1,y1,&code1);
encode(x2,y2,&code2);
while(code1!=0||code2!=0)
{
if((code1&code2)!=0)

计算机图形学中二维裁剪算法的研究

计算机图形学中二维裁剪算法的研究随着计算机技术的发展,计算机图形学也日益成熟。

在我们的日常生活中,也成了随处可见的必需部分。

在医学、娱乐、图形艺术、商业、教育培训、科学工程等众多领域,计算机图形学的应用非常普遍。

计算机图形学主要研究的是在计算机中构造图形,将用数学模型描述的图形数据采用合适的算法转换为屏幕上图形的显示。

计算机图形学学科研究的对象为二维图形学和三维图形学及其显示和变化情况。

点、线、面为二维图形学范畴,几何体和场等数学构造方法则为三维图形学范畴。

现在,计算机图形学的一些基本算法已经形成了固化在硬件中的规范软件包,这个学科也日趋成熟和完善。

但是依然有很多算法还需要不断的改进才能应用到实际中,而裁剪算法就是其中之一。

本文主要对二维图形裁剪中的椭圆形窗口裁剪算法进行了研究,使其具有较高的效率和稳定性。

标签:计算机图形学裁剪算法椭圆形窗口线裁剪算法1 裁剪概述裁剪算法,简称裁剪,是计算机图形学中很多重要问题的基础,它就是从数据集合中识别指定区域内或指定区域外图形部分的过程。

裁剪用途很广泛,最典型的就是确定场景中位于指定区域内的景物部分。

其中,指定区域成为裁剪窗口,一般为矩形,由四条边组成,上、下、左、右,即:(Xl,Yb),(Xr,Yt)。

实质上来说,裁剪就是确定哪些多边形等几何体位于裁剪窗口内。

对于点(X,Y),只要判断两对不等式:Xl≤X≤Xr,Yb≤Y≤Yt即可。

如果四个点坐标的不等式都不成立,则这个点在矩形窗口外,否则,在窗口内。

有一种最简单的裁剪方法,就是将所有图形扫描转换成点,然后在进行判断。

但是这种方法时间消耗太大,非常不可取。

倘若将全部在窗口外的图形完全排除而不进行扫描转换,则时间上面可以高效很多,故一般采用先裁剪再扫描的方法。

按裁减对象来分,裁剪算法大概分为如下几种:点裁剪、直线段裁剪、区域多边形裁剪、曲线裁剪和文字裁剪。

裁剪有多方面应用,主要包括:使用实体造型创建对象、在三维视图中标示出可见面、对图形的一部分进行删除、复制或移动操作、防止图形边界混淆、从特定场景中抽取指定部分等。

裁剪II(计算机图形学)


5. AP2的中点为P3,AP3简弃,再处理P3P2, 其中点为P4, 得到与A最近的点P4 6. P1P2的中点为P5, P5P2可简取,处理P1P5 7. P1P5的中点P6,简弃P6P1,得到与B最近的点P6 8. 处理完毕,得到裁剪结果 P4P6
B
中点分割裁剪算法演示例子
12
2009-2010-2:CG:SCUEC
XL
0000 A
0010
YB
0101
0100
XR
0110
2009-2010-2:CG:SCUEC
2
端点(x,y)编码流程
初值flag =0 y>YT Y flag首位为1 N N y<YB Y Flag第二位为1 N N
x>XR Y flag第三位为1
x<XL Y flag第四位为1
返回
2009-2010-2:CG:SCUEC
2009-2010-2:CG:SCUEC
10
中点分割裁剪算法框图
P0可见否? N P0P1显然不可见 N Pm= (P0+P1)/2 Y Y A= P0 exit 原线完全不可见 exit
|Pm – P0|<ε? N
Y A= Pm exit
P0Pm显然不可见?
Y P0 = Pm N P1= Pm
2009-2010-2:CG:SCUEC
3
Sutherland-Cohen裁剪算法-判断
对要被裁剪的线段的两个端点, 如果其所在的区域的编码均是 0000,则这条线段完全可见; 比如线段AB,两端点的编 码都为0000
1001 G 0001 A 1000 B 0000 1010
E
0010 F L 0110 K
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

贵州大学实验报告 学院:计算机科学与技术 专业: 计算机科学与技术 班级:计科131 姓名 学号 实验组 实验时间 指导教师 黄初华 成绩 实验项目名称 直线裁剪 实验目的

一、实验目的 掌握常用的裁减及消隐算法:直线的裁剪

实验要求

实现一个直线裁减算法 对于设计性实验,应根据“由学生自行设计实验方案并加以实现的实验”内涵要求,

注意省略由学生自主设计的“实验方案”. 根据本实验的特点、要求和具体条件,采用“以学生自主训练为主的开放模式组织教学,还是采用集中授课形式”,须加以明确。

实验原理

直线裁减 Cohen-SutherLand算法(编码算法) 算法原理(递归的裁剪过程): 对于每条线段P1P2分为三种情况处理:

(1)若P1P2完全在窗口内,则显示该线段P1P2。 (2)若P1P2明显在窗口外,则丢弃该线段。 (3)若线段不满足(1)或(2)的条件,则在交点处把线段分为两段。其中一段完全在窗口外,可弃之。然后对另一段重复上述处理。 为快速判断,采用如下编码方法: 由窗口四条边所在直线把二维平面分成9个区域(右图),每个区域赋予一

个四位编码:CtCbCrCl(上下右左);直线的端点都按其所处区域赋予相应的区域码,用来标识出端点相对于裁剪矩形边界的位置。 各位编码含义:

1001 0001 0101 1000 0000 0100

1010 0010 0110 上:if y>ymax,Ct=1,else, 0; 下:if y右:if x>xmax,Cr=1,else, 0; 左:if x对某线段的两个端点的区号进行位与运算,可知这两个端点是否同在视区的上、下、左、右; ‐ 如果两端点的编码均为0000,表示直线在窗口内。 ‐ 如果两端点的编码相与不为0000,表示直线在窗口外。 ‐ 如果两端点的编码不全为0000,但相与为0000,则该直线部分可见,需计算直线与窗口的交点,确定哪一部分可见。 ‐ 算法描述: BOOL done,draw;(done表示是否完成,draw表示是否可见) Unsigned char code1,code2;端点1,端点2的编码 While (!done) begin if (判断code1,code2,若为第1种情况) begin done = TRUE; draw = TRUE; end else if (为第2种情况) begin done = TRUE; draw = FALSE; end else if(检查code1,若在窗口内)/*第3种情况*/ begin 交换端点及端点的编码;以左,上,右,下的次序对端点1进行判断及求交;将交点的值赋给端点1; end end

算法分析: 本算法的优点在于简单,易于实现。用编码方法可快速判断线段的完全可见和显然不可见,他可以简单的描述为将直线在窗口左边的部分删去,按左,右,下,上的顺序依次进行,处理之后,剩余部分就是可见的了。在这个算法中求交点是很重要的,他决定了算法的速度。 本算法对于其他形状的窗口是否同样有效就值得讨论了,这也证明了在图形算法中,没有几个是对大多数情况有效的。 特别适用二种情形:大窗口场合;窗口特别小场合(光标拾取图形,光标看作小的裁剪窗口)。 Cohen-Sutherland与中点法在区域码测试阶段能以位运算方式高效率地进行,因而当大多数线段能够简单的取舍时,效率较好。

实验环境 五、实验条件: 硬件平台:PC 软件(推荐):Windows平台,Visualstdio2013,opengl

实验步骤

六、实验步骤 1. 掌握算法原理; 2. 依据算法,编写源程序并进行调试; 3. 对运行结果进行保存与分析; 4. 把源程序以文件的形式提交; 5. 按格式书写实验报告。

实验内容

#include"stdafx.h" #include #include #include

#pragma comment( lib, "opengl32.lib" ) #pragma comment( lib, "glu32.lib" ) #pragma comment( lib, "glut32.lib" )

#define LEFT_EDGE 1 #define RIGHT_EDGE 2 #define BOTTOM_EDGE 4 #define TOP_EDGE 8 static int times = 1;

//画从(x0,y0)到(x1,y1)的直线 void LineGL(int x0, int y0, int x1, int y1) { glBegin(GL_LINES); glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(x0, y0); glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(x1, y1); glEnd(); }

//矩形的结构体 typedef struct Rectangle { float xmin; float xmax; float ymin; float ymax; } Rectan;

Rectan rect; int x0, y0, x1, y1;

//求出坐标点的Cohen-Sutherland编码 int CompCode(int x, int y, Rectan rect) { int code = 0x00; if (y < rect.ymin) { code = code | 4; }

if (y>rect.ymax) { code = code | 8; }

if (x>rect.xmax) { code = code | 2; }

if (x{ code = code | 1; }

return code; } //裁剪直线 int cohensutherlandlineclip(Rectan rect, int& x0, int& y0, int& x1, int& y1) { int accept = 0, done = 0; float x, y; int code0, code1, codeout; int x00 = x0, y00 = y0, x11 = x1, y11 = y1;

code0 = CompCode(x0, y0, rect); code1 = CompCode(x1, y1, rect);

//直线全部在矩形框内部,应保留 if (!(code0 | code1)) { accept = 1; done = 1; }

//直线和矩形不相交,并且划直线的两点在矩形同侧(上、下、右。左),应去掉。 if (code0 & code1) { done = 1; }

while (!done) { //直线和矩形有交点,只保留矩形内部的 if (!(code0 | code1)) { accept = 1; done = 1; } else { if (code0 != 0) { codeout = code0; } else { codeout = code1; }

if (codeout & LEFT_EDGE) { y = y0 + (y1 - y0)*(rect.xmin - x0) / (x1 - x0); x = (float)rect.xmin; } else { if (codeout &RIGHT_EDGE) { y = y0 + (y1 - y0)*(rect.xmax - x0) / (x1 - x0); x = (float)rect.xmax; } else { if (codeout & BOTTOM_EDGE) { x = y0 + (x1 - x0)*(rect.ymin - y0) / (y1 - y0); y = (float)rect.ymin; } else { if (codeout & TOP_EDGE) { x = x0 + (x1 - x0)*(rect.ymax - y0) / (y1 - y0); y = (float)rect.ymax; } } } }

if (codeout == code0) { x0 = x; y0 = y; code0 = CompCode(x0, y0, rect); } else { x1 = x; y1 = y; code1 = CompCode(x1, y1, rect); }

//直线和矩形不相交,但是划直线的两点在矩形不同侧,这时应去掉。 if ((times <= 3) && (code0 & code1))

相关文档
最新文档