我们有一个长方形区域,有半透明的墙壁和一些光源。我们只考虑顶视图,所以这是一个二维问题。我们需要找到该区域每个点的近似光照(信号强度)。
我们需要使算法非常快。对我们来说,蛮力方法太慢了。您可以假设所有墙都衰减相同的数量,甚至可以接受恒定的衰减量。
该区域最多为1000x1000,光源不会超过100个。光源可以具有大约的范围。 50-100单位(它们不是无限的)。欢迎使用更快但近似的算法。
提前致谢!
我尝试的基本上是蛮力方法:将每个样本点与每个墙壁和光源进行比较,以确定其亮度。显然,它是O(n ^ 3)并且速度慢得令人无法接受。
到时候我没有任何特定的限制:但是在100毫秒或更快的时间内完成整个图像会很不错。请记住,我不需要速度的准确性。
答案 0 :(得分:3)
只是在黑暗中刺伤:你看过(GPU加速)光子映射吗?
答案 1 :(得分:0)
您可以通过线性降低质量(图像获得半直径并重新采样到相同大小)来平方地减少类似算法的运行时间(例如,跳过每第2个x和y)。
使用位图存储亮度,并在较小尺寸的位图(除以近似因子)上渲染所有点线atc(但也将所有点除以近似因子)然后使用高斯模糊并重新采样回所需大小。然后从像素中提取亮度。
我在youtube上上传了一个视频,显示了测试的运行情况,如果可行,我会尝试编写代码。它似乎与您的需求相似(在单个线程上以“几乎实时”的方式执行):
当然这里的墙是具有透明属性的线条,光线不会像你期望的那样漫射而是线性地散射,但是“近似”应该可以被算法使用,或者你可以在速度足够的情况下调整这个。并且要注意代码编写得非常糟糕,因为我只是在尝试。
这里的光度是标准化的,您可能会将对数刻度中的光度嵌入到像素中,因此您可以适应更大的范围,以保留原始值。
你可以用它做什么: 这是项目:
如果你对它进行优化和加工,对于1000x1000图像可能需要100ms,其中100个灯的直径为300,像20个长度为200的墙,可以达到5的近似值。