【问题标题】:How to represent a polygon with hole(s)?如何用孔表示多边形?
【发布时间】:2010-11-06 00:02:52
【问题描述】:

在向量(2*1 或 1*2 矩阵)中使用顶点按 CW 或 CCW 排序的多边形通常很流行。但是,如何用向量中的孔来表示多边形?

我将在这些多边形上应用各种处理,所以我想要一种可以轻松或有效地工作的表示方式。(即如何在我的程序中声明那种多边形以简化我的算法? )

多边形是二维的,我在 MATLAB 中编程。

编辑 1:我将计算这些多边形的visibility graph(有孔或无孔)。

【问题讨论】:

    标签: matlab polygon


    【解决方案1】:

    一个多边形,加上一个多边形孔的列表。只要确保各个多边形不相交即可。

    你打算用这个东西做什么?

    【讨论】:

    • 我要计算这些多边形的可见性图(有孔或无孔)。
    • 如何表示“多边形孔列表”?我想要一种通用的、很好的方式来表示它们(尤其是在 MATLAB 中)。
    • 这像阴影吗?光线追踪?这很简单:你必须有一个函数来决定一条光线是否与一个简单的多边形(无孔)相交。然后,如果光线与多边形相交并且不与任何孔相交,则射线与带孔的多边形相交。
    • 如何表示?也许是向量的向量:第一个向量是多边形,其余的(如果有的话)是孔。
    【解决方案2】:

    听起来每个洞都只是多边形内部的一个多边形。也许您可以存储一个像您为外部多边形描述的向量,然后为孔存储一个包含更多多边形向量的向量。

    【讨论】:

      【解决方案3】:

      “可见性图”下的具体含义是什么?

      两个“完整”的 poligon,两种可能的状态,+1 或 -1。

      如果你代表一个洞,你有一个状态为 +1 和一个状态为 -1,代表一个洞,导致状态 0。
      如果你有重叠的多边形,你最终会得到 >1 的结果状态。然后你可以计算一个新多边形的边界。
      如果你有两个带有相交孔的多边形,那么首先计算一个由两个旧多边形的外边界组成的新多边形的状态,然后处理孔。

      无论如何,......我想你明白了一般原则。

      不知道如何在 matlab 中执行此操作,到目前为止我只使用了它一点点,甚至在非常简单的事情上也使用它。

      【讨论】:

        【解决方案4】:

        你可以把一个有洞的多边形分成两个没有洞的形状。当您在复杂平面中进行轮廓积分时,您可以从多边形的一个边缘创建一个“切口”,将您带到孔的边缘;围绕孔的一侧和背部整合;然后围绕另一侧遍历第二个多边形。您最终会得到沿每个切割的两个路径积分,它们相互抵消。

        “可见性图” - 这是用于带阴影的辐射视图系数计算吗?还是光线追踪图形算法?

        【讨论】:

          【解决方案5】:

          如果您希望它尽可能通用(即带有多边形孔的多边形,内部有多边形,内部有孔,......),大概您会想要一个树结构。 Matlab 并不擅长有效地表示树结构,但这里有一个想法......

          有一个多边形结构数组。

          每个多边形都是一个结构体,有两个字段,“corners”和“children”。

          “角”字段包含角的 (x,y) 坐标矩阵,以“data{polyIdx}.corners(:,cornerIdx)”的形式访问。

          'children' 字段是一个多边形结构数组。

          下面是一些代码的示例,用于制作带有孔洞的虚假子代的三角形(尽管它们并不真正有效,因为它们可能会重叠:

          polygon = struct;
          npoints = 3;
          polygon.corners = rand(2,npoints);
          polygon.children = struct;
          nchildren = 5;
          for c=1:nchildren
              polygon.children(c).corners = rand(2,npoints);
              polygon.children(c).children = struct;
          end
          

          您可以继续递归定义在创建孔和填充孔之间交替的子项。

          【讨论】:

          • 如果你知道你永远不会有反空洞,你仍然可以使用相同的数据结构,但也许你想将“孩子”重命名为“空洞”。
          • 如果您将同心面岛算作一个面,您将无法满足欧拉-庞加莱公式。我不知道这对任何应用程序是否重要,但这足以让我放弃复杂性,让孔中的岛屿成为单独的面孔。
          【解决方案6】:

          正如其他人所提到的,带孔的多边形可以表示为外部边界,加上零个或多个内部边界,所有这些都是相互不重叠的*。如果您使用非零winding number 来确定内部/外部,请务必将内部边界指定为与外部边界相反的方向(外部边界为逆时针方向,内部为顺时针方向,反之亦然),以使内部轮廓积分为零洞。

          仅供参考,这种定义/表示已在 OpenGIS 简单功能规范 (PDF) 中正式化。

          就表示而言:

          我可能有一个由 K Nx2 矩阵组成的元胞数组,其中元胞数组中的第一个元素是外部边界,而元胞数组中的其余元素(如果有)是内部边界。我会使用元胞数组,因为每个边界上的点数可能不同。

          *nonoverlapping = 个别点除外,例如正方形内的钻石:

          【讨论】:

            猜你喜欢
            • 2011-06-10
            • 1970-01-01
            • 2010-09-26
            • 2011-10-14
            • 1970-01-01
            • 2017-05-12
            • 2018-07-24
            • 1970-01-01
            相关资源
            最近更新 更多