C++ 填充凸面形状的有效方法

C++ 填充凸面形状的有效方法,c++,graphics,opencv,visualization,computational-geometry,C++,Graphics,Opencv,Visualization,Computational Geometry,假设我有一个封闭的形状,如下图所示,我有边缘像素。填充形状的最有效方法是什么,即在以下情况下打开形状内部的像素: 1) 我有所有的边缘像素 2) 我有大部分边缘像素,但不是全部(如图所示) 在填充内部之前,需要确定准确的边界,在这种情况下,这将构成识别圆 在这之后,如果每个像素都在圆的周围,你就可以选中一个框。由于必须对圆内的每个像素进行处理,并且圆中的像素数与边界正方形的像素数成线性关系(假设边界正方形的边具有长度“半径*常数”作为某个常数),因此这应该接近最佳值。这一切取决于具体情况 如果手

假设我有一个封闭的形状,如下图所示,我有边缘像素。填充形状的最有效方法是什么,即在以下情况下打开形状内部的像素:

1) 我有所有的边缘像素

2) 我有大部分边缘像素,但不是全部(如图所示)


在填充内部之前,需要确定准确的边界,在这种情况下,这将构成识别圆


在这之后,如果每个像素都在圆的周围,你就可以选中一个框。由于必须对圆内的每个像素进行处理,并且圆中的像素数与边界正方形的像素数成线性关系(假设边界正方形的边具有长度“半径*常数”作为某个常数),因此这应该接近最佳值。

这一切取决于具体情况

如果手动创建帧缓冲区(基本上使用字节数组或类似的东西),则必须迭代所有要更改的像素。例如,从行的最左边开始:

  • 在行上查找形状的开始
  • 向右跳一步并启用“像素”,直到在行(或行的末尾)上找到形状的第二个端点
  • 继续下一行
当然,这只有在拥有所有边缘像素时才有效。看一看,可以有所帮助

请说得更具体些。“填充形状的最有效方法”取决于许多底层渲染库,如果是光栅图形等

编辑 请注意,如果可以生成边缘像素,则该算法的速度要快得多,因此无需查找边缘的起点

  • 如果单词“inside”,边界的断裂会破坏其含义
  • 像人类视网膜这样的神经网络在进行这种处理时非常有效
  • 在计算机上,你需要花时间来定义“内部”的含义。差距有多大?边界有多窄
  • 模拟一个较大的圆形虫子在“内部”周围反弹-太大,无法穿过缝隙,但小于边界的最小曲率半径

  • 标准算法对凸面形状非常有效,可以处理形状不如预期凸面的情况。不幸的是,它需要一个完整的轮廓。

    构造凸包并添加缺少的像素。然后使用扫描线算法填充多边形。

    我喜欢“bug”的想法。您还可以围绕外部运行它,以提供超出间隙的第二个边界,然后使用另一种方法填充内部。