主要内容

intersect

polyshape 对象的交集或线段与 polyshape 的交集

说明

polyout = intersect(poly1,poly2) 返回一个 polyshape 对象,它的区域是两个 polyshape 对象的几何交集。交集包含 poly1poly2 的重叠区域。poly1poly2 必须具有兼容的数组大小。

示例

polyout = intersect(polyvec) 返回一个 polyshape 对象,它的区域是向量 polyvec 中所有 polyshape 对象的交集。交集包含 polyvec 中所有 polyshape 对象的重叠区域。

示例

[polyout,shapeID,vertexID] = intersect(poly1,poly2) 还会返回从 polyout 中的顶点到 poly1poly2 中的顶点的顶点映射信息。仅当 poly1poly2 是标量 polyshape 对象时,intersect 函数才支持此语法。

shapeID 元素标识 polyout 中对应的顶点是源于 poly1poly2,还是因相交而产生的。vertexIDpolyout 的顶点映射到 poly1poly2 或交集的顶点。

示例

[polyout,shapeID,vertexID] = intersect(polyvec) 返回从 polyoutpolyshape 对象向量 polyvec 的每个元素的顶点映射信息。

示例

[in,out] = intersect(poly1,lineseg) 返回 lineseg 位于 poly1 内部和外部的线段。矩阵 lineseg 包含两列。第一列定义线段的 x 坐标,第二列定义对应的 y 坐标。

仅当 poly1 是标量 polyshapelineseg 不包含自相交时,intersect 才支持此语法。

示例

___ = intersect(___,Name=Value) 支持上述语法中的任何输入参量组合,且可使用一个或多个名称-值参量指定选项。您可以使用上述语法中的任何输出参量组合。例如,polyout = intersect(poly1,poly2,Simplify=false) 返回一个 polyshape 对象,该对象的顶点未经修改,不管是有交集还是有不正确的嵌套。

示例

全部折叠

创建并绘制两个多边形。

poly1 = polyshape([0 0 1 1],[1 0 0 1]);
poly2 = polyshape([0.75 1.25 1.25 0.75],[0.25 0.25 0.75 0.75]);
plot(poly1)
hold on
plot(poly2)

Figure contains an axes object. The axes object contains 2 objects of type polygon.

figure

计算并绘制 poly1poly2 的交集。

polyout = intersect(poly1,poly2)
polyout = 
  polyshape with properties:

      Vertices: [4×2 double]
    NumRegions: 1
      NumHoles: 0

plot(polyout)
xlim([-0.2 1.4]);
ylim([-0.2 1.2]);

Figure contains an axes object. The axes object contains an object of type polygon.

创建包含两个多边形的向量。

polyarray1 = polyshape([0 0 1 1],[1 0 0 1]);
polyarray2 = polyshape([0.75 1.25 1.25 0.75],[0.25 0.25 0.75 0.75]);
polyvec = [polyarray1 polyarray2]
polyvec = 
  1×2 polyshape array with properties:

    Vertices
    NumRegions
    NumHoles

plot(polyvec(1))
hold on
plot(polyvec(2))

Figure contains an axes object. The axes object contains 2 objects of type polygon.

figure

计算 poly1 的元素的交集。

polyout = intersect(polyvec)
polyout = 
  polyshape with properties:

      Vertices: [4×2 double]
    NumRegions: 1
      NumHoles: 0

plot(polyout)
xlim([-0.2 1.4]);
ylim([-0.2 1.2]);

Figure contains an axes object. The axes object contains an object of type polygon.

创建两个多边形并计算其交集。调用 intersect 函数时,指定三个输出参量以返回顶点映射信息。

poly1 = polyshape([0 0 1 1],[1 0 0 1]);
poly2 = polyshape([0.75 1.25 1.25 0.75],[0.25 0.25 0.75 0.75]);
[polyout,shapeID,vertexID] = intersect(poly1,poly2);

显示交集的顶点坐标和对应的顶点映射信息。

Vertices = polyout.Vertices;
table(Vertices,shapeID,vertexID)
ans=4×3 table
      Vertices      shapeID    vertexID
    ____________    _______    ________

    0.75    0.25       2          1    
    0.75    0.75       2          2    
       1    0.75       0          0    
       1    0.25       0          0    

shapeID 中的前两个值为 2,指示交集的对应顶点源于 poly2vertexID 中的对应值为 1 和 2,指示这些顶点是属性 poly2.Vertices 中的第一个和第二个顶点。polyout 的后两个顶点是因相交而产生的,因为 shapeIDvertexID 中的对应值为 0。

创建一个矩形多边形和一个线段。

poly1 = polyshape([0 0 1 1],[1 0 0 1]);
lineseg = [0.5 0.5; 1.5 1.5];

计算多边形与线段的交集。绘制线段位于多边形内部和外部的部分。

[in,out] = intersect(poly1,lineseg);
plot(poly1)
hold on
plot(in(:,1),in(:,2),"b",out(:,1),out(:,2),"r")
legend("Polygon","Inside","Outside",Location="northwest")

Figure contains an axes object. The axes object contains 3 objects of type polygon, line. These objects represent Polygon, Inside, Outside.

创建并绘制三个多边形。第一个多边形表示中心带孔的正方形,另外两个多边形是不带孔的正方形。

poly1 = polyshape([0.25 0.25 0.75 0.75], ...
                  [0.75 0.25 0.25 0.75]);
poly2 = polyshape([0 0 1 1],[1 0 0 1]);
poly1 = subtract(poly2,poly1);
poly2 = scale(poly2,0.8);
poly3 = translate(poly2,[0.2 0.2]);

plot([poly1 poly2 poly3])
axis equal

Figure contains an axes object. The axes object contains 3 objects of type polygon.

计算并绘制其交集。

[polyout,shapeID,vertexID] = ...
    intersect([poly1 poly2 poly3]);
plot(polyout)
axis equal

Figure contains an axes object. The axes object contains an object of type polygon.

显示生成的 polyshape 对象的顶点坐标和相应的顶点映射信息。

Vertices = polyout.Vertices;
table(Vertices,shapeID,vertexID)
ans=9×3 table
      Vertices      shapeID    vertexID
    ____________    _______    ________

    0.25    0.75        1          6   
    0.25    0.25        1          7   
    0.75    0.25        1          8   
    0.75    0.75        1          9   
     NaN     NaN      NaN        NaN   
     0.8     0.8        2          2   
     0.8     0.2        0          0   
     0.2     0.2        3          4   
     0.2     0.8        0          0   

所得交集具有两个边界。在输出 polyshape 对象的 Vertices 属性中,两组边界坐标由一行 NaN 值分隔。shapeIDvertexID 中的对应值也是 NaN

输入参数

全部折叠

第一个输入 polyshape,指定为标量、向量、矩阵或多维数组。

数据类型: polyshape

第二个输入 polyshape,指定为标量、向量、矩阵或多维数组。

数据类型: polyshape

polyshape 向量。

数据类型: polyshape

线段坐标,指定为两列矩阵。第一列定义线段的 x 坐标,第二列定义 y 坐标。lineseg 必须至少有两行且不包含自相交。

数据类型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

名称-值参数

全部折叠

将可选参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但对各个参量对组的顺序没有要求。

示例: polyout = intersect(poly1,poly2,Simplify=false)

将共线点保留为顶点,指定为以下数值或逻辑值之一:

  • 1 (true) - 保留所有共线点作为顶点。

  • 0 (false) - 删除共线点,使输出 polyshape 包含定义边界所需的最少顶点。

如果未指定 KeepCollinearPoints 名称-值参量,则该函数将根据在创建输入 polyshape 对象期间使用的值对其赋值。

  • 如果每个输入 polyshape 在创建期间将共线点保留为顶点,则该函数将 KeepCollinearPoints 设置为 true

  • 如果每个输入 polyshape 在创建期间删除了共线点,则该函数将 KeepCollinearPoints 设置为 false

  • 如果输入 polyshape 对象的共线点被区别对待,则该函数将 KeepCollinearPoints 设置为 false

修改要简化输出的多边形顶点,指定为以下数值或逻辑值之一:

  • 1 (true) - 当输出顶点产生交集或不正确嵌套时,修改多边形顶点以生成明确定义的多边形。

  • 0 (false) - 生成可能包含相交边、不正确嵌套、重复点或退化点的多边形。使用未明确定义的多边形进行计算可能会产生不准确或意想不到的结果。

输出参量

全部折叠

生成的交集,以 polyshape 对象或 polyshape 对象数组形式返回。

  • 如果您指定两个 polyshape 输入参量,则它们必须具有兼容的大小。例如,如果两个 polyshape 输入向量具有不同的长度 MN,则它们必须有不同的方向(一个必须是行向量,一个必须是列向量)。polyout 则是 M×NN×M,具体取决于每个输入向量的方向。有关兼容的数组大小的详细信息,请参阅基本运算的兼容数组大小

  • 如果您指定一个输入参量 polyvec,则 polyout 是标量 polyshape 对象。

如果 polyoutVertices 属性包含 NaN 值,则该形状具有多个区域或孔,因此具有多个边界。NaN 值分隔每个边界的顶点集。

形状 ID,以列向量形式返回,其各个元素表示交集中对应顶点的来源。

  • shapeID 的长度等于输出 polyshapeVertices 属性中的行数。

  • shapeID 的元素取决于输入参量的数量:

    • 如果您指定两个输入参量 poly1poly2,则它们必须是标量 polyshape 对象。当顶点源于 poly1 时,shapeID 中对应元素的值为 1,当顶点源于 poly2 时,对应元素的值为 2。如果输出 polyshape 的顶点是因相交而产生的,则对应元素为 0。

    • 如果您指定一个输入参量 polyvecpolyshape 对象向量),则 shapeID 包含作为输出顶点来源的对应 polyvec 元素的索引。如果顶点是因相交而产生的,则对应元素的值为 0。

  • shapeID 中的 NaN 值指示 polyout 具有多个区域或孔,因此具有多个边界。NaN 值分隔每个边界的顶点集。

数据类型: double

顶点 ID,以列向量形式返回,其元素将输出 polyshape 中的顶点映射到来源的 polyshape 中的顶点。

  • vertexID 的元素包含输入 polyshapeVertices 属性中对应顶点的行号。如果输出 polyshape 的顶点是因相交而产生的,则对应元素为 0。

  • vertexID 的长度等于输出 polyshapeVertices 属性中的行数。

  • 如果您指定两个输入参量 poly1poly2,则 intersect 仅在它们是标量时才支持此输出参量。

  • vertexID 中的 NaN 值指示 polyout 具有多个区域或孔,因此具有多个边界。NaN 值分隔每个边界的顶点集。

数据类型: double

内部线段坐标,以两列矩阵形式返回。in 的第一列包含位于输入 polyshape 内部的线段的 x 坐标,第二列包含对应的 y 坐标。

数据类型: double

外部线段坐标,以两列矩阵形式返回。out 的第一列包含位于输入 polyshape 外部的线段的 x 坐标,第二列包含对应的 y 坐标。

数据类型: double

扩展功能

全部展开

基于线程的环境
使用 MATLAB® backgroundPool 在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool 加快代码运行速度。

版本历史记录

在 R2017b 中推出

全部展开

另请参阅

|