📄 vmr_coordinateframe.m
字号:
function vmrc = vmr_CoordinateFrame(hfile, opts)
% VMR::CoordinateFrame - generate coordinate matrices of VMR
%
% FORMAT: vmrc = vmr.CoordinateFrame([opts]);
%
% Input fields:
%
% opts optional struct with settings
% .dirs compute directions (default true)
% .first compute coordinate of first voxel (default false)
% .ndgrid run ndgrid with VMR resolution (default false)
% .offsize get start/end pos (offset + size, default true)
% .origin compute origin (center of STC data, default true)
% .trans compute transformation matrix (default true)
% .transinv compute inverse matrix (default false)
% Version: v0.7b
% Build: 7090217
% Date: Sep-02 2007, 5:08 PM CEST
% Author: Jochen Weber, Brain Innovation, B.V., Maastricht, NL
% URL/Info: http://wiki.brainvoyager.com/BVQXtools
% argument check
if nargin < 1 || ...
numel(hfile) ~= 1 || ...
~isBVQXfile(hfile, 'vmr')
error( ...
'BVQXfile:BadArgument', ...
'Invalid call to %s.', ...
mfilename ...
);
end
bc = bvqxfile_getcont(hfile.L);
if nargin < 2 || ...
~isstruct(opts) || ...
numel(opts) ~= 1
opts = struct;
end
if ~isfield(opts, 'dirs') || ...
~islogical(opts.dirs) || ...
isempty(opts.dirs)
opts.dirs = true;
else
opts.dirs = opts.dirs(1);
end
if ~isfield(opts, 'first') || ...
~islogical(opts.first) || ...
isempty(opts.first)
opts.first = false;
else
opts.first = opts.first(1);
end
if ~isfield(opts, 'ndgrid') || ...
~islogical(opts.ndgrid) || ...
isempty(opts.ndgrid)
opts.ndgrid = false;
else
opts.ndgrid = opts.ndgrid(1);
end
if ~isfield(opts, 'offsize') || ...
~islogical(opts.offsize) || ...
isempty(opts.offsize)
opts.offsize = true;
else
opts.offsize = opts.offsize(1);
end
if ~isfield(opts, 'origin') || ...
~islogical(opts.origin) || ...
isempty(opts.origin)
opts.origin = true;
else
opts.origin = opts.origin(1);
end
if ~isfield(opts, 'trans') || ...
~islogical(opts.trans) || ...
isempty(opts.trans)
opts.trans = true;
else
opts.trans = opts.trans(1);
end
if ~isfield(opts, 'transinv') || ...
~islogical(opts.transinv) || ...
isempty(opts.transinv)
opts.transinv = false;
else
opts.transinv = opts.transinv(1);
end
% get resolution
rsx = bc.VoxResX;
rsy = bc.VoxResY;
rsz = bc.VoxResZ;
dmx = bc.DimX;
dmy = bc.DimY;
dmz = bc.DimZ;
% get slice centers
cs1 = [bc.Slice1CenterX; bc.Slice1CenterY; bc.Slice1CenterZ];
csn = [bc.SliceNCenterX; bc.SliceNCenterY; bc.SliceNCenterZ];
css = mean([cs1, csn], 2);
drs = csn - cs1;
drs = drs ./ sqrt(sum(drs .* drs));
% get directions
drx = [bc.RowDirX; bc.RowDirY; bc.RowDirZ];
dry = [bc.ColDirX; bc.ColDirY; bc.ColDirZ];
drx = drx ./ sqrt(sum(drx .* drx));
dry = dry ./ sqrt(sum(dry .* dry));
drz = -cross(drx, dry);
cnv = 1;
if sum(drs .* drz) < 0
drz = -drz;
cnv = 0;
end
if abs(sum(drs .* drz) - 1) > 0.01
error( ...
'BVQXfile:InvalidObject', ...
'Fields Slice*Center* and ***Dir* don''t match.' ...
);
end
trf = [[drx, dry, drz, css]; [0, 0, 0, 1]];
% build output
vmrc = struct;
% set resolution
vmrc.DimX = dmx;
vmrc.DimY = dmy;
vmrc.DimZ = dmz;
% set directions
if opts.dirs
vmrc.DirC = cnv;
vmrc.DirX = drx;
vmrc.DirY = dry;
vmrc.DirZ = drz;
end
% compute origin
if opts.first
fst = cs1 - ((rsx - 1) * dmx / 2) * drx + ((rsy - 1) * dmy / 2) * dry;
vmrc.First = fst;
end
% ndgrid
if opts.ndgrid
[opts.NDgrid{1:3}] = ndgrid(0:(rsx - 1), 0:(rsy - 1), 0:(rsz - 1));
end
% inverse transformation
if opts.transinv
vmrc.InverseTrans = inv(trf);
end
% get offset and size
if opts.offsize
if isfield(bc, 'OffsetX')
vmro = [bc.OffsetX, bc.OffsetY, bc.OffsetZ];
else
vmro = [0, 0, 0];
end
vmrc.OffSize = [vmro; vmro + [dmx, dmy, dmz] - 1];
end
% set origin
if opts.origin
vmrc.Origin = css;
end
% set resolution
fmrc.ResX = rsx;
fmrc.ResY = rsy;
fmrc.ResZ = rsz;
% set trans
if opts.trans
vmrc.Trans = trf;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -