注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

东南隅

wantnon的blog

 
 
 

日志

 
 
 
 

三维定轴旋转  

2009-08-22 22:22:06|  分类: matlab |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

设过原点的轴的方向向量为A(单位向量),则空间中一点P绕此轴旋转image 角到P’,公式为:
image
image的方向由螺旋定则判断:在右手系中用右手螺旋,在左手系中用左手螺旋。
封装成一个matlab函数:

function Q=rot3(P,n,a)
%点P绕轴n旋转a角得到Q
%其中n为单位向量,a为弧度
%旋转方向的确定:在左手系中用左手螺旋法则,右手系中用右手螺旋法则
%请自行保证n为单位向量,函数对此不作检查
Q = P*cos(a) + cross(n,P)*sin(a) + n*dot(n,P)*(1 - cos(a));
end

此函数是对单个点进行旋转的,如果要对点阵进行旋转,用下面函数:

function [X1,Y1,Z1]=rot3m(X,Y,Z,n,a)
%点阵(X,Y,Z)绕轴n旋转a角得到点阵(X1,Y1,Z1)
%其中n为单位向量,a为弧度
%X,Y,Z为相同尺寸的矩阵,
%旋转方向的确定:在左手系中用左手螺旋法则,右手系中用右手螺旋法则
%请自行保证n为单位向量,函数对此不作检查
X1=[];
Y1=[];
Z1=[];
for i=1:size(Z,1)
    for j=1:size(Z,2)
        tQ=rot3([X(i,j),Y(i,j),Z(i,j)],n,a);
        X1(i,j)=tQ(1);
        Y1(i,j)=tQ(2);
        Z1(i,j)=tQ(3);
    end
end
end

下面测试一个例子:
设有一半径为0.5的球体,中心在P(1,2,3),
使用rot3m将其绕过原点的向量(1,1,1)/sqrt(3)旋转60度到Q:
(旋转的不只是球心,还有球上各点)

P=[1,2,3];%原像球心
r=0.5;%原像半径
%生成原像球体
[X,Y,Z]=sphere();
X=r*X+P(1);
Y=r*Y+P(2);
Z=r*Z+P(3);
mesh(X,Y,Z);%画原像球体
hold on;
text(P(1)+r,P(2)+r,P(3)+r,'P');%原像标签
n=[1,1,1]/sqrt(3);%旋转轴
a=pi/3;%旋转角度
Q=rot3(P,n,a);%球心旋转到Q
[X1,Y1,Z1]=rot3m(X,Y,Z,n,a);%生成像
mesh(X1,Y1,Z1);%画像球体
text(Q(1)+r,Q(2)+r,Q(3)+r,'Q');%像的标签
F=plane_nP(n,P);%求旋转面
C=rayXplane([0 0 0],n,F);%求旋转面与旋转轴的交点C
text(C(1),C(2),C(3),'C');%交点标签
patch([P(1);Q(1);C(1)],[P(2);Q(2);C(2)],[P(3);Q(3);C(3)],[0.5 0.5 0.5]);%画三角面PQC
axis equal;%等比例
%设定轴范围
xlim([0 4]);
ylim([0 4]);
zlim([0 4]);
%轴标签
xlabel('X');
ylabel('Y');
zlabel('Z');
alpha(0.3);%设置网格透明度
arrow3([0 0 0],n);%画轴向量,一定要放在axis equal及xlim,ylim,zlim之后
plot3([0 5],[0 5],[0 5],'--b');%画轴所在虚线

运行结果:
image
图中箭头为向量(1,1,1)/sqrt(3),PQC为旋转平面,C为旋转点,PQC垂直于旋转轴。

  评论这张
 
阅读(48)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018