Skip to content

Commit f11665b

Browse files
committed
[test] add unit tests for surfboolean
1 parent eec4594 commit f11665b

File tree

3 files changed

+85
-14
lines changed

3 files changed

+85
-14
lines changed

gendocs.sh

+12-12
Original file line numberDiff line numberDiff line change
@@ -46,41 +46,41 @@ func_primitive="meshabox meshasphere meshanellip meshunitsphere meshacylinder
4646
meshgrid5 meshgrid6 latticegrid extrudecurve meshcylinders"
4747
func_inquery="finddisconnsurf surfedge volface extractloops meshconn
4848
meshcentroid nodevolume elemvolume neighborelem layersurf
49-
faceneighbors edgeneighbors maxsurf flatsegment orderloopedge
50-
mesheuler bbxflatsegment surfplane surfinterior surfpart
49+
faceneighbors edgeneighbors maxsurf flatsegment orderloopedge
50+
mesheuler bbxflatsegment surfplane surfinterior surfpart
5151
surfseeds meshquality meshedge meshface surfacenorm nodesurfnorm
5252
uniqedges uniqfaces advancefront innersurf outersurf surfvolume
53-
insurface"
53+
insurface"
5454
func_meshfix="meshcheckrepair meshreorient removedupelem
5555
removedupnodes removeisolatednode removeisolatedsurf
5656
surfaceclean getintersecttri delendelem surfreorient"
5757
func_metch="proj2mesh dist2surf regpt2surf affinemap metchgui metchgui_one"
5858
func_remesh="meshresample remeshsurf smoothsurf sortmesh mergemesh
5959
meshrefine mergesurf surfboolean fillsurf highordertet
60-
elemfacecenter barydualmesh meshinterp meshremap extrudesurf"
60+
elemfacecenter barydualmesh meshinterp meshremap extrudesurf"
6161
func_polyline="slicesurf slicesurf3 polylinelen polylinesimplify polylineinterp closestnode"
6262
func_fileio="saveasc savedxf savestl savebinstl saveinr saveoff
6363
savesmf savesurfpoly savegts readgts savemsh
6464
savevrml readasc readinr readmedit readoff readsmf
65-
readtetgen deletemeshfile mcpath mwpath savemedit
66-
savejson loadjson saveubjson loadubjson loadmsgpack savemsgpack
65+
readtetgen deletemeshfile mcpath mwpath savemedit
66+
savejson loadjson saveubjson loadubjson loadmsgpack savemsgpack
6767
savebj loadbj savemphtxt savetetgenele savetetgennode saveabaqus
68-
savenirfast readnirfast readnifti readmptiff"
68+
savenirfast readnirfast readnifti readmptiff"
6969
func_jdata="savejmesh loadjnifti savejnifti loadnifti savenifti jdataencode
7070
jdatadecode jload jsave decodevarname encodevarname jnifticreate
7171
nifticreate nii2jnii jnii2nii niicodemap niiformat savebnii savejnii"
7272
func_compression="zlibencode zlibdecode gzipencode gzipdecode lzmaencode
7373
lzmadecode lzipencode lzipdecode lz4encode lz4decode lz4hcencode
74-
lz4hcdecode base64decode base64encode"
74+
lz4hcdecode base64decode base64encode"
7575
func_binimage="bwislands fillholes3d deislands2d deislands3d ndgaussian ndimfilter
76-
imedge3d internalpoint smoothbinvol
77-
thickenbinvol thinbinvol maskdist"
76+
imedge3d internalpoint smoothbinvol volgrow volshrink volclose volopen
77+
thickenbinvol thinbinvol maskdist laplacefill"
7878
func_plotting="plotmesh plotsurf plottetra plotedges qmeshcut"
7979
func_misc="surfdiffuse volmap2mesh isoctavemesh getvarfrom raytrace linextriangle
80-
getplanefrom3pt getexeext fallbackexeext iso2meshver
80+
getplanefrom3pt getexeext fallbackexeext iso2meshver
8181
raysurf getoptkey rotatevec3d rotmat2vec varargin2struct
8282
jsonopt mergestruct orthdisk nestbracket2dim fast_match_bracket
83-
match_bracket memmapstream"
83+
match_bracket memmapstream"
8484

8585
print_title Streamlined mesh generation - shortcuts
8686
print_group $func_shortcut

surfboolean.m

+2-2
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@
118118
newnode(:, 4) = 1;
119119
newelem(:, 4) = 1;
120120
end
121-
opstr = ' --decouple-inin 1 --shells 2'; % -q
121+
opstr = ' --decouple-inin 1e-3 --shells 2'; % -q
122122
saveoff(node1(:, 1:3), elem1(:, 1:3), mwpath('pre_decouple1.off'));
123123
if (size(no, 2) ~= 3)
124124
opstr = ['-q --shells ' num2str(no)];
@@ -136,7 +136,7 @@
136136
newnode(:, 4) = 1;
137137
newelem(:, 4) = 1;
138138
end
139-
opstr = [' --decouple-outout 1 --shells 2']; % -q
139+
opstr = [' --decouple-outout 1e-3 --shells 2']; % -q
140140
saveoff(node1(:, 1:3), elem1(:, 1:3), mwpath('pre_decouple1.off'));
141141
if (size(no, 2) ~= 3)
142142
opstr = ['-q --shells ' num2str(no)];

test/run_iso2mesh_test.m

+71
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,9 @@ function run_iso2mesh_test(tests)
134134
test_iso2mesh('elemvolume', @savejson, unique(round_to_digits(elemvolume(no, el), 6)), '[0.083333]');
135135
test_iso2mesh('surfvolume', @savejson, surfvolume(no, fc), '[1]');
136136
test_iso2mesh('insurface', @savejson, insurface(no, fc, [1.5, -0.9, 2.1; 1, 0, 2; -1, 0 2; 1.2, -0, 2.5])', '[1,1,0,1]');
137+
138+
[no1, fc1] = highordertet(no, el);
139+
test_iso2mesh('highordertet', @savejson, fc1, '[[1,7,3,10,8,14],[15,21,17,24,22,28],[2,3,7,11,13,14],[16,17,21,25,27,28],[1,5,7,9,10,22],[15,19,21,23,24,32],[4,7,5,17,15,22],[18,21,19,31,29,32],[2,7,6,13,12,25],[16,21,20,27,26,33],[4,6,7,16,17,25],[18,20,21,30,31,33]]');
137140
end
138141

139142
%%
@@ -204,4 +207,72 @@ function run_iso2mesh_test(tests)
204207
test_iso2mesh('meshrefine elem sizefield node', @savejson, size(no1) - size(no), '[34,0]');
205208
test_iso2mesh('meshrefine elem sizefield elem', @savejson, size(el1) - size(el), '[105,0]');
206209
test_iso2mesh('meshrefine elem sizefield face', @savejson, size(fc1) - size(fc), '[64,1]');
210+
211+
[no, el] = meshgrid5(1:2, -1:0, 2:0.5:3);
212+
[no, el] = removeisolatednode(no, volface(el));
213+
no1 = sms(no, el, 10);
214+
[no2, el2] = s2m(no1, el, 1, 100);
215+
test_iso2mesh('sms laplacianhc', @savejson, sum(elemvolume(no2, el2(:, 1:4))) > 0.8, '[true]');
216+
217+
no1 = sms(no, el, 10, 0.5, 'laplacian');
218+
[no2, el2] = s2m(no1, el, 1, 100);
219+
test_iso2mesh('sms laplacian', @savejson, sum(elemvolume(no2, el2(:, 1:4))) < 0.1, '[true]');
220+
221+
no1 = sms(no, el, 10, 0.5, 'lowpass');
222+
[no2, el2] = s2m(no1, el, 1, 100);
223+
test_iso2mesh('sms lowpass', @savejson, sum(elemvolume(no2, el2(:, 1:4))) > 0.55, '[true]');
224+
end
225+
226+
%%
227+
if (ismember('boolean', tests))
228+
[no1, el1] = meshgrid5(1:2, 1:2, 1:2);
229+
el1 = volface(el1);
230+
[no1, el1] = removeisolatednode(no1, el1);
231+
[no2, el2] = meshgrid6(1.7:4, 1.7:4, 1.7:4);
232+
el2 = volface(el2);
233+
[no2, el2] = removeisolatednode(no2, el2);
234+
235+
[no3, el3] = surfboolean(no1, el1, 'and', no2, el2);
236+
[no3, el3] = meshcheckrepair(no3, el3, 'dup', 'tolerance', 1e-4);
237+
[node, elem] = s2m(no3, el3, 1, 100);
238+
239+
test_iso2mesh('surfboolean and', @savejson, round_to_digits(sum(elemvolume(node, elem(:, 1:4))), 5), '[0.027]');
240+
241+
[no3, el3] = surfboolean(no1, el1, 'or', no2, el2);
242+
[no3, el3] = meshcheckrepair(no3, el3, 'dup', 'tolerance', 1e-4);
243+
[node, elem] = s2m(no3, el3, 1, 100);
244+
test_iso2mesh('surfboolean or', @savejson, round(sum(elemvolume(node, elem(:, 1:4))) * 1000), '[8973]');
245+
246+
[no3, el3] = surfboolean(no1, el1, 'diff', no2, el2);
247+
[no3, el3] = meshcheckrepair(no3, el3, 'dup', 'tolerance', 1e-4);
248+
[node, elem] = s2m(no3, el3, 1, 100);
249+
test_iso2mesh('surfboolean diff', @savejson, round_to_digits(sum(elemvolume(node, elem(:, 1:4))), 5), '[0.973]');
250+
251+
[no3, el3] = surfboolean(no1, el1, 'first', no2, el2);
252+
[no3, el3] = meshcheckrepair(no3, el3, 'dup', 'tolerance', 1e-4);
253+
[node, elem] = s2m(no3, el3, 1, 100, 'tetgen', [1.5, 1.5, 1.5]);
254+
test_iso2mesh('surfboolean first region 1', @savejson, round_to_digits(sum(elemvolume(node, elem(elem(:, 5) == 1, 1:4))), 5), '[0.973]');
255+
test_iso2mesh('surfboolean first region 0', @savejson, round_to_digits(sum(elemvolume(node, elem(elem(:, 5) == 0, 1:4))), 5), '[0.027]');
256+
257+
[no3, el3] = surfboolean(no1, el1, 'second', no2, el2);
258+
[no3, el3] = meshcheckrepair(no3, el3, 'dup', 'tolerance', 1e-4);
259+
[node, elem] = s2m(no3, el3, 1, 100, 'tetgen', [2.6, 2.6, 2.6]);
260+
test_iso2mesh('surfboolean second region 1', @savejson, round_to_digits(sum(elemvolume(node, elem(elem(:, 5) == 1, 1:4))), 5), '[7.973]');
261+
test_iso2mesh('surfboolean second region 0', @savejson, round_to_digits(sum(elemvolume(node, elem(elem(:, 5) == 0, 1:4))), 5), '[0.027]');
262+
263+
[no3, el3] = surfboolean(no1, el1, 'resolve', no2, el2);
264+
[no3, el3] = meshcheckrepair(no3, el3, 'dup', 'tolerance', 1e-4);
265+
[node, elem] = s2m(no3, el3, 1, 100, 'tetgen', [1.5, 1.5, 1.5; 2.6, 2.6, 2.6]);
266+
test_iso2mesh('surfboolean resolve region 0', @savejson, round_to_digits(sum(elemvolume(node, elem(elem(:, 5) == 0, 1:4))), 5), '[0.027]');
267+
test_iso2mesh('surfboolean resolve region 1', @savejson, round_to_digits(sum(elemvolume(node, elem(elem(:, 5) == 1, 1:4))), 5), '[0.973]');
268+
test_iso2mesh('surfboolean resolve region 2', @savejson, round_to_digits(sum(elemvolume(node, elem(elem(:, 5) == 2, 1:4))), 5), '[7.973]');
269+
test_iso2mesh('surfboolean self intersecting test', @savejson, surfboolean(no1, el1, 'self', no2, el2), '[1]');
270+
271+
[no3, el3] = meshgrid5(1:0.4:1.4, 1:0.4:1.4, 1:0.4:1.4);
272+
el3 = volface(el3);
273+
[no3, el3] = removeisolatednode(no3, el3);
274+
275+
[no4, el4] = surfboolean(no1, el1, 'separate', no3, el3);
276+
[node, elem] = s2m(no4, el4, 1, 100, 'tetgen', [1.5, 1.5, 1.5]);
277+
test_iso2mesh('surfboolean resolve region 2', @savejson, unique(elem(:, 5))', '[0,1]');
207278
end

0 commit comments

Comments
 (0)