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

如图所示,我想画一个模拟井径的三维图像,其中心轨迹为一条曲线,知道曲线上若干个中心点位置处的圆的半径(点不同时,圆的半径也不同),不知道怎样拟合出一个变形了的圆柱面呢?... 如图所示,我想画一个模拟井径的三维图像,其中心轨迹为一条曲线,知道曲线上若干个中心点位置处的圆的半径(点不同时,圆的半径也不同),不知道怎样拟合出一个变形了的圆柱面呢? 展开
 我来答
dukinkin
2014-09-18 · TA获得超过1.3万个赞
知道大有可为答主
回答量:2443
采纳率:90%
帮助的人:990万
展开全部

%这里随便给了组数据,中心轨迹(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个点?
matlab爱好者
2021-01-16 · matlab编程与科研资料分享,欢迎关注!
matlab爱好者
采纳数:16 获赞数:28

向TA提问 私信TA
展开全部

本视频展示如何用matlab绘制散圆状态图,可用于相关科研数据绘图!

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式