【发布时间】:2010-11-06 00:02:52
【问题描述】:
在向量(2*1 或 1*2 矩阵)中使用顶点按 CW 或 CCW 排序的多边形通常很流行。但是,如何用向量中的孔来表示多边形?
我将在这些多边形上应用各种处理,所以我想要一种可以轻松或有效地工作的表示方式。(即如何在我的程序中声明那种多边形以简化我的算法? )
多边形是二维的,我在 MATLAB 中编程。
编辑 1:我将计算这些多边形的visibility graph(有孔或无孔)。
【问题讨论】:
在向量(2*1 或 1*2 矩阵)中使用顶点按 CW 或 CCW 排序的多边形通常很流行。但是,如何用向量中的孔来表示多边形?
我将在这些多边形上应用各种处理,所以我想要一种可以轻松或有效地工作的表示方式。(即如何在我的程序中声明那种多边形以简化我的算法? )
多边形是二维的,我在 MATLAB 中编程。
编辑 1:我将计算这些多边形的visibility graph(有孔或无孔)。
【问题讨论】:
一个多边形,加上一个多边形孔的列表。只要确保各个多边形不相交即可。
你打算用这个东西做什么?
【讨论】:
听起来每个洞都只是多边形内部的一个多边形。也许您可以存储一个像您为外部多边形描述的向量,然后为孔存储一个包含更多多边形向量的向量。
【讨论】:
“可见性图”下的具体含义是什么?
两个“完整”的 poligon,两种可能的状态,+1 或 -1。
如果你代表一个洞,你有一个状态为 +1 和一个状态为 -1,代表一个洞,导致状态 0。
如果你有重叠的多边形,你最终会得到 >1 的结果状态。然后你可以计算一个新多边形的边界。
如果你有两个带有相交孔的多边形,那么首先计算一个由两个旧多边形的外边界组成的新多边形的状态,然后处理孔。
无论如何,......我想你明白了一般原则。
不知道如何在 matlab 中执行此操作,到目前为止我只使用了它一点点,甚至在非常简单的事情上也使用它。
【讨论】:
你可以把一个有洞的多边形分成两个没有洞的形状。当您在复杂平面中进行轮廓积分时,您可以从多边形的一个边缘创建一个“切口”,将您带到孔的边缘;围绕孔的一侧和背部整合;然后围绕另一侧遍历第二个多边形。您最终会得到沿每个切割的两个路径积分,它们相互抵消。
“可见性图” - 这是用于带阴影的辐射视图系数计算吗?还是光线追踪图形算法?
【讨论】:
如果您希望它尽可能通用(即带有多边形孔的多边形,内部有多边形,内部有孔,......),大概您会想要一个树结构。 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
您可以继续递归定义在创建孔和填充孔之间交替的子项。
【讨论】:
正如其他人所提到的,带孔的多边形可以表示为外部边界,加上零个或多个内部边界,所有这些都是相互不重叠的*。如果您使用非零winding number 来确定内部/外部,请务必将内部边界指定为与外部边界相反的方向(外部边界为逆时针方向,内部为顺时针方向,反之亦然),以使内部轮廓积分为零洞。
仅供参考,这种定义/表示已在 OpenGIS 简单功能规范 (PDF) 中正式化。
就表示而言:
我可能有一个由 K Nx2 矩阵组成的元胞数组,其中元胞数组中的第一个元素是外部边界,而元胞数组中的其余元素(如果有)是内部边界。我会使用元胞数组,因为每个边界上的点数可能不同。
*nonoverlapping = 个别点除外,例如正方形内的钻石:
【讨论】: