matlab中如何转动三维图_MATLAB小技巧之:绕任意空间轴旋转三维图形

x=1:0.1:10;

y=sin(x);

c=cosd(15);

s=sind(15);

X=x*c-y*s;

Y=x*s+y*c;

plot(x,y)

hold on

plot(X,Y)

这就是新的坐标:

Xr=X*c-Y*s;

Yr=X*s+Y*c;

这样保存:

xlswrite('Newdata',Xr,'Sheet1','A1:A2716');

xlswrite('Newdata',Yr,'Sheet1','B1:B2716');

-----------------------------------------------------------

MATLAB小技巧之七:绕任意空间轴旋转三维图形

2011年10月25日 16:05:51

本小技巧原帖在:http://www.matlabsky.com/thread-18841-1-1.html

在计算图形学中,会经常涉及两种变化:

一是:三维几何变换。就是在同一个坐标系中,对图形进行旋转,缩放,平移等,其中任意轴旋转比较麻烦!

二是:三维坐标变换。就是在不同的坐标系中观察同一物体,从一个坐标系的坐标转换在另外一个坐标系的坐标。比如我在绘制三维图形的时候有事需要建立局部坐标系,那么这里就涉及到全局坐标系和局部坐标系的数据转换了。

坐标变换比几何变化复杂很多,这次不讨论哦。另外一个复杂的变换可以通过一些简单的变化组成,比如任意轴旋转就可以分解为平移、绕坐标轴旋转完成。

关于具体的理论推导我们也不讨论了,感兴趣的朋友可以查看相关《计算机图形学》教材。至于平移和缩放就更加简单了,只要右乘一个变换矩阵(矩阵的内容请查看相关书籍)就可以。下面我给出图形绕任意三维轴旋转的MATLAB代码。

clc

clear

close all

% 随机生成转轴通过的点

origin=rand(1,3)*10;

% 随机生成转轴方向

direct=rand(1,3)*10;

% 随机生成旋转角度

theta=rand*5;

[x,y,z]=peaks;

%% 图形比较

% 使用MATLAB自带rotate函数

figure

mesh(x,y,z);

hold on

h=mesh(x,y,z);

% rotate函数中角单位是角度

rotate(h,direct,rad2deg(theta),origin)

title('使用MATLAB自带rotate函数')

% 使用自己编写的rot3d函数

figure

mesh(x,y,z)

hold on

P=[x(:),y(:),z(:)];

Pr=rot3d(P,origin,direct,theta);

xr=reshape(Pr(:,1),size(x));

yr=reshape(Pr(:,2),size(x));

zr=reshape(Pr(:,3),size(x));

mesh(xr,yr,zr);

title('使用自己编写rot3d函数')

%% 数据比较

% 使用MATLAB自带rotate函数

% 由于该函数直接将图形旋转,如果想得到旋转之后的数据

% 此时可以使用get函数直接从图形的xdata,ydata和zdata属性中获取

xq=get(h,'xdata');

yq=get(h,'ydata');

zq=get(h,'zdata');

% 使用自己编写的rot3d函数

% 该函数自动返回旋转的数据而不是图形

% 也就是上面的xr,yr,zr

% 现在比较两组数据是否一致

disp('坐标Y的最大差距')

max(max(abs(yq-yr)))

disp('坐标X的最大差距')

max(max(abs(xq-xr)))

disp('坐标Z的最大差距')

max(max(abs(zq-zr)))

我们下面验证下我们的效果,MATLAB中提供了rotate函数进行图形旋转,但是可惜的是不会返回旋转后的坐标数据。

function Pr=ro

你可能感兴趣的:(matlab中如何转动三维图)