前提
我正在随机生成一个二维迷宫状结构。归结为在网格中随机生成一堆房间,然后使用 A* 将这些房间与走廊随机连接。房间的墙壁在网格中占据了整个正方形。我遇到的问题是这些墙的创建。
为了决定将随机生成的房间放在哪里,我开始将网格划分为一堆大小不一的矩形单元格,这些单元格彼此相邻,使用大小为 1 的单元格来填充它们之间的剩余间隙。之后,我随机选择一堆这些单元格作为房间。如果任何选定的单元格彼此相邻,则将它们组合成一个房间。到目前为止,该算法运行良好。
例子
问题
我遇到的问题是,当我想遍历定义其中一个房间墙壁的每个正方形时。现在发生的事情是,我为每个房间创建一个区域,并将所需的每个单元格添加到该房间的区域。我成功地使用PathIterator来遍历区域的轮廓。唯一的问题是该迭代器的结果不是我想要的结果。
例如,假设一个具有坐标 (5, 5) 和大小 (4, 6) 的矩形。我想要迭代的结果点如下:
- 第 1 行从 (5, 5) 到 (8, 5)
- 线路 2 从 (8, 5) 到 (8, 10)
- 第 3 行从 (8, 10) 到 (5, 10)
- 第 4 行从 (5, 10) 到 (5, 5)
相反,我最终得到以下结果:
- 线路 1 从 (5, 5) 到 (9, 5)
- 线路 2 从 (9, 5) 到 (9, 11)
- 3号线从 (9, 11) 到 (5, 11)
- 第 4 行从 (5, 11) 到 (5, 5)
换句话说,可以认为是在区域内部上方或左侧的每一行都包含在区域内,而考虑到区域下方或右侧的每一行都是区域独有的(如由Area.contains函数返回)。
现在在处理简单的正方形时修复这个问题似乎微不足道,但是一旦我开始尝试为一个区域修复这个问题,各种烦人的特殊情况开始从我尝试修复它的每个角度弹出。
我尝试或考虑过的一些东西:
- 格雷厄姆的扫描算法。当我意识到“凸壳”是什么意思以及我的房间不是那样时,我失败了
- 考虑路径中的每一行,检查它是否主要在区域内部或外部,如果在外部,则将其移动一个单位。尝试使用尽可能小的行(长度 2 - 3)执行时失败
- 考虑路径中每组连续的 3 个点,检查它们形成的角类型(什么方向 + 是凹角还是凸角),然后根据角的类型调整这三个点的中间。失败,因为我似乎找不到一种可靠的方法来检查这些点构成的角
所以我想知道,这里有什么明显的我完全想念的吗?这是我无法使用 PathIterator 完成的事情,我需要实现自己的“多边形创建”算法吗?如果是这样,那里有类似的东西吗?这几天我一直在为这件事绞尽脑汁。我似乎也无法在互联网上找到任何帮助。
好吧,我只是想到了一些非常明显的事情,我对我试图制作它的复杂程度感到有点羞愧。我想我只是在这个问题上盲目地盯着自己看。
- 迭代边界矩形的所有点
- 如果多边形包含该点,则在每个方向创建该点的翻译版本。
- 如果多边形不包含平移点之一,则表示该点是多边形墙的一部分。
这是一个令人难以置信的明显和简单的机制,这意味着至少我现在被保存了,但它显然非常低效,所以如果有人有更好的算法,仍然非常受欢迎!