Nicholl-Lee-Nicholl线段裁剪算法

Nicholl-Lee-Nicholl线段裁剪算法学习与详解

【算法简介】

Nicholl-Lee-Nicholl(NLN)算法通过在裁剪窗口边界创建多个区域,从而避免对一个直线段进行多次裁剪。

Cohen-Sutherland算法中,在找到与裁剪窗口边界的交点之前或完全舍弃该线段之前,必须对一条线段进行多次求交计算。NLN算法则在求交计算前进行更多的区域测试,从而减少求交计算。

与Cohen-Sutherland算法和梁友栋-Barsky算法相比,NLN算法的比较次数和除法次数减少。但NLN算法仅用于二维裁剪


【算法描述】

确定一线段完全在裁剪窗口内部或外部的初始测试可以像前两个算法一样用区域码测试来完成。如果一个线段不能明确接受或拒绝,则NLN算法进一步建立另外的裁剪区域。

对于端点为P0和Pend的线段,首先确定P0位于裁剪窗口的九个可能区域的位置。在下图中只需考虑三个区域。若位于其他六个区域之一,则可以利用对称变换将其变换到下图三个区域之一。

例如,在裁剪窗口正上方的区域,可以相对于直线y=-x投影到裁剪窗口的左边区域;或使用90度逆时针旋转,可以达到同样效果。

假定P0和Pend不同时在裁剪窗口的内部,下一步判断Pend相对于P0的位置。为此,根据P0的位置在平面上创立新的区域。新区域的边界是以P0为起点、穿过窗口顶点的射线。

1、如果P0在裁剪窗口之内,Pend在窗口之外,就设置四个区域,如下图所示。根据包含Pend点的某一个区域(L,T,R和B),可得线段与窗口交点。

2、如果P0位于窗口的左边区域,则设定四个区域:L、LT、LR、LB,如下图所示,这四个区域决定了线段的唯一边界。

如Pend在L区域,我们在左边界上裁剪该线段,且保存从交点到Pend之间的线段。

如果Pend在LT区域,则存储窗口左边界和上边界之间的线段部分。

对区域LR、LB处理类似。若Pend不在这四个区域,则舍弃整个线段。

3、当P0在窗口的左上方时,有如下图的两种情况。

如果P0接近裁剪窗口左边界,使用图中(a)的区域;

如果P0接近窗口的上边界,使用图中(b)的区域。

如果Pend在区域T、L、LT、TR、TB、LR或LB中,则确定了求交计算的唯一裁剪窗口边界,否则舍弃整个线段。

为了确定Pend位于哪个区域,要比较该线段的斜率和裁剪区域边界的斜率。

例如,上述情况2中,若P0在裁剪边界的左边并且满足:

斜率 P 0 P R T ‾ &lt; \overline{P_{0}P_{RT}}&lt; P0PRT<斜率 P 0 P e n d ‾ &lt; \overline{P_{0}P_{end}}&lt; P0Pend<斜率 P 0 P T L ‾ \overline{P_{0}P_{TL}} P0PTL

则:Pend在区域LT中。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值