C#:2D子平铺线交叉点

时间:2010-05-03 11:49:54

标签: c# 2d tiles intersection line-intersection

我在使用算法让我的游戏工作时遇到了一些问题,希望有人可以帮助我。谷歌似乎并不是一个很好的帮助,因为大多数解决方案只适用于完整的瓷砖。

在游戏中,单位可以占据拼贴内部的不同位置,即它们可以位于拼图的左上角,中心,右下角,...位置(2/3),即(2.2 / 3.1),( 2.5 / 3.5),(2.8 / 3.9)。

如果他们从位置(2.2 / 3.1)移动到(5.7 / 4.1),我需要检查路径中是否有障碍物。

我目前的算法是:

  1. 从(2.2 / 3.1)开始
  2. 计算运动角度(即70度)
  3. 向该方向移动0.1步
  4. 检查我所在的瓷砖(地板(p.X)/地板(p.Y))
  5. 从2
  6. 重复

    这个算法有效,但对我来说它看起来效率不高,因为障碍物只能是一个完整的瓦片,而不是瓦片的一部分(单元不会碰撞)。如果我增加步长,我开始错过仅略微交叉的瓷砖(即,您只穿过最左边的角)。即使步长为0.1,仍然可能会错过障碍物。

    我试图找到一个液取子图(与角部的所有区块(地板(start.X)/地板(start.Y))和(小区(start.X)/小区(start.Y) ),移动每个瓷砖,并检查它是否越过。遗憾的是,我似乎缺乏这项检查所需的数学知识。

    我的最后一个想法是将一个瓷砖的所有4个边框作为一条线并进行直线交叉,但这似乎比我原来的方法慢。

    任何提示?

    感谢。

1 个答案:

答案 0 :(得分:5)

不是通过沿着线踩踏来追踪路径 - 而是想要直接跳到下一个可能的图块(边框)。这可以相当简单地计算。我将使用上面的示例数字。

  1. 计算线eqn(y = .286x + 2.471)
  2. 你从2,3号铺开始,向瓦片5,4移动。因此,当x变为3时(右边的瓷砖边框),计算y值。它是3.329。
  3. 然后在y变为4(紧邻上方的图块的边框)时计算x值。这是5.346。
  4. 从2,3开始向右移动到3,3.329。向上移动到5.346,4。你在右边相交(在x上移动2 - > 3不会在y上移动一个平铺)。在x。中的tile 5之前,您不会在上面交叉。
  5. 以4计算的图块将成为您的新比较(3,3)。从第2步开始重复。
  6. 这个过程只会导致每个瓷砖移动一次计算(无论您的精度或瓷砖有多大),都是精确的。请注意,计算的值可以存储和重复使用,而不是一遍又一遍地盲目计算两个交叉点。在上面我们知道(步骤4)我们在x = 5之前不会向上移动。因此,可以在不进行另一次计算的情况下推断出整个路径(2,3-> 3,3-> 4,3-> 5,3-> 5,4)。

    也可以预先计算所有过渡而不是逐步进行过程,尽管只有在你总是需要整个路径时才会这样做(你不会因为想要在找到障碍物时停止处理)。

    两个警告。注意标志以及生产线的走向 - 通过不密切关注负斜率会发生很多错误。另外,使用实数你几乎不会对角交叉(两个边框一次),但你应该知道它(在代码中处理它)以防万一。

    这个方法有一个名字,但我不记得它在我的头顶。我相信它可能来自Game Programming Gems系列,但也许其他人可以提供更好的参考。