没有合适的资源?快使用搜索试试~ 我知道了~
直线裁剪算法研究(Cohen-Sutherland算法和Liang-Barsky算法).doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 175 浏览量
2022-05-07
23:28:16
上传
评论
收藏 256KB DOC 举报
温馨提示
试读
11页
直线裁剪算法研究(Cohen-Sutherland算法和Liang-Barsky算法).doc
资源推荐
资源详情
资源评论
直线裁剪算法研究
摘要:直线裁剪是计算机图形学中的一个重要技术,在对常见的直经线裁剪的算法
分析的基础上,针对算法和算法进行了分析研究。并
对两种算法了计算直线与窗口边界的交点时,进行了有效有比较。
关键词:裁剪;算法;;-;
引言
直线是图形系统中使用最多的一个基本元素。所以对于直线段的裁剪算法是被研究
最深入的一类算法,目前在矩形窗口的直线裁剪算法中,出现了许多有效的算法。其中
比 较 著 名的有: CohenSutherland 算 法 、 中 点 分 割 算 法 、 Liangrsky 算 法 、 Sobkow
PospisilYang算法,及NichollLeeNcholl算法等。
直线裁剪的基本原理
图1所示的为直线与窗口边界之间可能出现的几种关系。可以通过检查直线的两个端
点是否在窗口之内确定如何对此直线裁剪。如果一直线的两个端点均在窗口边界之内
(如图1中P5到P6的直线),则此直线应保留。如果一条直线的一个端点在窗口外(如
P9)另一个点在窗口内(如P10),则应从直线与边界的交点(P9)处裁剪掉边界之外的
线段。如果直线的两个端点均在边界外,则可分为两种情况:一种情况是该直线全部在
窗口之外;另一种情况是直线穿过两个窗口边界。图中从P3到P4的直线属于前一种情况,
应全部裁剪掉;从P7到P8的直线属于后一种情况,应保留P7到P8的线段,其余部分均裁
剪掉。
图 1 直线相对干窗口边界的栽剪
直线裁剪算法应首先确定哪些直线全部保留或全部裁剪,剩下的即为部分裁剪的直线。
对于部分裁剪的直线则首先要求出这些直线与窗口边界的交点,把从交点开始在边界外
的部分裁剪掉。一个复杂的画面中可能包含有几千条直线,为了提高算法效率,加快裁
剪速度,应当采用计算量较小的算法求直线与窗口边界的交点。
- 直线裁剪算法
Cohen-Sutherland算法的大意是:对于每条线段P1P2,分为3种情况处理。
若P1P2完全在窗口内,则显示该线段P1P2,简称“取”之。
若P1P2明显在窗口外,则丢弃该线段,简称“弃”之。
若线段既不满足“取”的条件,也不满足“弃”的条件,则把线段分为两段。其中一段
完全在窗口外,可弃之。然后对另一段重复上述处理。
1.区域码及其建立
Cohen-Sutherland直线裁剪算法的核心是把所有直线的端点均分配一个表示其相对位
置的4位二进制代码。此代码称为区域码。区域码按照端点与窗口边界的相对位置编码,
即区域码的4位分别代表端点位于窗口的上、下、左、右。区域码从右到左的各位所代表
的坐标区如下所示:
位 4 3 2 1
坐标区 上 下 右 左
上述各位中某位为 1,则表示点位于此坐标区。窗口周围各坐标区的区域码如图 2 所
示。由图 2 可见,位于窗中内的点,其区域码应为 0000,位于窗口左下方的点,其区域
码应为 0101,其余类推。
区域码各位的值可以通过对端点坐标(x,y)与窗口边界的比较求得。如果 x<x
wmin
,
则区域码的第一位为 1,其余各位的确定与此相似。现在的计算机语言都可以进行位操作,
因此,可以通过以下步骤建立区域码:
计算出端点坐标与窗口边界的差。
按计算出的各个差的符号把区域码的相应位置为 0 或 1,
即
区域码的第一位置为(x-x
wmin
)的符号位;
区域码的第二位置为(x
wmin
-x)的符号位;
区域码的第三位置为(y-y
wmin
)的符号位;
区域码的第四位置为(y
wmin
-y)的符号位。
2.区域码裁剪算法
对所有直线的端点都建立了区域码之后,就可按区域码判断直线在窗口之内或窗口
之外。这可分为如下几种情况:
若一直线的两个端点的区域码均为 0000 则此直线在窗口边界之内,应子保留。
若一直线的两个端点的区域码的同一位同时为 1,则此直线全部在窗口边界之外,
应子裁剪。例如,若一直线的一个端点的区域码为 1001,另一个端点的区域码为 0101,
则此两端点的区域码的第一位均为 1,说明此两端点均在窗口边界之左,因此,直线在窗
口边界之外,应予裁剪。可用将直线两个端点的区域码进行与操作的方法,判断直线是
否在窗口之外,若与操作的结果为 0000 则两端点的区域码任何位均不同时为 1,此直线
不一定被裁剪。
以上两种情况之外的直线,有可能穿过窗口,也有可能不穿过窗口,如图 87 所示。
图中所示的两条直线都不符合情况②的要求,但一条直线(P
1
P
2
)穿过窗口,另一直线
(P
3
P
4
)不守过窗口。对这类直线可以进行如下处理:取窗口外的一个端点与窗口边界比
图 2 区域码
较以确定可排除直线的哪一部分,然后,把直线剩下的部分与其他边界比较,这样一直
到直线全部被排除或确定直线的哪一部分在窗口之内为止。可按“左、右、下、上”的次序
建立检查直线端点与窗口边界关系的算法。
下面介绍对图 3 所示的两条直线进行处理的过程。从直线 P
1
P
2
的下端点 P
1
开始,依
次检查窗口的左、上、右及下边界,可发现此点在窗口之下(因为区域码的第三位为
1)。然后求得直线与下边界的交点 P
1
排除线段 P
1
P
1
这样直线就缩短为 P
1
P
2
。因为 P
2
在
边界之外,将此端点与各边界比较,可发现此端点在窗口上面。计算出交点 P
2
线段 P
1
P
2
保留下来。这样就完成了对这条线的处理并开始处理下一直线 P
3
P
4
。端点 P
3
在窗口之左,
可计算出交点 讲裁剪掉线段 。检查 的区域码,可发现直线的这一剩余部
分在窗口之下故也可排除。
由于窗口边界均平行于坐标轴,所以直线与窗口边界的交点可以用直线方程的各参
数很方便地求出,对于一条端点坐标为 及 的直线,其与一垂直边界的交点
的 y 坐标可以用下式计算:
这里互的取值可取 x 或 ,斜率 m 可用公式 计算。同样地
与水平边界交点的 x 坐标可用下式计算:
这里 y 的值可取几 或 。
下面是区域码直线裁剪算法的 C 语言描述,其中每个端点的区域码用 4 元素布尔数
组表示。
!"
#
#$
%&
'$(
!直线的裁剪算法
)
!*!(+(
)
!*(,-
)
./!,-
0
1232435%35
6(%7
剩余10页未读,继续阅读
资源评论
老帽爬新坡
- 粉丝: 79
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功