Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Search 如何在不迭代所有长方体的情况下确定点所在的长方体?_Search_Language Agnostic_Geometry_Fuzzy Search_Space Partitioning - Fatal编程技术网

Search 如何在不迭代所有长方体的情况下确定点所在的长方体?

Search 如何在不迭代所有长方体的情况下确定点所在的长方体?,search,language-agnostic,geometry,fuzzy-search,space-partitioning,Search,Language Agnostic,Geometry,Fuzzy Search,Space Partitioning,我有许多长方体,它们的位置和大小以最小和最大x,y和z坐标给出(因此它们与主轴平行) e、 g.我可能有以下3个长方体: 10.5 <= x <= 39.4, 90.73 <= y <= 110.2, 90.23 <= z <= 95.87 20.1 <= x <= 30.05, 9.4 <= y <= 37.6, 0.1 <= z <= 91.2 10.2 <= x <= 10.3, 0.1

我有许多长方体,它们的位置和大小以最小和最大
x
y
z
坐标给出(因此它们与主轴平行)

e、 g.我可能有以下3个长方体:

10.5 <= x <= 39.4, 90.73 <= y <= 110.2, 90.23 <= z <= 95.87 20.1 <= x <= 30.05, 9.4 <= y <= 37.6, 0.1 <= z <= 91.2 10.2 <= x <= 10.3, 0.1 <= y <= 99.8, 23.7 <= z <= 24.9
10.5您即将进入“二进制空间划分”和“碰撞检测”领域;从本质上讲,这些想法基本上是将长方体存储在一个树状结构中,将它们占据的空间分割成整洁的小盒子。每个长方体占用的“空间部分”是在插入树结构时决定的

在八叉树上进行谷歌搜索


有效地划分三维空间,其中包含的对象在计算机科学中占有相当大的比例;主要用于电脑游戏的开发。一些算法考虑了时间因素,即对象在分区空间之间移动。

加速此查询的一个简单方法是构建以下统一网格数据结构(通常称为BIN)作为预处理步骤:放置
nxnxn
(在3d中)网格覆盖在场景上,并为网格的每个单元存储指向与该单元相交的所有长方体的指针。现在,对于一个查询点,您可以直接计算它在统一网格中的哪个单元格,然后您只需要检查与该单元格关联的长方体,而不是所有的长方体

根据空间的大小和长方体大小的变化,这种方法可能不是很有效,因为您可能很难选择一个好的
n
分辨率来加速足够的速度,并且不需要大量的单元。要克服这一问题,您可能需要尝试寻找更自适应的方法来划分空间,例如kd-trees,它基本上是用轴对齐的平面划分空间的二叉树:请参见此处的示例,其中红色平面将长方体划分为两部分,然后绿色划分为较小的部分,然后蓝色

使用kd树的查询将首先向下遍历到查询点所在的kd树的叶子,然后使用该单元格中的局部长方体进行检查可以找到其他空间分区数据结构选项

另一种选择是使用边界体积层次结构,将对象分组到边界体积中,然后将边界体积分组到更大的边界体积中,依此类推。。。获取边界体积的层次结构。这些可以更好地适应场景,并且可以更容易地处理对象移动的场景,但是我认为在您的设置中,空间分割可以很好地工作。。。无论如何,有关更多详细信息,请参阅