Arc length of Cubic Bezier Curve

32 views (last 30 days)
Mahsa
Mahsa on 25 Feb 2014
Commented: Moreno, M. on 16 Apr 2022
Hello, I'm looking for an efficient way to calculate the arc length of Cubic Bezier curve, by knowing P0,P1,P2 and P3. Thank you,

Answers (2)

cuneyt haspolat
cuneyt haspolat on 6 Mar 2019
Hello,
After the bezier curve generation, you can take many samples from bezier curve.
hint: linscape can be used for taking samples on curve.
Then, euclidien norm can be used to find length. When number of sample is increased, accuracy will be increased. There is a direct proportion between number of sample and accuracy of the length.
bonus: For Nurbs curve length, nrbmeasure function is available in Piegl's toolbox. Discretization which is same as my advice is used as well and Integral is used to find curve length together.

Moreno, M.
Moreno, M. on 16 Apr 2022
If you have access to symbolic math, there is a way of calculating the analytic arc-length of a generic Bézier curve as the definite integral of the norm of the derivative of the curve. I use the functions bspl and bez2ber (find the polynomial form coefficients of the curve from its control points) that I have developed for this exercise:
function c = bez2ber(x)
n = size(x, 1) - 1;
N = prod(1 : n);
c = x;
for i = 1 : n - 1
I = prod(1 : i);
s = (-1) ^ i;
j = s * x(1, :) / I;
for k = 1 : i - 1
s = -s;
j = j + s * x(k + 1, :) / prod(1 : k) / prod(1 : i - k);
end
j = j + x(i + 1, :) / I;
c(i + 1, :) = N / prod(1 : n - i) * j;
end
s = (-1) ^ n;
j = s * x(1, :) / N;
for k = 1 : n
s = -s;
j = j + s * x(k + 1, :) / prod(1 : k) / prod(1 : n - k);
end
c(n + 1, :) = N * j;
end
% Control points and derivative polynomial form
dim = [4, 2];
X = rand(dim);
Y = bez2ber((dim(1) - 1) * diff(X));
% Analytic calculation
syms t
fun = zeros(1, dim(2));
for i = 1 : dim(1) - 1
fun = fun + Y(i, :) * t ^ (i - 1);
end
a = double(int(norm(fun), [0, 1]));
% Discrete arc-length approximation
b = diff(bspl(X, 1e3));
b = sum(sqrt(sum(b .* b, 2)));
error = abs(b - a) / a;
This would work for any Bézier curve, regardless the order or the dimension as long as the factorial calculations of the polynomial form are within the floating-point exception limits (dim(1) = 171). Overflows happen for more than 55 control points if the round(prod(1:n)) is used instead of prod(1:n). More stable approaches for factorial calculations can be used.
The error for a discrete evaluation of the arc-length using 1000 points in a random cubic Bézier would be:
[a; b; error]
ans =
1.29640077147666
1.29640027557947
3.82518436167337e-07
  1 Comment
Moreno, M.
Moreno, M. on 16 Apr 2022
https://uk.mathworks.com/matlabcentral/fileexchange/110220-polynomial-and-bezier-coefficient-conversion

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!