Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在矩阵(坐标系)中找到表示对象的边界_C++_Algorithm - Fatal编程技术网

C++ 如何在矩阵(坐标系)中找到表示对象的边界

C++ 如何在矩阵(坐标系)中找到表示对象的边界,c++,algorithm,C++,Algorithm,我在矩阵中有一个对象的示意图,简而言之,就是对象占用了哪些单元格(对象是一部分,标记为0的单元格未占用,标记为1的单元格被对象占用)。然后,我在list中用矩阵坐标列出了一个被占用的单元格列表 如何找到属于该对象的该对象的所有边界单元格?(例如,如果abs(x1-x2),相邻单元为(x1,y1)和(x2,y2) 首先,找到对象。可以使用 在(1)中找到的所有单元格都是候选单元格,遍历所有候选单元格并生成具有一个或多个值为0的相邻单元格的单元格。(或者如果其位于矩阵的边缘) 一种可能的优化方法是

我在矩阵中有一个对象的示意图,简而言之,就是对象占用了哪些单元格(对象是一部分,标记为0的单元格未占用,标记为1的单元格被对象占用)。然后,我在
list
中用矩阵坐标列出了一个被占用的单元格列表

如何找到属于该对象的该对象的所有边界单元格?(例如,如果abs(x1-x2),相邻单元为
(x1,y1)
(x2,y2)
  • 首先,找到对象。可以使用
  • 在(1)中找到的所有单元格都是候选单元格,遍历所有候选单元格并生成具有一个或多个值为0的相邻单元格的单元格。(或者如果其位于矩阵的边缘)


  • 一种可能的优化方法是只“探索”具有矩阵0/边的相邻单元的单元。

    使用边行走:定义一个2x2单元的窗口,然后从某个地方开始 在对象外部,例如在左上角。然后,移动 根据在窗口内看到的图案打开窗口:

    0 0
    0 0
    
    ->你仍然需要找到物体的边缘。移动两步到 右侧;如果击中右侧边缘,向下移动两步,全部 左边的方式(一种行扫描)

    ->向右走一步

    0 0
    1 1
    
    0 0
    1 0
    
    ->向右走一步

    0 0
    1 1
    
    0 0
    1 0
    
    ->退一步

    0 1
    0 1
    
    ->向前走一步

    0 1
    1 1
    
    ->向前走一步

    0 1
    1 1
    
    等等

    你沿着边缘顺时针移动。你遇到的任何一个都可以 被视为对象的边缘部分;尽管您可以将 上一个示例中的右下1不是边(即 定义问题)

    当你遇到你第一次击中的位置时,你就完成了 边缘

    请注意以下拐角处的情况,可能需要特殊处理 治疗(例如,记得曾经遇到过):


    如果一个像素的所有相邻像素均为1,则将其设置为0。剩余的1位于边界上:

    for (x = 1; x < width-1; ++x) {
      for (y = 1; y < height-1; ++y) {
        if (data(x+1,y) && data(x-1,y) && data(x,y+1) && data(x,y-1)) {
          data(x,y) = 0;
        }
      }
    }
    
    (x=1;x{ 对于(y=1;y<高度-1;++y){ if(数据(x+1,y)和数据(x-1,y)和数据(x,y+1)和数据(x,y-1)){ 数据(x,y)=0; } } }