Thanks for all answers...
How can i calculate the length of curve?
154 views (last 30 days)
Show older comments
Hi,
I have a curve which includes X (meter) and Y (meter) data. Is there any way to obtain the length of curve easily?
Thanks a lot,
X=[96.0741000000000,97.1940000000000,98.3139000000000,99.4338000000000,100.553700000000,101.673600000000,102.793500000000,103.913400000000,105.033300000000,106.153200000000,107.273100000000,108.393000000000,109.512900000000,110.632800000000,111.752700000000,112.872600000000,113.992500000000,115.112400000000,116.232300000000]
Y=[-4.13836296940031,-4.10455468315876,-4.05645426203322,-3.99617782198545,-3.92344322326347,-3.83385191481492,-3.73582865974161,-3.61740402741020,-3.49399064332423,-3.35231953224592,-3.20552503148528,-3.04892626846560,-2.88658570885772,-2.72091440408539,-2.55226630046971,-2.38425597793465,-2.21787687713447,-2.05656258174384,-1.89889800700337]
Answers (5)
Ankit
on 26 Aug 2022
Edited: Ankit
on 26 Aug 2022
X=[96.0741000000000,97.1940000000000,98.3139000000000,99.4338000000000,100.553700000000,101.673600000000,102.793500000000,103.913400000000,105.033300000000,106.153200000000,107.273100000000,108.393000000000,109.512900000000,110.632800000000,111.752700000000,112.872600000000,113.992500000000,115.112400000000,116.232300000000];
Y=[-4.13836296940031,-4.10455468315876,-4.05645426203322,-3.99617782198545,-3.92344322326347,-3.83385191481492,-3.73582865974161,-3.61740402741020,-3.49399064332423,-3.35231953224592,-3.20552503148528,-3.04892626846560,-2.88658570885772,-2.72091440408539,-2.55226630046971,-2.38425597793465,-2.21787687713447,-2.05656258174384,-1.89889800700337];
len_curve = sum(vecnorm(diff( [X(:),Y(:)] ),2,2));
% the 2-norm along the rows of a matrix: vecnorm(A,2,2) , where A is a
% vector
% diff: Difference and approximate derivative.
2 Comments
Star Strider
on 26 Aug 2022
Possibly —
X=[96.0741000000000,97.1940000000000,98.3139000000000,99.4338000000000,100.553700000000,101.673600000000,102.793500000000,103.913400000000,105.033300000000,106.153200000000,107.273100000000,108.393000000000,109.512900000000,110.632800000000,111.752700000000,112.872600000000,113.992500000000,115.112400000000,116.232300000000];
Y=[-4.13836296940031,-4.10455468315876,-4.05645426203322,-3.99617782198545,-3.92344322326347,-3.83385191481492,-3.73582865974161,-3.61740402741020,-3.49399064332423,-3.35231953224592,-3.20552503148528,-3.04892626846560,-2.88658570885772,-2.72091440408539,-2.55226630046971,-2.38425597793465,-2.21787687713447,-2.05656258174384,-1.89889800700337]
dX = gradient(X); % Numerical Derivative
dY = gradient(Y); % Numerical Derivative
Len = cumtrapz(X,hypot(dX,dY)) % Integrate The Hypotenuse Of The Numerical Derivatives Of The Segments
figure
plot(X, Y, '.-')
hold on
plot(X, Len, '.-')
hold off
grid
.
6 Comments
Star Strider
on 29 Jan 2023
My code calculates the trapezoidal integral of the gradients (numerical derivatives) of ‘X’ and ‘Y’.
Torsten
on 26 Aug 2022
Edited: Torsten
on 26 Aug 2022
I'd say Ankit's solution is the more intuitive.
But Star Strider's solution should be second-order accurate while Ankit's is only first-order accurate.
X=[96.0741000000000,97.1940000000000,98.3139000000000,99.4338000000000,100.553700000000,101.673600000000,102.793500000000,103.913400000000,105.033300000000,106.153200000000,107.273100000000,108.393000000000,109.512900000000,110.632800000000,111.752700000000,112.872600000000,113.992500000000,115.112400000000,116.232300000000];
Y=[-4.13836296940031,-4.10455468315876,-4.05645426203322,-3.99617782198545,-3.92344322326347,-3.83385191481492,-3.73582865974161,-3.61740402741020,-3.49399064332423,-3.35231953224592,-3.20552503148528,-3.04892626846560,-2.88658570885772,-2.72091440408539,-2.55226630046971,-2.38425597793465,-2.21787687713447,-2.05656258174384,-1.89889800700337];
length = 0;
for i = 1:numel(X)-1
length = length + sqrt((X(i+1)-X(i))^2 + (Y(i+1)-Y(i))^2);
end
length
0 Comments
Tamas Rozsa
on 29 Jan 2023
Edited: Tamas Rozsa
on 30 Jan 2023
dX = gradient(X);
dY = gradient(Y);
% option 1
Len = cumsum(hypot(dX,dY)) % if sublengths of all segments also needed
% option 2
Len = sum(hypot(dX,dY)) % if only total length needed
As @Star Strider also highlighted in comment, gradient() may be substituted with diff(), but gradient() may give more satisfactory (i.e., smoother) result in most cases. [UPDATE: in some cases, and depending on the actual use-case]
Unlike @Star Strider's original answer, this code gives correct result even in case of arbitrary spacing in the input data as well as in case of vertical line segments.
3 Comments
Stephen23
on 30 Jan 2023
Edited: Stephen23
on 30 Jan 2023
A very simple approach is to download John D'Errico's excellent ARCLENGTH function:
X = -1:.01:1;
Y = sqrt(1-X.^2);
L = arclength(X,Y,'spline')
L-pi
For the sample curve, this gives a more accurate solution.
1 Comment
Stephen23
on 9 Mar 2023 at 15:24
Edited: Stephen23
on 9 Mar 2023 at 15:25
Tested on the cases given here:
Arbitrary spacing (L=pi/2):
X = logspace(-10,0,200);
Y = sqrt(1-X.^2);
L = arclength(X,Y,'spline')
L - pi/2
Vertical lines (L=10):
X = ones(1,200);
Y = logspace(-10,1,200);
L = arclength(X,Y,'spline')
L - 10
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!