CREATESCALING3D Create the 4x4 matrix of a 3D scaling. TRANS = createScaling3d(S); returns the scaling transform corresponding to a scaling factor S in each direction. S can be a scalar, or a 1-by-3 vector containing the scaling factor in each direction. TRANS = createScaling3d(SX, SY, SZ); returns the scaling transform corresponding to a different scaling factor in each direction. The returned matrix has the form : [SX 0 0 0] [ 0 SY 0 0] [ 0 0 SZ 0] [ 0 0 0 0] See also: transforms3d, transformPoint3d, transformVector3d, createTranslation3d, createRotationOx, createRotationOy, createRotationOz
0001 function trans = createScaling3d(varargin) 0002 %CREATESCALING3D Create the 4x4 matrix of a 3D scaling. 0003 % 0004 % TRANS = createScaling3d(S); 0005 % returns the scaling transform corresponding to a scaling factor S in 0006 % each direction. S can be a scalar, or a 1-by-3 vector containing the 0007 % scaling factor in each direction. 0008 % 0009 % TRANS = createScaling3d(SX, SY, SZ); 0010 % returns the scaling transform corresponding to a different scaling 0011 % factor in each direction. 0012 % 0013 % The returned matrix has the form : 0014 % [SX 0 0 0] 0015 % [ 0 SY 0 0] 0016 % [ 0 0 SZ 0] 0017 % [ 0 0 0 0] 0018 % 0019 % See also: 0020 % transforms3d, transformPoint3d, transformVector3d, createTranslation3d, 0021 % createRotationOx, createRotationOy, createRotationOz 0022 0023 % 0024 % --------- 0025 % author : David Legland 0026 % INRA - TPV URPOI - BIA IMASTE 0027 % created the 20/04/2006. 0028 % 0029 0030 % HISTORY 0031 % 25/11/2008 rename from scale3d to scaling3d 0032 % 30/04/2009 rename to createScaling3d 0033 0034 0035 %% default arguments 0036 sx = 1; 0037 sy = 1; 0038 sz = 1; 0039 center = [0 0 0]; 0040 0041 %% process input parameters 0042 if nargin == 1 0043 % only one argument -> scaling factor 0044 [sx, sy, sz]= parseScalingFactors(varargin{1}); 0045 0046 elseif nargin == 2 0047 % 2 arguments, giving center and uniform scaling 0048 center = varargin{1}; 0049 [sx, sy, sz]= parseScalingFactors(varargin{2}); 0050 0051 elseif nargin == 3 0052 % 3 arguments, giving scaling in each direction 0053 sx = varargin{1}; 0054 sy = varargin{2}; 0055 sz = varargin{3}; 0056 0057 elseif nargin == 4 0058 % 4 arguments, giving center and scaling in each direction 0059 center = varargin{1}; 0060 sx = varargin{2}; 0061 sy = varargin{3}; 0062 sz = varargin{4}; 0063 end 0064 0065 %% create the scaling matrix 0066 trans = [... 0067 sx 0 0 center(1)*(1-sx);... 0068 0 sy 0 center(2)*(1-sy);... 0069 0 0 sz center(3)*(1-sz);... 0070 0 0 0 1]; 0071 0072 %% Helper function 0073 function [sx, sy, sz] = parseScalingFactors(var) 0074 0075 if length(var)==1 0076 % same scaling factor in each direction 0077 sx = var; 0078 sy = var; 0079 sz = var; 0080 elseif length(var)==3 0081 % scaling is a vector, giving different scaling in each direction 0082 sx = var(1); 0083 sy = var(2); 0084 sz = var(3); 0085 else 0086 error('wrong size for first parameter of "createScaling3d"'); 0087 end