java - 在超阵列中生成填充多边形

标签 java arrays game-engine point-in-polygon

考虑以下几点:

目前,我正在编写一个非常基本的地牢生成器。现在,它是这样工作的:

  1. 生成一个任意长度的 int[][] 超数组。

  2. 使用 for 循环在这个超阵列中以随机坐标放置房间(我们现在称之为迷宫。),在迷宫中使用 1 填充房间的高度和宽度。出于游戏引擎的目的,0 表示不可穿越(一堵墙)。1 表示玩家/敌人可以穿越。

  3. 在 0,0 处启动一个完美的迷宫生成器并运行,直到房间之间的所有空间都被走廊填满。

  4. 将房间连接到走廊,移除死胡同,剩下的就是一个相互连接的房间系统。

像这样

dungeon

现在我想让这些房间变得活泼起来,因为它们只是扁平的矩形。我现在需要做的是找到一种方法在 int 超数组中生成一个多边形(坐标可能会很好,这不是问题)然后用 1 填充超数组中多边形的空间(我的部分)我遇到了麻烦)。

最佳答案

我现在正试图弄清楚如何“在整数数组中画线”。 我发现,我可以通过执行以下操作从一点到另一点画一条线: 求点1和点2的宽高(x1-x2和y1-y2的绝对值, 将宽度除以 (height-1) 并从点 1 到点 2,沿 y 轴单步移动到点 2,并在 x 轴上按宽度/高度步进。 示例:

01000
01000
00100
00100
00010
00001

这里我有一条从 (1,0) 到 (x,y) 到 (4,5) 的线 如果我采用我最终得到的宽度和高度 宽度 = 3 高度 = 5 如果我除以 3/5 我最终得到 0.6 因此,对于沿 y 轴的每一步,我沿 x 轴采取 0.6 步(并降低结果值,因为我们只能使用整数作为位置) 并以坐标结束

(1,0)
(1.6,1) -> (1,1)
(2.2,2) -> (2,2)
(2.8,3) -> (2,3)
(3.4,4) -> (3,4)
(4,5) ->   (4,5)

有了这个,您可以使用此线函数为多边形的每个坐标对绘制这些线

x = x1 + (|(y1-y)| * ( |(x1-x2)| / |(y1-y2)| ) * sign(x2-x1))

其中 x 是每次迭代的当前 x,沿着 y 轴的线 和 x1 beeing 你的起始 x 位置,x2 beeing 你的结束位置 y beeing 每次迭代的当前 y(具体来说是循环期间的实际计数器) y1 和 y2 分别是开始 y 和结束 y 的位置。 并签名 (x2-x1) 以帮助确定您是从起始位置向左还是向右。

有了这个,您应该能够绘制多边形的轮廓,希望之后填充它会变得更容易。

希望对你有所帮助 问候

编辑: 我们为每一对连续的坐标画线,而不是每一对。 意思是如果你要从点 p1,p2,p3,p4,p5 画一个多边形 你会画一条线从 p1 到 p2,p2 到 p3,p3 到 p4,p4 到 p5 和 p5 到 p1

只是一个简短的旁注

关于java - 在超阵列中生成填充多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54458241/

相关文章:

java - 在 Eclipse 中查看 http POST 和 GET 数据的最简单/最佳方法?任何插件/工具?

c++ - 如何修复由多态性引起的错误?

javascript - Console.log 给出正确的输出,但在访问设置值时给出错误的输出

java - 在 Apache Tomcat 服务器中启动时出错

java - 最佳架构 - 在 java 中监听 Atom feed 的最佳方式是什么?

java - 字符串设置为 ArrayList?

android - 从 Spinner 获取键和值的最佳方式

c - C 中复制 3d 数组的函数?

c++ - 类构造函数中的 OpenGL sigsegv 错误

java - 从 Selenium 和 chromedriver 下载文件