⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tfmatrix.m

📁 toolbox of BVQX, This is the access between BV and matlab. It will help you to analysis data from BV
💻 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 + -