# help converting 2D rotating affine matrix to 3D rotating (matlab / octave code)

Greetings All I have a function that creates an affine matrix that works for 2D rotation around an arbitrary point but now I would like it to work for 3D rotations also. The working function example is below with it's example function:

%affine matrix rotation about a point rtaffine[theta,rpx,rpy,sigx,sigy,sigz]
%crx cry rpx rpy represent center of rotation
function [rotsig,theta,crpx,crpy,sigx,sigy,sigz] = rtaffine(theta,rpx,rpy,sigx,sigy,sigz) %format in rrtaffine[theta,rpx,rpy,sigx,sigy,sigz]
rotsig=[];
%affinematrix=[];
siga=[sigx;sigy;sigz];

r00 = cosd(theta); r01 = -sind(theta); r10 = sind(theta); r11 = cosd(theta);
affinematrix = [r00, r01, rpx(1,1) - r00*rpx(1,1) - r01*rpy(1,1);...
r10, r11, rpy(1,1) - r10*rpx(1,1) - r11*rpy(1,1);...
0, 0, 1];
rotsig=affinematrix*siga; %new affine matrix
endfunction


Example code to use with function below:

clear all, clc,clf,tic
t= linspace(0,2*pi,1000); %from 0 to 1 with 100 equal spaces between
freq=1;
y=sin(freq*(t)); %pi will change phase of angle (t+pi)
y2=sin(freq*(t)); %pi will change phase of angle (t+pi)
z = ones(size(y));
siga=[t;y;z];
siga2=[t;y2;z];
rpcalc=[t(1,size(t,2)/2),0]; %size(b,2) %will count all the rows with a 1, count all colmns with 2
rp=[t(1,size(t,2)/2),0]; %rotation point half way on x/t axis
rotsigt=[];
for theta=0:1:360
rotsig=rtaffine(theta,rp(1,1),rp(1,2),siga(1,:),siga(2,:),siga(3,:));
rotsig2=rtaffine((theta*2),rp(1,1),rp(1,2),siga(1,:),siga(2,:),siga(3,:));
rotsigcomb=rotsig+rotsig2;
axis([-10 15 -10 10])
plot(0,0,'g*',rp(1,1),rp(1,2),'r*',rotsig(1,:),rotsig(2,:),'b-',rotsig2(1,:),rotsig2(2,:),'r',rotsigcomb(1,:),rotsigcomb(2,:),'g')
%plot(0,0,'g*',rp(1,1),rp(1,2),'r*',rotsigcomb(1,:),rotsigcomb(2,:),rotsig2(1,:),rotsig2(2,:))
axis([-10 15 -10 10])
title(['Phase Shift is ',num2str(theta),' deg']);
grid on
pause(.001)
%rotsigt=[rotsigt(:,:),rotsig(:,:)];
end
fprintf('- Complete re-import test in %4.4fsec or %4.4fmins\n',toc,toc/60);


Any suggestions?

-
First suggestion: Remove all those "tia sal22" from your questions. They are only annoying. ;) – Hans Lundmark Mar 18 '11 at 11:28
pick an axis, a point, and an angle. translate to origin, rotate by angle around axis, move back. the rotation matrix looks like (in the basis of the axis of rotation and the plance perpendicular to it) $$\left( \begin{array}{ccc} 1 & 0 & 0 \\ 0 & \cos\theta & -\sin\theta \\ 0 & \sin\theta & \cos\theta \end{array} \right)$$ sorry I can't wade through your code – yoyo Mar 18 '11 at 15:38
the way to do this is 1) Translate point you want to rotate about to origin (0,0) 2) Rotate signal 3) Translate signal back to original position – Rick T Mar 26 '11 at 0:10