Red de conocimiento informático - Aprendizaje de programación - ¿Cómo dibujar un cilindro de sección variable con una línea central curva en Matlab?

¿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

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));

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');