Description |
If you have two polygons and want two masks, you can just call poly2mask separately on each polygon. Now imagine these two 2D polygons are hovering at Z=1 and Z=10, and you want to make a mask *volume* along the slices Z=1:10. For that, you want blendedPolyMask.
BLENDEDPOLYMASK Creates a 3D mask "lofted" from a set of polygons
BW = BLENDEDPOLYMASK(C,X,Y,Z) returns a logical volume of size equal to
[length(Y) length(X) length(Z)]. C is a cell array of N-by-3 XYZ
coordinates specifying individual (planar) XY polygons. The first
Z-coordinate of each polygon in C specifies its planar location. X, Y
and Z are vectors specifying pixel locations in the 3D output volume.
The output BW is a "loft" from one polygon to the next. Interpolation
between polygons is done via the distance function of the masks at each
neighbouring polygon. The IP toolbox BWDIST function is required.
Example:
[circXY(:,1),circXY(:,2)] = pol2cart(linspace(0,2*pi,50)', 1);
sqXY = [-1 -1;1 -1;1 1;-1 1; -1 -1];
C = {[sqXY*5 ones(5,1)] % Start with a small square
[circXY*40 ones(50,1)*30] % Blend to a large circle
[sqXY*20 ones(5,1)*65] % Blend to a large square
[circXY*10 ones(50,1)*99]}; % Blend to a small circle
X = linspace(-40, 40, 200);
Y = linspace(-40, 40, 200);
Z = linspace(0, 100, 400);
BW = blendedPolymask(C,X,Y,Z);
figure, patch(isosurface(X,Y,Z,BW,0.5),'FaceColor','g','EdgeColor','none','FaceAlpha',0.5)
view(3), camlight, hold on, axis image
cellfun(@(x)patch(x(:,1),x(:,2),x(:,3),'b'),C) |