作业帮 > 综合 > 作业

matlab怎样绘制中心线为曲线的变截面圆柱?

来源:学生作业帮 编辑:神马作文网作业帮 分类:综合作业 时间:2024/11/13 14:34:44
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');

再问: 感谢大神!用您的程序实现了要求的功能。不过这个只是我仿真过程的第一步,在下还有一个小问题,如下图所示:我在圆柱内部穿过一条直线(图中绿线所示),线上取等间距的5个点(如黑色点),然后在每个点绕着该条绿色直线进行六次等间距测量,测量黑色点到圆柱面的距离,这样总共输出6X5=30个数据。不知道大神能否帮忙解决呢?或者qq上聊也行?拜托了!

再答: 所谓的绕着绿色线测量
是不是对于每个黑点所产生的6个测量点
加上黑点本身的7个点,都在垂直于绿线的平面内?
也就是说,要求在过黑点和绿色垂直的平面和圆柱面的交线上求6个点?
再问: 大神,我做了一个示意图。圆筒代表井筒(没有画出变径和轴线弯曲),橙色圆所在基准面2是与井筒中心线垂直的面,而图中蓝色线所在的基准面1是一个测量面(垂直于之前所述绿色线),蓝色圆的中心即绿线上的黑点(测量点),六条蓝线段分别代表测量点到井筒的距离,沿圆周均匀分布。我希望输出的就是六个线段的长度值(即测量点到井筒的六个方向上的距离值)。黑点共有五个,所以输出6X5=30个数。 不知QQ详聊可否?
再答: %利用之前获得的数据xx,yy,zzpoint=[0.2 0.95 0.85];    %假设圆柱内直线上有一点nline=[-1 1 2];          %直线的方向也知道     nline=nline./sqrt(sum(nline.^2));%直线方向单位向量greenline=[point-0.3*nline;point+0.2*nline];plot3(point(:,1),point(:,2),point(:,3),'k.');  %画点plot3(greenline(:,1),greenline(:,2),greenline(:,3),'g','linewidth',2);%画绿色
proj=arrayfun(@(x,y,z) dot([x,y,z]-point,nline),xx,yy,zz);%算点积c=contourc(proj,[0 0]);     %计算点积为0算等值线ind=c(:,2:1+c(2,1))';crx=interp2(xx,ind(:,1),ind(:,2));%插值计算交线x坐标cry=interp2(yy,ind(:,1),ind(:,2));%插值计算交线y坐标crz=interp2(zz,ind(:,1),ind(:,2));%插值计算交线z坐标
ncl=[crx-point(1),cry-point(2),crz-point(3)];ncl=bsxfun(@rdivide,ncl,sqrt(sum(ncl.^2,2)));dn=dot(ncl(1:end-1,:),ncl(2:end,:),2);theta=cumsum([0;acos(dn)]);%计算交线数据的角度samplex=interp1(theta,crx,(0:5)*pi/3);%插值计算需要的6点sampley=interp1(theta,cry,(0:5)*pi/3);samplez=interp1(theta,crz,(0:5)*pi/3);distance=sqrt((samplex-point(1)).^2+(sampley-point(2)).^2+(samplez-point(3)).^2);%6个距离
这是直线上有1个点的情况,其他点你可以举一反三的实现,以下是效果图