141 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Matlab
		
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Matlab
		
	
	
| function arrowHandle = arrow3D(pos, deltaValues, colorCode, stemRatio, rhoRatio)
 | |
| 
 | |
| % arrowHandle = arrow3D(pos, deltaValues, colorCode, stemRatio) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | |
| % 
 | |
| %     Used to plot a single 3D arrow with a cylindrical stem and cone arrowhead
 | |
| %     pos = [X,Y,Z] - spatial location of the starting point of the arrow (end of stem)
 | |
| %     deltaValues = [QX,QY,QZ] - delta parameters denoting the magnitude of the arrow along the x,y,z-axes (relative to 'pos')
 | |
| %     colorCode - Color parameters as per the 'surf' command.  For example, 'r', 'red', [1 0 0] are all examples of a red-colored arrow
 | |
| %     stemRatio - The ratio of the length of the stem in proportion to the arrowhead.  For example, a call of:
 | |
| %                 arrow3D([0,0,0], [100,0,0] , 'r', 0.82) will produce a red arrow of magnitude 100, with the arrowstem spanning a distance
 | |
| %                 of 82 (note 0.82 ratio of length 100) while the arrowhead (cone) spans 18.  
 | |
| %     rhoRatio - The ratio of the cylinder radius (0.05 is the default)
 | |
| %     value)
 | |
| % 
 | |
| %     Example:
 | |
| %       arrow3D([0,0,0], [4,3,7]);  %---- arrow with default parameters
 | |
| %       axis equal;
 | |
| % 
 | |
| %    Author: Shawn Arseneau
 | |
| %    Created: September 14, 2006
 | |
| %    Updated: September 18, 2006
 | |
| % 
 | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | |
|     if nargin<2 || nargin>5     
 | |
|         error('Incorrect number of inputs to arrow3D');     
 | |
|     end
 | |
|     if numel(pos)~=3 || numel(deltaValues)~=3
 | |
|         error('pos and/or deltaValues is incorrect dimensions (should be three)');
 | |
|     end
 | |
|     if nargin<3                 
 | |
|         colorCode = 'interp';                             
 | |
|     end
 | |
|     if nargin<4                 
 | |
|         stemRatio = 0.75;                                   
 | |
|     end    
 | |
|     if nargin<5                 
 | |
|         rhoRatio = 0.05;                                   
 | |
|     end    
 | |
| 
 | |
|     X = pos(1); %---- with this notation, there is no need to transpose if the user has chosen a row vs col vector
 | |
|     Y = pos(2);
 | |
|     Z = pos(3);
 | |
|     
 | |
|     [sphi, stheta, srho] = cart2sph(deltaValues(1), deltaValues(2), deltaValues(3));  
 | |
|     
 | |
|     %******************************************* CYLINDER == STEM *********************************************
 | |
|     cylinderRadius = srho*rhoRatio;
 | |
|     cylinderLength = srho*stemRatio;
 | |
|     [CX,CY,CZ] = cylinder(cylinderRadius);      
 | |
|     CZ = CZ.*cylinderLength;    %---- lengthen
 | |
|     
 | |
|     %----- ROTATE CYLINDER
 | |
|     [row, col] = size(CX);      %---- initial rotation to coincide with X-axis
 | |
|     
 | |
|     newEll = rotatePoints([0 0 -1], [CX(:), CY(:), CZ(:)]);
 | |
|     CX = reshape(newEll(:,1), row, col);
 | |
|     CY = reshape(newEll(:,2), row, col);
 | |
|     CZ = reshape(newEll(:,3), row, col);
 | |
|     
 | |
|     [row, col] = size(CX);    
 | |
|     newEll = rotatePoints(deltaValues, [CX(:), CY(:), CZ(:)]);
 | |
|     stemX = reshape(newEll(:,1), row, col);
 | |
|     stemY = reshape(newEll(:,2), row, col);
 | |
|     stemZ = reshape(newEll(:,3), row, col);
 | |
| 
 | |
|     %----- TRANSLATE CYLINDER
 | |
|     stemX = stemX + X;
 | |
|     stemY = stemY + Y;
 | |
|     stemZ = stemZ + Z;
 | |
|     
 | |
|     %******************************************* CONE == ARROWHEAD *********************************************
 | |
|     coneLength = srho*(1-stemRatio);
 | |
|     coneRadius = cylinderRadius*1.5;
 | |
|     incr = 4;  %---- Steps of cone increments
 | |
|     coneincr = coneRadius/incr;    
 | |
|     [coneX, coneY, coneZ] = cylinder(cylinderRadius*2:-coneincr:0);  %---------- CONE 
 | |
|     coneZ = coneZ.*coneLength;
 | |
|     
 | |
|     %----- ROTATE CONE 
 | |
|     [row, col] = size(coneX);    
 | |
|     newEll = rotatePoints([0 0 -1], [coneX(:), coneY(:), coneZ(:)]);
 | |
|     coneX = reshape(newEll(:,1), row, col);
 | |
|     coneY = reshape(newEll(:,2), row, col);
 | |
|     coneZ = reshape(newEll(:,3), row, col);
 | |
|     
 | |
|     newEll = rotatePoints(deltaValues, [coneX(:), coneY(:), coneZ(:)]);
 | |
|     headX = reshape(newEll(:,1), row, col);
 | |
|     headY = reshape(newEll(:,2), row, col);
 | |
|     headZ = reshape(newEll(:,3), row, col);
 | |
|     
 | |
|     %---- TRANSLATE CONE
 | |
|     V = [0, 0, srho*stemRatio];    %---- centerline for cylinder: the multiplier is to set the cone 'on the rim' of the cylinder
 | |
|     Vp = rotatePoints([0 0 -1], V);
 | |
|     Vp = rotatePoints(deltaValues, Vp);
 | |
|     headX = headX + Vp(1) + X;
 | |
|     headY = headY + Vp(2) + Y;
 | |
|     headZ = headZ + Vp(3) + Z;
 | |
|     %************************************************************************************************************    
 | |
|     hStem = surf(stemX, stemY, stemZ, 'FaceColor', colorCode, 'EdgeColor', 'none'); 
 | |
|     hold on;  
 | |
|     hHead = surf(headX, headY, headZ, 'FaceColor', colorCode, 'EdgeColor', 'none');
 | |
|     
 | |
|     if nargout==1   
 | |
|         arrowHandle = [hStem, hHead]; 
 | |
|     end
 | |
|     
 | |
|     
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 |