计算机图形学(裁剪)

裁剪:从大的画面中抽取所需的信息,以显示局部。与裁剪对应的显示区,称为窗口。
最典型的用途:确定场景或画面中位于给定区域的部分,称为裁剪区域(二维:矩形,三维:视见体-四棱柱、四棱台)
一、二维空间的裁剪窗口:矩形
裁剪对象:点、线、多边形
1.对点的裁剪:对点在窗口内的包含检测
裁剪窗口为:Xmin<=x<=Xmax,Ymin<=y<=Ymax
点(x,y)在窗口内部的条件是:
在这里插入图片描述
2.对于直线的裁剪
(1)Cohen-Sutherland(编码)算法
在这里插入图片描述
分区和编码:
对于给定平面,平面中有四条直线(四条直线内部所围成的矩形是裁剪窗口)将该平面分为9个区域,用四位2进制数D1D2D3D4对这九个区域进行编码,D0标记裁剪窗口的左边界XL,D1标记裁剪窗口的右边界XR,D2标记裁剪窗口的下边界YB,D3标记裁剪窗口的上边界YT。
对于平面内一点(x,y),根据其坐标所在的区域,赋予一个4为的二进制码,编码规则:
在这里插入图片描述
根据直线两端点编码区分:取、弃、裁
当直线两端点的编码code1和code2都为0000,取之;
当直线两端点的编码code1和code2都不为0000,且code1与code2按位与结果不为0000,说明直线位于平面内四条直线的某一条直线的外侧,弃之;
例如:
在这里插入图片描述
当直线两端点的编码code1和code2都不为0000,且code1与code2按位与结果为0000或者一个端点的编码位0000、另一个端点编码不为0000,说明直线与裁剪窗口相交,裁之(需要求出直线与裁剪窗口边界线的交点,利用该交点作为直线段的新交点进行下一次的裁剪判断)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
例如下例:线段P1P2,P1、P2的编码code1,code2都不为0000,且code1与code2按位与结果为0,所以对线段采取的操作是裁之。裁剪线段是需考虑线段与窗体边界的交点(只需考虑code1与code2与窗体边界直线对应位不一致的情况)。例如,左边界对应D0,P1的D0位为1,P2的D0位为0,P1P2与直线有交点,交点为P3,求出P3后在对线段P3P2进行同样的操作(上边界对应位为D3,P1、P2的D3位都为0,P1P2与上边界没有交点,不需要求交点)。
在这里插入图片描述
在这里插入图片描述
(2)梁友栋-Barsky裁剪算法
将窗体边界直线中的左右边界直线、上下边界直线分为分为始边、终边:
在这里插入图片描述
将被裁剪线段的起点(P1)和其与两条始边的交点A,B分为一组,称为起始组,将被裁剪线段的终点(P2)和其与两条终边的交点C,D分为一组,称为终止组。
将直线用下图形式表示:
在这里插入图片描述
dx,dy为实数(dx=x2-x1,dy=y2-y1);t为参数,当参数t处于0~1时,表示(x1,y1)和(x2,y2)之间的线段,当t<0时,表示向P1外侧延伸的部分,当t>1时,表示向P2外侧延伸的部分。(起点P1的t值为0,终点P2的t值为1)
要找出A,B,P(起始组)与P2(终点)最近的点,只需找该三个点中t值最大的点,该点t值为t1;要找出C,D,P2(终止组)与P1(起点)最近的点,只需找该三个点中t值最小的点,该点t值为t2.
在这里插入图片描述
2.对多边形的裁剪
Sutherland-Hodgman算法(只适用于凸多边形,如果要作用于凹多边形,则应先将凹多边形分割成多个凸多边形在进行裁剪):分割处理、逐边裁剪的算法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1) 如果整条直线完全在窗口之内。此时,不需剪裁,显示整条直线,简称“取”之。 2) 如果整条直线明显在窗口之外,此时,不需剪裁,不显示直线。简称“弃”之。 3) 如果部分直线在窗口之内,部分在窗口之外。此时,需要求出直线与窗框之交点,并将窗口外的直线部分剪裁掉,显示窗口内的部分。 图2-1多边形裁剪区域编码 图2-2线段裁剪 为使计算机能够快速判断一条直线段与窗口属何种关系,采用如下编码方法。延长窗口的边,把未经裁剪的图形区域分成九个区,如图2-1所示。每个区具有一个四位代码,即四位二进制数,从左到右各位依次表示上、下、右、左。裁剪一条线段(如图2-2)时,先求出端点P1P2所在的区号code1和code2。若code1=0, 且code2=0,则说明线段P1P2均在窗口内,那么整条线段也必在窗口内,应取之。 若code1和code2经按位与运算后的结果code1&code2≠ 0,则说明两个端点同在窗口的上方、下方、左方或右方。在这种情况下,可判断线段完全在窗口外,可弃之。 如果上述两种条件均不成立,则按第三种情况处理。求出线段与窗口某边的交点,在交点处把线段一分为二,其中必有一段完全在窗口外,可弃之。再对另一段重复上述处理。 在实现本算法时,不必把线段与每条窗口边界依次求交,只要按顺序检测到端点的编码不为0,才把线段与对应的窗口边界求交。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值