how to convert B-form into piecewise bezier curves

3 ビュー (過去 30 日間)
kg wong
kg wong 2022 年 12 月 21 日
回答済み: Abhaya 2024 年 9 月 18 日
I am following the mathlab example to get the smooth curves from discrete points in B-form. The curve looks quite smooth. I wonder if there is any way to convert the B-form into multiple pieces of quadratic or cubic Bezier curves that cover the whole curve.
x = linspace(0,2*pi,51);
noisy_y = cos(x) + .2*(rand(size(x))-.5);
plot(x,noisy_y,'x')
axis([-1 7 -1.2 1.2])
tol = (.05)^2*(2*pi)
fnplt( spaps(x, noisy_y, tol), 'r', 2 )

回答 (1 件)

Abhaya
Abhaya 2024 年 9 月 18 日
Hi Wong,
To convert a B-form spline into multiple Bézier curves in MATLAB, you can use the MATLAB ‘spbrk’ function. The spbrk’ function breaks the B-form in the given spline into parts of B-form and returns the knots, coefficients, number of breakpoints, and the order of the B-curve.
With the coefficients obtained, we can create the Bézier segments. These segments can then be plotted individually.
Below is a sample code snippet to convert B-form into piecewise Bezier curves.
x = linspace(0, 2*pi, 51);
noisy_y = cos(x) + 0.2 * (rand(size(x)) - 0.5);
figure;
plot(x, noisy_y, 'x');
hold on;
axis([-1 7 -1.2 1.2]);
tol = (0.05)^2 * (2*pi);
% Fit a smoothing spline
sp = spaps(x, noisy_y, tol);
% Plot the B-spline curve
fnplt(sp, 'r', 2);
% break the B-form in SP
[knots, coefs, number, order] = spbrk(sp);
% Insert knots to convert to Bezier form
% Insert knots at each unique knot value to get Bezier segments
unique_knots = unique(knots);
for i = 1:length(unique_knots)
sp = fnrfn(sp, unique_knots(i));
end
% Extract the refined B-form
[refined_knots, refined_coefs, refined_number, refined_order] = spbrk(sp);
% Plot the Bezier curves
for i = 1:refined_number - refined_order
% Extract control points for each Bezier segment
bezier_coefs = refined_coefs(:, i:i+refined_order-1);
t = linspace(0, 1, 100);
bezier_curve = zeros(1, length(t));
for j = 1:refined_order
bezier_curve = bezier_curve + bezier_coefs(j) * nchoosek(refined_order-1, j-1) * (1-t).^(refined_order-j) .* t.^(j-1);
end
plot(linspace(refined_knots(i), refined_knots(i+1), 100), bezier_curve, 'b-', 'LineWidth', 1);
end
hold off;
The result plot of the given code is attached below.
To explore more about MATLAB ‘spbrk’ function, execute following command on MATLAB command window
doc spbrk
Hope this helps.

カテゴリ

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

Community Treasure Hunt

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

Start Hunting!

Translated by