梁算法是计算机图形学上最经典的几个算法,也是目前唯一一个以中国人命名的出现在国内外计算机图形学课本的算法,我之前在介绍裁剪算法的时候介绍过这个算法

https://www.cnblogs.com/wkfvawl/p/11705842.html#_label3

这几天复习图形学,发现当时那篇博客写的很空洞,一些关键性的推理式子讲的不是很清楚,于是在这里仔细介绍一下。

最近发现中国大学MOOC上中国农业大学的赵明教授讲的很不错,课程短小精悍,感兴趣的同学可以去看一下https://www.icourse163.org/course/CAU-45006?from=study

一、直线的参数方程

梁算法表示直线是通过直线的参数方程来确定的,也就是说给出两个点,利用参数表示直线。

这里对U的理解就是(x,y)点在所给两点之间线段上的位置。

二、出边和入边

把被裁剪的红色直线段看 成是一条有方向的线段,把窗口 的四条边分成两类:

入边出边

入边:直线由窗口外向窗口内移动时和窗口边界相交的边(左边界和下边界)。

出边:直线由窗口内向窗口外移动时和窗口边界相交的边(右边界和上边界)。

裁剪结果的线段起点是直线和两条入边的交点以及始端点三 个点里最前面的一个点,即参数u最大的那个点;

裁剪线段的终点是和两条出边的交点以及端点最后面的一个 点,取参数u最小的那个点。

值得注意的是,当u从-∞到+∞遍历直线时,首先对裁剪窗口的两条边界直线(下边和左边)从外面向里面移动,再对裁剪窗口两条边界直线(上边和右边)从里面向外面移动。

如果用u1,u2分别表示 线段(u1≤u2)可见部分的开始和结束

上面就是梁友栋先生的发现,但又有了新的问题:

如何判断出边和入边?

四个U值是如何求出来的?

判断线段某一部分是否在窗口内,可以简化为判断直线上一个点是否在窗口内的问题

我们知道梁友栋算法的基本出发点是直线的参数方程,那么对于那些不会被裁剪掉的点一定会满足下面的不等式:

三、运算所用的量

将上面的不等式移项得:

在这里可以确定那些直线与裁剪窗口的交点中PK<0的点输入入边,PK>0的点属于出边

1)分析Pk=0的情况

如果还满足qk<0

则线段完全在边界外,应舍弃该线段

如果qk≥0

则进一步判断

(2)当pk≠0时:

当pk<0时

线段从裁剪边界延长线的外部 延伸到内部,是入边交点

当pk > 0时

线段从裁剪边界延长线的内部 延伸到外部,是出边交点

线段和窗口边界一共有四个交点,根据pk的符号,就知道 哪两个是入交点,哪两个是出交点

当p k < 0时:对应入边交点

当p k > 0时:对应出边交点

一共四个u值,再加上u=0、u=1两个端点值,总共六个值

把pk<0的两个u值和0比较去找最大的,把pk>0的两个u值 和1比较去找最小的,这样就得到两个端点的参数值

四、小结

直线参数化

直线段看成是有方向的

把窗口的四条边分为入边和出边

计算机图形学——梁友栋-Barsky算法的更多相关文章

  1. [图形学] Chp8.7.2 梁友栋-Barsky线段裁剪算法

    这节简单介绍了梁友栋-Barsky裁剪算法的原理,只有结论并没有过程,看过http://blog.csdn.net/daisy__ben/article/details/51941608这篇文章后,大 ...

  2. 计算机图形学(第2版 于万波 于硕 编著)第45页的Bresenham算法有错误

    计算机图形学(第2版 于万波 于硕 编著)第45页的Bresenham算法有错误: 书上本来要写的是以x为阶越步长的方法,但是他写的是用一部分y为阶越步长的方法(其实也写的不对),最后以x为阶越步长的 ...

  3. 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

    这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...

  4. Mathematics for Computer Graphics数学在计算机图形学中的应用 [转]

    最近严重感觉到数学知识的不足! http://bbs.gameres.com/showthread.asp?threadid=10509 [译]Mathematics for Computer Gra ...

  5. 计算机图形学学习方法和相关书籍,做游戏,GIS,虚拟现实,三维引擎的都能够看看.

    本书參照<<图形学扫盲>> 整理的,原文内容引子: http://www.cppblog.com/lai3d/archive/2008/12/30/70796.html 前言: ...

  6. [图形学] 计算机图形学 with OpenGL开篇

    <计算机图形学>(第四版)正在学习中,学习目的是为了在Unity中使用shader实现不同的渲染效果. 希望在这里能把学习过程中学到的知识和遇到的问题记录下来. 工作环境是:Xcode 8 ...

  7. 学习shader之前必须知道的东西之计算机图形学-渲染管线

    引言 shader到底是干什么用的?shader的工作原理是什么? 其实当我们对这个问题还很懵懂的时候,就已经开始急不可耐的要四处搜寻有关shader的资料,恨不得立刻上手写一个出来.但看了一些资料甚 ...

  8. html5 canvas高级贝塞尔曲线运动动画(好吧这一篇被批的体无完肤!都说看不懂了!没办法加注释了!当然数学不好的我也没办法了,当然这还涉及到一门叫做计算机图形学的学科)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 学习shader之前必须知道的东西之计算机图形学(一)渲染管线

    引言 shader到底是干什么用的?shader的工作原理是什么? 其实当我们对这个问题还很懵懂的时候,就已经开始急不可耐的要四处搜寻有关shader的资料,恨不得立刻上手写一个出来.但看了一些资料甚 ...

随机推荐

  1. day07 ORM中常用字段和参数

    day07 ORM中常用字段和参数 今日内容 常用字段 关联字段 测试环境准备 查询关键字 查看ORM内部SQL语句 神奇的双下划线查询 多表查询前提准备 常用字段 字段类型 AutoField in ...

  2. Azkaban(一)【集群安装】

    目录 一.下载解压 二. 配置Mysql 三. 配置Azkaban Executor 四. 配置Azkaban WebServer 一.下载解压 1.下载地址:https://github.com/a ...

  3. 【原创】Altium生成Gerber时跳出The Film is too small for this PCB的解决办法

    在用altium Designer画板子的时候,要生成gerber文件的时候,会出错,出现这样的提示框:"The Film is too small for this PCB" 原 ...

  4. 【swift】CoreData Crash(崩溃)(Failed to call designated initializer on NSManagedObject class)

    感谢另一篇博客:https://blog.csdn.net/devday/article/details/6577985 里面的图片和介绍,发现问题如他描述的一样,没有bundle 我的Xcode版本 ...

  5. [项目总结]Android 手动显示和隐藏软键盘

    1.方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) 1 InputMethodManager imm = (InputMethodManager) getSystemService(Cont ...

  6. Docker 安装 Oracle12c

    为选定需要pull到系统中的数据库镜像 # docker pull sath89/oracle-12c --------sath89/oracle-12c为选定需要pull到系统中的数据库镜像 doc ...

  7. axios使用步骤详解(附代码)

    Axios是一个基于Promise的 HTTP 库,可以用在浏览器和node.js 中,因为尤大大的推荐,axios也变得越来越流行.最近项目中使用axios也遇到了一些问题,就借此机会总结一下,如有 ...

  8. 【Matlab】abs不支持复整数

    需要将uint8转换成double型数据才能计算 https://blog.csdn.net/lihe4151021/article/details/89372688 图像数据格式uint8与doub ...

  9. 手写Mybatis和Spring整合简单版示例窥探Spring的强大扩展能力

    Spring 扩展点 **本人博客网站 **IT小神 www.itxiaoshen.com 官网地址****:https://spring.io/projects/spring-framework T ...

  10. exit_hook在pwn题中的应用

    以前只接触过malloc_hook,free_hook,大概意思就是在调用malloc和free的时候会先看看里面有没有东西,有的话就会执行.以前在看一些师傅们博客的时候有看到过exit_hook,前 ...