Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.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
Matlab:查找顶点集的内边界_Matlab_Draw_Vertices - Fatal编程技术网

Matlab:查找顶点集的内边界

Matlab:查找顶点集的内边界,matlab,draw,vertices,Matlab,Draw,Vertices,我有一组(x,y)点,按以下方式定义: map=[0,0;66,0;66,44;44,44;44,66;110,66;110,110;0,110]; 然后有一个函数将这些点(即顶点,即角点)连接在一起以形成闭合形状。我给出的示例顶点形成如下形状: ________________________________________ | | |

我有一组(x,y)点,按以下方式定义:

    map=[0,0;66,0;66,44;44,44;44,66;110,66;110,110;0,110];
然后有一个函数将这些点(即顶点,即角点)连接在一起以形成闭合形状。我给出的示例顶点形成如下形状:

     ________________________________________
    |                                        |
    |                                        |
    |                                        |
    |                    ____________________|
    |                   |
    |                   |_______
    |                           |
    |                           |
    |                           |
    |                           |
    |___________________________|
现在我想自动生成第二组顶点,这些顶点在形状内部形成边界,偏移一定量。即:

    inner_boundary=[5,5;61,5;61,39;39,39;39,71;105,71;105,105;5,105];
     ________________________________________
    |   ___________________________________  |
    |  |                                   | |
    |  |              _____________________| |
    |  |             |   ____________________|
    |  |             |  |
    |  |             |  |_______
    |  |             |________  |
    |  |                      | |
    |  |                      | |
    |  |______________________| |
    |___________________________|
有什么办法吗?我一直在绞尽脑汁,但想不出一个强有力的方法来做到这一点。我需要它对任何输入顶点集自动执行此操作。另外,为了澄清,我只对如何指定顶点集感兴趣,而不是绘图部分


非常感谢

这是一个基于图像处理工具箱函数的解决方案。基本思路如下:

  • 使用“poly2mask”从多边形创建BW(0-1)图像 坐标
  • 使用“imerode”将遮罩腐蚀1像素
  • 使用“边界”追踪新的侵蚀边界
  • 代码示例:

    x = [4 10 10 4 4];
    y = [4 4 10 10 4];
    mask = poly2mask(x,y,12,12);
    mask_eroded = imerode(mask, 1);
    newBnds = bwboundaries(mask_eroded);
    newBnds = newBnds{1};
    

    请注意,新边界可能包含比您想要的更多的点,因为它跟踪边界上的每个像素。您可以编写一个简单的迭代例程来丢弃非端点

    请澄清在这种情况下会发生什么,即原始边界太细,无法将较小的边界放入内部。表示两个顶点之间的距离小于
    2*offset
    。并且:您有图像处理工具箱吗?如果边之间的距离太小,无法容纳内部边界,我想停止并抛出一个错误。我想我有图像处理工具箱,是的。但是,我不确定我希望在其上运行此功能的其他机器是否会这样做-因此,如果有其他方法可以避免使用它,那么这将是更可取的。给定点的顺时针/逆时针顺序,您可以使用我的答案。很好的解决方案。我只建议您创建一个结构元素来同时进行侵蚀,而不是使用循环。例如,要腐蚀5个像素,请使用
    r=5;se=strel('square',2*r+1);掩膜腐蚀=imerode(掩膜,se)。也感谢您的解决方案。如果其他能够使用图像处理工具箱的人看到了这一点,那么这看起来是一种简单的方法。因为我不确定我想让它工作的所有电脑都有工具箱,所以我会同意上面比克的建议。但是谢谢!