如何高效绘制多边形多孔?

How to efficiently draw a polygon with multiple holes?

我想绘制一个带有多个孔的多边形,如下所示:

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 中绘制数百个(可能部分透明的)多边形 space,并且我希望能够 "look through" 洞。因此,具有 "white overlay" 多边形的解决方案不是我要找的。

处理此问题的最佳方法可能是将多边形分解为 Delaunay triangulation with constrained edges, extract only the triangles that are on the interior of the constrained edges, then create a set of face/vertex data from that to use with 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');

结果图:

您在创建 "duplicate data points have been detected and removed" 的三角剖分时会收到警告,无需担心。您甚至可以将所有多边形和约束数据一起放入一组矩阵中​​,然后进行一次三角剖分,为多个多边形创建一大组 face/vertex 数据。