我正在开发一个简单的地图应用程序以获得乐趣,我需要做的一件事就是找到(并着色)从当前位置可见的所有点。在这种情况下,点是像素。我的地图是光栅图像,其中透明像素是开放空间,而任何其他像素都是不透明的。 (没有半透明像素; alpha是0或100%。)在这个意义上,它有点像常规的泛光填充,其约束条件是每个填充的像素必须具有清晰的视线。起源点。下图显示了几个这样的区域(微小的十字线是原点,白色=透明):
此外,我最感兴趣的是“边界”其他颜色的点,即我想要构成可见区域边缘的点列表。
我当前和非常低效的解决方案是我上面描述的修改后的洪水填充。这种方法返回正确的结果,但是由于需要将一行上的每个像素迭代到泛洪填充中的每个像素的原点,因此它非常慢。我的图像缩小和量化,但我仍然需要大约1MP的可接受的精度,典型的LoS区域每个至少100,000像素。
我可能正在使用错误的搜索词,但我无法找到任何可以解决此(栅格化)LoS案例的算法的讨论。
答案 0 :(得分:2)
我怀疑如果你的“墙”被表示为方程而不是光栅图像中的简单像素,那么这可以更有效地完成。例如,多边形/三角形,圆形,椭圆形。
然后就像2D中的光线追踪(搜索这个术语)。换句话说,您可以将图像中每个像素的光线/线条视为感兴趣的点,并仅在像素不与任何对象相交时为其着色。
此方法确实要求您测试图像中每个像素与每个对象的交点;但是,如果你查看光线追踪,你会发现许多有效的方法来测试这些交叉点。它们主要用于3D情况,但将它们转换为2D应该很简单。
有三维光线追踪器在很大的图像上非常快,所以这应该是非常可行的。
答案 1 :(得分:0)
您可以尝试对每种颜色进行delaunay三角测量。我的意思是你可以尝试用DT找到每种颜色的形状。