-
Notifications
You must be signed in to change notification settings - Fork 75
/
Copy pathvol2mesh.m
75 lines (72 loc) · 3.2 KB
/
vol2mesh.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
function [node, elem, face, regions] = vol2mesh(img, ix, iy, iz, opt, maxvol, dofix, method, isovalues)
%
% [node,elem,face,regions]=vol2mesh(img,ix,iy,iz,opt,maxvol,dofix,method,isovalues)
%
% convert a binary (or multi-valued) volume to tetrahedral mesh
%
% author: Qianqian Fang (q.fang at neu.edu)
%
% input:
% img: a volumetric binary image
% ix,iy,iz: subvolume selection indices in x,y,z directions
% opt: as defined in vol2surf.m
% maxvol: target maximum tetrahedral elem volume
% when method='cgalmesh', maxvol can specify the target
% for each label (subregion index) by the following syntax
% 'label1=size1:label2=size2:...'
% dofix: 1: perform mesh validation&repair, 0: skip repairing
% method: 'cgalsurf' or omit: use CGAL surface mesher
% 'simplify': use binsurface and then simplify
% 'cgalmesh': use CGAL 3.5 3D mesher for direct mesh generation [new]
%
% generally speaking, 'cgalmesh' is the most robust path
% if you want to product meshes from binary or multi-region
% volumes, however, its limitations include 1) only accept
% uint8 volume, and 2) can not extract meshes from gray-scale
% volumes. If ones goal is to process a gray-scale volume,
% he/she should use the 'cgalsurf' option. 'simplify' approach
% is not recommended unless other options has failed.
% isovalues: a list of isovalues where the levelset is defined
%
% output:
% node: output, node coordinates of the tetrahedral mesh
% elem: output, element list of the tetrahedral mesh, the last
% column is the region ID
% face: output, mesh surface element list of the tetrahedral mesh
% the last column denotes the boundary ID
% region: optional output. if opt.autoregion is set to 1, region
% saves the interior points for each closed surface component
%
% -- this function is part of iso2mesh toolbox (http://iso2mesh.sf.net)
%
if (nargin >= 8)
if (strcmp(method, 'cgalmesh'))
vol = img(ix, iy, iz);
if (length(unique(vol(:))) > 64 && dofix == 1)
error(['it appears that you are processing a ' ...
'grayscale image. Currently cgalmesher ' ...
'does not support grayscale images. ' ...
'Please use "cgalsurf" method to mesh a grayscale ' ...
'volume. If you are certain to run cgalmesher ' ...
'on your data, please set dofix=0 and run this again.']);
end
[node, elem, face] = cgalv2m(vol, opt, maxvol);
return
end
end
% first, convert the binary volume into isosurfaces
if (nargin == 8)
[no, el, regions, holes] = vol2surf(img, ix, iy, iz, opt, dofix, method);
elseif (nargin == 9)
[no, el, regions, holes] = vol2surf(img, ix, iy, iz, opt, dofix, method, isovalues);
else
[no, el, regions, holes] = vol2surf(img, ix, iy, iz, opt, dofix, 'cgalsurf');
end
% then, create volumetric mesh from the surface mesh
if (nargin >= 8)
if (strcmp(method, 'cgalpoly'))
[node, elem, face] = cgals2m(no(:, 1:3), el(:, 1:3), opt, maxvol);
return
end
end
[node, elem, face] = surf2mesh(no, el, [], [], 1, maxvol, regions, holes);