function astra_geom_visualize(proj_geom, vol_geom) if strcmp(proj_geom.type,'parallel') || strcmp(proj_geom.type,'fanflat') ||strcmp(proj_geom.type,'parallel3d') || strcmp(proj_geom.type,'cone') proj_geom = astra_geom_2vec(proj_geom); end % open window f = figure('Visible','off'); hold on % display projection 1 displayProjection(1); % label txt = uicontrol('Style','text', 'Position',[10 10 70 20], 'String','Projection'); % slider anglecount = size(proj_geom.Vectors,1); sld = uicontrol('Style', 'slider', ... 'Min', 1, 'Max', anglecount, 'SliderStep', [1 1]/anglecount, 'Value', 1, ... 'Position', [80 10 200 20], ... 'Callback', @updateProjection); f.Visible = 'on'; function updateProjection(source, callbackdata) displayProjection(floor(source.Value)); end function displayProjection(a) colours = get(gca,'ColorOrder'); % set title title(['projection ' num2str(a)]); if strcmp(proj_geom.type,'parallel_vec') v = proj_geom.Vectors; d = proj_geom.DetectorCount; if ~isfield(vol_geom, 'option') minx = -vol_geom.GridRowCount/2; miny = -vol_geom.GridColCount/2; minz = -vol_geom.GridSliceCount/2; maxx = vol_geom.GridRowCount/2; else minx = vol_geom.option.WindowMinX; miny = vol_geom.option.WindowMinY; maxx = vol_geom.option.WindowMaxX; maxy = vol_geom.option.WindowMaxY; end % axis cla axis([minx maxx miny maxy]*2.25) axis square % volume plot([minx minx maxx maxx minx], [miny maxy maxy miny miny], 'LineWidth', 1, 'Color', colours(1,:)) % ray s = maxx - minx; plot([0 v(a,1)]*s*0.33, [0 v(a,2)]*s*0.33, 'LineWidth', 2, 'Color', colours(3,:)) % detector s2 = s*0.75; plot([-d/2 d/2]*v(a,5) + v(a,3) + s2*v(a,1), [-d/2 d/2]*v(a,6) + v(a,4) + s2*v(a,2), 'LineWidth', 2, 'Color', colours(5,:)) elseif strcmp(proj_geom.type,'fanflat_vec') v = proj_geom.Vectors; d = proj_geom.DetectorCount; if ~isfield(vol_geom, 'option') minx = -vol_geom.GridRowCount/2; miny = -vol_geom.GridColCount/2; minz = -vol_geom.GridSliceCount/2; maxx = vol_geom.GridRowCount/2; else minx = vol_geom.option.WindowMinX; miny = vol_geom.option.WindowMinY; maxx = vol_geom.option.WindowMaxX; maxy = vol_geom.option.WindowMaxY; end % axis cla axis([minx maxx miny maxy]*2.25) axis square % volume plot([minx minx maxx maxx minx], [miny maxy maxy miny miny], 'LineWidth', 1, 'Color', colours(1,:)) % detector D1 = v(a,3:4) - d/2*v(a,5:6); D2 = v(a,3:4) + d/2*v(a,5:6); plot([D1(1) D2(1)], [D1(2) D2(2)], 'LineWidth', 2, 'Color', colours(5,:)) % beam plot([v(a,1) D1(1)], [v(a,2) D1(2)], 'LineWidth', 1, 'Color', colours(3,:)) plot([v(a,1) D2(1)], [v(a,2) D2(2)], 'LineWidth', 1, 'Color', colours(3,:)) elseif strcmp(proj_geom.type,'parallel3d_vec') v = proj_geom.Vectors; d1 = proj_geom.DetectorRowCount; d2 = proj_geom.DetectorColCount; if ~isfield(vol_geom, 'option') minx = -vol_geom.GridRowCount/2; miny = -vol_geom.GridColCount/2; minz = -vol_geom.GridSliceCount/2; maxx = vol_geom.GridRowCount/2; maxy = vol_geom.GridColCount/2; maxz = vol_geom.GridSliceCount/2; else minx = vol_geom.option.WindowMinX; miny = vol_geom.option.WindowMinY; minz = vol_geom.option.WindowMinZ; maxx = vol_geom.option.WindowMaxX; maxy = vol_geom.option.WindowMaxY; maxz = vol_geom.option.WindowMaxZ; end % axis windowminx = min(v(:,4)); windowminy = min(v(:,5)); windowminz = max(v(:,6)); windowmaxx = max(v(:,4)); windowmaxy = max(v(:,5)); windowmaxz = max(v(:,6)); cla axis([minx maxx miny maxy minz maxz]*5.10) % volume plot3([minx minx maxx maxx minx], [miny maxy maxy miny miny], [minz minz minz minz minz], 'LineWidth', 1, 'Color', colours(1,:)) plot3([minx minx maxx maxx minx], [miny maxy maxy miny miny], [maxz maxz maxz maxz maxz], 'LineWidth', 1, 'Color', colours(1,:)) plot3([minx minx], [miny miny], [minz maxz], 'LineWidth', 1, 'Color', colours(1,:)) plot3([maxx maxx], [miny miny], [minz maxz], 'LineWidth', 1, 'Color', colours(1,:)) plot3([minx minx], [maxy maxy], [minz maxz], 'LineWidth', 1, 'Color', colours(1,:)) plot3([maxx maxx], [maxy maxy], [minz maxz], 'LineWidth', 1, 'Color', colours(1,:)) % detector D1 = v(a,4:6) - d1/2*v(a,7:9) - d2/2*v(a,10:12); D2 = v(a,4:6) + d1/2*v(a,7:9) - d2/2*v(a,10:12); D3 = v(a,4:6) + d1/2*v(a,7:9) + d2/2*v(a,10:12); D4 = v(a,4:6) - d1/2*v(a,7:9) + d2/2*v(a,10:12); plot3([D1(1) D2(1) D3(1) D4(1) D1(1)], [D1(2) D2(2) D3(2) D4(2) D1(2)], [D1(3) D2(3) D3(3) D4(3) D1(3)], 'LineWidth', 2, 'Color', colours(5,:)) % ray s = maxx - minx; plot3([0 v(a,1)]*s*0.30, [0 v(a,2)]*s*0.30, [0 v(a,3)]*s*0.30, 'LineWidth', 2, 'Color', colours(3,:)) elseif strcmp(proj_geom.type,'cone_vec') v = proj_geom.Vectors; d1 = proj_geom.DetectorRowCount; d2 = proj_geom.DetectorColCount; if ~isfield(vol_geom, 'option') minx = -vol_geom.GridRowCount/2; miny = -vol_geom.GridColCount/2; minz = -vol_geom.GridSliceCount/2; maxx = vol_geom.GridRowCount/2; maxy = vol_geom.GridColCount/2; maxz = vol_geom.GridSliceCount/2; else minx = vol_geom.option.WindowMinX; miny = vol_geom.option.WindowMinY; minz = vol_geom.option.WindowMinZ; maxx = vol_geom.option.WindowMaxX; maxy = vol_geom.option.WindowMaxY; maxz = vol_geom.option.WindowMaxZ; end % axis windowminx = min(v(:,4)); windowminy = min(v(:,5)); windowminz = max(v(:,6)); windowmaxx = max(v(:,4)); windowmaxy = max(v(:,5)); windowmaxz = max(v(:,6)); cla axis([minx maxx miny maxy minz maxz]*5.10) % volume plot3([minx minx maxx maxx minx], [miny maxy maxy miny miny], [minz minz minz minz minz], 'LineWidth', 1, 'Color', colours(1,:)) plot3([minx minx maxx maxx minx], [miny maxy maxy miny miny], [maxz maxz maxz maxz maxz], 'LineWidth', 1, 'Color', colours(1,:)) plot3([minx minx], [miny miny], [minz maxz], 'LineWidth', 1, 'Color', colours(1,:)) plot3([maxx maxx], [miny miny], [minz maxz], 'LineWidth', 1, 'Color', colours(1,:)) plot3([minx minx], [maxy maxy], [minz maxz], 'LineWidth', 1, 'Color', colours(1,:)) plot3([maxx maxx], [maxy maxy], [minz maxz], 'LineWidth', 1, 'Color', colours(1,:)) % detector D1 = v(a,4:6) - d1/2*v(a,7:9) - d2/2*v(a,10:12); D2 = v(a,4:6) + d1/2*v(a,7:9) - d2/2*v(a,10:12); D3 = v(a,4:6) + d1/2*v(a,7:9) + d2/2*v(a,10:12); D4 = v(a,4:6) - d1/2*v(a,7:9) + d2/2*v(a,10:12); plot3([D1(1) D2(1) D3(1) D4(1) D1(1)], [D1(2) D2(2) D3(2) D4(2) D1(2)], [D1(3) D2(3) D3(3) D4(3) D1(3)], 'LineWidth', 2, 'Color', colours(5,:)) % beam plot3([v(a,1) D1(1)], [v(a,2) D1(2)], [v(a,3) D1(3)], 'LineWidth', 1, 'Color', colours(3,:)) plot3([v(a,1) D2(1)], [v(a,2) D2(2)], [v(a,3) D2(3)], 'LineWidth', 1, 'Color', colours(3,:)) plot3([v(a,1) D3(1)], [v(a,2) D3(2)], [v(a,3) D3(3)], 'LineWidth', 1, 'Color', colours(3,:)) plot3([v(a,1) D4(1)], [v(a,2) D4(2)], [v(a,3) D4(3)], 'LineWidth', 1, 'Color', colours(3,:)) else error('invalid projector type') end end end