how to convert B-form into piecewise bezier curves

8 次查看(过去 30 天)
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 CenterFile Exchange 中查找有关 Spline Postprocessing 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by