问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求助matlab根据 圆柱轴线画弯曲的圆柱体

发布网友 发布时间:2022-05-01 13:10

我来回答

1个回答

热心网友 时间:2023-10-14 06:11

function h=tubemesh(curve,r,theta,f)
% rotmesh(curve,r,theta,fun)用于绘制圆柱面
%   矩阵curve=[x,y,z]为中轴线,其中x,y,z为列向量,分别代表中轴线的三维坐标
%   r为半径
%     当r为向量时,r的个数必须与列向量x的个数相同,代表处于对应位置时的半径
%     当r为标量时,代表各处半径相同
%   向量theta为旋转弧度,默认为linspace(-pi,pi,37)
%   句柄fun为绘图函数,默认为@mesh
% h=rotsurf(...)
%  绘制曲面的同时返回该旋转体的句柄h
%
%例1:绘制中轴线为螺旋线x=sin(t);y=cos(t);z=t,半径为1的圆柱体
%t=linspace(0,10)'; 
%tubemesh([sin(t),cos(t),t],1) 
%xlabel('x');ylabel('y');zlabel('z');axis equal
%例2:绘制抛物线z=x^2+y^2
%t=[0,2.^(-2:0.2:2)]'; 
%tubemesh([t-t,t-t,t.^2],t,[],@surfc) 
%例3:
%t=linspace(0,4*pi)'; 
%tubemesh([sin(t),cos(t),-t],t*10,t/2,@surf);
%axis equal off;view(50,60);
%colormap hsv;shading interp;camlight;lighting phong;camzoom(1.8)
  
assert(nargin>=2 && nargin<=4,'参数个数错误!请看帮助!');
if nargin<4
    f=@mesh;
    if nargin<3
        theta=linspace(-pi,pi,37)';
    end
end
if isempty(theta)
    theta=linspace(-pi,pi,37)';
end
curve=squeeze(curve);
assert(ismatrix(curve),'参数1格式错误!请看帮助!');
if size(curve,2)~=3
    curve=curve.';
end
assert(size(curve,2)==3 && size(curve,1)>1,'参数1格式错误!请看帮助!');
r=squeeze(r);
if size(r,2)~=1
    curve=curve.';
end
if(length(r)==1)
    r=r*ones(size(curve,1),1);
end
assert(size(r,2)==1 && size(r,1)==size(curve,1),'参数2格式错误!请看帮助!');
theta=squeeze(theta);
if size(theta,2)~=1
    theta=theta.';
end
assert(size(theta,2)==1,'参数3格式错误!请看帮助!');
 
x=curve(:,1);
y=curve(:,2);
z=curve(:,3);
direct=diff(curve);
direct=direct./repmat(sqrt(sum(direct.^2,2)),1,3);
direct=[direct(1,:);(direct(1:end-1,:)+direct(2:end,:))/2;direct(end,:)];
direct=direct./repmat(sqrt(sum(direct.^2,2)),1,3);
sint=sin(theta);
cost=cos(theta);
 
mm=[-direct(:,2),direct(:,1)];
mm=mm./repmat(sqrt(sum(mm.^2,2)),1,2);
mm(isnan(mm))=0;
mx=mm(:,1);
my=mm(:,2);
alph = acos(direct(:,3));
cosa = cos(alph);
sina = sin(alph);
vera = 1 - cosa;
XX=zeros(length(theta),length(x));
YY=XX;
ZZ=XX;
view(3)
hold on
for k=1:length(x)
    rot = [cosa(k)+mx(k)^2*vera(k) mx(k)*my(k)*vera(k) my(k)*sina(k); ...
        mx(k)*my(k)*vera(k) cosa(k)+my(k)^2*vera(k) -mx(k)*sina(k); ...
        -my(k)*sina(k) mx(k)*sina(k) cosa(k)]';
    X=r(k)*cost;
    Y=r(k)*sint;
    Z=X-X;
    newxyz = [X,Y,Z]*rot;
      
    XX(:,k)=newxyz(:,1)+x(k);
    YY(:,k)=newxyz(:,2)+y(k);
    ZZ(:,k)=newxyz(:,3)+z(k);
end
hh=f(XX,YY,ZZ);
if nargout==1
    h=hh;
end

t=linspace(0,10)'; 
tubemesh([sin(t),cos(t),t],1) 
xlabel('x');ylabel('y');zlabel('z');axis equal

热心网友 时间:2023-10-14 06:11

function h=tubemesh(curve,r,theta,f)
% rotmesh(curve,r,theta,fun)用于绘制圆柱面
%   矩阵curve=[x,y,z]为中轴线,其中x,y,z为列向量,分别代表中轴线的三维坐标
%   r为半径
%     当r为向量时,r的个数必须与列向量x的个数相同,代表处于对应位置时的半径
%     当r为标量时,代表各处半径相同
%   向量theta为旋转弧度,默认为linspace(-pi,pi,37)
%   句柄fun为绘图函数,默认为@mesh
% h=rotsurf(...)
%  绘制曲面的同时返回该旋转体的句柄h
%
%例1:绘制中轴线为螺旋线x=sin(t);y=cos(t);z=t,半径为1的圆柱体
%t=linspace(0,10)'; 
%tubemesh([sin(t),cos(t),t],1) 
%xlabel('x');ylabel('y');zlabel('z');axis equal
%例2:绘制抛物线z=x^2+y^2
%t=[0,2.^(-2:0.2:2)]'; 
%tubemesh([t-t,t-t,t.^2],t,[],@surfc) 
%例3:
%t=linspace(0,4*pi)'; 
%tubemesh([sin(t),cos(t),-t],t*10,t/2,@surf);
%axis equal off;view(50,60);
%colormap hsv;shading interp;camlight;lighting phong;camzoom(1.8)
  
assert(nargin>=2 && nargin<=4,'参数个数错误!请看帮助!');
if nargin<4
    f=@mesh;
    if nargin<3
        theta=linspace(-pi,pi,37)';
    end
end
if isempty(theta)
    theta=linspace(-pi,pi,37)';
end
curve=squeeze(curve);
assert(ismatrix(curve),'参数1格式错误!请看帮助!');
if size(curve,2)~=3
    curve=curve.';
end
assert(size(curve,2)==3 && size(curve,1)>1,'参数1格式错误!请看帮助!');
r=squeeze(r);
if size(r,2)~=1
    curve=curve.';
end
if(length(r)==1)
    r=r*ones(size(curve,1),1);
end
assert(size(r,2)==1 && size(r,1)==size(curve,1),'参数2格式错误!请看帮助!');
theta=squeeze(theta);
if size(theta,2)~=1
    theta=theta.';
end
assert(size(theta,2)==1,'参数3格式错误!请看帮助!');
 
x=curve(:,1);
y=curve(:,2);
z=curve(:,3);
direct=diff(curve);
direct=direct./repmat(sqrt(sum(direct.^2,2)),1,3);
direct=[direct(1,:);(direct(1:end-1,:)+direct(2:end,:))/2;direct(end,:)];
direct=direct./repmat(sqrt(sum(direct.^2,2)),1,3);
sint=sin(theta);
cost=cos(theta);
 
mm=[-direct(:,2),direct(:,1)];
mm=mm./repmat(sqrt(sum(mm.^2,2)),1,2);
mm(isnan(mm))=0;
mx=mm(:,1);
my=mm(:,2);
alph = acos(direct(:,3));
cosa = cos(alph);
sina = sin(alph);
vera = 1 - cosa;
XX=zeros(length(theta),length(x));
YY=XX;
ZZ=XX;
view(3)
hold on
for k=1:length(x)
    rot = [cosa(k)+mx(k)^2*vera(k) mx(k)*my(k)*vera(k) my(k)*sina(k); ...
        mx(k)*my(k)*vera(k) cosa(k)+my(k)^2*vera(k) -mx(k)*sina(k); ...
        -my(k)*sina(k) mx(k)*sina(k) cosa(k)]';
    X=r(k)*cost;
    Y=r(k)*sint;
    Z=X-X;
    newxyz = [X,Y,Z]*rot;
      
    XX(:,k)=newxyz(:,1)+x(k);
    YY(:,k)=newxyz(:,2)+y(k);
    ZZ(:,k)=newxyz(:,3)+z(k);
end
hh=f(XX,YY,ZZ);
if nargout==1
    h=hh;
end

t=linspace(0,10)'; 
tubemesh([sin(t),cos(t),t],1) 
xlabel('x');ylabel('y');zlabel('z');axis equal

热心网友 时间:2023-10-14 06:11

function h=tubemesh(curve,r,theta,f)
% rotmesh(curve,r,theta,fun)用于绘制圆柱面
%   矩阵curve=[x,y,z]为中轴线,其中x,y,z为列向量,分别代表中轴线的三维坐标
%   r为半径
%     当r为向量时,r的个数必须与列向量x的个数相同,代表处于对应位置时的半径
%     当r为标量时,代表各处半径相同
%   向量theta为旋转弧度,默认为linspace(-pi,pi,37)
%   句柄fun为绘图函数,默认为@mesh
% h=rotsurf(...)
%  绘制曲面的同时返回该旋转体的句柄h
%
%例1:绘制中轴线为螺旋线x=sin(t);y=cos(t);z=t,半径为1的圆柱体
%t=linspace(0,10)'; 
%tubemesh([sin(t),cos(t),t],1) 
%xlabel('x');ylabel('y');zlabel('z');axis equal
%例2:绘制抛物线z=x^2+y^2
%t=[0,2.^(-2:0.2:2)]'; 
%tubemesh([t-t,t-t,t.^2],t,[],@surfc) 
%例3:
%t=linspace(0,4*pi)'; 
%tubemesh([sin(t),cos(t),-t],t*10,t/2,@surf);
%axis equal off;view(50,60);
%colormap hsv;shading interp;camlight;lighting phong;camzoom(1.8)
  
assert(nargin>=2 && nargin<=4,'参数个数错误!请看帮助!');
if nargin<4
    f=@mesh;
    if nargin<3
        theta=linspace(-pi,pi,37)';
    end
end
if isempty(theta)
    theta=linspace(-pi,pi,37)';
end
curve=squeeze(curve);
assert(ismatrix(curve),'参数1格式错误!请看帮助!');
if size(curve,2)~=3
    curve=curve.';
end
assert(size(curve,2)==3 && size(curve,1)>1,'参数1格式错误!请看帮助!');
r=squeeze(r);
if size(r,2)~=1
    curve=curve.';
end
if(length(r)==1)
    r=r*ones(size(curve,1),1);
end
assert(size(r,2)==1 && size(r,1)==size(curve,1),'参数2格式错误!请看帮助!');
theta=squeeze(theta);
if size(theta,2)~=1
    theta=theta.';
end
assert(size(theta,2)==1,'参数3格式错误!请看帮助!');
 
x=curve(:,1);
y=curve(:,2);
z=curve(:,3);
direct=diff(curve);
direct=direct./repmat(sqrt(sum(direct.^2,2)),1,3);
direct=[direct(1,:);(direct(1:end-1,:)+direct(2:end,:))/2;direct(end,:)];
direct=direct./repmat(sqrt(sum(direct.^2,2)),1,3);
sint=sin(theta);
cost=cos(theta);
 
mm=[-direct(:,2),direct(:,1)];
mm=mm./repmat(sqrt(sum(mm.^2,2)),1,2);
mm(isnan(mm))=0;
mx=mm(:,1);
my=mm(:,2);
alph = acos(direct(:,3));
cosa = cos(alph);
sina = sin(alph);
vera = 1 - cosa;
XX=zeros(length(theta),length(x));
YY=XX;
ZZ=XX;
view(3)
hold on
for k=1:length(x)
    rot = [cosa(k)+mx(k)^2*vera(k) mx(k)*my(k)*vera(k) my(k)*sina(k); ...
        mx(k)*my(k)*vera(k) cosa(k)+my(k)^2*vera(k) -mx(k)*sina(k); ...
        -my(k)*sina(k) mx(k)*sina(k) cosa(k)]';
    X=r(k)*cost;
    Y=r(k)*sint;
    Z=X-X;
    newxyz = [X,Y,Z]*rot;
      
    XX(:,k)=newxyz(:,1)+x(k);
    YY(:,k)=newxyz(:,2)+y(k);
    ZZ(:,k)=newxyz(:,3)+z(k);
end
hh=f(XX,YY,ZZ);
if nargout==1
    h=hh;
end

t=linspace(0,10)'; 
tubemesh([sin(t),cos(t),t],1) 
xlabel('x');ylabel('y');zlabel('z');axis equal

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
请帮忙查iphone4手机的序列号dx3hnchpdp0n DX3J481PDP0N帮忙查一下 是真的吗 我不会查 大神们是翻新的? 苹果4激活日期查询 猫猫一直发情怎么办呢 如何帮助猫咪度过发情期呢? 本科英语都要过4级吗 车子中间的踏板是什么 高考400分能考哪些军事类二本 联通3g双卡双待智能导航手机 ...可以一个卡装移动2g的卡,专打电话,一个卡装联通3g流量卡吗 梦见我家猫咪吐我一身 中山证券网上开户的那个叫什么? 怎样用matlab画水平实心圆柱体,已知圆柱体的半径和高度。(悬赏值不够了,见谅) 中山证券同花顺手机交易版怎么下载? 如何用matlab画出空心圆柱体 如何用matlab画一个三维的圆柱体 matlab 画圆柱体时如何设定高度 梦见家里养的猫口吐白沫子像是中毒是怎么回事? 如何运用matlab画圆柱面 云南腾冲旅游,给点建议 什么是天然火山石 用java编写防止SQL注入!求java高手指点!问题解决后,一定提高悬赏! 火山石对人体有什么益处 火山石的成分,分布地点,哪里的火山石保健作用好? 火山石(北京)影视文化有限责任公司怎么样? 上海火山石一期股权投资合伙企业(有限合伙)怎么样? 怎样把华为p20+pro的那个电话号码导到荣耀50 华为p20怎样搜索出保存在手机内的联系人 vivo Y55A 手机里的应用怎么转移到内存卡? 电话簿怎样导入华为P20手机? 诺基亚630手机如何安装中山证券的交易软件 matlab 如何绘制三维实体圆柱! 有线耳机被洗衣机洗了又甩干还能用吗 中山证券赢者手机交易版怎么下载下载的 中山证券行情软件哪里可以下载? 如何用matlab画长方体、圆柱体? 梦见猫咪吐血是怎么回事? 中山证券可以在哪些炒股软件上用 怎样用matlab画水平实心圆柱体,已知圆 中山证券官方网站,中山证券官方下载 梦见我家猫吐出好多虫子 MATLAB 画图 圆柱面 梦见猫吐食物快要死了 如何用matlab画一些杂乱的小圆柱体 谁知道中山证券小鹿金融怎么样? 中山证券里的股票怎么操作? 我梦到家里以前养了很多年的猫生病了还吐了,我还抱着它,还是跟以前一样*它。可是它己经丢失好久了 如何用matlab画圆柱体的相贯线 怎么把中山证券的同花顺交易帐号加入通达信交易软件里面来? Matlab cylinder 函数