How can we increase/decrease the number of triangles in a triangulation that is created from a polyshape object?

I wrote the following code:
C1 = polyshape(X1,Y1);
C2 = polyshape(X2,Y2);
C = subtract(C1,C2);
T = triangulate(C);
where X1, X2, Y1 & Y2 are column vectors of x- & y-coordinates of points that define the outer and inner boundaries of a region. The last command breaks the region C into triangles. My question is: How can we increase or decrease the numbr of triangles in the triangualtion or is it fixed?

回答 (3 件)

Matt J
Matt J 2023 年 5 月 20 日
編集済み: Matt J 2023 年 5 月 20 日
To increase the number of triangles, you would have to add vertices along the edges, like in the following:
p1= polyshape([0,0; 1 0; 0 1]);
p2=polyshape([0,0,; 1 0; 0.5,0.5,;0,1],'Simplify',0);
doPlot(p1)
doPlot(p2)
function doPlot(p)
figure
plot(p,'FaceColor','g'); hold on
triplot(triangulation(p),'r'); hold off
axis equal
end

4 件のコメント

Thank you Matt for your answer. Actually I already tried increasing the vertices but it didn't work. The polyshape function automatically deleted vertices that lie on a straight line except the two extreme ones. But I'm using ver2018. Maybe in the latest version this may not be the case.
Matt J
Matt J 2023 年 5 月 22 日
I don't think it's any different in 2018. You need to set 'Simplify'='off' like in my posted code.
Add a very tiny bit of noise to the coordinates so they're no longer on a perfectly straight line.
Thank you Matt & Image Analyst for your valuable inputs. Yes, when I use 'Simplify',0) in the polyshape command it starts working. So I get the two figures shown below. The traingles span the whole width of the hexagonal ring. Any idea how to have smaller triangles?

サインインしてコメントする。

Image Analyst
Image Analyst 2023 年 5 月 20 日
To decrease the number of vertex points that describe a polygon while still somewhat resembling the original shape, see the algorithm in the attached paper.
Matt J
Matt J 2023 年 5 月 22 日
編集済み: Matt J 2023 年 5 月 22 日
Another way:
p1=nsidedpoly(6);
p2=p1.scale(0.5);
P=subtract(p1,p2);
P=subTri(P);
for i=1:3
P=splitTri(P);
end
plot(P); axis equal
function p=subTri(P)
%Sub-divide a scalar polyshape P into a vector of triangular sub-polyshapes
T=triangulation(P);
V=T.Points;
for i=height(T):-1:1
p(i)=polyshape(V(T(i,:),:));
end
p=p(:)';
end
function pnew=splitTri(p)
%Given a vector of triangular polyshapes, p, split each p(i) into smaller
%triangular polyshapes.
if isscalar(p)
V=interp1( p.Vertices([1,2,3,1],:) , 1:0.5:3.5);
pnew=subTri(polyshape(V,'Simplify',0));
else
C=arrayfun(@splitTri,p,'uni',0);
pnew=[C{:}];
end
end

カテゴリ

ヘルプ センター および File ExchangeElementary Polygons についてさらに検索

質問済み:

2023 年 5 月 20 日

編集済み:

2023 年 5 月 22 日

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by