对角线视线与两个角落

现在我正在使用Bresenham的线路algorithm进行视线。 问题是我发现了一个边界情况,玩家可以通过墙壁看。 当玩家在特定的角度看另一侧的空隙的两个角落之间时发生。

视线边缘情况

我想要的结果是两个墙之间的瓷砖被标记为无效。

期望的结果

修改Bresenham的线algorithm来解决这个问题的最快方法是什么? 如果没有一个好的解决scheme,是否有更适合的algorithm? 任何想法都欢迎。 请注意解决scheme也应该能够支持3D。

编辑:我简单的解决scheme是检查一个线的x和y坐标改变时,两个角是否closures。 有关已完成产品的工作源代码和交互式演示,请参阅http://ashblue.github.io/javascript-pathfinding/

Eric Lippert编写了一个关于在C#中使用阴影投射在矩形平面网格上生成视线的优秀系列。

在其他问题中,Eric处理了必须回答的关于视线要求的各种问题,这些问题给出了不同的结果,并给出了几个不同结果的例子。 其中一篇文章深入地讨论了在他的algorithm的早期版本中出现的“环视”情况。

我已经在这里将Eric的algorithm调整为六角形网格,并且成功地将它用于具有广泛可见半径(> 60格)的大六边形网格(> 400 x 700)。 这个实现使用一个单独的i7 CPU来计算并显示完整的视野,就像我可以眨眼一样快。 这对我所期望的任何用途来说肯定足够快。

更新 – 高程视线:
与上面相关的六角网格实现计算了高程的视线,而不仅仅是障碍物。 文件说明还讨论了关于高程计算必须作出的额外决定:目标高度和观察者高度。 默认的select是使两者相等,这将创建对称的视野,但地面和地面的观察者眼睛可以被select。 (代码是MIT许可证下的开源代码)

如果为了计算LOS,你有一个单独的“更高分辨率”的网格,填补了角落的空白。 我在想这样的事情:

在这里输入图像描述

左边是4格的原始块部分。

正确的是“高分辨率”的版本,你可以看到每个原始的广场细分为四分之一,其中一个角落已经填补。我不确定副手的生成algorithm,但它可以预先计算从当前的地图。

这意味着坐标空间增加了四倍,但我不认为这是一个重大的性能问题。