首页 > 解决方案 > 在超阵列内生成填充多边形

问题描述

考虑以下:

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

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

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

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

  4. 将房间连接到走廊,消除死角,您将获得一个相互连接的房间系统。

像这样

地牢

现在我想为这些房间增添些许活力,因为它们只是扁平的矩形。我现在需要做的是找到一种在 int 超阵列内生成多边形的方法(坐标可能会很好,这不是问题),然后用 1 填充超阵列中多边形的空间(我的部分我遇到了麻烦)。

标签: javaarraysgame-enginepoint-in-polygon

解决方案


我现在正试图弄清楚如何“在整数数组中画线”。我发现,我可以通过执行以下操作从一个点到另一个点画一条线:找到点 1 和点 2 的宽度和高度(x1-x2 和 y1-y2 的绝对值,将宽度除以(高度-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 是您的开始 x 位置,x2 是您的结束位置 y 是每次迭代的当前 y(循环期间的实际计数器要具体) y1和 y2 分别位于开始 y 和结束 y 位置。和 sign(x2-x1) 以帮助确定您是从起始位置向左还是向右。

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

我希望这对你有所帮助

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

只是一个快速的旁注


推荐阅读