如何计算四壁砖的视野?

我正在做一个基于2D平铺的游戏。 我试图计算视野,我已经实施了墙壁,所以他们不占用整个瓷砖。 相反,他们只是占用每块瓷砖的一面。 如同:

class Tile { bool northWall; bool westWall; } 

我一直在研究的大多数algorithm都希望墙壁占用一个完整的瓦片,而检查一个瓦片是否阻挡瓦片是微不足道的。 我有困难缠着这个。 我现在有recursion阴影投影的实现,但不知道如何编写我的is_blocked()函数。 任何人都可以给我一些建议吗?

Solutions Collecting From Web of "如何计算四壁砖的视野?"

鉴于你的墙不是细胞,你将需要一种方法来识别封堵器raymarch。 最简单的方法是,当你从一个单元格移动到下一个单元格时,检查是否有从墙A到墙B的边界上有墙,并存储结果以供使用。

让我们看看三种不同的方法来为你澄清这一点。

recursion阴影投射 ,您当前的algorithm。 你永远不会有“火柴梗”(无限薄)的墙壁。 为什么? 因为algorithm在单元格中迭代的顺序与光线在几何正确的光照模型中的方向不同 ,也就是说,它是基于八分圆的近似 。 recursion阴影投射是对这个问题的一个简化,通过打破这个“捷径”的一些基本要求,这个algorithm根本就行不通。 因此,尽管您可能首先放置单独的墙,但是在algorithm运行之前 ,这些边墙必须连接成环状。 否则,由于algorithm迭代的方向,它将完全错过一些墙。 本质上,这个问题是量化和分辨率的问题之一 – 墙壁从某个角度变为0维,因此不能被algorithm检测到。

2D DDA光线投射 。 这是德军总部和末日使用的,只是看起来更有趣。 在select角度分辨率后,使用DDA,沿着每个可能的path投射光线,例如。 如果你想每度光线一个,使用360光线。 如果您愿意,可以使用火柴梗墙,但是有一个警告:由于底层网格的分辨率限制,这种方法在光线方向上几何上是正确的,但是在距观察者相对较远的距离处可能会遗漏火柴梗墙,因为光线发散。

反投影 。 你永远不会失去火柴梗的墙壁,因为你不是评估基于网格的光照,而是评估那个空间的每个多边形的每个顶点(或者在你的火柴梗墙的边缘),并把它们反投影到光源。 但是请注意,如果你想正确地完成遮挡,这将需要你创建实际的多边形作为边缘列表,因为你需要将从每个顶点投射回来的光线与位于它们前面的可能的遮挡物相交(即他们和光源)。 这里最大的问题是任意的几何graphics会导致对照明区域进行高度复杂的评估,除非您仍然使用栅格作为顶点布局的指南。

我的建议? 如果您完全愿意接受使用单元格,则使用recursion阴影投射,因为这是一个依赖于此的快捷方式,而且易于实现和理解。 如果您可以接受距离光源一定距离的精度损失,请使用光线投射。 如果所有其他方法都失败了,并且需要尽可能高的准确度,则可以使用基于顶点的反投影。