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算法,则可以使用抗锯齿来精确地播放。