DDA, Bresenham line's algorithm and Voxel Traversal used in the Grid-Accelerator in PBRT
【遍历阶段】
4)△x和△y谁大,谁就作为插值的主序方向。意味着每次插值都是朝这个方向行进一步。比如△x大,那么假设当前在格子(xi, yi)处,决定下一个格子时,由于在x方向是主序方向,所以朝x方向行进一步得到xi+1。剩下的就是决定y方向上到底是yi呢还是yi+1呢。
5)到底是yi还是yi+1,要看根据y = m(xi+1) + b计算出真实的y等于多少。这时的y计算出来的是浮点数,根据float2Int的一些规则,转换成对应的整形然后找到对应的格子。float2Int的转换规则要看具体情况,四舍五入还是直接截取,看效果吧。
6)重复4)-5)步
DDA算法直接了当,简单易懂。不过它的计算过程中涉及到许多浮点数运算,这在当今的CPU设计架构中运算成本较大,也可视为其运算复杂度较高。下面的Bresenham line's algorithm就是对其的一种改进。
- Bresenham line's algorithm -
Bresenham line's algorithm 是DDA的一种改进算法。它与DDA相比有质量和效率的两点改进:
1)质量方面的改进。 比如还是以△x为主序方向行进时,决定下一个点是落在yi还是yi+1,不仅仅考虑真实计算出来的y等于多少,还要考虑这个y值是离yi更近还是离yi+1更近。谁近就画在谁的格子里。这一点显然比DDA中思考问题的方式更加make sense。
2)效率方面的改进。根据上一点的判断准则,再加上一系列的递归推导,最后简化到只存在整形的加减运算以及比较操作。这在当今CPU的架构中运算成本相对来说非常便宜,因此效率更高。具体的推导细节,参见这篇 DERIVATION OF THE BRESENHAM’S LINE ALGORITHM
- Voxel Traversal used in the Grid-Accelerator in PBRT -
我正在看pbrt的第4章。这章主要讲了有关场景管理组织的一些技术,目的是为了提高射线相交测试(ray intersection tests)的效率。主要的手段有三种,Grid-Based, BVH 和 KD-Tree。目前正看到第一种,Grid-Based,基于网格的场景管理技术 。
基于网格的场景管理方法,相当于把整个场景看作是一个大的bouding box,然后对这个box所在的空间分别在三个维度上划分成一格一格的。然后将场景中的primitives与各个发生overlap的格子”关联“起来。接着,从射线的方位出发,遍历(traverse)这个网格系统,对于与射线发生相交的格子,再在里面遍历与之关联的所有primitives,对遍历到的每个primitive都做一次相交测试。当然这当中的细节还有很多,就不赘述了。总之这种算法的思想可以描述为”分而治之“。通过每个格子的空间管理与之有关的primitives,测试某个格子的时候就不必考虑其他格子里的primitives,从而可以有效降解其遍历场景的复杂度。
这里,我想强调下射线是如何遍历这个网格系统的。其方法也是DDA算法的一种改进,书中说非常像Bresenham line's algorithm。但我仔细观察了一下,和Bresenham的算法还是不一样的。这里的关键是利用的是射线的参数(parametric)方程,那个参数t(作为沿着射线方向偏离起点的距离)是很重要的。当决定下一点究竟是朝x方向,y方向还是z方向步进时,要看这条射线”最先打到哪个方向的下一格子的边界“。哪个方向的边界先被打到,就朝哪个方向步进一次。这样一来,这种算法就不是依靠决定”哪个方向是主序“的思路进行的了,每次判断步进时三个方向皆有可能步进。这点与经典的DDA(包括Bresenham)算法都非常不同。
我知道我没说清楚,刚才在网上粗略找了找,发现这篇应该才是pbrt中使用的算法:A Fast Voxel Traversal Algorithm for Ray Tracing。(我没细看,大体觉得差不了)。欢迎指正校对勘误拍砖头,谢谢。
DDA, Bresenham line's algorithm and Voxel Traversal used in the Grid-Accelerator in PBRT的更多相关文章
- 计算机图形学之扫描转换直线-DDA,Bresenham,中点画线算法
1.DDA算法 DDA(Digital Differential Analyer):数字微分法 DDA算法思想:增量思想 公式推导: 效率:采用了浮点加法和浮点显示是需要取整 代码: void lin ...
- 【A Global Line Matching Algorithm for 2D Laser Scan Matching in Regular Environment】
只看了前面的部分,灭有看实验,觉得整体风格比较傻白甜,与我的想法不谋而合.简单明了,用起来应该比较方便. 初步探测:如果有直线,就给线性插值一下. 分级聚类:利用简单的阈值给聚类了一下,分成了段段. ...
- C# Cut Line Bressenham Algorithm
using System; using System.Drawing; using System.Windows.Forms; namespace CutLine { static class Pro ...
- 【十天自制软渲染器】DAY 02:画一条直线(DDA 算法 & Bresenham’s 算法)
推荐关注公众号「卤蛋实验室」或访问博客原文,更新更及时,阅读体验更佳 第一天我们搭建了 C++ 的运行环境并画了一个点,根据 点 → 线 → 面 的顺序,今天我们讲讲如何画一条直线. 本文主要讲解直线 ...
- Bresenham直线算法与画圆算法
在我们内部开发使用的一个工具中,我们需要几乎从 0 开始实现一个高效的二维图像渲染引擎.比较幸运的是,我们只需要画直线.圆以及矩形,其中比较复杂的是画直线和圆.画直线和圆已经有非常多的成熟的算法了,我 ...
- Line Search and Quasi-Newton Methods 线性搜索与拟牛顿法
Gradient Descent 机器学习中很多模型的参数估计都要用到优化算法,梯度下降是其中最简单也用得最多的优化算法之一.梯度下降(Gradient Descent)[3]也被称之为最快梯度(St ...
- Line Search and Quasi-Newton Methods
Gradient Descent 机器学习中很多模型的参数估计都要用到优化算法,梯度下降是其中最简单也用得最多的优化算法之一.梯度下降(Gradient Descent)[3]也被称之为最快梯度(St ...
- 中点Bresenham画圆
这里不仔细讲原理,只是把我写的算法发出来,跟大家分享下,如果有错误的话,还请大家告诉我,如果写的不好,也请指出来,一起讨论进步. 算法步骤: (1) 输入圆的半径R. (2) 计算初始值d = 1 - ...
- 改进的Bresenham算法
这里不仔细讲原理,只是把我写的算法发出来,跟大家分享下,如果有错误的话,还请大家告诉我,如果写的不好,也请指出来,一起讨论进步. 算法步骤: (1) 输入直线的两端点P0 (x0, y0)和P1 (x ...
随机推荐
- (树形dp)鸡毛信问题 (fzu 1227)
http://acm.fzu.edu.cn/problem.php?pid=1227 Problem Description 大革命时期,地下党组织的联络图是一个树状结构.每个党员只和一个比他高一 ...
- java如何编写下载功能
@RequestMapping("/downLoadFailRecord") public ModelAndView downLoadFailRecord( HttpServlet ...
- ESP-IDF3.0
发行版v3.0的文档可在http://esp-idf.readthedocs.io/en/v3.0/上找到. 这是自发布v3.0-rc1以来的更改列表. 如果从以前的稳定版本V2.1进行升级,请检查v ...
- jvm虚拟机--堆内存
reserved 保留区域 堆 所有对象实例都在这里分配内存. 是垃圾收集的主要区域("GC 堆").现代的垃圾收集器基本都是采用分代收集算法,主要思想是针对不同的对象采取不同的垃 ...
- jQuery插件初级练习4答案
html: $("p").log().css("color","red") jQuery: $.fn.extend({ log: funct ...
- bootstrap代码(一)
一般在个人博客上使用的较为频繁,用于显示代码的风格.在Bootstrap主要提供了三种代码风格:1.使用<code></code>来显示单行内联代码2.使用<pre> ...
- 新建django需要设置的地方
urls:urlpatterns = [ path('admin/', admin.site.urls), path('login/', views.Login.as_view())#类方法url对应 ...
- Java学习--数组与方法
1. public class MethodDemo01{ public static void main(String args[]){ printInfo() ; // 调用printInfo() ...
- java的环境变量
Java学习第一步——JDK安装及Java环境变量配置 2014-05-30 9:09 Java SE 阿超 9226 views Java作为当下很主流的编程语言,学习Java的朋友也越来越 ...
- ubuntu18.10安装redis遇到问题
执行命令apt-get install redis-server 安装遇到的问题 1.出现apt-get被占用情况,用ps -a|grep apt ,杀死存在的apt进程 2.还不行就执行sudo f ...