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

时间:2017-08-22 17:53:51

标签: 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')

two holes, as expected

然而,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 
% ...

这种情况发生了:

too many holes!

这种技术适用于单个孔,但我是否也可以将相同的技术应用于多个孔?或者我是否必须将其拆分,如here所示?

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

1 个答案:

答案 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');

由此产生的数字:

enter image description here

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