¿Cómo dibujar un cilindro de sección variable con una línea central curva en Matlab?
%El siguiente es un conjunto de datos aleatorios, la trayectoria del centro del círculo (x, y, z) y el radio del círculo correspondiente
x=0:0.02:1;y=cos( x* pi/2);z=y.^2;
r=0.15-0.1*x;
%Aquí x, y, z, r son secuencias de iguales grados, tenga en cuenta que dos puntos adyacentes no pueden superponerse
plot3(x,y,z,'b');continue
dx=gradient (x);dy=gradient (y);dz = Degradado (z); % de incremento en la dirección de la curva
deg=0: 360;
for ii=1:length( x)
n=[dx (ii) dy(ii) dz(ii)]; ?%n es la dirección incremental del punto actual y el vector normal del plano circular
n=n/sqrt(sum(n.^ 2)) ; %Normalizar el vector normal
a=zeros(1,3); [ind ind]=min(n);a(ind)=1;% Encuentra la diferencia con n(ii). , :)
r1= cross(n,a); ?% Genera un vector en el plano del círculo
r1=r1/sqrt(sum(r1.^2) )* r(ii); ?% Hacer que la longitud del vector sea igual al radio
r2=cross(n,r1); % Generar otro vector de radio ortogonal a él
xx; =r1 (1)*cosd(deg)+r2(1)*sind(deg)+x(ii);% Utilice ángulos basados en r1 y r2 para generar datos circulares
yy=r1(2 )*cosd (grados)+r2(2)*sind(grados)+y(ii);
zz=r1(3)*cosd(grados)+r2(3)* sind(deg )+z(ii);?
plot3(xx,yy,zz,'r');?%Dibujar un círculo
end
mantener ;cuadrícula en el eje igual;
Actualizar
%Aquí se proporciona un conjunto aleatorio de datos, la trayectoria central (x,y,z) y el radio correspondiente del círculo p>
x=0:0.02:1;y=cos(x*pi/2);z =y.^2;
r=0.15-0.1*x;
%Aquí x, y, z, r son secuencias de igual grado. Tenga en cuenta que dos puntos adyacentes no pueden superponerse
x=x(: y=y(:); z( :);
plot3(x,y,z,'b','linewidth',2); espera
Plot3(x,y,z,'b); ', 'ancho de línea',2).Continue
n=[gradient(x) gradient(y) gradient(z)]; % de incremento de dirección de la curva
n=bsxfun(@) rdivide ,n,sqrt(sum(n.^2,2));
a=zeros(1,3);[ind ind]=min(n(1,:));a( ind )=1;
r1=cross(n(1,:),a);
r1=r1/sqrt(suma(r1.^2)); p >
r2=cruz(n(1,:),r1);
deg=0:20:360;
xx=r(1 ) *(r1(1)*cosd(grados)+r2(1)*sind(grados))+x(1);?
y=r(1)*(r1(2)* cosd (grados)+r2(
2)*sind(grados))+y(1);
zz=r(1)*(r1(3)*cosd(grados)+r2(3)*sind(grados))+ z(1);?
d0=[xx(1) yy(1) zz(1)]
para ii=2:longitud(x)
;r1=cruz(r2,n(ii,:));
r2=cruz(n(ii,:),r1 ?
xx=[xx); ;r(ii)*(r1(1)*cosd(grados)+r2(1)*sind(grados))+x(ii)]; ) )*(r1(2)*cosd(grados)+r2(2)*sind(grados))+y(ii)];
zz=[zz;r(ii)*(r1 ( 3)*cosd(grados)+r2(3)*sind(grados))+z(ii)]; ?
end
malla(xx,yy,zz) ; colormap([1 0 0]);
esperar;cuadrícula encendida;eje igual;oculto;
xlabel('X');ylabel('Y'); zlabel('Z');