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

3 views (last 30 days)
Saad Mansoor on 20 May 2023
Edited: Matt J on 22 May 2023
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?

Matt J on 20 May 2023
Edited: Matt J on 20 May 2023
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
Saad Mansoor on 22 May 2023
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 on 20 May 2023
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 on 22 May 2023
Edited: Matt J on 22 May 2023
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