C++ 填充凸面形状的有效方法
假设我有一个封闭的形状,如下图所示,我有边缘像素。填充形状的最有效方法是什么,即在以下情况下打开形状内部的像素: 1) 我有所有的边缘像素 2) 我有大部分边缘像素,但不是全部(如图所示)C++ 填充凸面形状的有效方法,c++,graphics,opencv,visualization,computational-geometry,C++,Graphics,Opencv,Visualization,Computational Geometry,假设我有一个封闭的形状,如下图所示,我有边缘像素。填充形状的最有效方法是什么,即在以下情况下打开形状内部的像素: 1) 我有所有的边缘像素 2) 我有大部分边缘像素,但不是全部(如图所示) 在填充内部之前,需要确定准确的边界,在这种情况下,这将构成识别圆 在这之后,如果每个像素都在圆的周围,你就可以选中一个框。由于必须对圆内的每个像素进行处理,并且圆中的像素数与边界正方形的像素数成线性关系(假设边界正方形的边具有长度“半径*常数”作为某个常数),因此这应该接近最佳值。这一切取决于具体情况 如果手
在填充内部之前,需要确定准确的边界,在这种情况下,这将构成识别圆
在这之后,如果每个像素都在圆的周围,你就可以选中一个框。由于必须对圆内的每个像素进行处理,并且圆中的像素数与边界正方形的像素数成线性关系(假设边界正方形的边具有长度“半径*常数”作为某个常数),因此这应该接近最佳值。这一切取决于具体情况 如果手动创建帧缓冲区(基本上使用字节数组或类似的东西),则必须迭代所有要更改的像素。例如,从行的最左边开始:
- 在行上查找形状的开始
- 向右跳一步并启用“像素”,直到在行(或行的末尾)上找到形状的第二个端点
- 继续下一行
标准算法对凸面形状非常有效,可以处理形状不如预期凸面的情况。不幸的是,它需要一个完整的轮廓。构造凸包并添加缺少的像素。然后使用扫描线算法填充多边形。我喜欢“bug”的想法。您还可以围绕外部运行它,以提供超出间隙的第二个边界,然后使用另一种方法填充内部。