0001 function [imdl,distr] = GREIT3D_distribution(fmdl, vopt)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 if ischar(fmdl) && strcmp(fmdl,'UNIT_TEST'); do_unit_test; return; end
0037
0038 imdl = select_imdl(fmdl,{'Basic GN dif'});
0039 imdl = mk_voxel_volume(imdl,vopt);
0040 msm = imdl.rec_model.mdl_slice_mapper;
0041 imdl.rec_model.mdl_slice_mapper.y_pts = ...
0042 fliplr(imdl.rec_model.mdl_slice_mapper.y_pts);
0043 [x, y, z] = ndgrid(msm.x_pts, msm.y_pts, msm.z_pts);
0044
0045 IN = point_in_vox(imdl.rec_model,[x(:),y(:),z(:)]);
0046 distr = [x(IN),y(IN),z(IN)]';
0047
0048 function out = point_in_vox(fmdl,points, epsilon)
0049
0050 if nargin < 3
0051 epsilon = 0;
0052 end
0053
0054 levels = unique(fmdl.nodes(:,3));
0055 out = false(numel(points)/3,1);
0056
0057 opt.faces = true;
0058 fmdl = fix_model(fmdl, opt);
0059
0060 jnk.nodes = fmdl.nodes(:,1:2);
0061 jnk.type = 'fwd_model';
0062
0063 for i = 1:numel(levels)-1
0064 idx = (points(:,3) - levels(i)) > epsilon;
0065 idx = idx & ((levels(i+1) - points(:,3)) > epsilon);
0066
0067 nidx = fmdl.nodes(:,3) == levels(i);
0068 F = all(nidx(fmdl.faces),2);
0069 jnk.elems = fmdl.faces(F,:);
0070 bnd = find_boundary(jnk);
0071 bnd = order_loop(jnk.nodes(unique(bnd(:)),:));
0072 out(idx) = out(idx) | inpolygon(points(idx,1),points(idx,2),bnd(:,1),bnd(:,2));
0073 end
0074
0075 function do_unit_test
0076 [vh,vi] = test_fwd_solutions;
0077
0078 fmdl= ng_mk_cyl_models([4,1,.5],[16,1.5,2.5],[0.05]);
0079 fmdl= mystim_square(fmdl);
0080
0081 vopt.imgsz = [32 32];
0082 vopt.zvec = linspace( 0.5,3.5,7);
0083 vopt.save_memory = 1;
0084 opt.noise_figure = 2;
0085 [imdl,opt.distr] = GREIT3D_distribution(fmdl, vopt);
0086 imdl = mk_GREIT_model(imdl, 0.2, [], opt);
0087
0088 unit_test_cmp('RM size', size(imdl.solve_use_matrix.RM), [5136,928]);
0089 unit_test_cmp('RM', imdl.solve_use_matrix.RM(1,1:2), ...
0090 [8.573008430710381 -18.601036109804095], 1e-10);
0091
0092 img = inv_solve(imdl, vh, vi);
0093 unit_test_cmp('img size', size(img.elem_data), [5136,5]);
0094 [mm,ll] =max(img.elem_data(:,1));
0095 unit_test_cmp('img', [mm,ll], ...
0096 [0.582161052175761, 1308], 1e-10);
0097
0098 img.show_slices.img_cols = 1;
0099 subplot(131); show_fem(fmdl); title 'fmdl'
0100 subplot(132); show_slices(img,[inf,inf,2]); title 'centre';
0101 subplot(133); show_slices(img,[inf,inf,1.5]); title 'bottom';
0102
0103
0104 function fmdl = mystim_square(fmdl);
0105 [~,fmdl] = elec_rearrange([16,2],'square', fmdl);
0106 [fmdl.stimulation, fmdl.meas_select] = ...
0107 mk_stim_patterns(32,1,[0,5],[0,5],{},1);
0108
0109 function [vh,vi] = test_fwd_solutions;
0110 posns= linspace(1.0,3.0,5);
0111 str=''; for i=1:length(posns);
0112 extra{i} = sprintf('ball%03d',round(posns(i)*100));
0113 str = [str,sprintf('solid %s=sphere(0.5,0,%f;0.1); ', extra{i}, posns(i))];
0114 end
0115 extra{i+1} = str;
0116 fmdl= ng_mk_cyl_models([4,1,.2],[16,1.5,2.5],[0.05],extra);
0117 fmdl = mystim_square(fmdl);
0118
0119 img= mk_image(fmdl,1);
0120 vh = fwd_solve(img);
0121
0122 for i=1:length(posns);
0123 img= mk_image(fmdl,1);
0124 img.elem_data(fmdl.mat_idx{i+1}) = 2;
0125 vi{i} = fwd_solve(img);
0126 end;
0127 vi = [vi{:}];