6.4 包围盒(圆、球、体)
点集、物体或一组物体的包围盒(圆、球、体)就是将物体的组合完全包容在相对简单的一个封闭空间,包围体的使用通常常用于加速某些特定的检测过程,例如检测物体相互之间的重叠关系,先由物体的包围盒进行粗略检测,当两包围盒不重叠时,其相应的两原物体间一定不相交(拒绝判定的充分条件),从而快速排除那些不可能相交的物体,提高几何运算的效率,而简单的物体比较容易检查相互之间的重叠关系。在计算机图形学的消隐、光照模型,在机器人、汽车的动态仿真等均有广泛的应用。

一个应用程序中的包围体类型的选择受到不同因素的影响:计算物体包围体所需的计算开销、物体移位、形状或者尺寸发生变化时在程序中更新所需开销以及相交检验所需的精度等。通常使用几种类型的组合,快速、粗略的方法与那些慢速、精确的方法组合起来使用。

比较典型的包围盒有多种(参阅图6.4-1),最常用的是轴平行于坐标轴的包围盒AABB与包围球两种。

求取包围球(圆、盒)的主要目的是用于碰撞检测,用球、盒等形状简单的几何体包围形状复杂的物体,从而通过简单的计算快速地排除哪些物体不可能产生碰撞,虽然这种检测是一种充分条件,“不可能产生碰撞”的条件被扩大了,导致不碰撞的条件变得过于严格。因此,就希望所求点集的最小包围球(盒)达到“最小”。遗憾的是,点集的包围球(盒)常常被扩大了。

a) 包围球(Sphere);

b)轴平行于包围盒AABB(Axis-Aligned Bounding Boxes),由于此包围盒较松散,因此被排除的节点较少,但求取方法和碰撞检测简单使他常用;

c)延任意方向的包围盒OBB(Oriented Bounding Boxes),它是b)的改进;

d)固定方向包围盒FDH(Fixed Direction Hull)

e)凸包包围盒包围物体紧密,但相互之间的求交计算更复杂。

6.4.1 包围圆(球)

最小圆或最小包围圆问题是一个数学问题,它求取一个最小半径的圆,使平面上给定点集的点均在此圆内(含上)。在n维空间是求取一个最小的n维球,在三维空间就是最小包围球。此问题最初由英国数学家J. J. Sylvester在1857提出(J.J. Sylvester,A Question in the Geometry of Situation,Quarterly Journal ofMathemaitcs,Vol.1,p79 (1857))。实际例子是新设施的选址问题——任何被这个设施服务的顾客到该设施的最长距离达到最短。因此,求点集的包围圆(球)主要是如何确定包围球的中心。

一般情况下,先确定一个包围球中心的初始位置和半径,然后遍历点集对中心与半径作动态修正。算法的基本步骤如下:

Step1 确定点集S的一个初始包围圆B0的估计,中点为C0,初始半径为R0;
Step2 设当前包围圆为Bk,检测S中的点Pk+1,如果Pk+1∈Bk,则Bk+1=Bk,否则,点Pk+1必定在Bk+1的边界上。
Step3 重复Step2直至所有S中的P点遍历完就得到点集的包围圆。
该算法的计算复杂度是O(n),速度较快,算法可扩展到n维空间。
初始中心的取法根据点集的分布状态及应用的目标决定,常用的有:
1)在三维点集S中找到较远的两点,构成一个初始包围圆的估计:

★遍历S,求出其中x坐标最大/最小、y最大/最小及z最大/最小的3对点,然后取其中距离最大的一对,以其两点连线的中点为圆心C0,距离的一半为初始半径R0;
★取坐标距离最远的两点的中心作为圆心C0,两点的距离作为圆的直径。
2)取点集坐标的平均值。简单且均等对待点集中各点的作用,在点多,分布均匀时常采用此法。

3)包围盒的中心作为包围球的球心。当包围盒不是由2个点得到时,半径被扩大了。

当包围球中心的初始位置确定后,可遍历点集,并修正半径。此时圆心可不再改变(如取点集坐标的平均值作为中心),也可作动态修正。下面是一个在遍历点集过程中动态修正中心的包围圆算法(图6.4-2)。这种中心的修正使算法速度较快,但不保证是“最小”包围圆。
★如果点Pk包含在Bk中(||CkPk||≤Rk),那么,Bk+1=Bk,继续测试下一个点;
★否则,设||CkPk||-Rk=2d,将Ck沿矢量CkPk平移d,得到Ck+1,更新Rk+1=Rk+d,得到新的包围圆Bk+1(因为Bk+1与Bk在CkPk的反向延长线Qk处相切,因此,包围圆Bk+1至少包含了Bk中的点)。

下面给出的2个算法均按上述步骤实现,第一个算法中圆心的初始值取最大/最小坐标3对点距离中最大的一对连线的中点,第二个算法改为点集的几何中心位置,后面的步骤不变。


这两个包围圆的算法的区别只是包围圆圆心的初始值的取法不同,所求的结果相近。但是,他们得到的不是点集的最小包围圆。

一个反例如图6.4-3 a)所示,3个点P0、P1、P2的点集,先以x方向最远的2个点P0、P1得到包围圆B0(圆心C0),扩展第3个点P2得到的包围圆B1(圆心C1)为所求包围圆。它不是最小的,因为直接由P0、P1、P2三点所作的圆要比他小。

图6.4-3b)是包围圆的球心的初始值改为点集的几何中心位置后的另一个给出3点求包围圆的过程,也可看出所求包围圆(B2)不是最小的,比“三点圆”的要大。

目前最小包围圆算法基本上是用递归方法:先由点集Sn中2点的包围球作为初值;设定已找到点集Sn中一个子集{P1,P2,…,Pk}的最小包围球Bk,检测点Pk+1,如果Pk+1包含在Bk中,那么Bk+1=Bk,继续测试下一个点;否则,寻找子集{Pk+1,P1,P2,…,Pk}的最小包围球Bk+1,此时,Bk+1通过点Pk+1。如此递归直至找到点集Sn{P1,P2,…,Pn}的最小包围球Bn为止。问题是怎样找到子集{Pk+1,P1,P2,…,Pk}的最小包围球Bk+1。
下面给出的求点集的包围圆之三(求点集的最小包围圆)就是一个根据这一思想试图找到最小包围圆的算法,算法分成3部分:求点集的最小包围球(主算法)、求点集与1个点的最小包围球及求点集与2个点的最小包围球,还用到两点求圆与3点求圆算法。
令Bi-1为相对于{p0,p1,…pi-1}的最小包围圆,如果pi∈Bi-1,则Bi=Bi-1;否则,需要对Bi更新。此时,最小包围圆是过pi点且覆盖点集{p0,p1,…pi-1}的最小包围圆。按同样的思路,取Bi={p0,pi},逐个判断点集{p1,p2,…pi-1},如果存在pj∉Bi(j=0,1,2,…,i-1),则Bi={pj,pi}。同时,再依次对点集{p1,p2,…pj-1}判断是否满足pk∈Bi(j=0,1,2,…,j-1),若有不满足,则Bi={pk,pj,pi}。由于三点唯一地确定一个圆,故而,只需在此基础上判断其他的点是否位于此包围圆内,不停地更新pk。当最内层循环完成时,退出循环,转而更新pj;当次内层循环结束时,退出循环,更新pi。当i=n时,表明对所有的顶点均已处理过,此时的Bn即为覆盖了给定n个点的最小包围圆。


算法3与4的原理是一样的,只是后者采用递归方法编制。

不能说明该算法求得了“最小包围圆”,但它求得的包围圆面积是比较小。另外,在求取点集与2个点的最小包围球算法中,是以3点求圆来终结的。这并不准确,因为当给出的3点成钝角三角形时,以最长边作为直径的圆才是3点的最小包围圆,更未检测3点共线奇异状态。

图6.4-4中给出了上述3种算法所产生包围球的比较,图中的编号为:

  1. 取x/y/z方向最大/最小点对作为初始圆心;
  2. 取点集位置中心作为初始圆心;
  3. 所谓“最小包围球算法”。
    测试结果,第3种“最小包围球算法”得到的圆半径最小。

    在http://www.inf.ethz.ch/personal/gaertner/miniball.html中提到,B. Gartner,1999用C++开发了一个快速、稳定的Miniball V2.0软件包,可在GNU通用公共许可证下使用,在非开源码中使用则需要购买的一个商业许可(300欧元),有兴趣的读者可以参阅。

6.4.2 矩形包围盒与最小最大判定法

AABB包围盒是最常用的包围盒,也称为最小最大判定法。它提供这样一种快速拒绝判定法,这个判定法是利用多边形(如物体投影,图6.4-5中打斜线部分)的最小外接矩形(图6.4-5中的矩形ABCD)来替代,从而粗略地判定两个多边形之间的某种关系,例如不重叠关系(或不遮挡关系)。虽然这种判定条件是一种充分条件,在某些情况下,这种替代是不正确的(图6.4-5b),但因其比较计算简化的优点弥补了这种不足。这个判定法在消隐过程中反复运用于物体间、面与面、线与面间的关系判定。

设两个矩形分别为[X1,Y1,X2,Y2]和[x1,y1,x2,y2],可以从两种不同的判别角度(相叠(图6.4-6a)或不相叠(图6.4-6b))出发去设计算法。显然,采用后者的逻辑简单而花费的时间比前者要少。


矩形盒子是最常用的包围盒,它形成容易,碰撞检测计算简单。但是,它的基础是由点集在x与y方向的最小、最大坐标构成的,当这种最小、最大坐标不在2点达到时,盒子就被放大了。首先想到的改进算法就是用最简单加和减原始坐标表达式去代替单个的坐标。在二维,就有表达式u=(x+y)和v=(x-y),它们分别对应于斜率分别为+1和-1的直线(图6.4-7)。对一个二维点集S,可以计算出它们对应的最小和最大值(umin,umax,vmin,vmax)。俗称“钻石”包围盒。

如果将它更一般化,试图求取“最小矩形盒子”,在二维,就是有两对平行边给出点集S的矩形盒子(图6.4-8),它区域为:
(a1x+ b1y)min £ a1x + b1y£(a1x + b1y)max

(a2x+ b2y)min £a2x + b2y £(a2x+ b2y)max

统一这两种情况,实际上就是二维平面上任意角度的一个矩形均可以构成一个包围盒,它的包围区域的计算就是以该矩形的“左下角”为新原点,与之连接的两条边构成新的uv坐标系(图6.4-9),点集S在这个新坐标系下构筑AABB包围盒。
此方式可扩充到三维空间,问题是如何决定新包围盒的位置(旋转角度)。

6.4.3 凸包包围盒

凸包是包围盒的一种,由于它包围物体比较紧密,是最常用的包围盒检测方法。在了解凸包之前,先认识何謂“凸多边形”(Convex Polygon)。在数学上,凸多边形的严格定义是:假说在一个多边形上(包括在多边形的边界上及边界包围的范围)任意取两点並以一条线段连接,如果線段上的每一点均在该多边形内,那么便說这个多边形是凸的。
三角形、正方形、長方形、平行四边形、正五边形、正六边形等等,都是凸多边形的例子。有趣的是,汉字的“凸”字形並非凸多边形,因为图6.4-10中A、B的连线並不全在该多边形内。

,这个点集的凸包就是包含点集中所有点的最小面積的凸多边形。构成凸包的点称为“凸包点(Hull Point)”,其余点則称为“凸包内点(Inner Point)”。这个定义中有“最小面积”这个限制條件,如果沒有这个限制條件,求凸包就变成非常容易但卻沒有唯一解的运算。

  1. 求取平面上点集凸包的Graham算法
    设有一组有序的顶点构成一个任意多边形,如图6.4-11a所示的顶点组1-2-3-4-5-6-7-1。首先选取一个这组点中的一个极点(x或y方向的最大或最小点,该点将在所求的凸包上),例如P1,则P9P1在P1点逆时针旋转后得到P1P2,P1点是一个凸点;以此考察以下各点,P2也是个凸点,发现点P3是一个凹点,从点列中删除P3点,连接P2P4,继续考察P2点,等等。最后可以得到1-2-4-5-7-1一个凸包。
    在碰到一个凹点将其删除时指针需要回退,这种回退将影响到先前已被认定为“凸点”的前一点。如图6.4-11a的判定7-8-9三点时,8号点被判定为“凸点”,继续检测8-9-1三点时,判定9号点为凹点,删除9号点。先前已将8号点已被判定为凸点了,但是,如果检测7-8-1三点,发现8号点其实是凹点,显然需要纠正。

图6.4-11a中类似的情况还有删除3号凹点后,需要回退重新检测2号点(检测1-2-4三点);删除6号点时,需要回退重新检测5号点(检测4-7-5三点);删除9号点时,需要回退重新检测8号点(检测7-8-1三点),等等。

因此,在检测到某一点为凹点时,除了删除该凹点外,还需要回退检测它前一点的凹凸性,虽然该点曾被判定为“凸点”。

根据首点选取的不同,还可以得到2-4-5-7-1-2;4-5-7-1-2-4等表示同一个凸包的序列,选取其中任一都行。一般地,求取的凸包可记为记录:{vi1,vi2,vi3,……,vin,vi1}

此算法的G1-G3三步是将平面上的离散点列作出一个有序排列,G3是初始化工作,G4、G2两步根据拐向判断的思想剔除点列中的“凹点”,最后得到点列的凸包。

2)求取平面上点集凸包的Jarris步进法(包裹法)
此算法的G1—G3三步是将平面上的离散点列作出一个有序排列,G3是初始化工作,G4、G2两步根据拐向判断的思想剔除点列中的“凹点”,最后得到点列的凸包。
按照凸包定义,被凸包包含的点均在凸包任一条边向量的同侧。Jarris步进法(包裹法)就利用了这个特性,通过运用一种“打包”技术(平面上是“围栏”技术)来计算一个点集Q(设其总点数为N)的凸包。形象地,该算法模拟在集合Q形成一个“围栏”。开始时,把围栏绳子的一端固定在Q的最低点Pi0上(该点为凸包的一个顶点),然后把绳子的另一端拉向右边使其绷紧,再将绳子拉高一些直至碰到一个点,该点也必定是凸包的一个顶点,用这种方法继续围绕顶点集合直至回到原始点Pi0。下面列出了一种求取平面上点集凸包的Jarris步进法的框架。

兴趣的读者可以编制它的程序。
2021年2月26日

原文见

何援军著,《几何计算》,北京:高等教育出版社,2013年3月。

ISBN:978-7-04-035502-4

上海交大教授:何援军——包围盒(包容体/包围盒子)相关推荐

  1. UG NX二次开发(C#)-最小包容体(块)

    前言 在做一些仿真项目中,经常遇到将UG NX的三维模型导入到其他仿真软件中,这是由于UG NX的造型功能比较强大,能对三维模型进行前期处理.本文将讲述采用UG NX二次开发来实现模型处理中的简化功能 ...

  2. 上交大计算机导师俞凯,WLA青科聊高考①|偶像剧“男主”、上海交大教授俞凯的学霸人生...

    编者按 高考的考试结束了,考生们终于可以略为放松心情,等待分数揭晓和志愿填报.在这段等待的空窗期,世界顶尖科学家协会(WLA)上海中心独家推出"青年科学家聊高考"系列策划,采访来自 ...

  3. ucl计算机教授汪军,UCL多智能体机器学习课程上线,计算机系教授汪军主讲

    来源:机器之心 本文约1500字,建议阅读5分钟 本课程基于伦敦大学学院计算机系2020-2021学年度课程Multi-agent Artificial Intelligence (20/21),主要 ...

  4. UCL 教授汪军:多智能体强化学习的两大挑战 | CCF-GAIR 2017

    2017 年 7 月 7 日,由中国计算机学会(CCF)主办,雷锋网(公众号:雷锋网)与香港中文大学(深圳)承办的 CCF - GAIR 大会,在深圳大中华喜来登酒店开幕.在 AI 学术前沿专场的第三 ...

  5. 鸿蒙os上海交大教授,等了两年,鸿蒙OS明天发布,十大特性抢先看!

    上周二,华为正式对外宣布,研发两年多的鸿蒙 OS 将于 6 月 2 号,也就是明晚八点正式发布. 华为表示,发布会上不仅会推出「华为WATCH 3.华为 MatePad Pro」等多款搭载鸿蒙 OS ...

  6. 认知智能通用智能“AlphaGo只是围棋高手,不会炒回锅肉!”上海交大教授正在研发“全才”机器人

    如果有一台机器人,几乎可以通过 "自学" 的方式,完成人类 80%-90% 的日常工作和任务,你信吗? 或许你会说,人类可以做到的事,机器人为什么不可以? 但很显然,我们如今看到的 ...

  7. 几何算法:矩形碰撞和包含检测算法

    大家好,我是前端西瓜哥.今天来讲讲几何算法中,比较经典的算法:矩形碰撞和包含检测算法. 矩形碰撞检测是被广泛使用的算法. 比如在游戏中,为了优化图形碰撞判断效率(复杂不规则图形之间的碰撞算法很复杂), ...

  8. WorldWind源码剖析系列:外包围盒类BoundingBox和外包围球类BoundingSphere

    PluginSDK中的外包围盒.外包围球分别用类 BoundingBox和BoundingSphere描述,其类图如下所示. 外包围盒BoundingBox类的corners字段用来存储外包围盒的8个 ...

  9. UG/NX二次开发(C#) 创建体的最小包容块

    体的最小包容体用途很多,能将一个复杂的实体简化成一个长方体 /// <summary>/// 创建体的最小包容块block/// </summary>/// <param ...

  10. NX/UG二次开发—3D几何—包围盒相交检测(转载)

    一:包围盒介绍 包围盒是指能够包容物体的三维立方体或者二维长方形,是包围体的一种,常常用于模型的碰撞检测.包围体主要包括球体.轴对齐包围盒(AABB).有向包围盒(OBB)和凸包(Convex Hul ...

最新文章

  1. 双击SDK Manager.exe和AVD Manager.exe时,弹出提示:failed to execute tools\android.bat解决办法
  2. 使用Docfx生成项目文档
  3. 批处理如何清除文本文档里面的重复行
  4. yili邮箱服务器配置,手把手教 个人SMTP服务器的配置 -电脑资料
  5. iOS开发触摸事件的传递
  6. Jeewx-Api 1.3.2 版本发布,微信开发SDK
  7. Java描述设计模式(24):备忘录模式
  8. 誰毀了全新Vista電腦﹖
  9. php套壳_PHP-T
  10. spring中的@Bean是否一定要与@Configuration一起用
  11. Servlet+JSP分页
  12. PLC的ST语言转义字符列表
  13. 如何评价的测试用例好坏以及如何写好一份测试用例
  14. 优化算法:《Lookahead Optimizer: k steps forward, 1 step back》
  15. MYIP网站信息状态条 v1.0.1.3 (MyIP Status Bar for IE)
  16. 人工智能入门学习-人工智能岗位超吃香
  17. DICOM医学影像文件解析
  18. 秉承极简美学设计:Polestar 2 登陆中国后会威胁到谁?
  19. 2018秋招面试经验(测试开发、产品)
  20. 小牛叔讲Python第10章:化繁为简的推导式

热门文章

  1. ug齿条插件_NX9.0齿轮齿条运动仿真—齿轮工具箱巧用及渐开线制作
  2. linux for java programer
  3. 太原理工计算机学科评估,太原理工大学学科评估结果及排名情况怎样
  4. 搭建个人云盘保姆级教程
  5. 如何选出好用的仓库库存管理系统软件?看文章就知道了
  6. 高精度三维扫描仪用于运动鞋逆向建模
  7. java中递归遍历文件夹下所有文件
  8. SURF算法之Opencv代码详解
  9. Sentaurus training 笔记
  10. Java随机生成中文姓名工具