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

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. day02 MySQL基本操作

    day02 MySQL基本操作 昨日内容回顾 数据库演变史 1.纯文件阶段 2.目录规范 3.单机游戏 4.联网游戏 # 数据库就是一款帮助我们管理数据的程序 软件开发架构及数据库本质 cs架构与bs ...

  2. Largest Rectangle in Histogram及二维解法

    昨天看岛娘直播解题,看到很经典的一题Largest Rectangle in Histogram 题目地址:https://leetcode.com/problems/largest-rectangl ...

  3. Classs类

    Classs类如何获得 获得Class对象 方式一: 通过Object类中的getClass()方法 方式二: 通过 类名.class 获取到字节码文件对象( 方式三: 通过Class类中的方法(将类 ...

  4. 【Java 基础】Java Enum

    概览 在本文中,我们将看到什么是 Java 枚举,它们解决了哪些问题以及如何在实践中使用 Java 枚举实现一些设计模式. enum关键字在 java5 中引入,表示一种特殊类型的类,其总是继承jav ...

  5. Jenkins检测Maven项目是否引用快照包

    目录 一.简介 二.具体 一.简介 生产环境不允许使用快照包,但人为规定终究不如脚本进行检测,所以在打war包,检测是否引用了快照包,如果引用了宣布打包失败 二.具体 1.在pipeline的scri ...

  6. 离散数学3.1&&3.3

    离散数学 当前所使用的数字电脑是离散的,二进制指令,传输到内存 早先使用的模拟电脑是连续的 判断是否是命题(两个步骤)[不要跳步骤] 陈述句 要么是真命题要么是假命题 真假性 真:用T或1表示,假:用 ...

  7. [BUUCTF]PWN3——warmup_csaw_2016

    [BUUCTF]PWN3--warmup_csaw_2016 题目网址:https://buuoj.cn/challenges#warmup_csaw_2016 步骤: 例行检查,64位,没有开启任何 ...

  8. .Net Core服务诊断排查

    前言: 近期在项目中出现了几次服务内存资源占用较高的情况,特回顾梳理下排查过程以及对相应问题的排查方法总结. 一.Dump抓取 抓取dump的方式有多种,下面介绍几种常用的: 1. 任务管理器中找到程 ...

  9. SpringSecurity自定义注解和处理器

    登录功能 添加一个配置类 @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Reso ...

  10. LuoguP5139 z小f的函数 题解

    Content 给定 \(T\) 个二次函数 \(y=ax^2+bx+c\),有若干次操作,有一个操作编号 \(p\),保证仅为以下这五种: 操作 \(1\):给定 \(k\),将函数图像向上移动 \ ...