数学隐藏碰撞

时间:2012-08-25 14:58:39

标签: actionscript-3 math vector-graphics

Example

我正在开发一个使用磁贴引擎(自制)的项目,我的下一个任务是创建一个AI(除了已经完成的其他AI),这一个很棘手,因为AI应该只发现玩家玩家在AI的视野中。在计算范围(在瓦片中)[1瓦片= 32 * 32]之后,用周期来尝试它 然后我想到了创建一条直线方程。在这里,我对数学感到困惑
我知道如何计算它是否与这些“隐藏”的瓷砖重叠? 请注意,我只想使用数学!

TileInfo.tileData[la[floor(y / 32)][floor(x / 32)]];
//la -> array of tile positions, if it's >0 then there is a tile.

1 个答案:

答案 0 :(得分:1)

假设查看者位于(x1,y1)位置,目标位于(x2,y2)。现在,我假设在n沿xm沿y有一组(x0,y0)个连续的拼贴。第一个瓷砖的左下角位于d位置。切片的大小为x ty y = y1 + (y2 - y1) * (x - x1) / (x2 - x1)。现在数学:

连接查看器和目标的行是

p1 = (x0,y0)

瓷砖角落位于p2 = (x0 + n * d, y0)点; p3 = (x0 + n * d, y0 + m * t); p4 = (x0, y0 + m * t); y = y0。现在的工作是找出该线是否穿过连接两个连续角落的4个线段中的任何一个。让我们取x定义的p1和p2(水平线)之间的片段。如果将其设置为线方程式,您可以找到我命名为xi的可能拦截y0 = (y2 - y1) * (xi - x1) / (x2 - x1) + y1

xi = x1 + (y0 - y1) * (x2 - x1) / (y2 - y1)

您可以反转此等式并找到possibx:

xi > x0

现在,如果xi < x0 + n * dp2 -> p3: x = x0 + n * d您对此细分受到拦截。否则你有一个自由的视线。

对其直线由p3 -> p4: y = y0 + m * d定义的其他三个段执行相同操作; p4 -> p1: x = x0;和y = const

请注意,当细分为水平(y)时,您必须将此x放在视线直线上,计算x并将此x = const与拦截。如果细分是垂直的(x),那么您必须将y放在直线方程中,计算x1 = x2并检查它是否落在间隔中。

最后一点是,您必须特别注意y1 = y2或{{1}}的情况。这是垂直和水平的视线,并且可能导致在上述等式中除以零。解决方案:分别处理这些案例。