梁友栋-Barsky算法

 

  • 此算法的主要特色

    • 把二维裁剪的问题化成二次一维裁剪问题,而把裁剪问题转化为解一组不等式的问题;

    • 改善了Cohen-Sutherland 的编码算法中全部摒弃的判断只适合于那些仅在窗口同一侧(或左、或右、或上、或下) 线段的不足。

算法分成一维和二维两部分,前者是后者的基础。

  • 一维裁剪

    • 一维裁剪的本质是求取2条线段的公共部分。

      一维裁剪算法原理示意图

      • 线段P1P2与一维窗口W1W2的位置分布(未列出重端点状况)

    • 设W1W2为一维窗口,P1P2是给定的线段,则P1P2在一维窗口W1W2内的可见部分为:

      S=W1W2∩P1P2

      令w1,w2和x1,x2分别为W1,W2和P1,P2点的坐标,则P1P2至少部分可见的充要条件是:

      max(min(x1,x2), min(w1,w2))≤ min(max(x1,x2), max(w1,w2))

      (假设线段和窗口均从左至右排列,可简写为:max(x1 , w1) ≤ min(x2,w2) )即

      • 线段和窗口:左端点中大者≤右端点中小者
         

  • 二维裁剪

    • 二维裁剪算法的本质是如何把二维裁剪的问题化成二次一维裁剪。

      设二维窗口为下列方程所确定:

      x=XL
          x=XR (记XL≤x≤XR的区域为Δx)
          y=YB
          y=YT (记YB≤y≤YT的区域为Δy)
       

      则平面上任意线段P1P2在窗口内的部分为:

      P1P2∩Δx∩Δy

      设通过P1P2的直线与窗口左、右、上、下边界的交点分别为L、R、B、T,则P1P2可见部分亦可表为:

      P1P2∩LR∩BT


       

    • 当直线垂直时

      • xp1=xp2
         

        且XL≤xp1≤XR时,P1P2∩LR∩BT 等价于求P1P2∩BT;
         

    • 当直线平行时

      • yp1=yp2
         

        且YB≤yp1≤YT时,P1P2∩LR∩BT 等价于求P1P2∩LR; 
         

    • 线段P1P2既不平行于窗口垂直边界,也不平行于窗口水平边界时

      • 即当xp1≠xp2,且yp1≠yp2

        • L、R、B、T都是确定的
           

        • P1P2的斜率k=( yp2-yp1)/ ( xp2-xp1)为非零或非奇异值。

          xB= xp1 +(YB- yp1)/k;
              xT= xp1 +(YT- yp1)/k;

          且  xB <xT,当k>0;
              xT <xB,当k<0。


            X1= max(xL,min(xp1,xp2))
            X2= min(xR,max(xp1,xp2))

        则P1P2∩LR为非空集合的充要条件是:

        X1≤X2(按照:max(x1 , w1) ≤ min(x2,w2))

        此时线段P1P2与窗口在X轴方向的公共部分就是:

        [X1,X2]

        而P1P2∩LR∩BT为非空集合的充要条件为:

        max(X1, min(xB , xT))≤min(X2, max(xB , xT))
         

      • 它等价于下列三个不等式
         

        • X1≤X2 
          X1≤max(xB , xT)
          min(xB , xT)≤X2
           

      • 三个不等式又等价于如下两组不等式

        • X1≤X2 (1)          X1≤X2
          X1≤xT (2) (k>0)   X1≤xB(k<0)
          xB≤X2 (3)          xT≤X2
           

      • 当上述两组不等式中有任何一个不满足时,线段和窗口不可能有公共部分。
         

      • 试观察上述三个不等式的几何意义
         

        • 设k>0
           

        • 式(1)X1>X2
           

          • P1P2∩LR的交集为空,即P1P2∩Δx为空,

            此时P1P2, 或在窗口左边界x=XL的左侧,或在窗口右边界x=XR的右侧


             

        • 式(2)X1>xT

          • 此式意味着max(xL,min(xp1,xp2))>xT

            它相当于:xL>xT, 或min(xp1,xp2)>xT

            k>0时,当xL>xT ,通过P1P2的直线与窗口上边界的交点T(xT)在窗口左边界的左侧,如a所示

            而min(xp1,xp2)>xT等价于:xp1>xT,或xp2>xT,表示线段P1P2在窗口上边界的上方,如b所示
             

        • 式(3)xB>X2

          • 同理可知xB>X2表示直线穿越窗口下边边界y=YB和右边边界x=XR (图中c),或是P1P2在y=YB的下方(图中d)


             

        • 当k<0时

          • 当k<0时,线段与窗口的位置也有对应的4种情况

            这个方法增加了跨越三个区域的直线段(a和c状态)的快速拒绝判定。

            这些状态用Sutherland的编码法是不能一次予以解决的(它只能快速拒绝判定b和d)。


             

  • 二维裁剪算法的实施

    • 当上述三个条件不全满足,那么线段P1P2至少是部分在窗口内部。此时,若k>0,则可见部分的端点为:

      当k<0时,只要交换YB和YT,表中所列结论均适用。

      转载  http://cg.sjtu.edu.cn/lecture_site/chap3/main.htm

 

 

梁友栋-Barsky算法相关推荐

  1. 梁友栋-Barsky裁剪算法原理分析

    梁友栋-Barsky算法是一种参数线裁剪算法. 为两个参数方程,为两点的差值,其中的由来是整理参数方程中三角函数的值得出,因为取值需要在裁剪框内,所以u只需要取0~1范围内的就足够. 是结合四条边界线 ...

  2. 计算机图形学:Cohen-Sutherland直线段剪裁算法及梁友栋-Barsky裁剪算法(算法原理及代码实现)

    一.算法实现原理 Cohen-Sutherland直线段剪裁算法: 算法原理: (1)判断线段两端是否都落在窗口内,如果是,则线段完全可见,否则进行下一步 (2)判断线段两端是否都落在窗口外,如果是, ...

  3. 理解梁友栋-Barsky裁剪算法

    学习图形学窗口裁剪算法时,很多教材只是对梁友栋-Barsky裁剪算法过程做了简单的介绍,并没有对原理过多的解释.老而学者如秉烛夜行,用了两三天时间终于搞明白算法原理. 消除指定区域内或区域外的图形部分 ...

  4. java实现梁友栋裁剪算法_梁友栋裁剪算法

    梁友栋裁剪算法 用任意颜色绘制窗口,并用一种颜色绘制线段,利用P181页所示梁友栋裁剪算法对线段进行裁剪.要求能够演示出裁剪过程,裁剪前的图形要绘出,当按下任意按键,绘制出裁剪结果.请使用TC打开源程 ...

  5. 计算机图形学 裁剪算法源代码,OpenGL计算机图形学梁友栋裁剪算法实验代码及运行结果.doc...

    OpenGL计算机图形学梁友栋裁剪算法实验代码及运行结果.doc (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分  .<计算 ...

  6. [计算机图形学]Python实现梁友栋裁剪算法

    梁友栋算法是很简单的一个裁剪算法,但是只适用于裁剪范围是矩形框并且矩形框边界平行于坐标轴的情况. 实验结果: 完整代码: 注意代码没有写到线是平行和垂直的情况,也没有考虑线不经过框的情况,所以输入的时 ...

  7. openGL-梁友栋-Barsky算法

    代码 // // main.cpp // hw_1_cut_line // // Created by 窦志扬 on 2018/3/11. // Copyright © 2018年 窦志扬. All ...

  8. 计算机图形学常用算法实现9 梁友栋-Barskey裁剪算法

    这个算法的效率比前面提到的Cohen-Sutherland要高 思路是把直线表示为参数方程形式, x= x1+udx y = y1+udy 由xmin<x<xmax ymin<y&l ...

  9. 张正友相机标定算法详解

    张正友相机标定算法详解 1.齐次表示法与一些基本结论 1.1 点与直线的齐次表示 ​ 在射影几何中,通常用齐次方式来表达点与直线.比如p=(u,v)p=(u,v)p=(u,v)被表示成p^=(x1,x ...

  10. 图形学 实验四 梁barsky算法

    核心思想: 用参数方程表示一条直线 已知一条线段的起点(x1,y1).终点(x2,y2),就可以通过一个参数u,表示这条线段所在直线上的任意一个点(x,y) x=x1+u(x2-x1) y=y1+u( ...

最新文章

  1. Tomcat双向Https验证搭建,亲自实现与主流浏览器、Android/iOS移动客户端超安全通信
  2. python实现简单的api接口-简单实现Python调用有道API接口(最新的)
  3. ICLR 2022 | Transformer不比CNN强!Local Attention和动态Depth-wise卷积
  4. 多文档版的的正则表达式工具
  5. Android 电视 文件目录,通用的安卓智能电视截屏及图片目录文件获取方法
  6. Vue项目中使用 路由导航守卫 处理页面的访问权限
  7. Module build failed: Error: Node Sass version 5.0.0 is incompatible with ^4.0.0.
  8. python离线语音识别_Python实现语音识别和语音合成功能
  9. Java | 用Java实现冒泡排序算法
  10. 超实用!!!使用IDEA插件Alibaba Cloud Toolkit工具一键部署本地应用到ECS服务器
  11. php 设为首页 收藏_如何在网站上添加“设为首页”“加入收藏”
  12. python filter
  13. motion filter_Android Motion布局
  14. 如何去掉windows2003的自动锁定(每离开一会都会出现这个界面,不想让它出现)...
  15. 以下产品不用再做CCC认证了,你的产品在内吗?
  16. 【深入浅出向】从自信息到熵、从相对熵到交叉熵,nn.CrossEntropyLoss, 交叉熵损失函数与softmax,多标签分类
  17. 受拜登刺激的希望-华尔街股市创下历史新高,纳斯达克指数在Netflix启动未来股票回购后疯狂上涨
  18. 华硕无线路由打印机服务器,华硕RT-AC86U路由器怎么共享打印机
  19. GO connectex: A connection attempt failed because the connected party did not properly respond 已解决
  20. 遇到不同网段互相访问的一些问题的总结

热门文章

  1. Linux安装MATLAB Compiler Runtime操作
  2. 深入了解 Dojo 的服务器推送技术
  3. 实战Nginx与Perl、Java的安装与配置
  4. ANTLR实现的SQL解析器 - OQL
  5. 一个关于继承和多态的问题(思索篇)
  6. 监控-Kafka Manager
  7. 第三季-第4课-Linux应用程序地址布局
  8. SQL Server 存储(5/8):理解IAM 页
  9. 《树莓派Python编程入门与实战(第2版)》——2.2 使用Raspbian命令行
  10. keras小程序(一),用cnn做分类