【问题标题】:How to efficiently draw a polygon with multiple holes?如何有效地绘制具有多个孔的多边形?
【发布时间】:2017-08-22 17:53:51
【问题描述】:

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

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 空间中绘制数百个(可能是部分透明的)多边形,并且我希望能够“看穿”这些孔。因此,具有“白色覆盖”多边形的解决方案不是我想要的。

【问题讨论】:

    标签: matlab plot octave polygons


    【解决方案1】:

    处理此问题的最佳方法可能是将多边形分解为 Delaunay triangulationconstrained 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');
    

    结果图:

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

    【讨论】:

    • 谢谢。我担心我不得不拆分多边形,似乎我的恐惧是有道理的。哦,更有趣的是,这是为了修复 R2010a 中没有 delaunayTriangulation 类的一些遗留代码;你知道在旧的 MATLAB 中是否有等价物?
    • @RodyOldenhuis:看看this older question,它有一个先前版本的约束德劳内三角剖分示例。它非常相似,但是从三角剖分构建人脸/顶点数据的方式可能会有所不同。
    猜你喜欢
    • 2023-03-30
    • 2017-10-23
    • 2019-07-26
    • 2016-01-19
    • 2016-10-06
    • 2017-12-19
    • 2012-10-04
    • 1970-01-01
    • 2018-04-17
    相关资源
    最近更新 更多