检查大网格上的放置重叠

Check for placement overlap on large grid

本文关键字:重叠 网格 检查      更新时间:2023-10-16

我正在开发一款游戏,将通过连接器连接的建筑放置在矩形网格上。没有什么可以重叠。建筑物和连接器一旦进入电网,就不能改变;它们随时都可能被摧毁。栅格的定义使左下角为(0,0)。

这些建筑是矩形的,每个边缘可以有1-4个单元长;还有一个5x5的正方形。

连接器有起点和终点。它们不能重叠,并且有1个单位宽。他们可以直线前进编辑:(左、右、上、下),并在任何地方弯曲90度。长度不限。

理想情况下,网格会非常大(200x200或更大),但这意味着可以有数千个这样的对象和连接器。

当一个对象被构建时,我需要检查它是否与任何东西重叠。如果我制作一个比特网格,它的大小将超过300x300。如果我列出所有对象,我可以在一定范围内搜索,但我该如何处理连接器?

由于二维比特数组是不可能的,我必须对所有建筑进行索引,然后按x坐标和y坐标对它们进行排序。我可以线性搜索连接器,但这会非常乏味和痛苦。

有人有什么建议吗?附言:我在C++中这样做

除了300x300不是很大之外,如果你真的想要,你可以将布尔值打包成一个字节内的位(但出于速度原因,我不建议这样做),你可以检查连接器是否与一个简单的函数相交:https://stackoverflow.com/a/565282/2436175

假设您已经检查了新建筑没有与任何其他建筑相交,那么需要检查的是新建筑(线段)的一侧没有与任何已就位的连接件相交。