Language agnostic 光线从单个光源跟踪整个二维栅格
在具有已知边界的二维栅格世界中,有:-Language agnostic 光线从单个光源跟踪整个二维栅格,language-agnostic,artificial-intelligence,path-finding,raytracing,Language Agnostic,Artificial Intelligence,Path Finding,Raytracing,在具有已知边界的二维栅格世界中,有:- 光源(蓝色org) 墙壁(灰色) 如何有效地从网格中每个白色块的中心向组织的中心进行光线跟踪? 对于每个块,我需要一个布尔值-无论它是否亮起 换句话说,我想确定org是否可以直接看到每个块(整个世界) 我糟糕的解决方案 使用标准光线跟踪将每个白色块跟踪到org,但其性能非常差。我觉得很多计算是多余的 相关:该算法仍然适用于一个白色块,而不是整个世界。您可以使用或之类的线条算法来查找路径中的像素 从要计算其是否点亮的像素开始 沿灯光方向遍历像素 如果你先按
org
)组织的中心进行光线跟踪?
对于每个块,我需要一个布尔值-无论它是否亮起
换句话说,我想确定org
是否可以直接看到每个块(整个世界)
我糟糕的解决方案
使用标准光线跟踪将每个白色块跟踪到org
,但其性能非常差。我觉得很多计算是多余的
相关:该算法仍然适用于一个白色块,而不是整个世界。您可以使用或之类的线条算法来查找路径中的像素
从要计算其是否点亮的像素开始
沿灯光方向遍历像素
如果你先按一下灯,它就会亮起来
如果你击中了一个被阻挡的像素,那么它是暗的
同样也可用于多个灯光。这将非常有效,因为每个像素只计算一行。您可以使用或之类的行算法来查找路径中的像素
从要计算其是否点亮的像素开始
沿灯光方向遍历像素
如果你先按一下灯,它就会亮起来
如果你击中了一个被阻挡的像素,那么它是暗的
同样也可用于多个灯光。这将是有效的,因为每个像素只计算一行。首先制作一个std::map
包含成对的double
s。这将保持组织可见的角度范围。首先用[0,2*PI]
然后,按照正方形与组织的距离顺序处理正方形。对于每个正方形:
使用lower_bound
查找包含从org到块中心的角度的范围(如果有)。如果角度在其中一个范围内,则块可见
如果块为灰色,则删除、分割和/或调整附近的范围,以删除隐藏块背后的角度
这将在O(N logn)时间内工作,这并不坏。一旦你对它的工作方式感到满意,你就可以做很多优化。最重要的是,如果您按照预定义的顺序处理正方形,以便按顺序访问范围集,那么您可以使用向量而不是贴图,因为您不必搜索。这将使运行时降到O(N)。首先制作一个std::map
,其中包含成对的double
s。这将保持组织可见的角度范围。首先用[0,2*PI]
然后,按照正方形与组织的距离顺序处理正方形。对于每个正方形:
使用lower_bound
查找包含从org到块中心的角度的范围(如果有)。如果角度在其中一个范围内,则块可见
如果块为灰色,则删除、分割和/或调整附近的范围,以删除隐藏块背后的角度
这将在O(N logn)时间内工作,这并不坏。一旦你对它的工作方式感到满意,你就可以做很多优化。最重要的是,如果您按照预定义的顺序处理正方形,以便按顺序访问范围集,那么您可以使用向量而不是贴图,因为您不必搜索。这将使运行时间降到O(N)。对我来说,这听起来合理且可用。只是想确认一下,你的方法的准确性是否比我的差解要低?准确性取决于你想如何计算。如果你使用的是吴的直线算法,那么你可以使用抗锯齿来精确播放。这听起来很合理,对我来说也很有用。只是想确认一下,你的方法的准确性是否比我的差解要低?准确性取决于你想如何计算。如果您使用的是Wu的line算法,则可以使用抗锯齿来精确地播放。