如何有效地绘制具有多个孔的多边形?

Rod*_*uis 5 matlab plot octave polygons

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

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')
Run Code Online (Sandbox Code Playgroud)

两个洞,正如预期的那样

但是,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 
% ...
Run Code Online (Sandbox Code Playgroud)

有时候是这样的:

洞太多了!

这种技术可以很好地用于单个孔,但是我是否也可以对多个孔应用相同的技术?还是我不得不求助于拆分它,如图所示这里

注意:最终,我将在3D空间中绘制数百个(可能是部分透明的)多边形,我希望能够"透视"这些洞.因此,具有"白色叠加"多边形的解决方案不是我正在寻找的.

gno*_*ice 4

处理此问题的最佳方法可能是将多边形分解为具有约束边的Delaunay 三角剖分,仅提取约束边内部的三角形,然后从中创建一组面/顶点数据以用于。鉴于示例中的第二个矩阵,操作方法如下:patchP

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');
Run Code Online (Sandbox Code Playgroud)

结果图:

在此输入图像描述

创建三角测量时,您会收到一条警告“已检测到并删除了重复的数据点”,无需担心。您甚至可以将所有多边形和约束数据放在一组矩阵中​​,并进行一次三角测量,为多个多边形创建一大组面/顶点数据。

  • @RodyOldenhuis:看看[这个旧问题](/sf/ask/119036571/),其中有一个先前版本的约束 Delaunay 三角剖分的示例。它非常相似,但是从三角测量构建面/顶点数据的方式可能不同。 (2认同)