zoukankan      html  css  js  c++  java
  • 直线裁剪算法

    直线裁剪算法

    一、

    1、裁剪:确定图形哪些部分落在显示区之内,哪些落在显示区外。这个选择的过程就称为裁剪。

    2、直线段的裁剪:Cohen-Suther land、中点分割法和Liang-Barsky裁剪算法

    二、Cohen-Suther land算法

    又称编码裁剪算法,算法的基本思想是对每条直线分三种情况处理:

    1>若端点完全在裁剪窗口内----“简取”之

     

    2>若端点完全在裁剪窗口外,且满足下列四个条件之一----“简弃”之

     

    3>既不满足简取,也不满足简弃:对直线段按交点进行分段,分段后判断直线是“简取”还是“简弃”

    每条线段的端点都赋以四位二进制码D3D2D1D0,编码规则如下:左右下上)

     

    例如:

     

    裁剪一条线段时,先求出端点P1P2编码code,然后进行二进制“或”和“与”运算

    (1)code1|code2=0,对直线段简取

    (2)code1&code2不等于0,对直线段简弃

    (3)若上述两条件都不成立,则需要求出直线段与窗口边界的交点,并在交点处把直线段一分为二

    3、存在问题:

    一条完全在窗口外的直线,进行与运算=0,还需求交点,然后所得结果还是全部舍弃三、

    三、中点分割算法

    1、核心思想:通过二分逼近来确定直线段与窗口的交点

    2、注意:

    1>若中点不在窗口内,则把中点和离窗口边界最远点构成的线段丢掉,线段上的另一点和该中点再构成线段求其中点

    2>若中点在窗口内,则以中点和最远点构成线段,求其中点,直到中点与窗口边界的坐标值在规定的误差范围内

    3、问题:中点分割算法会不会无限循环下去?

    不会。因为屏幕像素是有限的,一般计算次数不会太多,而且允许在误差范围内

    四、Liang-Barsky裁剪算法

    1、主要思想:用参数方程表示一条直线段(0<=U<=1)

    X=X1+U*(X2-X1)=X1+U*X

    Y=Y1+U*(Y2-Y1)=Y1+U*Y

    2、把直线看成是一条有方向的线段,把窗口的四条边及其延长线分成两类:入边和出边

    入边:左边界和下边界

    出边:右边界和上边界

     

    如何求出起点和终点的坐标?(即起点和终点的参数值u

     

    判断线段某一部分是否在窗口内,可以简化为判断直线上一个点是否在窗口内的问题,窗口内的P点满足什么条件?

     

    3、举例:

     

    3、Liang-Barsky算法小结

    1>直线方程参数化

    2>直线段是有方向的

    3>把窗口的四条边分成入边和出边

    五、Cohen-Suther land算法和Liang-Barsky算法比较

    1、Cohen-Suther land算法的核心思想是编码,窗口和延长线把空间分成了9个区域

    2、线段要么大部分在窗口外,要么大部分在窗口内,使用Cohen-Suther land效果好

    3、一般情况下(线段贯穿窗口),优先使用Liang-Barsky算法

    4、两者均只能应用于矩形窗口

  • 相关阅读:
    Populating Next Right Pointers in Each Node II
    Populating Next Right Pointers in Each Node
    Construct Binary Tree from Preorder and Inorder Traversal
    Construct Binary Tree from Inorder and Postorder Traversal
    Path Sum
    Symmetric Tree
    Solve Tree Problems Recursively
    632. Smallest Range(priority_queue)
    609. Find Duplicate File in System
    poj3159最短路spfa+邻接表
  • 原文地址:https://www.cnblogs.com/keguniang/p/9688126.html
Copyright © 2011-2022 走看看