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、两者均只能应用于矩形窗口

  • 相关阅读:
    有序表的合并---顺序表实现
    有序表的合并---链表实现
    双向链表操作
    有序表的合并-用链表操作
    C语言单链表操作
    c语言顺序表操作
    c语言 取余 % 和除法 / 的应用技巧 (在取位数方面的)
    JS打印表格(HTML定义格式)
    富文本编辑器(php)
    利用formdata异步上传图片并预览图片
  • 原文地址:https://www.cnblogs.com/keguniang/p/9688126.html
Copyright © 2011-2022 走看看