如何确定2D中的可见性

时间:2010-03-28 03:44:05

标签: algorithm 2d visibility

我正在开发一个AI沙箱,我想计算每个生物实体可以看到的东西。

规则是从实体的角度简单地隐藏形状边缘后面的内容。图像澄清了一切:

alt text http://img231.imageshack.us/img231/2972/shadows.png

我需要它作为人工智能的输入,或者以图形方式显示,以便在特定实体移动时显示它。

有什么好主意吗?

3 个答案:

答案 0 :(得分:5)

这不是最快的算法,但它产生的多边形可能对AI的进一步分析有用:

  1. 对于每个线段,计算实体与两个端点之间的角度。
  2. 按角度对点进行排序。
  3. 360°左右“扫描”,跟踪哪些线段与扫描线相交。当您跨越分段起点时,将该分段添加到集合中;当您越过分段结束点时,从集合中删除该分段。
  4. 最近的线段形成可见的多边形。多边形是三角形条子的结合。
  5. 我意识到这个解释并不是很好,但我可以使用an online demo here来了解它是如何工作的。将它扩展到与圆圈一起工作可能并不算太糟糕(着名的遗言)。

    2d visibility demo

答案 1 :(得分:4)

如果你使用简单的形状来阻止实体的视图,那么有一种简单的方法可以实现这一点:

创建一个VisionWave对象,可以水平或垂直移动。您可以使用源坐标定义VisionWave,与该点相交的两条线以及距离源点的距离。

你应该有4个波:一个向上,一个向下,一个向左,一个向右,并且定义它们的线应该具有1和-1的斜率(即,X)。下面的粗略图表显示了一个波形(向右),由>字符表示。

  \     /
   \   />
    \ / >
     @  >
    / \ >
   /   \>
  /     \

创建一个循环,每次传播一个像素。传播wave时,您需要执行以下操作:

  1. 将波形触摸的每个像素标记为可见。
  2. 如果波触摸的任何像素阻挡光线,那么您希望将波形分成两部分,并递归地传播每一个。
  3. 我在我的Roguelike中实现了这样的系统,它非常快。确保您的代码存在瓶颈问题。

    如果你非常聪明,你可能会尝试使用圆形波而不是直线,但我不知道由于三角计算它是否会更快。

答案 2 :(得分:1)

确定哪些顶点对您的眼点可见,然后将这些顶点从直线上的眼点投射回来以创建新顶点。关闭形状,您将创建一个表示不可见区域的多边形。

请参阅shadow volumes了解3D效果。