83 lines
3.3 KiB
Matlab
83 lines
3.3 KiB
Matlab
function rotatedData = rotatePoints(alignmentVector, originalData)
|
|
|
|
% rotatedData = rotatePoints(alignmentVector, originalData) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
%
|
|
% Rotate the 'originalData' in the form of Nx2 or Nx3 about the origin by aligning the x-axis with the alignment vector
|
|
%
|
|
% Rdata = rotatePoints([1,2,-1], [Xpts(:), Ypts(:), Zpts(:)]) - rotate the (X,Y,Z)pts in 3D with respect to the vector [1,2,-1]
|
|
%
|
|
% Rotating using spherical components can be done by first converting using [dX,dY,dZ] = cart2sph(theta, phi, rho); alignmentVector = [dX,dY,dZ];
|
|
%
|
|
% Example:
|
|
% %% Rotate the point [3,4,-7] with respect to the following:
|
|
% %%%% Original associated vector is always [1,0,0]
|
|
% %%%% Calculate the appropriate rotation requested with respect to the x-axis. For example, if only a rotation about the z-axis is
|
|
% %%%% sought, alignmentVector = [2,1,0] %% Note that the z-component is zero
|
|
% rotData = rotatePoints(alignmentVector, [3,4,-7]);
|
|
%
|
|
% Author: Shawn Arseneau
|
|
% Created: Feb.2, 2006
|
|
%
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
alignmentDim = numel(alignmentVector);
|
|
DOF = size(originalData,2); %---- DOF = Degrees of Freedom (i.e. 2 for two dimensional and 3 for three dimensional data)
|
|
|
|
if alignmentDim~=DOF
|
|
error('Alignment vector does not agree with originalData dimensions');
|
|
end
|
|
if DOF<2 || DOF>3
|
|
error('rotatePoints only does rotation in two or three dimensions');
|
|
end
|
|
|
|
|
|
if DOF==2 % 2D rotation...
|
|
[rad_theta, rho] = cart2pol(alignmentVector(1), alignmentVector(2));
|
|
deg_theta = -1 * rad_theta * (180/pi);
|
|
ctheta = cosd(deg_theta); stheta = sind(deg_theta);
|
|
|
|
Rmatrix = [ctheta, -1.*stheta;...
|
|
stheta, ctheta];
|
|
rotatedData = originalData*Rmatrix;
|
|
|
|
else % 3D rotation...
|
|
[rad_theta, rad_phi, rho] = cart2sph(alignmentVector(1), alignmentVector(2), alignmentVector(3));
|
|
rad_theta = rad_theta * -1;
|
|
deg_theta = rad_theta * (180/pi);
|
|
deg_phi = rad_phi * (180/pi);
|
|
ctheta = cosd(deg_theta); stheta = sind(deg_theta);
|
|
Rz = [ctheta, -1.*stheta, 0;...
|
|
stheta, ctheta, 0;...
|
|
0, 0, 1]; %% First rotate as per theta around the Z axis
|
|
rotatedData = originalData*Rz;
|
|
|
|
[rotX, rotY, rotZ] = sph2cart(-1* (rad_theta+(pi/2)), 0, 1); %% Second rotation corresponding to phi
|
|
rotationAxis = [rotX, rotY, rotZ];
|
|
u = rotationAxis(:)/norm(rotationAxis); %% Code extract from rotate.m from MATLAB
|
|
cosPhi = cosd(deg_phi);
|
|
sinPhi = sind(deg_phi);
|
|
invCosPhi = 1 - cosPhi;
|
|
x = u(1);
|
|
y = u(2);
|
|
z = u(3);
|
|
Rmatrix = [cosPhi+x^2*invCosPhi x*y*invCosPhi-z*sinPhi x*z*invCosPhi+y*sinPhi; ...
|
|
x*y*invCosPhi+z*sinPhi cosPhi+y^2*invCosPhi y*z*invCosPhi-x*sinPhi; ...
|
|
x*z*invCosPhi-y*sinPhi y*z*invCosPhi+x*sinPhi cosPhi+z^2*invCosPhi]';
|
|
|
|
rotatedData = rotatedData*Rmatrix;
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|