我想在其中绘制一个有多个孔的多边形,如下所示:
P = [
0.5, 0.8;
1.0, 0.0; % outer boundary
0.0, 0.0;
0.5, 0.8;
%{
%}
0.5, 0.3;
0.3, 0.1; % inner boundary I
0.7, 0.1; % (hole)
0.5, 0.3;
%{
%}
0.5, 0.6;
0.3, 0.4; % inner boundary II
0.7, 0.4; % (hole)
0.5, 0.6;
];
figure, clf, hold on
patch(P(:,1),P(:,2), 'r', 'linestyle', 'none')
然而,patch
并不像我预期的那样完成。当我将最后一个洞更改为:
% ...
0.45, 0.6; % <- slightly offset in X-direction
0.3, 0.4;
0.7, 0.4;
0.45, 0.6; % <- slightly offset in X-direction
% ...
这种情况发生了:
这种技术适用于单个孔,但我是否也可以将相同的技术应用于多个孔?或者我是否必须将其拆分,如here所示?
注意:最终,我将在3D空间中绘制数百个(可能是部分透明的)多边形,我希望能够“透视”这些洞。因此,具有“白色叠加”多边形的解决方案不是我正在寻找的。
答案 0 :(得分:4)
处理此问题的最佳方法可能是将多边形分解为Delaunay triangulation constrained edges,仅提取约束边on the interior的三角形,然后创建一组用于patch
的面/顶点数据。给出您示例中的第二个矩阵P
,以下是如何执行此操作:
C = [1:3 5:7 9:11; 2:4 6:8 10:12].';
DT = delaunayTriangulation(P, C);
vertices = DT.Points;
faces = DT.ConnectivityList(isInterior(DT), :);
patch('Faces', faces, 'Vertices', vertices, 'FaceColor', 'r', 'EdgeColor', 'none');
由此产生的数字:
在创建“已检测到并删除重复数据点”的三角测量时,您会收到警告,这无需担心。您甚至可以将所有多边形和约束数据放在一组矩阵中,并进行一次三角测量,为多个多边形创建一组大的面/顶点数据。