Simplify or subsample a polyline using the Ramer-Douglas-Peucker algorithm, a.k.a. the iterative end-point fit algorithm or the split-and-merge algorithm.
The pline as a N-by-2 matrix. Rows correspond to the
verices (compatible with polygons2d
). The vector idx constains
the indexes on vetices in pline that generates pline2, i.e.
pline2 = pline(idx,:)
.
Parameters
Maximum number of vertices. Default value 1e3
.
Tolerance for the error criteria. Default value 1e-4
.
Maximum number of iterations. Default value 10
.
Not implemented.
Run demo simplifyPolyline_geometry
to see an example.
See also: curve2polyline, curveval, simplifyPolygon_geometry.
The following code
t = linspace(0,1,100).'; y = polyval([1 -1.5 0.5 0],t); pline = [t y]; figure(1) clf plot (t,y,'-r;Original;','linewidth',2); hold on tol = [8 2 1 0.5]*1e-2; colors = jet(4); for i=1:4 pline_ = simplifyPolyline_geometry(pline,'tol',tol(i)); msg = sprintf('-;%g;',tol(i)); h = plot (pline_(:,1),pline_(:,2),msg); set(h,'color',colors(i,:),'linewidth',2,'markersize',4); end hold off # --------------------------------------------------------- # Four approximations of the initial polyline with decreasing tolerances.
Produces the following figure
Figure 1 |
---|
The following code
P = [0 0; 3 1; 3 4; 1 3; 2 2; 1 1]; func = @(x,y) linspace(x,y,5); P2(:,1) = cell2mat( ... arrayfun (func, P(1:end-1,1),P(2:end,1), ... 'uniformoutput',false))'(:); P2(:,2) = cell2mat( ... arrayfun (func, P(1:end-1,2),P(2:end,2), ... 'uniformoutput',false))'(:); P2s = simplifyPolyline_geometry (P2); plot(P(:,1),P(:,2),'s',P2(:,1),P2(:,2),'o',P2s(:,1),P2s(:,2),'-ok'); # --------------------------------------------------------- # Simplification of a polyline in the plane.
Produces the following figure
Figure 1 |
---|
Package: geometry