how to convert B-form into piecewise bezier curves
8 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
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 )
0 comentarios
Respuestas (1)
Abhaya
el 18 de Sept. de 2024
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.
0 comentarios
Ver también
Categorías
Más información sobre Spline Postprocessing en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!