如何解决光线从单个光源跟踪整个2D网格
在边界已知的2D网格世界中,有:-
- 光源(蓝色
org
) - 墙壁(灰色)
如何有效地从网格中每个白色块的 center 到org
的 center 进行光线跟踪?
对于每个块,我想要一个布尔值-是否点亮。
换句话说,我想确定org
是否可以直接看到每个块(对于整个世界)。
我的解决方案不佳
使用标准光线跟踪将每个白色块都向org
跟踪,但是其性能非常差。我觉得很多计算都是多余的。
相关:https://en.wikipedia.org/wiki/Any-angle_path_planning:该算法仍适用于一个白色方块-并非整个世界。
解决方法
您可以使用Bresenham's line algorithm或Xiaolin Wu's line algorithm之类的Line算法来查找路径中的像素。
- 从要计算其是否点亮的像素开始。
- 沿光的方向遍历像素。
- 如果您先打灯,那么它会亮起。
- 如果您碰到了一个被阻塞的像素,那么它就暗了。
同样可以用于多个灯光。这将非常有效,因为您只需为每个像素计算一行。
,首先创建一个std::map
,其中包含成对的double
。这将保留显示 org 的角度范围。最初使用[0,2*PI]
然后,按照距 org 的距离顺序处理正方形。对于每个正方形:
- 使用
lower_bound
查找包含 org 到块中心(如果有)的角度的范围。如果角度在范围之一内,则该块可见。 - 如果该块是灰色的,则删除,分割和/或调整附近的范围以删除将块隐藏在其后面的角度。
这将在O(N log N)的时间内工作,这还不错。一旦您对它的工作方式感到满意,就可以进行很多优化。最重要的是,如果您按预定义的顺序处理正方形,以便可以按顺序访问范围集,则可以使用矢量代替地图,因为您不必搜索。这样可以使运行时间降至O(N)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。