我希望数据结构具有以下方法:
insert :: Point3D -> a -> SphereMap a -> SphereMap a
remove :: Point3D -> a -> SphereMap a -> SphereMap a
query :: Float -> Point3D -> SphereMap a -> [a]
insert
和remove
在数据结构中添加3D索引值时,query
会收到一个角度和一个点,并返回该角度范围内的所有值的列表关于原点(0,0,0)的观点。
此类要求存在哪些数据结构?
答案 0 :(得分:2)
通常的方法是对二维数据使用四叉树或对三维数据使用八叉树。四叉树基于X和Y阈值将关注区域分成4个象限。对于每个象限,如果它包含0或1个点,则结束,否则将象限细分为子象限并重复。这将为您提供一个点树,其中树几何体反映了相邻的几何形状。然后,您可以编写一个算法来遍历树,找到与搜索半径相交的所有象限。 十月树在三维中是相同的,由X,Y和Z分开。 有关详细信息,请参阅http://gamedevelopment.tutsplus.com/tutorials/quick-tip-use-quadtrees-to-detect-likely-collisions-in-2d-space--gamedev-374。