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 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 |