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