使用多边形通常很受欢迎,它们的顶点在向量(2 * 1或1 * 2矩阵)中按CW或CCW排序。但是,如何在向量中描述带孔的多边形?
我将对这些多边形应用各种处理,所以我想要一种表示我可以轻松或有效地工作的方法。(即如何在我的程序中声明这种多边形以便简化我的算法? )
多边形是2D,我在MATLAB中编程。
编辑1:我将计算这些多边形的visibility graph(有或没有洞)。
答案 0 :(得分:6)
正如其他人所提到的,带孔的多边形可以表示为外部边界,加上零个或多个内部边界,所有这些都是相互不重叠的*。如果使用非零winding number来确定内部/外部,请确保在与外部边界相反的方向上指定内部边界(逆时针方向为外部,顺时针方向为内部,反之亦然),以便轮廓积分为在洞内零。
仅供参考,这种定义/表示已在OpenGIS简单特征规范(PDF)中形式化。
至于代表:
我可能有一个K Nx2矩阵的单元阵列,其中单元阵列中的第一个元素是外部边界,而单元格数组中的其余元素(如果有的话)是内部边界。我会使用一个单元格数组,因为每个边界上可能没有相同数量的点。
* nonoverlapping =除个别点外,例如广场内的钻石:
答案 1 :(得分:3)
您可以将带有孔的多边形分成两个没有孔的形状。当您在复杂平面中进行轮廓积分时,可以从多边形的一个边创建一个“切割”,将您带到孔的边缘;整合在孔的一侧并且背面;然后绕另一边遍历第二个多边形。你最终会在每个切口上有两个相互抵消的路径积分。
“可见性图” - 这是用于使用阴影的辐射视图因子计算吗?还是光线跟踪图形算法?
答案 2 :(得分:1)
多边形,加上多边形孔列表。请确保各种多边形不相交。
你打算用这件事做什么?
答案 3 :(得分:1)
听起来每个洞只是多边形内部的多边形。也许你可以存储一个像你描述的外部多边形的矢量,然后存储更多的多边形矢量的矢量。
答案 4 :(得分:1)
如果你想让它尽可能通用,你可能想要一个树形结构(即多边形孔的多边形,里面有多边形,里面有孔,......)。 Matlab并不是很有效地表示树结构,但这里有一个想法......
有一个多边形的结构数组。
每个多边形都是一个包含两个字段的结构,“角落”和“儿童”。
'corner'字段包含角的(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
您可以继续递归地定义在创建孔和填充孔之间交替的子项。
答案 5 :(得分:0)
在“可见性图表”下,您的具体含义是什么?
两个“完整”的poligons,两个状态可能,+ 1或-1。
如果你代表一个洞,你有一个状态为+1的状态,一个状态为-1,代表一个洞,导致状态为0。 如果你有重叠的多边形,你最终会得到结果状态> 1。然后,您可以计算新多边形的边界 如果你有两个带有相交孔的多边形,那么首先计算一个新多边形的状态,该多边形由两个旧边的外边框组成,然后处理空洞。
无论如何,......我认为你得到了一般原则。
不知道如何在matlab中做到这一点,到目前为止我只是略微使用它,甚至是非常简单的事情。