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空间中绘制数百个(可能是部分透明的)多边形,我希望能够"透视"这些洞.因此,具有"白色叠加"多边形的解决方案不是我正在寻找的.
处理此问题的最佳方法可能是将多边形分解为具有约束边的Delaunay 三角剖分,仅提取约束边内部的三角形,然后从中创建一组面/顶点数据以用于。鉴于示例中的第二个矩阵,操作方法如下: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');
Run Code Online (Sandbox Code Playgroud)
结果图:
创建三角测量时,您会收到一条警告“已检测到并删除了重复的数据点”,无需担心。您甚至可以将所有多边形和约束数据放在一组矩阵中,并进行一次三角测量,为多个多边形创建一大组面/顶点数据。