我目前正在为一款游戏编写插件,其中一个功能是设置由2个二维坐标定义的区域(矩形的左上和右下角)。这些区域将被存储,并与每个区域关联各种其他数据。当玩家在世界范围内移动时,我需要仅根据玩家的坐标确定他何时进入这些区域,并且所使用的方法必须有效率,因为这将每秒被调用数百次。
是否存在任何数据结构可以有效地支持此类搜索?如果是,我在哪里可以找到相关文档,以查找可用的java实现或必要时自己实现该算法?
我还想指出,我找到了一些似乎只支持批量加载的树形结构,但我必须能够实时添加和删除该结构中的值。
我目前正在为一款游戏编写插件,其中一个功能是设置由2个二维坐标定义的区域(矩形的左上和右下角)。这些区域将被存储,并与每个区域关联各种其他数据。当玩家在世界范围内移动时,我需要仅根据玩家的坐标确定他何时进入这些区域,并且所使用的方法必须有效率,因为这将每秒被调用数百次。
是否存在任何数据结构可以有效地支持此类搜索?如果是,我在哪里可以找到相关文档,以查找可用的java实现或必要时自己实现该算法?
我还想指出,我找到了一些似乎只支持批量加载的树形结构,但我必须能够实时添加和删除该结构中的值。
在一维情况下,适当的数据结构是区间树。
要解决二维问题,可以使用区间树快速查找至少在一个维度上包含点的矩形,并对每个矩形检查第二个维度(这可能已经足够快),或者使用维基百科文章简要概述的多维泛化(尽管我必须承认我第一次阅读时没有理解那个泛化)。
假设玩家移动缓慢(即进入或离开区域的事件数量与区域数量相比较小),以下方法可能更有效:保持x坐标的搜索树,其中矩形开始或结束,并为y坐标提供类似的树。如果玩家进入或离开区域,则必须穿过边界点的x或y坐标。也就是说,您将在x搜索树上对范围[old_x,new_x]进行范围查询,并检查每个矩形。对y方向执行相同操作(不报告重复项)。
要实现坐标,您可以在实现所需功能的类中使用Point2D:
http://download.oracle.com/javase/6/docs/api/java/awt/geom/Point2D.html