0001 function [xyz,F] = vb_get_boundary_mesh(v,vlevel)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 if nargin < 2, vlevel = 0.5; end;
0015
0016 [N1, N2, N3]=size(v);
0017
0018 siz=[N1 N2 N3];
0019
0020
0021
0022
0023 jw = 1:(N1-1);
0024 je = 2:N1;
0025
0026 jn = 1:(N2-1);
0027 js = 2:N2;
0028
0029 jd = 1:(N3-1);
0030 ju = 2:N3;
0031
0032
0033 vb = zeros(N1+1, N2+1, N3+1);
0034 vx = zeros(N1+1, N2+1, N3+1);
0035 vy = zeros(N1+1, N2+1, N3+1);
0036 vz = zeros(N1+1, N2+1, N3+1);
0037
0038 F =[];
0039
0040
0041
0042 vw = zeros(N1+1, N2+1, 1);
0043 vn = zeros(N1+1, N2+1, 1);
0044 vd = zeros(N1+1, 1, N3+1);
0045
0046
0047
0048 for n=1:N3,
0049
0050 iw = find( (v(jw,:,n)-vlevel) .* (v(je,:,n)-vlevel) <= 0 );
0051
0052 if ~isempty(iw),
0053
0054 [j1,j2,j3] = ind2sub([N1-1,N2,1], iw );
0055 jw1 = sub2ind([N1+1,N2+1], j1+1,j2 );
0056 jw2 = sub2ind([N1+1,N2+1], j1+1,j2+1);
0057 vw = zeros(N1+1, N2+1, 1);
0058
0059 vw(jw1) = 1;
0060 vx(:,:,n) = vx(:,:,n) + vw;
0061
0062 vw(jw2) = vw(jw2) + 1;
0063 vb(:,:,n) = vb(:,:,n) + vw;
0064 vb(:,:,n+1) = vb(:,:,n+1) + vw;
0065 end;
0066
0067
0068 iw = find( (v(:,jn,n)-vlevel) .* (v(:,js,n)-vlevel) <= 0 );
0069
0070 if ~isempty(iw),
0071
0072 [j1,j2,j3] = ind2sub([N1,N2-1,1], iw );
0073 jw1 = sub2ind([N1+1,N2+1], j1, j2+1);
0074 jw2 = sub2ind([N1+1,N2+1], j1+1,j2+1);
0075 vw = zeros(N1+1, N2+1, 1);
0076
0077 vw(jw1) = 1;
0078 vy(:,:,n) = vy(:,:,n) + vw;
0079
0080 vw(jw2) = vw(jw2) + 1;
0081 vb(:,:,n) = vb(:,:,n) + vw;
0082 vb(:,:,n+1) = vb(:,:,n+1) + vw;
0083 end;
0084 end;
0085
0086 for n=1:N2,
0087
0088 id = find( (v(:,n,jd)-vlevel) .* (v(:,n,ju)-vlevel) <= 0 );
0089
0090 if ~isempty(id),
0091
0092 [j1,j2,j3] = ind2sub([N1, 1, N3-1], id );
0093 j2(:) = 1;
0094 jw1 = sub2ind([N1+1,1,N3+1], j1, j2,j3+1);
0095 jw2 = sub2ind([N1+1,1,N3+1], j1+1,j2,j3+1);
0096
0097 vd = zeros(N1+1,1,N3+1);
0098 vd(jw1) = 1;
0099 vz(:,n,:) = vz(:,n,:) + vd;
0100
0101 vd(jw2) = vd(jw2) + 1;
0102 vb(:,n ,:) = vb(:,n ,:) + vd;
0103 vb(:,n+1,:) = vb(:,n+1,:) + vd;
0104 end;
0105 end;
0106
0107
0108
0109
0110 ix = find( vb > 0 );
0111 NB = length(ix);
0112
0113
0114 vb(ix) = 1:NB;
0115
0116
0117 [kx,ky,kz] = ind2sub([N1+1, N2+1, N3+1], ix );
0118
0119 xyz=[kx-1 ,ky-1 ,kz-1 ];
0120
0121
0122 iw = find( vx > 0 );
0123
0124 [j1,j2,j3] = ind2sub([N1+1, N2+1, N3+1], iw );
0125
0126
0127 jw1 = sub2ind([N1+1,N2+1,N3+1], j1,j2+1,j3 );
0128 jw2 = sub2ind([N1+1,N2+1,N3+1], j1,j2 ,j3+1);
0129 jw3 = sub2ind([N1+1,N2+1,N3+1], j1,j2+1,j3+1);
0130
0131
0132 F=[F; vb(iw),vb(jw1),vb(jw2) ; vb(jw1),vb(jw2),vb(jw3)];
0133
0134
0135 iw = find( vy > 0 );
0136
0137 [j1,j2,j3] = ind2sub([N1+1, N2+1, N3+1], iw );
0138
0139
0140 jw1 = sub2ind([N1+1,N2+1,N3+1], j1+1,j2,j3 );
0141 jw2 = sub2ind([N1+1,N2+1,N3+1], j1 ,j2,j3+1);
0142 jw3 = sub2ind([N1+1,N2+1,N3+1], j1+1,j2,j3+1);
0143
0144
0145 F=[F; vb(iw),vb(jw1),vb(jw2) ; vb(jw1),vb(jw2),vb(jw3)];
0146
0147
0148 iw = find( vz > 0 );
0149
0150 [j1,j2,j3] = ind2sub([N1+1, N2+1, N3+1], iw );
0151
0152
0153 jw1 = sub2ind([N1+1,N2+1,N3+1], j1+1,j2 ,j3);
0154 jw2 = sub2ind([N1+1,N2+1,N3+1], j1 ,j2+1,j3);
0155 jw3 = sub2ind([N1+1,N2+1,N3+1], j1+1,j2+1,j3);
0156
0157
0158 F=[F; vb(iw),vb(jw1),vb(jw2) ; vb(jw1),vb(jw2),vb(jw3)];