【发布时间】:2020-05-02 06:16:34
【问题描述】:
有一个二元网格(例如黑色和白色像素,黑色 = 空白,白色 = 障碍物)。 从黑色的给定点开始,我想向各个方向发射“射线”。这些光线应该在达到给定长度(例如 100)或击中白色像素时中止(在这种情况下,应标记该像素的位置,也就是障碍物轮廓)。 那些标记的像素导致从给定点“可见”的所有障碍物轮廓的视图(没有被其他障碍物阻挡)。
到目前为止,我的想法是简单地调用足够数量的 bresenham 行。在半径为 100 的情况下,这意味着 100*2*pi = 628 行来覆盖最外圈上的所有像素。 然而,这会导致对靠近中心的相同像素进行多次多次检查。现在我可以将支票分成多个环,每个环都有不同密度的 bresenham 线,但这似乎也相当低效。
有人碰巧对此有更有效的算法想法吗? 非常感谢提前!
【问题讨论】:
-
通常一个好的方法是只发射可以给你相关结果的光线:例如在一个有直墙的迷宫场景中,你只需要知道两个给定的角是否可见就可以确定是否整面墙都是可见的。也许这可以帮助你:ncase.me/sight-and-light
-
为了增加问题与本网站的相关性(这对我来说似乎并不明显),也许你可以添加一些数字和代码 sn-p 显示你的想法(即使是伪代码也会比没有代码好完全)。
-
@Liuka 有趣的工作,但不幸的是,这种优化不适用于我的情况,因为障碍像素可以有效地看起来好像是随机的。 @kebs 好主意,我会做点什么。
-
如果您正在寻找更“像素完美的方法”,有这样的东西:github.com/mattdesl/lwjgl-basics/wiki/2D-Pixel-Perfect-Shadows,但是,如果我没记错的话,需要移动到 GPU 着色器才能获得良好的性能结果,您获得的只是图像而不是“逻辑数据”。这种方法虽然很酷,但可能满足您的需求就足够了
-
基本上,您将相机周围的空间(网格)转换为极坐标(我认为,但请看文章),然后您只需从下到上滑动每个像素列,看看哪个是最前面的像素。这样,您只检查每个像素一次。即使您需要应用额外的转换,肯定不会产生像素完美的图像(但可能是实现部分可见性的一种很酷的方法),我认为您正在减少检查的总数