8

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

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

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

编辑 1:我将计算这些多边形的可见性图(有或没有孔)。

4

6 回答 6

6

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

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

至于代表性:

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

*非重叠 = 个别点除外,例如正方形内的菱形:

替代文字 替代文字

于 2009-06-29T17:12:04.087 回答
3

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

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

于 2009-06-26T00:19:03.450 回答
1

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

你打算怎么处理这件事?

于 2009-06-25T22:28:45.297 回答
1

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

于 2009-06-25T22:30:20.533 回答
1

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

有一个多边形的结构数组。

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

'corners' 字段包含角的 (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

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

于 2009-06-26T03:52:42.747 回答
0

您在“可见性图”下到底是什么意思?

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

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

无论如何,......我认为你得到了一般原则。

不知道如何在 matlab 中做到这一点,到目前为止我只使用了它,甚至对于非常简单的事情也是如此。

于 2009-06-25T22:42:40.963 回答