首页/文章/ 详情

接触基础知识:从四叉树八叉树到K-d tree

12天前浏览20

上次说到了 接触基础知识:从二分到四叉树与八叉树

说到了四叉树、八叉树与二分的关系,其实呢就是高维上的均匀二分法,那么其实在此之上还有一种变形,那就是K-D tree。

K-D tree的问题其实主要是为了解决以下的问题:假设蓝框框是需要划分的几何空间,为了快速搜索,假定我们待检测的几何或者网格在一个维度上分布很广,而在另外一个维度上基本空间位置没啥变化,那么传统的四叉树与八叉树就会造成一定的问题。比如看下边这个图,虚线将空间划分为4等分(典型的2D空间中的四叉树),那么左边2个小三角型分别横跨左边上下两个,右边的两个也是横跨右边上下两个,这个时候如果有个接触检测的物体进入这些盒子都需要进行接触检测,显然不是我们想要的。 


 那么我们来看看改进的K-d tree是咋做的呢,K-d tree 顾名思义,他的意思就是     的树结构,     为空间维度,对于2D来说,    , 对于3D来说,    ,其实也是在各个维度上进行二分,这里乍一看,跟上述四叉树八叉树也没啥区别,但这里他有两个比较重要的特点(起码我认为重要):

  1. 不一定均分
  2. 不一定每个维度方面都分

一般来说在三维中,按x→y→z→x循环选择分割维度,然后可以选择图形在该维度上的中位数作为分割点,确保树平衡,而且也并不一定每个维度都分割,比如像上述的结构,我们可以采用下边的方法 

这样我们进行x方向的分割,并略过y方向的分割,因为如果像上述四叉树一样也进行y方向的分割无非是让格子变得更多,且每个格子里面物体的数量又不会减少(如上述四叉树),增加了存储又没带来啥好处。

所以这里可以看到K-d tree 提供一种比传统四叉、八叉树更为灵活的方式,可以分别在各个维度上剖分,可以认为是四叉树八叉树的改进型,不过编码方面会稍微麻烦一点,下一次我会结合编码直接来说一下,然后大家怎么选用看自己的选择

另外,K-d tree还有一个大好处,因为他并不是对空间的均匀剖分,所以对于空间分布不均匀的情况也会效果更好一点,下图这个分布很不均匀的情况 

用左边的四叉树,四个格子分别的单元数量(按照但凡有部分在就算属于这个格子的原则):

  1. 左上:5
  2. 右上:2
  3. 左下:4
  4. 右下:2

换成K-d tree 后:

  1. 左上:3
  2. 右上:2
  3. 左下:2
  4. 右下:3

可以看到存储的数量减少了很多,更重要的是后续在格子中做局部的接触检测的数量会减少,提高计算效率。

最后总结一下:K-d tree和四叉、八叉树在查询效率和构建复杂度方面基本一致,但是K-d tree 可能更省内存,各个区域的划分可能更均衡,虽然理论上并不会改变计算复杂度的级别,但是实操起来对于一大堆数据的情况(特别是接触、动态的、不均匀的),往往能效率更高一些。


来源:大狗子说数值模拟
理论
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-08-09
最近编辑:12天前
大狗子说数值模拟
博士 传播国际一流的数值模拟算法
获赞 10粉丝 25文章 72课程 0
点赞
收藏
作者推荐

关于一些常见的梁、壳连接的思考

最近经常处理一些不同的连接,也在用户的案例中看到了非常多种发生错误的方式,不得不说有限元分析中连接是一个好东西,但也是最经常发生错误的地方(另一个可能是接触),我将我工作中发现的模型错误的可能性排序从高到低大概是这样:连接接触边界条件(尤其是约束)材料模型(或者有人会把参数输入错误)单元类型误用函数误用所以今天就说一说我最近看到的一些连接方式,与相应的思考壳单元,实体单元直接共节点如图所示,我在很多人的模型中看到过如下这种结构,壳单元直接通过共节点与实体单元连接起来,这个连接方式极其危险。因为大家知道,壳单元有6个自由度,实体单元有3个自由度,所以在连接的地方,壳单元的后三个转动自由度是完全没有约束的,这就导致了其实上边这片壳可以自由“晃动”。 但是坏就坏在,很多时候这种情况还能算,原因在于很多商业软件都会默认用个软弹簧把没约束的地方约束一下,另外就是很多人诸如用非线性分析会默认打开稳定项,也就是Abaqus非线性分析中的这个选项,这些在一定程度上可以解决上述乱晃的问题,但由于稳定项与软弹簧都无法给你确定的结果(你的结果啥样,全看运气),结果是否正确,谁又知道呢? 正确的方式,如果想直接用壳单元实现边焊连接,其实可以采用如下的方式 首先将板子拉通到下边,然后共节点,然后再拉一个斜角焊缝到下边共节点,这样有两个地方共节点,就不会发生上述由于壳单元转动自由度没被约束而乱晃的情况了。注:稳定项虽好,千万别乱用!梁与实体连接与上述类似,很多人就这样把一个梁和实体连到一起了,通过共节点的方式,梁和实体连在同一个点上,同理也会“乱飞”,原因也是梁有3个转动自由度,而实体没有。 而且这种方式一般来说在另一个角度也是十分错误的,比如现实生活中细长结构通常被我们简化为梁单元,大块的结构用实体单元,这是很多人都有的常识,但是当两者相连接的时候,对于梁却不应该只连在实体的一个点上,因为真实中梁界面肯定是有一个面积的,这种连接方式等同于将一个小区域的分布力集中在一个小点上了,算出的结果应力集中不说,一般来说变形情况也会受影响。正确的做法就是考虑截面的面积,绑上周边一堆单元节点,想刚性一点呢就用RBE2 也就是kinematic coupling,想柔性一点呢就用RBE3 也就是distributed coupling 梁与壳连接由于梁、壳每个节点都有6个自由度,首先我们可以直接通过共节点连起来,也可以通过上述RBE的方式连接,同样,如果有很多梁分布在壳的时候,就比如这种结构 如果不想费劲的设置共节点或者RBE,其实也可能无脑的将梁的绑在壳上边,Abaqus中可以设置Tied连接,其他软件类似,但是,一定要注意的是,千万要勾选这个选项如下图Abaqus,Ansys中也有类似的,否则转动自由度也不会被连到一起,最后变形情况就会很怪,梁、壳之间没有弯矩传递,算出的结果就是个没用的云图 。当然,如果你想所有结构都实体单元硬怼,那么绑定+共节点确实基本就足够了,但一般情况下对于大型案例,这并不可能。最后愿所有的工程师都热衷思考且执着,别随便给个结果,好好思考自己计算的场景,并相信自己计算的结果。来源:大狗子说数值模拟

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈