Codebase list octave-iso2mesh / lintian-fixes/main surf2volz.m
lintian-fixes/main

Tree @lintian-fixes/main (Download .tar.gz)

surf2volz.m @lintian-fixes/mainraw · history · blame

function img=surf2volz(node,face,xi,yi,zi)
%
% img=surf2volz(node,face,xi,yi,zi)
%
% convert a triangular surface to a shell of voxels in a 3D image
% along the z-axis
%
% author: Qianqian Fang (q.fang at neu.edu)
%
% input:
%	 node: node list of the triangular surface, 3 columns for x/y/z
%	 face: triangle node indices, each row is a triangle
%	 xi,yi,zi: x/y/z grid for the resulting volume
%
% output:
%	 img: a volumetric binary image at position of ndgrid(xi,yi,zi)
%
% -- this function is part of iso2mesh toolbox (http://iso2mesh.sf.net)
%

ne=size(face,1);
img=zeros(length(xi),length(yi),length(zi),'uint8');

dx0=min(abs(diff(xi)));
dx=dx0/2;
dy0=min(abs(diff(yi)));
dy=dy0/2;
dz0=min(abs(diff(zi)));

dl=sqrt(dx*dx+dy*dy);

minz=min(node(:,3));
maxz=max(node(:,3));
iz=hist([minz,maxz],zi);
hz=find(iz);
iz=hz(1):min(length(zi),hz(end)+1);

for i=1:length(iz);
    plane=[0 100 zi(iz(i)); 100 0 zi(iz(i)); 0 0 zi(iz(i))];
    [bcutpos,bcutvalue,bcutedges]=qmeshcut(face(:,1:3),node,node(:,1),plane);
    if(isempty(bcutpos))
        continue;
    end
    enum=size(bcutedges,1);
    for j=1:enum
        e0=bcutpos(bcutedges(j,1),1:2);
        e1=bcutpos(bcutedges(j,2),1:2);
        len=ceil(sum(abs(e1-e0))/(abs(dx)+abs(dy)))+1;
        dd=(e1-e0)/len;

        posx= floor(((e0(1)+(0:len)*dd(1)-xi(1)))/dx0)';
        posy= floor(((e0(2)+(0:len)*dd(2)-yi(1)))/dy0)';
        pos=[posx, posy];
        pos(find(posx>length(xi) | posy>length(yi) | posx<=0|posy<=0), :)=[];

        if(length(pos)>0)
            zz=floor(((zi(iz(i))-zi(1)))/dz0);
            for k=1:size(pos,1)
                img(pos(k,1),pos(k,2),zz)=1;
            end
          %img(sub2ind(size(img),pos(:,1),pos(:,2),i*ones(size(pos,1),1)))=1;
        end
    end
end