matlab怎样绘制中心线为曲线的变截面圆柱?如图所示,我想画一个模拟井径的三维图像,其中心轨迹为一条曲线,知道曲线上若干个中心点位置处的圆的半径(点不同时,圆的半径也不同),不知道
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/27 15:53:37
matlab怎样绘制中心线为曲线的变截面圆柱?如图所示,我想画一个模拟井径的三维图像,其中心轨迹为一条曲线,知道曲线上若干个中心点位置处的圆的半径(点不同时,圆的半径也不同),不知道
matlab怎样绘制中心线为曲线的变截面圆柱?
如图所示,我想画一个模拟井径的三维图像,其中心轨迹为一条曲线,知道曲线上若干个中心点位置处的圆的半径(点不同时,圆的半径也不同),不知道怎样拟合出一个变形了的圆柱面呢?
matlab怎样绘制中心线为曲线的变截面圆柱?如图所示,我想画一个模拟井径的三维图像,其中心轨迹为一条曲线,知道曲线上若干个中心点位置处的圆的半径(点不同时,圆的半径也不同),不知道
%这里随便给了组数据,中心轨迹(x,y,z)以及对应的圆半径
x=0:0.02:1;y=cos(x*pi/2);z=y.^2;
r=0.15-0.1*x;
%这里x,y,z,r是程度相等的数组,注意相邻两点不能重合
plot3(x,y,z,'b');hold on
dx=gradient(x);dy=gradient(y);dz=gradient(z);%曲线方向增量
deg=0:360;
for ii=1:length(x)
n=[dx(ii) dy(ii) dz(ii)]; %n是当前点的增量方向,也是圆平面的法向量
n=n/sqrt(sum(n.^2)); %归一化法向量
a=zeros(1,3);[ind ind]=min(n);a(ind)=1;%找到和n(ii,:)不共线的向量
r1=cross(n,a); %产生圆平面上的一个向量
r1=r1/sqrt(sum(r1.^2))*r(ii); %让向量长度等于半径
r2=cross(n,r1); %产生另一个与其正交的半径向量
xx=r1(1)*cosd(deg)+r2(1)*sind(deg)+x(ii); %根据r1和r2,利用角度产生圆数据
yy=r1(2)*cosd(deg)+r2(2)*sind(deg)+y(ii);
zz=r1(3)*cosd(deg)+r2(3)*sind(deg)+z(ii);
plot3(xx,yy,zz,'r'); %画一个圆
end
hold off;grid on
axis equal;
升级版
%这里随便给了组数据,中心轨迹(x,y,z)以及对应的圆半径
x=0:0.02:1;y=cos(x*pi/2);z=y.^2;
r=0.15-0.1*x;
%这里x,y,z,r是程度相等的数组,注意相邻两点不能重合
x=x(:);y=y(:);z=z(:);
plot3(x,y,z,'b','linewidth',2);hold on
n=[gradient(x) gradient(y) gradient(z)];%曲线方向增量
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(sum(r1.^2));
r2=cross(n(1,:),r1);
deg=0:20:360;
xx=r(1)*(r1(1)*cosd(deg)+r2(1)*sind(deg))+x(1);
yy=r(1)*(r1(2)*cosd(deg)+r2(2)*sind(deg))+y(1);
zz=r(1)*(r1(3)*cosd(deg)+r2(3)*sind(deg))+z(1);
d0=[xx(1) yy(1) zz(1)];
for ii=2:length(x)
r1=cross(r2,n(ii,:));
r2=cross(n(ii,:),r1);
xx=[xx;r(ii)*(r1(1)*cosd(deg)+r2(1)*sind(deg))+x(ii)];
yy=[yy;r(ii)*(r1(2)*cosd(deg)+r2(2)*sind(deg))+y(ii)];
zz=[zz;r(ii)*(r1(3)*cosd(deg)+r2(3)*sind(deg))+z(ii)];
end
mesh(xx,yy,zz);colormap([1 0 0]);
hold off;grid on;axis equal;hidden off;
xlabel('X');ylabel('Y');zlabel('Z');