📄 tfmatrix.m
字号:
function tfm = tfmatrix(tf)
% tfmatrix - build 4x4 transformation matrix for different steps
%
% FORMAT: tfm = tfmatrix(steps)
%
% Input fields:
%
% steps 1xN struct array with steps (in order of performance)
% .type one of
% - 't' / 'translate' - translation
% - 'r' / 'rotate' - rotation
% - 's' / 'scale' - scaling
% - 'h' / 'shear' - shearing
% .xyz 1x3 double for command
%
% Note: as with SPM, if a multi-rotation is given (rotation around
% more than one axis), rotation is performed in reverse order,
% first around Z axis, then around Y axis, and finally around X.
% angles must be specified in radiens.
% Version: v0.7a
% Build: 7080210
% Date: Aug-02 2007, 10:33 AM CEST
% Author: Jochen Weber, Brain Innovation, B.V., Maastricht, NL
% URL/Info: http://wiki.brainvoyager.com/BVQXtools
% argument check
if nargin < 1 || ...
~isstruct(tf) || ...
~isfield(tf, 'type') || ...
~isfield(tf, 'xyz')
if nargin > 0 && ...
isa(tf, 'double')
tf = tf(:)';
if numel(tf) < 7
tf(7:9) = 1;
end
tfi = [tf zeros(1, 3)];
tf = struct('type', 'h', 'xyz', tfi(10:12));
tf(2) = struct('type', 's', 'xyz', tfi( 7: 9));
tf(3) = struct('type', 'r', 'xyz', tfi( 4: 6));
tf(4) = struct('type', 't', 'xyz', tfi( 1: 3));
else
error( ...
'BVQXtools:BadArgument', ...
'Bad input argument supplied.' ...
);
end
end
tf = tf(:);
tfm = eye(4);
for c = 1:length(tf)
if ~ischar(tf(c).type) || ...
~isa(tf(c).xyz, 'double') || ...
numel(tf(c).xyz) ~= 3 || ...
any(isnan(tf(c).xyz) | isinf(tf(c).xyz))
error( ...
'BVQXtools:BadArgument', ...
'Bad input argument supplied.' ...
);
end
switch lower(tf(c).type(:)'), case {'t', 'translate'}
tfm = [[eye(3);0 0 0], [tf(c).xyz(:);1]] * tfm;
case {'r', 'rotate'}
r = tf(c).xyz(:);
if r(3) ~= 0
tfm = [cos(r(3)) sin(r(3)) 0 0; -sin(r(3)) cos(r(3)) 0 0; 0 0 1 0; 0 0 0 1] * tfm;
end
if r(2) ~= 0
tfm = [cos(r(2)) 0 sin(r(2)) 0; 0 1 0 0; -sin(r(2)) 0 cos(r(2)) 0; 0 0 0 1] * tfm;
end
if r(1) ~= 0
tfm = [1 0 0 0; 0 cos(r(1)) sin(r(1)) 0; 0 -sin(r(1)) cos(r(1)) 0; 0 0 0 1] * tfm;
end
case {'s', 'scale'}
tfm = diag([tf(c).xyz(:)', 1]) * tfm;
case {'h', 'shear'}
h = tf(c).xyz(:)';
tfm = [1 h(1:2) 0; 0 1 h(3) 0; 0 0 1 0; 0 0 0 1] * tfm;
otherwise
error( ...
'BVQXtools:BadArgument', ...
'Invalid transformation type: %s', ...
tf(c).type(:)' ...
);
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -