Jinesh Savla
Jinesh Savla

Reputation: 11

Would like to generate surface of revolution from bezier curve

I would like to generate surface of revolution from bezier curve. I have made bezier curve in MATLAB but beyond this point I am stuck and do not know how to proceed. Please help. Below is the code that I have made.

clc
clear
close all

% Name      :   Savla Jinesh Shantilal
% Bits ID   :   2021HT30609

%% Define inout parameters

B = [1,1; 2,3; 4,3; 3,1]; % Creating matrix for polygon vertices
[r,s] = size(B); % getting size of matrix in terms of rows and columns
n = r-1; % n+1 represents number of vertices of the polygon

np = 20; % represents number of equi-distance points on the bezier curve
t = linspace(0,1,np);

%% Plot polygon

for k = 1:n
    plot([B(k,1),B(k+1,1)], [B(k,2),B(k+1,2)], 'r', 'LineWidth', 2)
hold on
grid on
end

%% Generate the points on the bezier curve

for j = 1:np
    P = [0,0];
    for i = 0:n
        M(i+1) = (factorial(n)/(factorial(i)*factorial(n-i)))*((t(j))^i)*((1-t(j))^(n-i));
        P = P + B(i+1,:)*M(i+1);
    end
    Q(j,:) = P;
end

%% Plot the bezier curve from the obtained points

for l = 1:np-1
    plot([Q(l,1),Q(l+1,1)],[Q(l,2),Q(l+1,2)], '-- b', 'LineWidth', 2);
    hold on
end

Upvotes: 0

Views: 328

Answers (1)

bla
bla

Reputation: 26069

Usually one can use the built-in cylinder function for monotonically increasing x-values. Here, the bezier curve has non monotonic values from max(x) so we break it to two parts to parameterize it, and then add an angle rotation.

% first define the x and y coordinate from your Q info:
xx = Q(:,1);
yy = Q(:,2); 

N = 1e2; 
[~, id] = max(xx); % the position where we split
t = linspace(xx(1),xx(id),N);


% Parameterize the function:
t     = linspace(0,2*(xx(id)-xx(1)),N);
x     = zeros(1, N);
L     = t <= ( xx(id)-xx(1) ); % the "Left" side of the curve
x(L)  = t(L)+xx(1);
x(~L) = flip(x(L));
  
%define the r value
r     = x;
r(L)  = interp1(xx(1:id)  ,yy(1:id)  , x(L) ); % Left side
r(~L) = interp1(xx(id:end),yy(id:end), x(~L)); % right side (not left)
 
% define your x values
x = repmat(x', [1 N]);

% define the theta that will perform the rotation
theta = linspace(0,2*pi, N);

% initialize values for y and z
y = zeros(N);
z = zeros(N);

% calculate the y and z values
for i=1:N
    y(i,:) = r(i) *cos(theta);
    z(i,:) = r(i) *sin(theta);
end
 
%plot the surface of revolution and the original curve
s = surf(x,y,z);
alpha 0.4
hold on
plot(xx,yy,'k','LineWidth',3)

enter image description here

Upvotes: 3

Related Questions