代码之家  ›  专栏  ›  技术社区  ›  Rody Oldenhuis

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

  •  5
  • Rody Oldenhuis  · 技术社区  · 7 年前

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

    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 回复  |  直到 7 年前
        1
  •  4
  •   gnovice    7 年前

    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