Arc length of Cubic Bezier Curve
24 次查看(过去 30 天)
显示 更早的评论
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,
0 个评论
回答(2 个)
cuneyt haspolat
2019-3-6
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.
0 个评论
Moreno, M.
2022-4-16
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 个评论
Moreno, M.
2022-4-16
https://uk.mathworks.com/matlabcentral/fileexchange/110220-polynomial-and-bezier-coefficient-conversion
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Interpolation 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!