【问题标题】:Optimize field of vision algorithm in a grid tiled map优化网格平铺地图中的视野算法
【发布时间】:2016-07-07 17:20:24
【问题描述】:

我正在尝试在我的游戏中实现视野算法,我在这里遵循了很棒的教程:sight-and-light,这是我到目前为止得到的:

你可以看到它对我来说很好:)

然后我尝试在平铺地图中使用此算法。它也可以正常工作,但有点慢,所以我现在正在尝试找到一种优化算法的方法。

一些信息可能有助于优化:

  • 平铺地图是正交的
  • 所有图块的大小都是相同的 32 * 32 并且是正方形
  • 标记为 0 的瓷砖表示空,标记为 1 表示障碍
  • 我已将连接组件标记算法用于预处理:
    • 所有障碍物已合并到多个区域中
    • 我知道每个区域的所有顶点位置

类似这样的:

假设我有 9 个连接区域(9 个多边形)和总共 40 个顶点。

根据上面链接中的算法,会有:

  • 光线投射:40 * 3(每个顶点角度 3 次光线投射 +- 0.00001)
  • 边数:40
  • edge * ray-cast 相交测试:40 * 40 * 3 == 4800

我认为应该有一种方法来减少我需要在上述情况下进行交集计算的光线投射计数和边缘计数,但只是想不出一个好的解决方案。

任何建议将不胜感激,谢谢:)

【问题讨论】:

    标签: javascript algorithm grid tiles


    【解决方案1】:

    您正在做的事情可以得到很大的优化。 首先,使用所有顶点没有意义,也不需要进行任何相交测试。

    获取每个多边形。对于每个顶点,确定它是否是一个反转点。那就是从原点/眼睛获取光线并检查邻居是否在同一侧。找出朝向原点的方向并跟随它,直到找到另一个反转点。这些点之间的部分是面向原点/眼睛的部分。如果你有一个凸形,那么只有 2 个,对于更复杂的可以有更多。

    接下来将所有反演点转换为极坐标并按角度排序。现在你应该有一堆可能重叠的间隔(注意扭曲 360->0)。如果您的场景很简单,则间隔是不重叠的,因此您只需要使用灯光跟随多边形(无需测试)。如果您遇到重叠,请从现有区间中获取反转点和当前边缘,并查看反转点是否与原点/眼在同一侧。如果是这样,那么您可以将光线与当前边相交到反转点以获得远点并将其与现在将替换为当前边的反转点链接。如果存在不属于任何多边形的区间,则光线将趋于无穷大(该多边形中的所有光线都看不到任何东西)。

    这适用于所有不重叠的多边形。

    因此,在您的情况下,您将仅获得 9*2 反转点(您的多边形很简单),并且您需要做很少的边缘 * 射线相交,因为它们的布局相当稀疏,并且算法可以快速丢弃明显的非相交案例。

    如果这是针对某些实时应用程序,您可以利用反转点大部分保持不变的事实来进一步优化它,如果它们发生变化,它们通常会沿着多边形移动一条边(如果多边形小,移动距离大)。

    【讨论】:

      猜你喜欢
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 2012-01-18
      相关资源
      最近更新 更多