Java PathIterator - 如何找到区域的正确周长?

时间:2014-02-04 17:52:46

标签: java algorithm grid area path-iterator

前提

我随机生成一个二维mazelike结构。归结为在网格中随机生成一堆房间,然后使用A *随机连接这些房间和走廊。房间的墙壁占据了网格中的整个广场。我遇到的问题是创建这些墙。

为了决定在哪里放置随机生成的房间,我开始将网格分成一堆不同大小的矩形单元格,这些单元格彼此相邻,使用大小为1的单元格填充它们之间的剩余间隙。之后,我选择一组随机的这些单元格作为房间。如果任何所选单元彼此相邻,则将它们组合以形成单个房间。到目前为止,该算法运行良好。

实施例

Cell Gen

问题

我遇到的问题是当我想要遍历定义其中一个房间的墙的每个方格时。现在发生的是,我为每个房间创建了一个Area,并添加了该房间区域所需的每个单元格。我成功地使用PathIterator来遍历Area的大纲。唯一的问题是迭代器的结果不是我想要的结果。

例如,假设一个带有coördinate(5,5)和大小(4,6)的矩形。我想要迭代的结果如下:

  • 从(5,5)到(8,5)的第1行
  • 从(8,5)到(8,10)的第2行
  • 从(8,10)到(5,10)的第3行
  • 从(5,10)到(5,5)的第4行

相反,我最终得到以下内容:

  • 从(5,5)到(9,5)的第1行
  • 从(9,5)到(9,11)的第2行
  • 第3行(9,11)至(5,11)
  • 从(5,11)到(5,5)的第4行

换句话说,区域内部可以被视为 的每条线包含到区域,并且区域中低于的每一行都独占到区域(由 Area.contains 功能)。

现在解决这个问题在处理简单的方块时可能看起来微不足道,但是一旦我开始尝试为一个区域修复这个问题,各种恼人的特殊情况都会从我尝试修复它的各个角度出现。

我尝试或考虑的一些事情:

  • 格雷厄姆的扫描算法。 当我意识到'凸包'意味着什么以及我的房间不是那样的时候失败
  • 考虑路径中的每个连续线,检查它是否主要位于区域内部或外部,如果它在外部,则将其移动一个单位。 尝试使用尽可能小的行(长度为2 - 3)
  • 执行时失败
  • 考虑路径中每个连续的3个点,检查它们的角落类型(方向+是凹角还是凸角),然后根据角的类型调整这三个点的中间位置。 失败,因为我似乎无法找到一种可靠的方法来检查积分构成的角落

所以我想知道,有什么显而易见的我在这里完全不见了吗?这是我根本不能用PathIterator做的事情,我需要实现自己的'多边形创建'算法吗?如果是的话,那里有什么东西吗?我几天来一直在嘲笑这件事。我似乎无法在互联网上找到任何帮助。


好吧,我只是想到了一些令人难以置信的明显的事情,我有点惭愧我试图做到这一点有多么复杂。我想我只是盯着这个问题。

  • 迭代边界矩形的所有点
  • 如果多边形包含该点,请在每个方向上创建该点的翻译版本。
  • 如果多边形不包含其中一个平移点,则表示该点是多边形墙的一部分。

这是一个令人难以置信的显而易见的简单机制,这意味着至少我现在已经保存了,但它显然非常低效,所以如果有人有更好的算法,它仍然非常受欢迎!

0 个答案:

没有答案