evenlySampleCurve
Below is a basic demonstration of the features of the evenlySampleCurve function.
Contents
clear; close all; clc;
Syntax
[Vg] = evenlySampleCurve(V,n,interpPar,closeLoopOpt,spacingFlag);
Description
The evenlySampleCurve function samples a curve evenly in n points. The curve is parameterized using curve distance and can be closed loop if closeLoopOpt==1 (default=0). The resampling is performed using interpolation based on the method specified by interpPar. Available methods are those associated with interp1 i.e.: 'linear', 'nearest', 'next', 'previous', 'spline', 'pchip' (default), 'cubic', and also the custom 'biharmonic' method. Alternatively interpPar my be set as a scalar in the range 0-1 to use the csaps method for cubic spline based smoothening. The 5th input is spacingFlag and defines wether n should be interpretet as number of desired points (0) or as a desired point spacing (1).
The default values for the optional parameters are: n -> size(V,1) interpPar -> 'pchip' closeLoopOpt -> 0 spacingFlag -> 0
See also: interp1, csaps, biharmonicSplineInterpolation
Examples
Plot settings
markerSize1=25; lineWidth=2;
EXAMPLE 1: Evenly sampling a curve
%Simulating the case of an unevenly sampled curve
ns=11;
x=linspace(0,2*pi,ns);
y=4*sin(x);
V=[x(:) y(:)];
Resampling a curve evenly (point spacing based on number of points)
Below the original and resampled curves are shown. Note that the original curve is sampled evenly allong the x-axis but is not evenly sampled allong the curve (point spacing not even) For instance the spacing is smallest in flat regions and lowest in steep regions.Various interpolation methods are shown.
interpMethods={'linear','pchip','spline','biharmonic'}; closeLoopOpt=0; %Option for closed curve n=50; %New number of points cFigure; subplot(2,3,1); hold on; title('Input data'); plotV(V,'k-','MarkerSize',markerSize1,'lineWidth',lineWidth); plotV(V,'r.','MarkerSize',markerSize1,'lineWidth',lineWidth); view(2); grid on; axis equal; axis tight; box on; drawnow; for q=1:1:numel(interpMethods) [Vg]=evenlySampleCurve(V,n,interpMethods{q},closeLoopOpt); subplot(2,3,q+1); hold on; title(['Resampled, ',interpMethods{q},' interpolation']); plotV(Vg,'k-','MarkerSize',markerSize1,'lineWidth',lineWidth); plotV(Vg,'g.','MarkerSize',markerSize1,'lineWidth',lineWidth); view(2); grid on; axis equal; axis tight; box on; end drawnow;
EXAMPLE 2: Upsample a closed polygon
%Simulating the case of an unevenly sampled curve ns=4; t=linspace(0,2*pi,ns+1)'; t=t(1:end-1);%+0.25*pi; V=[cos(t) sin(t)];
Resampling a curve evenly (point spacing based on number of points)
Below the original and resampled curves are shown. Note that the original curve is sampled evenly allong the x-axis but is not evenly sampled allong the curve (point spacing not even) For instance the spacing is smallest in flat regions and lowest in steep regions.Various interpolation methods are shown.
interpMethods={'linear','pchip','spline','biharmonic'}; closeLoopOpt=1; %Option for closed curve n=ns*20; %New number of points cFigure; subplot(2,3,1); hold on; title('Input data'); plotV(V,'k-','MarkerSize',markerSize1,'lineWidth',lineWidth); plotV(V,'r.','MarkerSize',markerSize1,'lineWidth',lineWidth); view(2); grid on; axis equal; axis tight; box on; drawnow; for q=1:1:numel(interpMethods) [Vg]=evenlySampleCurve(V,n,interpMethods{q},closeLoopOpt); subplot(2,3,q+1); hold on; title(['Resampled, ',interpMethods{q},' interpolation']); plotV(Vg,'k-','MarkerSize',markerSize1,'lineWidth',lineWidth); plotV(Vg,'g.','MarkerSize',markerSize1,'lineWidth',lineWidth); view(2); grid on; axis equal; axis tight; box on; end drawnow;
EXAMPLE 3: Evenly sampling a closed curve
%Simulating the case of an unevenly sampled loop curve ns=75; t=sort(linspace(0,2*pi,ns)+pi/10*rand(1,ns)); t=unique(t); %removing double points t=t(t<2*pi);%Removing 2*pi points since they are the same as the 0 point r=3+2.*cos(6*t); [x,y] = pol2cart(t,r); z=y; V=[x(:) y(:) z(:)]; interpMethod='pchip'; closeLoopOpt=1; n=200; [Vg]=evenlySampleCurve(V,n,interpMethod,closeLoopOpt);
Resampling a curve evenly (point spacing based on number of points)
Below the original and resampled curves are shown. Note that the original curve is sampled evenly allong the x-axis but is not evenly sampled allong the curve (point spacing not even) For instance the spacing is smallest in flat regions and lowest in steep regions.Various interpolation methods are shown.
interpMethods={'linear','pchip','spline','biharmonic'}; closeLoopOpt=1; %Option for closed curve n=ns*2; %New number of points cFigure; subplot(2,3,1); hold on; title('Input data'); plotV(V,'k-','MarkerSize',markerSize1,'lineWidth',lineWidth); plotV(V,'r.','MarkerSize',markerSize1,'lineWidth',lineWidth); view(3); grid on; axis equal; axis tight; box on; drawnow; for q=1:1:numel(interpMethods) [Vg]=evenlySampleCurve(V,n,interpMethods{q},closeLoopOpt); subplot(2,3,q+1); hold on; title(['Resampled, ',interpMethods{q},' interpolation']); plotV(Vg,'k-','MarkerSize',markerSize1,'lineWidth',lineWidth); plotV(Vg,'g.','MarkerSize',markerSize1,'lineWidth',lineWidth); view(3); grid on; axis equal; axis tight; box on; end drawnow;
EXAMPLE 4: Resampling and smoothening a curve based on CSAPS
By setting interpMethod as a scalar between 0 and 1 it is interpreted as a smoothening parameter for csaps based cubic smoothening.
ns=125; t=sort(linspace(0,2*pi,ns)+pi/10*rand(1,ns)); t=unique(t); %removing double points t=t(t<2*pi);%Removing 2*pi points since they are the same as the 0 point r=3+2.*cos(6*t); [x,y] = pol2cart(t,r); z=y; V=[x(:) y(:) z(:)]; %Adding noise V=V+0.2.*randn(size(V)); interpMethod=0.25; %Setting a scaler triggers csaps based smoothening closeLoopOpt=1; [Vg]=evenlySampleCurve(V,n,interpMethod,closeLoopOpt); cFigure; subplot(1,2,1); hold on; title('Unevenly sampled and noisy'); plotV(V,'k-','MarkerSize',markerSize1,'lineWidth',lineWidth); plotV(V,'r.','MarkerSize',markerSize1,'lineWidth',lineWidth); view(3); grid on; axis equal; axis tight; box on; subplot(1,2,2); hold on; title('Evenly sampled and smoothened'); plotV(Vg,'k-','MarkerSize',markerSize1,'lineWidth',lineWidth); plotV(Vg,'g.','MarkerSize',markerSize1,'lineWidth',lineWidth); plotV(V,'r.','MarkerSize',markerSize1); view(3); grid on; axis equal; axis tight; box on; drawnow;
EXAMPLE 5: Using point spacing instead of number of points
If the spacingFlag value is set to true (or 1) then the second input is instead interpretet as the desired point spacing.
ns=75; t=sort(linspace(0,2*pi,ns)+pi/10*rand(1,ns)); t=unique(t); %removing double points t=t(t<2*pi);%Removing 2*pi points since they are the same as the 0 point r=3+2.*cos(6*t); [x,y] = pol2cart(t,r); z=y; V=[x(:) y(:) z(:)]; interpMethod='pchip'; closeLoopOpt=1; spacingFlag=1; pointSpacing=0.5; [Vg]=evenlySampleCurve(V,pointSpacing,interpMethod,closeLoopOpt,spacingFlag); cFigure; subplot(1,2,1); hold on; title('Input data'); plotV(V,'k-','MarkerSize',markerSize1,'lineWidth',lineWidth); plotV(V,'r.','MarkerSize',markerSize1,'lineWidth',lineWidth); view(2); grid on; axis equal; axis tight; box on; drawnow; subplot(1,2,2); hold on; title('Resampled with a desired point spacing'); plotV(Vg,'k-','MarkerSize',markerSize1,'lineWidth',lineWidth); plotV(Vg,'g.','MarkerSize',markerSize1,'lineWidth',lineWidth); view(2); grid on; axis equal; axis tight; box on; drawnow;
GIBBON www.gibboncode.org
Kevin Mattheus Moerman, [email protected]
GIBBON footer text
License: https://github.com/gibbonCode/GIBBON/blob/master/LICENSE
GIBBON: The Geometry and Image-based Bioengineering add-On. A toolbox for image segmentation, image-based modeling, meshing, and finite element analysis.
Copyright (C) 2019 Kevin Mattheus Moerman
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.