Algorithm 二维光栅图像视线算法

Algorithm 二维光栅图像视线算法,algorithm,math,2d,Algorithm,Math,2d,为了好玩,我正在开发一个简单的映射应用程序,我需要做的一件事是找到(和颜色)从当前位置可见的所有点。在这种情况下,点是像素。我的地图是一个光栅图像,其中透明像素是开放空间,而任何其他像素都是不透明的。(没有半透明像素;alpha为0或100%)从这个意义上讲,它有点像常规泛光填充,每个填充的像素必须有一条到原点的清晰视线。下图显示了两个彩色区域(微小的十字光标是原点,白色=透明): () 此外,我最终感兴趣的是“边框”其他颜色的点,也就是说,我想要组成可见区域边缘的点列表 我目前非常低效的解决方

为了好玩,我正在开发一个简单的映射应用程序,我需要做的一件事是找到(和颜色)从当前位置可见的所有点。在这种情况下,点是像素。我的地图是一个光栅图像,其中透明像素是开放空间,而任何其他像素都是不透明的。(没有半透明像素;alpha为0或100%)从这个意义上讲,它有点像常规泛光填充,每个填充的像素必须有一条到原点的清晰视线。下图显示了两个彩色区域(微小的十字光标是原点,白色=透明):

()

此外,我最终感兴趣的是“边框”其他颜色的点,也就是说,我想要组成可见区域边缘的点列表

我目前非常低效的解决方案是我上面描述的修改过的洪水填充。这种方法返回正确的结果,但是由于需要迭代一条线上的每个像素到泛光填充中每个像素的原点,因此速度非常慢。我的图像被缩小和量化,但我仍然需要大约1MP才能达到可接受的精度,典型的视距区域至少为100000像素


我很可能使用了错误的搜索词,但我还没有找到任何关于算法的讨论来解决这个(光栅化的)LoS问题。

我怀疑,如果你的“墙”被表示为方程式,而不是光栅图像中的简单像素,那么这可能会更有效。例如,多边形/三角形、圆、椭圆

然后,它将类似于2D中的光线跟踪(搜索该术语)。换句话说,你可以考虑从图像中的每个像素到感兴趣点的光线/线,并且只在不与任何物体相交的情况下对像素着色。 此方法确实需要您测试图像中每个像素与每个对象的交点;但是,如果您查找光线跟踪,您将发现许多用于测试这些交点的有效方法。它们主要用于3D情况,但将它们转换为2D应该很简单


有3D光线跟踪器在更大的图像上非常快速,因此这应该是非常可行的。

您可以尝试对每种颜色进行delaunay三角剖分。我的意思是你可以试着用DT找出每种颜色的形状。

谢谢你的建议!我熟悉光线跟踪技术,但不幸的是,我的输入数据都来自照片,我对照片进行过滤/量化以生成透明区域。与我提供的原始样本图像不同,真实的区域是不规则的形状——一般来说,我无法用少量多边形、椭圆或曲线来近似。还是有别的办法呢?@Luk232我明白了,你目前的算法是如何工作的?你用布雷森汉姆的吗?你是沿着图像的边缘/边界移动还是从每个像素处进行检查?@Luk232还有,你所说的“与其他颜色相邻的点”是什么意思?你是指视线的边界在所有感兴趣的点上的并集吗?因为只有大约8300个可能的不同的线斜率适合我的图像(多亏了整数像素坐标),但要绘制的视轴线超过一百万条,我预先计算了每条可能的线(坡度)的相对x/y偏移量,因此我不需要每次都计算该线。因此,我只需将当前位置添加到对应“坡度”中的每个元素,即可检查碰撞数组,直到我发现一些不透明的东西。为了回答你的第二个问题,如果你看示例图像,我说的红色区域的“边界”将是红色像素与白色或黑色像素相交的边缘。未显示,但这些边缘也可能是以前绘制的其他区域(LoS检测应该考虑到这些现存的区域不透明)。起源点(十字准线)背后的逻辑被选择是复杂的,超出了范围,但它基本上会导致为给定的图像选择大约12个原点。希望这是有意义的!谢谢,但我恐怕不明白。我理解DT算法,只是不理解它对我的问题的应用。你介意为你的想法提供更多细节吗?我的意思是你可以试着用DT找出每种颜色的形状。