zoukankan      html  css  js  c++  java
  • Cohen-SutherLand算法(编码算法)

    转自:http://my.oschina.net/liqiong/blog/4921

    Cohen-SutherLand算法(编码算法)

     

    基本思想:对于每条线段P1P2,分为三种情况处理:

    (1)若P1P2完全在窗口内,则显示该线段,简称“取”之;

    (2)若P1P2明显在窗口外,则丢弃该线段,简称“弃”之;

    (3)若线段既不满足“取”的条件,也不满足“弃”的条件,则把线段分为两段。其中一段完全在窗口外,可弃之。然后对另一段重复上述处理。

    为了使计算机能够快速的判断一条线段与窗口属于何种关系,采用如下编码方法:把窗口的边界延长成直线,窗口平台就分成9个分区,每个区设定一个4位的编码与之对应。

    平面上每一条直线的端点根据其所在的区域都可定义出两个编码。

    编码(以二进制形式自右向左给出)的意义如下:

    (1)第0位:如果端点在窗口左边界左侧,则为1,否则为0;

    (2)第1位:如果端点在窗口右边界右侧,则为1,否则为0;

    (3)第2位:如果端点在窗口下边界下侧,则为1,否则为0;

    (4)第3位:如果端点在窗口上边界上侧,则为1,否则为0。

     

    裁剪一条线段时,先求出端点p1和p2的编码code1和code2:

    (1)如果code1和code2均为0,则说明P1和P2均在窗口内,那么线段全部位于窗口内部,应取之。(c)

    (2)如果code1和code2经过按位与运算后的结果code1&code2不等于0,说明P1和P2同时在窗口的上方、下方、左方或右方,那么线段全部位于窗口的外部,应弃之。(e,d)

    (3)如果上述两种条件均不成立,则可按如下方法处理:求出线段与窗口边界的交点,在交点处把线段一分为二,其中必有一段完全在窗口外,可以弃之。再对另一段重复进行上述处理,直到该线段完全被舍弃或者找到位于窗口内的一段线段为止。(a,b,d’)

            

    此方法直观而方便,速度也较快。但是:

    (1)由于采用按位与运算,对程序的实现有特殊的要求;

    (2)全部舍弃的判断只适合于那些仅在窗口同一侧(后左、或右、或上、或下)的线段。

     

    算法的特点:

    (1)特点:用编码方法可快速判断线段--完全可见和显然不可见。

     (2)特别适用二种场合:

    大窗口场合;

              窗口特别小的场合(如:光标拾取图形时,光标看作小的裁剪窗口)

         

         例:根据区域编码裁剪算法对P1P2(P1[80,75],P2[-40,0])进行裁剪,以图解形式说明裁剪的过程(已知:XL=0,XR=100,YB=0,YT=50)。

         

         

         

  • 相关阅读:
    c++深拷贝与浅拷贝
    c++构造函数的explicit
    c++虚函数和虚函数表
    c++重载、重写、隐藏(重定义)
    c++传值、传指针、传引用
    ASP.Net Core API 学习の中间件
    WPF中String Format的用法
    ASP.Net Core API 全局处理异常
    989. Add to Array-Form of Integer
    1014. Best Sightseeing Pair
  • 原文地址:https://www.cnblogs.com/x_wukong/p/4186890.html
Copyright © 2011-2022 走看看