フィルターのクリア

Arc length of Cubic Bezier Curve

13 ビュー (過去 30 日間)
Mahsa
Mahsa 2014 年 2 月 25 日
コメント済み: Moreno, M. 2022 年 4 月 16 日
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,

回答 (2 件)

cuneyt haspolat
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.

Moreno, M.
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.
Moreno, M. 2022 年 4 月 16 日
https://uk.mathworks.com/matlabcentral/fileexchange/110220-polynomial-and-bezier-coefficient-conversion

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeInterpolation についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by