有趣的算法——判断空间中球体和长方体是否相交
二维空间圆形与矩形是否相交判断
设c为矩形中心,h为矩形半长度,p为圆心,r为半径。方法是计算圆心与矩形的最短距离 u,若 u 的长度小于 r 则两者相交。
- 首先利用绝对值把 p - c 转移到第一象限,下图显示不同象限的圆心也能映射至第一象限,这不影响相交测试的结果:
- 然后,把 v 减去 h,负数的分量设置为0,就得到圆心与矩形最短距离的矢量 u。下图展示了4种情况,红色的u是结果。
- 最后要比较 u 和 r 的长度,若距离少于 r,则两者相交。可以只求 u 的长度平方是否小于 r 的平方。
bool Intersection(Vector2 c, Vector2 h, Vector2 p, float r) {Vector2 v = abs(p - c); // 第1步:转换至第1象限Vector2 u = max(v - h, 0); // 第2步:求圆心至矩形的最短距离矢量return dot(u, u) <= r * r; // 第3步:长度平方与半径平方比较
}
如矩形不是轴对齐矩形(AABB)而是定向矩形(OBB),可以把圆心旋转至矩形的座标系。
空间中球体和长方体相交算法
二维空间圆形和矩形相交引申到三维空间,那么就是空间中的球体和矩形相交。
我们先来看第一步:
- 首先利用绝对值把长方体的重心移动到三维空间的原点位置(0,0,0),同时球体也跟着移动,再利用绝对值将球心移动到第一象限(也就是 x>0, y>0, z>0)的空间。上面2次移动并不影响相交的测试关系
2.同样的我们计算出三维空间的h = box.max- box.center(球心坐标),并计算出 u = v- h(就是球心) 就得到球心与长方体最短距离的矢量 u
3.同样的,我们判断球体和长方体是否相交,既判断 u.squaredNorm() < squaredradius那么就认为是相交的。当然我们也要处理三维空间下 u,x <0, u.y < 0, u.z <0 的情况,只要有某一个值<0,我们便将u向量的这个值置为0
bool Intersection(Vector3 c, Vector3 h, Vector3 p, float r) {Vector3 v = abs(p - c); // 第1步:转换至第1象限Vector3 u = max(v - h, 0); // 第2步:求球体至长方体的最短距离矢量return dot(u, u) <= r * r; // 第3步:长度平方与半径平方比较
}
总结:三维空间的相交检测和二维空间一摸一样,只是顶线,向量,由二维变成三维了。
以上算法参考知乎回答:
https://www.zhihu.com/question/24251545/answer/27184960
有趣的算法——判断空间中球体和长方体是否相交相关推荐
- 3d空间中球体的动量守恒
其实,虽然说的是3d空间中的,但事实上一旦掌握原理,他可以用在任意维度的空间中: 为了简化代码,最好能够满足如下要求: 所有的空间属性都用矢量来表示:比如位置,速度,加速度(虽然这里涉及不到加速度): ...
- 数据结构算法——判断表达式中的括号是否匹配
元旦三天假,闲着没事干,就想着复习一下学数据结构时的那些算法吧.本来是想用C语言来写的,无奈啊,三四年没用C了,基本上忘光光,还是用C#来写吧,而且.Net基类库中已经有了栈.队列等的实现,直接拿来用 ...
- Computer Science Theory for the Information Age-1: 高维空间中的球体
Computer Science Theory for the Information Age-1: 高维空间中的球体 高维空间中的球体 注:此系列随笔是我在阅读图灵奖获得者John Hopcroft ...
- 检测空间中实心圆与平面是否相交
问: 三维空间中存在一实心圆和一块无限平面,证明实心圆与平面是否相交. 此题事实上是两个平面相交的问题,一般不平行的两平面相交问题只需要解两平面方程联立的行列式就能得到相交的直线方程了,但是在本题中, ...
- 计算长方体体积编程_如何求N个球体在空间中所占的体积?
最近,我遇到了一个这样的应用问题.在三维空间存在N个球体,球体间可能会存在相离.相切.相交和包含的关系, 现给出球体的球心坐标和对应的半径,如何求解这N个球体在三维空间所占的体积? 对于最一般的情况, ...
- 如何判断一笔交易是否属于欺诈 数据挖掘算法与现实生活中的应用案例
文|周学春,一个在银行做挖掘的博士,微信公众号:比格堆塔 相对于武汉,北京的秋来的真是早,九月初的傍晚,就能够感觉到丝丝丝丝丝丝的凉意. 最近两件事挺有感觉的. 看某发布会,设计师李剑叶的话挺让人感动 ...
- 【算法】图(一)拓扑排序的实现 图的邻接表算法 判断是否图G中存在环
文章目录 用list来表示图,判断是否存在环 邻接表实现拓扑排序 用DFS(邻接矩阵) 来实现拓扑排序. 判断无向图顶点是否全部连通 判断图G中从顶点u到v是否存在简单路径 输出图G中从顶点u到v的所 ...
- java判断扑克牌是否为顺子_程序算法设计题,判断扑克牌中的顺子
相信很多人都玩过扑克牌.在扑克牌中,有许许多多的算法供我们学习.仅仅一个斗地主游戏,就可以学习很多的算法.今天和大家分享一个判断扑克牌中的顺子的问题. 题目: 从扑克牌中随机抽取五张牌,判断是不是一个 ...
- 4.6设计一个算法判断图G中从顶点u到v是否存在简单路径
1. 题目描述 假设图G采用邻接表存储,设计一个算法判断图G中从顶点u到v是否存在简单路径 所谓简单路径是指路径上的顶点不重复.可采用深度优先遍历的方法 #include <bits/stdc+ ...
最新文章
- 费用流 -- 四川省赛F-Direction Setting [拆边成点+费用流]
- EXSI中Linux安装tools
- 手机耗电统计app_Android O新特性:精确统计APP电量消耗
- Java线程中wait、await、sleep、yield、join用法总结
- 【研发管理】中国企业 VS 世界优秀企业在产品研发上差距(下)
- 大型分布式存储方案MinIO介绍,看完你就懂了!
- python gitlab_Python Gitlab Api 使用方法
- java做报表_一步一步使用POI做java报表
- asp.net mvc3.0第一个程序helloworld开发图解
- 八数码——路径寻找问题
- springboot之idea无法添加包
- docunment对象
- Google IO 2018 来啦!
- java连接zookeeper服务器出现“KeeperErrorCode = ConnectionLoss for ...”
- 关于 Nim游戏与SG函数 的一点研究
- centos7下安装zmap
- 给初学编程的人的忠告
- day 21 C# 窗体绘制一个正方体
- 技能高考计算机专业考什么,2016年技能高考计算机专业考试总结
- 不用找了,大厂在用的分库分表方案,都在这了