summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvrouvrea <vrouvrea@636b058d-ea47-450e-bf9e-a15bfbe3eedb>2016-04-06 11:08:33 +0000
committervrouvrea <vrouvrea@636b058d-ea47-450e-bf9e-a15bfbe3eedb>2016-04-06 11:08:33 +0000
commitfb22bc9ca84f5b3c55a598bf0c903a73c117e783 (patch)
treee066a8a8fa5a07e2d0faf0be096cb542295def52
parent3d592b82f837219ee9ecd8e33120563edb4e76ab (diff)
Replace Delaunay_triangulation_off_io.h and Delaunay_triangulation_off_rw.cpp with
Points_off_io.h and CGAL_points_off_reader.cpp Adapt UT and examples for this Adapt Alpha complex for it Alpha complex is now inserting points in a faster way (after a spatial_sort). Remove Alpha complex construction from a pointer on Delaunay triangulation (no more needed). Adapt documentation to all these modifications Forbid copy/move constructor/assignment operator on Alpha complex git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/alphashapes@1098 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 08a673b66451b5cb03fbdf482d696d93b35d220f
-rw-r--r--src/Alpha_complex/doc/Intro_alpha_complex.h6
-rw-r--r--src/Alpha_complex/doc/alpha_complex_doc.ipe136
-rw-r--r--src/Alpha_complex/doc/alpha_complex_doc.pngbin25150 -> 25554 bytes
-rw-r--r--src/Alpha_complex/doc/alpha_complex_doc_420.ipe (renamed from src/Alpha_complex/doc/alpha_complex_doc_421.ipe)76
-rw-r--r--src/Alpha_complex/doc/alpha_complex_doc_420.pngbin0 -> 80794 bytes
-rw-r--r--src/Alpha_complex/doc/alpha_complex_doc_421.pngbin100798 -> 0 bytes
-rw-r--r--src/Alpha_complex/doc/alpha_complex_representation.ipe16
-rw-r--r--src/Alpha_complex/doc/alpha_complex_representation.pngbin14628 -> 14606 bytes
-rw-r--r--src/Alpha_complex/example/Alpha_complex_from_off.cpp8
-rw-r--r--src/Alpha_complex/example/Alpha_complex_from_points.cpp15
-rw-r--r--src/Alpha_complex/example/alphaoffreader_for_doc_32.txt26
-rw-r--r--src/Alpha_complex/example/alphaoffreader_for_doc_60.txt36
-rw-r--r--src/Alpha_complex/include/gudhi/Alpha_complex.h109
-rw-r--r--src/Alpha_complex/test/Alpha_complex_unit_test.cpp2
-rw-r--r--src/Persistent_cohomology/example/alpha_complex_persistence.cpp3
-rw-r--r--src/common/example/CGAL_points_off_reader.cpp43
-rw-r--r--src/common/example/CMakeLists.txt12
-rw-r--r--src/common/example/Delaunay_triangulation_off_rw.cpp54
-rw-r--r--src/common/example/cgaloffreader_result.txt7
-rw-r--r--src/common/example/dtoffrw_alphashapedoc_result.off15
-rw-r--r--src/common/example/dtoffrw_alphashapedoc_result.txt2
-rw-r--r--src/common/include/gudhi/Delaunay_triangulation_off_io.h348
-rw-r--r--src/common/include/gudhi/Points_off_io.h178
-rw-r--r--src/common/test/CMakeLists.txt14
-rw-r--r--src/common/test/dtoffrw_alphashapedoc_result.off22
-rw-r--r--src/common/test/dtoffrw_unit_test.cpp90
-rw-r--r--src/common/test/points_off_reader_unit_test.cpp78
27 files changed, 568 insertions, 728 deletions
diff --git a/src/Alpha_complex/doc/Intro_alpha_complex.h b/src/Alpha_complex/doc/Intro_alpha_complex.h
index 0dea2b16..9d0dcefa 100644
--- a/src/Alpha_complex/doc/Intro_alpha_complex.h
+++ b/src/Alpha_complex/doc/Intro_alpha_complex.h
@@ -112,14 +112,14 @@ namespace alphacomplex {
*
* \subsubsection dimension2 Dimension 2
*
- * From the example above, it means the algorithm looks into each triangle ([4,2,1], [2,4,6], [4,5,6], ...),
+ * From the example above, it means the algorithm looks into each triangle ([0,1,2], [0,2,4], [1,2,3], ...),
* computes the filtration value of the triangle, and then propagates the filtration value as described
* here :
- * \image html "alpha_complex_doc_421.png" "Filtration value propagation example"
+ * \image html "alpha_complex_doc_420.png" "Filtration value propagation example"
*
* \subsubsection dimension1 Dimension 1
*
- * Then, the algorithm looks into each edge ([1,2], [4,2], [4,1], ...),
+ * Then, the algorithm looks into each edge ([0,1], [0,2], [1,2], ...),
* computes the filtration value of the edge (in this case, propagation will have no effect).
*
* \subsubsection dimension0 Dimension 0
diff --git a/src/Alpha_complex/doc/alpha_complex_doc.ipe b/src/Alpha_complex/doc/alpha_complex_doc.ipe
index 99bd05af..baf0d26a 100644
--- a/src/Alpha_complex/doc/alpha_complex_doc.ipe
+++ b/src/Alpha_complex/doc/alpha_complex_doc.ipe
@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<!DOCTYPE ipe SYSTEM "ipe.dtd">
<ipe version="70107" creator="Ipe 7.1.10">
-<info created="D:20150603143945" modified="D:20160315144626"/>
+<info created="D:20150603143945" modified="D:20160406112209"/>
<ipestyle name="basic">
<symbol name="arrow/arc(spx)">
<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
@@ -253,13 +253,13 @@ h
320 580 l
</path>
<text matrix="1 0 0 1 -260 0" transformations="translations" pos="380 530" stroke="darkcyan" type="label" width="118.196" height="8.307" depth="2.32" valign="baseline" size="large">Delaunay triangulation</text>
-<text matrix="1 0 0 1 -242.155 -3.50128" transformations="translations" pos="282.952 524.893" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
-<text matrix="1 0 0 1 -240 0" transformations="translations" pos="352.708 510.349" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
-<text matrix="1 0 0 1 -240 0" transformations="translations" pos="310.693 578.759" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
-<text matrix="1 0 0 1 -240 0" transformations="translations" pos="375.332 578.49" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">5</text>
-<text matrix="1 0 0 1 -240 0" transformations="translations" pos="272.179 660.635" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">1</text>
-<text matrix="1 0 0 1 -239.3 -10.1537" transformations="translations" pos="296.419 724.197" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
-<text matrix="1 0 0 1 -240 0" transformations="translations" pos="375.332 689.453" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">0</text>
+<text matrix="1 0 0 1 -242.155 -3.50128" transformations="translations" pos="282.952 524.893" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">0</text>
+<text matrix="1 0 0 1 -240 0" transformations="translations" pos="352.708 510.349" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">1</text>
+<text matrix="1 0 0 1 -240 0" transformations="translations" pos="310.693 578.759" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
+<text matrix="1 0 0 1 -240 0" transformations="translations" pos="375.332 578.49" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
+<text matrix="1 0 0 1 -240 0" transformations="translations" pos="272.179 660.635" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
+<text matrix="1 0 0 1 -239.3 -10.1537" transformations="translations" pos="296.419 724.197" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">5</text>
+<text matrix="1 0 0 1 -240 0" transformations="translations" pos="375.332 689.453" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
<path matrix="1 0 0 1 -240 0" stroke="darkcyan">
280 660 m
300 710 l
@@ -314,7 +314,7 @@ h
<use matrix="1 0 0 1 -240 0" name="mark/fdisk(sfx)" pos="370 580" size="normal" stroke="black" fill="white"/>
<use matrix="1 0 0 1 -240 0" name="mark/fdisk(sfx)" pos="350 520" size="normal" stroke="black" fill="white"/>
<use matrix="1 0 0 1 -240 0" name="mark/fdisk(sfx)" pos="290 530" size="normal" stroke="black" fill="white"/>
-<text matrix="1 0 0 1 -8 -96" transformations="translations" pos="304 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
+<text matrix="1 0 0 1 4 -96" transformations="translations" pos="304 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
<path matrix="1 0 0 1 4 -96" stroke="black">
300 688 m
300 676 l
@@ -322,15 +322,14 @@ h
312 688 l
h
</path>
-<path matrix="1 0 0 1 -8 -96" stroke="black">
+<text matrix="1 0 0 1 24 -76" transformations="translations" pos="304 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
+<path matrix="1 0 0 1 36 -76" stroke="black">
300 688 m
300 676 l
312 676 l
312 688 l
h
</path>
-<text matrix="1 0 0 1 -8 -96" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
-<text matrix="1 0 0 1 12 -76" transformations="translations" pos="304 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
<path matrix="1 0 0 1 24 -76" stroke="black">
300 688 m
300 676 l
@@ -338,6 +337,8 @@ h
312 688 l
h
</path>
+<text matrix="1 0 0 1 24 -76" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
+<text matrix="1 0 0 1 12 -76" transformations="translations" pos="304 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">1</text>
<path matrix="1 0 0 1 12 -76" stroke="black">
300 688 m
300 676 l
@@ -345,39 +346,15 @@ h
312 688 l
h
</path>
-<text matrix="1 0 0 1 12 -76" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
-<text matrix="1 0 0 1 0 -76" transformations="translations" pos="304 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">1</text>
-<path matrix="1 0 0 1 36 -76" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
-<path matrix="1 0 0 1 0 -76" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
-<text matrix="1 0 0 1 24 -76" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">5</text>
-<path matrix="1 0 0 1 20 -96" stroke="black">
+<path matrix="1 0 0 1 24 -96" stroke="black">
300 688 m
300 676 l
312 676 l
312 688 l
h
</path>
-<text matrix="1 0 0 1 8 -96" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">5</text>
+<text matrix="1 0 0 1 12 -96" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
<text matrix="1 0 0 1 64 -76" transformations="translations" pos="304 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
-<path matrix="1 0 0 1 76 -76" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
<path matrix="1 0 0 1 64 -76" stroke="black">
300 688 m
300 676 l
@@ -385,7 +362,6 @@ h
312 688 l
h
</path>
-<text matrix="1 0 0 1 64 -76" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
<text matrix="1 0 0 1 52 -76" transformations="translations" pos="304 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
<path matrix="1 0 0 1 52 -76" stroke="black">
300 688 m
@@ -401,7 +377,7 @@ h
312 688 l
h
</path>
-<text matrix="1 0 0 1 36 -96" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
+<text matrix="1 0 0 1 36 -96" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
<text matrix="1 0 0 1 104 -76" transformations="translations" pos="304 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
<path matrix="1 0 0 1 104 -76" stroke="black">
300 688 m
@@ -418,14 +394,14 @@ h
312 688 l
h
</path>
-<path matrix="1 0 0 1 92 -96" stroke="black">
+<path matrix="1 0 0 1 96 -96" stroke="black">
300 688 m
300 676 l
312 676 l
312 688 l
h
</path>
-<text matrix="1 0 0 1 80 -96" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
+<text matrix="1 0 0 1 84 -96" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
<text matrix="1 0 0 1 148 -76" transformations="translations" pos="304 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
<path matrix="1 0 0 1 148 -76" stroke="black">
300 688 m
@@ -442,22 +418,22 @@ h
312 688 l
h
</path>
-<path matrix="1 0 0 1 168 -76" stroke="black">
+<path matrix="1 0 0 1 120 -76" stroke="black">
300 688 m
300 676 l
312 676 l
312 688 l
h
</path>
-<text matrix="1 0 0 1 156 -76" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
-<path matrix="1 0 0 1 168 -76" stroke="black">
+<text matrix="1 0 0 1 108 -76" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
+<path matrix="1 0 0 1 120 -76" stroke="black">
300 688 m
300 676 l
312 676 l
312 688 l
h
</path>
-<text matrix="1 0 0 1 156 -76" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
+<text matrix="1 0 0 1 108 -76" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
<path matrix="1 0 0 1 48 -96" stroke="black">
292 716 m
292 728 l
@@ -514,11 +490,11 @@ h
<text matrix="1 0 0 1 48 -96" transformations="translations" pos="400 720" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
<text matrix="1 0 0 1 48 -96" transformations="translations" pos="424 720" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">5</text>
<text matrix="1 0 0 1 48 -96" transformations="translations" pos="448 720" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
-<path matrix="1 0 0 1 36 -96" stroke="black">
+<path matrix="1 0 0 1 -12 -96" stroke="black">
436 708 m
436 716 l
</path>
-<path matrix="1 0 0 1 36 -96" stroke="black">
+<path matrix="1 0 0 1 28 -96" stroke="black">
364 708 m
364 716 l
</path>
@@ -535,11 +511,11 @@ h
308 716 l
308 716 l
</path>
-<path matrix="1 0 0 1 36 -96" stroke="black">
+<path matrix="1 0 0 1 48 -96" stroke="black">
264 688 m
268 696 l
</path>
-<path matrix="1 0 0 1 36 -96" stroke="black">
+<path matrix="1 0 0 1 40 -96" stroke="black">
292 688 m
292 696 l
</path>
@@ -555,5 +531,65 @@ h
448 612 m
448 620 l
</path>
+<text matrix="1 0 0 1 80 -76" transformations="translations" pos="304 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
+<path matrix="1 0 0 1 80 -76" stroke="black">
+300 688 m
+300 676 l
+312 676 l
+312 688 l
+h
+</path>
+<path matrix="1 0 0 1 80 -96" stroke="black">
+300 688 m
+300 676 l
+312 676 l
+312 688 l
+h
+</path>
+<text matrix="1 0 0 1 68 -96" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
+<path matrix="1 0 0 1 24 -96" stroke="black">
+364 688 m
+364 696 l
+</path>
+<path matrix="1 0 0 1 136 -96" stroke="black">
+300 688 m
+300 676 l
+312 676 l
+312 688 l
+h
+</path>
+<text matrix="1 0 0 1 124 -96" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
+<path matrix="1 0 0 1 136 -96" stroke="black">
+300 688 m
+300 676 l
+312 676 l
+312 688 l
+h
+</path>
+<text matrix="1 0 0 1 124 -96" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
+<path matrix="1 0 0 1 4 -116" stroke="black">
+436 708 m
+436 716 l
+</path>
+<path matrix="1 0 0 1 168 -76" stroke="black">
+300 688 m
+300 676 l
+312 676 l
+312 688 l
+h
+</path>
+<text matrix="1 0 0 1 156 -76" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
+<path matrix="1 0 0 1 168 -76" stroke="black">
+300 688 m
+300 676 l
+312 676 l
+312 688 l
+h
+</path>
+<text matrix="1 0 0 1 156 -76" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
+<path matrix="1 0 0 1 36 -96" stroke="black">
+436 708 m
+436 716 l
+</path>
</page>
</ipe>
diff --git a/src/Alpha_complex/doc/alpha_complex_doc.png b/src/Alpha_complex/doc/alpha_complex_doc.png
index cfe3ede6..0b6201da 100644
--- a/src/Alpha_complex/doc/alpha_complex_doc.png
+++ b/src/Alpha_complex/doc/alpha_complex_doc.png
Binary files differ
diff --git a/src/Alpha_complex/doc/alpha_complex_doc_421.ipe b/src/Alpha_complex/doc/alpha_complex_doc_420.ipe
index 727816c5..5d1d29d4 100644
--- a/src/Alpha_complex/doc/alpha_complex_doc_421.ipe
+++ b/src/Alpha_complex/doc/alpha_complex_doc_420.ipe
@@ -252,14 +252,14 @@ h
350 520 l
320 580 l
</path>
-<text matrix="1 0 0 1 0 80" transformations="translations" pos="380 530" stroke="darkcyan" type="label" width="54.628" height="8.965" depth="2.99" valign="baseline" size="large">Cell [4,2,1]</text>
-<text matrix="1 0 0 1 -2.15463 76.4987" transformations="translations" pos="282.952 524.893" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
-<text matrix="1 0 0 1 0 80" transformations="translations" pos="352.708 510.349" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
-<text matrix="1 0 0 1 0 80" transformations="translations" pos="310.693 578.759" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
-<text matrix="1 0 0 1 0 80" transformations="translations" pos="375.332 578.49" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">5</text>
-<text matrix="1 0 0 1 0 80" transformations="translations" pos="272.179 660.635" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">1</text>
-<text matrix="1 0 0 1 0.700256 69.8463" transformations="translations" pos="296.419 724.197" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
-<text matrix="1 0 0 1 0 80" transformations="translations" pos="375.332 689.453" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">0</text>
+<text matrix="1 0 0 1 0 80" transformations="translations" pos="380 530" stroke="darkcyan" type="label" width="54.628" height="8.965" depth="2.99" valign="baseline" size="large">Cell [4,2,0]</text>
+<text matrix="1 0 0 1 -2.15463 76.4987" transformations="translations" pos="282.952 524.893" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">0</text>
+<text matrix="1 0 0 1 0 80" transformations="translations" pos="352.708 510.349" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">1</text>
+<text matrix="1 0 0 1 0 80" transformations="translations" pos="310.693 578.759" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
+<text matrix="1 0 0 1 0 80" transformations="translations" pos="375.332 578.49" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
+<text matrix="1 0 0 1 0 80" transformations="translations" pos="272.179 660.635" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
+<text matrix="1 0 0 1 0.700256 69.8463" transformations="translations" pos="296.419 724.197" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">5</text>
+<text matrix="1 0 0 1 0 80" transformations="translations" pos="375.332 689.453" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
<path matrix="1 0 0 1 0 80" stroke="lightgray">
280 660 m
300 710 l
@@ -285,7 +285,7 @@ h
243.428 591.569 m
186.061 643.28 l
</path>
-<text matrix="1 0 0 1 0 80" transformations="translations" pos="212.724 627.389" stroke="darkcyan" type="label" width="18.785" height="4.294" depth="1.49" valign="baseline">$\alpha_{421}$</text>
+<text matrix="1 0 0 1 0 80" transformations="translations" pos="212.724 627.389" stroke="darkcyan" type="label" width="18.785" height="4.294" depth="1.49" valign="baseline">$\alpha_{420}$</text>
<path matrix="1 0 0 1 -264 -162" stroke="lightgray">
320 580 m
350 520 l
@@ -306,15 +306,15 @@ h
350 520 l
320 580 l
</path>
-<text matrix="0.582962 0 0 1 -211.265 -209.555" transformations="translations" pos="380 530" stroke="darkcyan" type="label" width="231.798" height="8.965" depth="2.99" valign="baseline" size="large">[4,2] is Gabriel $\rightarrow$ $\alpha_{42}$ is not$\\$
+<text matrix="0.582962 0 0 1 -211.265 -209.555" transformations="translations" pos="380 530" stroke="darkcyan" type="label" width="231.798" height="8.965" depth="2.99" valign="baseline" size="large">[2,0] is Gabriel $\rightarrow$ $\alpha_{20}$ is not$\\$
modified (NaN)
</text>
-<text matrix="1 0 0 1 -266.155 -165.501" transformations="translations" pos="282.952 524.893" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
-<text matrix="1 0 0 1 -264 -162" transformations="translations" pos="310.693 578.759" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
-<text matrix="1 0 0 1 -264 -162" transformations="translations" pos="375.332 578.49" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">5</text>
-<text matrix="1 0 0 1 -264 -172" transformations="translations" pos="272.179 660.635" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">1</text>
-<text matrix="1 0 0 1 -263.3 -172.154" transformations="translations" pos="296.419 724.197" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
-<text matrix="1 0 0 1 -264 -162" transformations="translations" pos="375.332 689.453" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">0</text>
+<text matrix="1 0 0 1 -266.155 -165.501" transformations="translations" pos="282.952 524.893" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">0</text>
+<text matrix="1 0 0 1 -264 -162" transformations="translations" pos="310.693 578.759" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
+<text matrix="1 0 0 1 -264 -162" transformations="translations" pos="375.332 578.49" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
+<text matrix="1 0 0 1 -264 -172" transformations="translations" pos="272.179 660.635" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
+<text matrix="1 0 0 1 -263.3 -172.154" transformations="translations" pos="296.419 724.197" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">5</text>
+<text matrix="1 0 0 1 -264 -162" transformations="translations" pos="375.332 689.453" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
<path matrix="1 0 0 1 -264 -162" stroke="lightgray">
280 660 m
300 710 l
@@ -333,7 +333,7 @@ modified (NaN)
320 580 l
280 660 l
</path>
-<text matrix="1 0 0 1 -166.834 -240.52" transformations="translations" pos="212.724 627.389" stroke="darkcyan" type="label" width="14.814" height="4.294" depth="1.49" valign="baseline">$\alpha_{42}$</text>
+<text matrix="1 0 0 1 -166.834 -240.52" transformations="translations" pos="212.724 627.389" stroke="darkcyan" type="label" width="14.814" height="4.294" depth="1.49" valign="baseline">$\alpha_{20}$</text>
<path matrix="1 0 0 1 -264 -162" stroke="darkcyan" pen="heavier">
290 530 m
320 580 l
@@ -365,11 +365,11 @@ modified (NaN)
350 520 l
320 580 l
</path>
-<text matrix="1 0 0 1 -199.21 -189.117" transformations="translations" pos="380 530" stroke="darkred" type="label" width="168.308" height="8.965" depth="2.99" valign="baseline" size="large">[2,1] is not Gabriel $\rightarrow$ $\alpha_{21} = \alpha_{421}$</text>
-<text matrix="1 0 0 1 -40.1546 -167.501" transformations="translations" pos="282.952 524.893" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
-<text matrix="1 0 0 1 -38 -164" transformations="translations" pos="375.332 578.49" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">5</text>
-<text matrix="1 0 0 1 -37.2997 -174.154" transformations="translations" pos="296.419 724.197" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
-<text matrix="1 0 0 1 -38 -164" transformations="translations" pos="375.332 689.453" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">0</text>
+<text matrix="1 0 0 1 -199.21 -189.117" transformations="translations" pos="380 530" stroke="darkred" type="label" width="168.308" height="8.965" depth="2.99" valign="baseline" size="large">[0,4] is not Gabriel $\rightarrow$ $\alpha_{40} = \alpha_{420}$</text>
+<text matrix="1 0 0 1 -40.1546 -167.501" transformations="translations" pos="282.952 524.893" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">0</text>
+<text matrix="1 0 0 1 -38 -164" transformations="translations" pos="375.332 578.49" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
+<text matrix="1 0 0 1 -37.2997 -174.154" transformations="translations" pos="296.419 724.197" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">5</text>
+<text matrix="1 0 0 1 -38 -164" transformations="translations" pos="375.332 689.453" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
<path matrix="1 0 0 1 -38 -164" stroke="lightgray">
280 660 m
300 710 l
@@ -388,7 +388,7 @@ modified (NaN)
320 580 l
280 660 l
</path>
-<text matrix="1 0 0 1 52.4654 -193.97" transformations="translations" pos="212.724 627.389" stroke="darkcyan" type="label" width="14.814" height="4.294" depth="1.49" valign="baseline">$\alpha_{12}$</text>
+<text matrix="1 0 0 1 52.4654 -193.97" transformations="translations" pos="212.724 627.389" stroke="darkcyan" type="label" width="14.814" height="4.294" depth="1.49" valign="baseline">$\alpha_{40}$</text>
<path matrix="1 0 0 1 -38 -164" stroke="darkcyan" pen="heavier">
290 530 m
280 660 l
@@ -413,12 +413,12 @@ modified (NaN)
350 520 l
320 580 l
</path>
-<text matrix="1 0 0 1 123.845 -165.501" transformations="translations" pos="282.952 524.893" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
-<text matrix="1 0 0 1 126 -162" transformations="translations" pos="352.708 510.349" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
-<text matrix="1 0 0 1 126 -162" transformations="translations" pos="310.693 578.759" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
-<text matrix="1 0 0 1 126 -162" transformations="translations" pos="375.332 578.49" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">5</text>
-<text matrix="1 0 0 1 126.7 -172.154" transformations="translations" pos="296.419 724.197" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
-<text matrix="1 0 0 1 126 -162" transformations="translations" pos="375.332 689.453" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">0</text>
+<text matrix="1 0 0 1 123.845 -165.501" transformations="translations" pos="282.952 524.893" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">0</text>
+<text matrix="1 0 0 1 126 -162" transformations="translations" pos="352.708 510.349" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">1</text>
+<text matrix="1 0 0 1 126 -162" transformations="translations" pos="310.693 578.759" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
+<text matrix="1 0 0 1 126 -162" transformations="translations" pos="375.332 578.49" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
+<text matrix="1 0 0 1 126.7 -172.154" transformations="translations" pos="296.419 724.197" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">5</text>
+<text matrix="1 0 0 1 126 -162" transformations="translations" pos="375.332 689.453" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
<path matrix="1 0 0 1 126 -162" stroke="lightgray">
280 660 m
300 710 l
@@ -437,8 +437,8 @@ modified (NaN)
320 580 l
280 660 l
</path>
-<text matrix="1 0 0 1 225.859 -165.729" transformations="translations" pos="212.724 627.389" stroke="darkcyan" type="label" width="14.814" height="4.294" depth="1.49" valign="baseline">$\alpha_{41}$</text>
-<text matrix="1 0 0 1 122 -164" transformations="translations" pos="272.179 660.635" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">1</text>
+<text matrix="1 0 0 1 225.859 -165.729" transformations="translations" pos="212.724 627.389" stroke="darkcyan" type="label" width="14.814" height="4.294" depth="1.49" valign="baseline">$\alpha_{42}$</text>
+<text matrix="1 0 0 1 122 -164" transformations="translations" pos="272.179 660.635" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
<path stroke="darkcyan" pen="heavier">
406.093 497.775 m
446.094 418.092 l
@@ -450,7 +450,7 @@ modified (NaN)
425.854 457.774 m
470.795 457.774 l
</path>
-<text matrix="1 0 0 1 -48.9756 -209.799" transformations="translations" pos="380 530" stroke="darkcyan" type="label" width="231.798" height="8.965" depth="2.99" valign="baseline" size="large">[4,1] is Gabriel $\rightarrow$ $\alpha_{41}$ is not modified (NaN)
+<text matrix="1 0 0 1 -48.9756 -209.799" transformations="translations" pos="380 530" stroke="darkcyan" type="label" width="231.798" height="8.965" depth="2.99" valign="baseline" size="large">[2,4] is Gabriel $\rightarrow$ $\alpha_{42}$ is not modified (NaN)
</text>
<path stroke="darkblue" arrow="normal/normal">
205.028 596.091 m
@@ -464,9 +464,9 @@ modified (NaN)
341.123 594.316 m
413.904 554.079 l
</path>
-<text matrix="1 0 0 1 39.645 -2.36686" transformations="translations" pos="199.703 569.464" stroke="darkblue" type="label" width="93.206" height="7.473" depth="2.49" valign="baseline">For all faces of [4,2,1]</text>
+<text matrix="1 0 0 1 39.645 -2.36686" transformations="translations" pos="199.703 569.464" stroke="darkblue" type="label" width="93.206" height="7.473" depth="2.49" valign="baseline">For all faces of [4,2,0]</text>
<text matrix="1 0 0 1 -93.391 2.68003" transformations="translations" pos="104.437 300.174" stroke="black" type="label" width="208.621" height="6.926" depth="1.93" valign="baseline">N.B. : is Gabriel on a single point has no sense.</text>
-<text matrix="1 0 0 1 -36.9231 10" transformations="translations" pos="48 784" stroke="black" type="label" width="118.324" height="7.473" depth="2.49" valign="baseline">Dimension =2 - $\sigma$ = [4,2,1]</text>
+<text matrix="1 0 0 1 -36.9231 10" transformations="translations" pos="48 784" stroke="black" type="label" width="118.324" height="7.473" depth="2.49" valign="baseline">Dimension =2 - $\sigma$ = [4,2,0]</text>
<path stroke="darkcyan">
247.333 430.892 m
311.764 430.892 l
@@ -484,19 +484,19 @@ modified (NaN)
<use matrix="1 0 0 1 -264 -162" name="mark/fdisk(sfx)" pos="370 690" size="normal" stroke="black" fill="white"/>
<use matrix="1 0 0 1 -264 -162" name="mark/fdisk(sfx)" pos="370 580" size="normal" stroke="black" fill="white"/>
<use matrix="1 0 0 1 -264 -162" name="mark/fdisk(sfx)" pos="350 520" size="normal" stroke="black" fill="white"/>
-<text matrix="1 0 0 1 -264 -162" transformations="translations" pos="352.708 510.349" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
+<text matrix="1 0 0 1 -264 -162" transformations="translations" pos="352.708 510.349" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">1</text>
<use matrix="1 0 0 1 -264 -162" name="mark/fdisk(sfx)" pos="305 555" size="normal" stroke="darkcyan" fill="white"/>
<use matrix="1 0 0 1 -264 -162" name="mark/fdisk(sfx)" pos="290 530" size="normal" stroke="black" fill="white"/>
<use matrix="1 0 0 1 -264 -162" name="mark/fdisk(sfx)" pos="320 580" size="normal" stroke="black" fill="white"/>
<use matrix="1 0 0 1 -37.2997 -174.154" name="mark/fdisk(sfx)" pos="300 720" size="normal" stroke="black" fill="white"/>
<use matrix="1 0 0 1 -38 -164" name="mark/fdisk(sfx)" pos="370 690" size="normal" stroke="black" fill="white"/>
-<text matrix="1 0 0 1 -38 -164" transformations="translations" pos="272.179 660.635" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">1</text>
+<text matrix="1 0 0 1 -38 -164" transformations="translations" pos="272.179 660.635" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
<use name="mark/fdisk(sfx)" pos="247 431" size="normal" stroke="darkcyan" fill="white"/>
<use matrix="1 0 0 1 -38 -164" name="mark/fdisk(sfx)" pos="350 520" size="normal" stroke="black" fill="white"/>
-<text matrix="1 0 0 1 -38 -164" transformations="translations" pos="352.708 510.349" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
+<text matrix="1 0 0 1 -38 -164" transformations="translations" pos="352.708 510.349" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">1</text>
<use matrix="1 0 0 1 -38 -164" name="mark/fdisk(sfx)" pos="370 580" size="normal" stroke="black" fill="white"/>
<use matrix="1 0 0 1 -38 -164" name="mark/fdisk(sfx)" pos="320 580" size="normal" stroke="darkred" fill="white"/>
-<text matrix="1 0 0 1 -38 -164" transformations="translations" pos="310.693 578.759" stroke="darkred" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
+<text matrix="1 0 0 1 -38 -164" transformations="translations" pos="310.693 578.759" stroke="darkred" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
<path matrix="1 0 0 1 -38 -164" stroke="darkred" pen="heavier">
65.192 0 0 65.192 285 595 e
</path>
diff --git a/src/Alpha_complex/doc/alpha_complex_doc_420.png b/src/Alpha_complex/doc/alpha_complex_doc_420.png
new file mode 100644
index 00000000..ef7187f7
--- /dev/null
+++ b/src/Alpha_complex/doc/alpha_complex_doc_420.png
Binary files differ
diff --git a/src/Alpha_complex/doc/alpha_complex_doc_421.png b/src/Alpha_complex/doc/alpha_complex_doc_421.png
deleted file mode 100644
index 1cce4402..00000000
--- a/src/Alpha_complex/doc/alpha_complex_doc_421.png
+++ /dev/null
Binary files differ
diff --git a/src/Alpha_complex/doc/alpha_complex_representation.ipe b/src/Alpha_complex/doc/alpha_complex_representation.ipe
index fead1661..e8096b93 100644
--- a/src/Alpha_complex/doc/alpha_complex_representation.ipe
+++ b/src/Alpha_complex/doc/alpha_complex_representation.ipe
@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<!DOCTYPE ipe SYSTEM "ipe.dtd">
<ipe version="70107" creator="Ipe 7.1.10">
-<info created="D:20150603143945" modified="D:20151127174742"/>
+<info created="D:20150603143945" modified="D:20160404172133"/>
<ipestyle name="basic">
<symbol name="arrow/arc(spx)">
<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
@@ -251,13 +251,13 @@ h
h
</path>
<text matrix="1 0 0 1 -230.178 22.1775" transformations="translations" pos="380 530" stroke="seagreen" type="label" width="76.735" height="8.307" depth="2.32" valign="baseline" size="large">Alpha complex</text>
-<text matrix="1 0 0 1 -212.333 18.6762" transformations="translations" pos="282.952 524.893" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
-<text matrix="1 0 0 1 -210.178 22.1775" transformations="translations" pos="352.708 510.349" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
-<text matrix="1 0 0 1 -210.178 22.1775" transformations="translations" pos="310.693 578.759" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
-<text matrix="1 0 0 1 -210.178 22.1775" transformations="translations" pos="375.332 578.49" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">5</text>
-<text matrix="1 0 0 1 -210.178 22.1775" transformations="translations" pos="272.179 660.635" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">1</text>
-<text matrix="1 0 0 1 -209.478 12.0238" transformations="translations" pos="296.419 724.197" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
-<text matrix="1 0 0 1 -210.178 22.1775" transformations="translations" pos="375.332 689.453" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">0</text>
+<text matrix="1 0 0 1 -212.333 18.6762" transformations="translations" pos="282.952 524.893" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">0</text>
+<text matrix="1 0 0 1 -210.178 22.1775" transformations="translations" pos="352.708 510.349" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">1</text>
+<text matrix="1 0 0 1 -210.178 22.1775" transformations="translations" pos="310.693 578.759" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
+<text matrix="1 0 0 1 -210.178 22.1775" transformations="translations" pos="375.332 578.49" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
+<text matrix="1 0 0 1 -210.178 22.1775" transformations="translations" pos="272.179 660.635" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
+<text matrix="1 0 0 1 -209.478 12.0238" transformations="translations" pos="296.419 724.197" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">5</text>
+<text matrix="1 0 0 1 -210.178 22.1775" transformations="translations" pos="375.332 689.453" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
<path matrix="1 0 0 1 31.9779 -58.7483" stroke="darkgray">
58.1341 0 0 58.1341 218.925 692.601 e
</path>
diff --git a/src/Alpha_complex/doc/alpha_complex_representation.png b/src/Alpha_complex/doc/alpha_complex_representation.png
index 9833bff3..7b81cd69 100644
--- a/src/Alpha_complex/doc/alpha_complex_representation.png
+++ b/src/Alpha_complex/doc/alpha_complex_representation.png
Binary files differ
diff --git a/src/Alpha_complex/example/Alpha_complex_from_off.cpp b/src/Alpha_complex/example/Alpha_complex_from_off.cpp
index 18a1a20d..963ef5ca 100644
--- a/src/Alpha_complex/example/Alpha_complex_from_off.cpp
+++ b/src/Alpha_complex/example/Alpha_complex_from_off.cpp
@@ -4,17 +4,15 @@
#include <iostream>
#include <string>
-void usage(char * const progName) {
+void usage(int nbArgs, char * const progName) {
+ std::cerr << "Error: Number of arguments (" << nbArgs << ") is not correct\n";
std::cerr << "Usage: " << progName << " filename.off alpha_square_max_value [ouput_file.txt]\n";
std::cerr << " i.e.: " << progName << " ../../data/points/alphacomplexdoc.off 60.0\n";
exit(-1); // ----- >>
}
int main(int argc, char **argv) {
- if ((argc != 3) && (argc != 4)) {
- std::cerr << "Error: Number of arguments (" << argc << ") is not correct\n";
- usage(argv[0]);
- }
+ if ((argc != 3) && (argc != 4)) usage(argc, (argv[0] - 1));
std::string off_file_name(argv[1]);
double alpha_square_max_value = atof(argv[2]);
diff --git a/src/Alpha_complex/example/Alpha_complex_from_points.cpp b/src/Alpha_complex/example/Alpha_complex_from_points.cpp
index 815e40d7..cd17af1e 100644
--- a/src/Alpha_complex/example/Alpha_complex_from_points.cpp
+++ b/src/Alpha_complex/example/Alpha_complex_from_points.cpp
@@ -4,13 +4,26 @@
#include <iostream>
#include <string>
#include <vector>
+#include <limits> // for numeric limits
typedef CGAL::Epick_d< CGAL::Dimension_tag<2> > Kernel;
typedef Kernel::Point_d Point;
typedef std::vector<Point> Vector_of_points;
+void usage(int nbArgs, char * const progName) {
+ std::cerr << "Error: Number of arguments (" << nbArgs << ") is not correct\n";
+ std::cerr << "Usage: " << progName << " [alpha_square_max_value]\n";
+ std::cerr << " i.e.: " << progName << " 60.0\n";
+ exit(-1); // ----- >>
+}
+
int main(int argc, char **argv) {
- double alpha_square_max_value = 60.0;
+ if ((argc != 1) && (argc != 2)) usage(argc, (argv[0] - 1));
+
+ // Delaunay complex if alpha_square_max_value is not given by the user.
+ double alpha_square_max_value = std::numeric_limits<double>::infinity();
+ if (argc == 2)
+ alpha_square_max_value = atof(argv[1]);
// ----------------------------------------------------------------------------
// Init of a list of points
diff --git a/src/Alpha_complex/example/alphaoffreader_for_doc_32.txt b/src/Alpha_complex/example/alphaoffreader_for_doc_32.txt
index 5869fdff..13183e86 100644
--- a/src/Alpha_complex/example/alphaoffreader_for_doc_32.txt
+++ b/src/Alpha_complex/example/alphaoffreader_for_doc_32.txt
@@ -7,16 +7,16 @@ Iterator on alpha complex simplices in the filtration order, with [filtration va
( 4 ) -> [0]
( 5 ) -> [0]
( 6 ) -> [0]
- ( 5 4 ) -> [6.25]
- ( 3 1 ) -> [7.25]
- ( 4 2 ) -> [8.5]
- ( 6 2 ) -> [9.25]
- ( 6 5 ) -> [10]
- ( 6 4 ) -> [11.25]
- ( 6 5 4 ) -> [12.5]
- ( 6 4 2 ) -> [12.9959]
- ( 3 0 ) -> [13.25]
- ( 4 1 ) -> [20]
- ( 1 0 ) -> [22.7367]
- ( 3 1 0 ) -> [22.7367]
- ( 5 0 ) -> [30.25]
+ ( 3 2 ) -> [6.25]
+ ( 5 4 ) -> [7.25]
+ ( 2 0 ) -> [8.5]
+ ( 1 0 ) -> [9.25]
+ ( 3 1 ) -> [10]
+ ( 2 1 ) -> [11.25]
+ ( 3 2 1 ) -> [12.5]
+ ( 2 1 0 ) -> [12.9959]
+ ( 6 5 ) -> [13.25]
+ ( 4 2 ) -> [20]
+ ( 6 4 ) -> [22.7367]
+ ( 6 5 4 ) -> [22.7367]
+ ( 6 3 ) -> [30.25]
diff --git a/src/Alpha_complex/example/alphaoffreader_for_doc_60.txt b/src/Alpha_complex/example/alphaoffreader_for_doc_60.txt
index 1d17a58a..71f29a00 100644
--- a/src/Alpha_complex/example/alphaoffreader_for_doc_60.txt
+++ b/src/Alpha_complex/example/alphaoffreader_for_doc_60.txt
@@ -7,21 +7,21 @@ Iterator on alpha complex simplices in the filtration order, with [filtration va
( 4 ) -> [0]
( 5 ) -> [0]
( 6 ) -> [0]
- ( 5 4 ) -> [6.25]
- ( 3 1 ) -> [7.25]
- ( 4 2 ) -> [8.5]
- ( 6 2 ) -> [9.25]
- ( 6 5 ) -> [10]
- ( 6 4 ) -> [11.25]
- ( 6 5 4 ) -> [12.5]
- ( 6 4 2 ) -> [12.9959]
- ( 3 0 ) -> [13.25]
- ( 4 1 ) -> [20]
- ( 1 0 ) -> [22.7367]
- ( 3 1 0 ) -> [22.7367]
- ( 5 0 ) -> [30.25]
- ( 4 0 ) -> [36.5]
- ( 5 4 0 ) -> [36.5]
- ( 4 1 0 ) -> [37.2449]
- ( 2 1 ) -> [59.7107]
- ( 4 2 1 ) -> [59.7107]
+ ( 3 2 ) -> [6.25]
+ ( 5 4 ) -> [7.25]
+ ( 2 0 ) -> [8.5]
+ ( 1 0 ) -> [9.25]
+ ( 3 1 ) -> [10]
+ ( 2 1 ) -> [11.25]
+ ( 3 2 1 ) -> [12.5]
+ ( 2 1 0 ) -> [12.9959]
+ ( 6 5 ) -> [13.25]
+ ( 4 2 ) -> [20]
+ ( 6 4 ) -> [22.7367]
+ ( 6 5 4 ) -> [22.7367]
+ ( 6 3 ) -> [30.25]
+ ( 6 2 ) -> [36.5]
+ ( 6 3 2 ) -> [36.5]
+ ( 6 4 2 ) -> [37.2449]
+ ( 4 0 ) -> [59.7107]
+ ( 4 2 0 ) -> [59.7107]
diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex.h b/src/Alpha_complex/include/gudhi/Alpha_complex.h
index 2b27a459..21eb5f48 100644
--- a/src/Alpha_complex/include/gudhi/Alpha_complex.h
+++ b/src/Alpha_complex/include/gudhi/Alpha_complex.h
@@ -27,14 +27,16 @@
#include <gudhi/graph_simplicial_complex.h>
#include <gudhi/Simplex_tree.h>
#include <gudhi/Debug_utils.h>
-// to construct a Delaunay_triangulation from a OFF file
-#include <gudhi/Delaunay_triangulation_off_io.h>
+// to construct Alpha_complex from a OFF file of points
+#include <gudhi/Points_off_io.h>
#include <stdlib.h>
#include <math.h> // isnan, fmax
+//#include <CGAL/Triangulation_data_structure.h>
#include <CGAL/Delaunay_triangulation.h>
#include <CGAL/Epick_d.h>
+#include <CGAL/Spatial_sort_traits_adapter_d.h>
#include <iostream>
#include <vector>
@@ -43,6 +45,7 @@
#include <map>
#include <utility> // std::pair
#include <stdexcept>
+#include <numeric> // for std::iota
namespace Gudhi {
@@ -57,7 +60,7 @@ namespace alphacomplex {
* \details
* The data structure can be constructed from a CGAL Delaunay triangulation (for more informations on CGAL Delaunay
* triangulation, please refer to the corresponding chapter in page http://doc.cgal.org/latest/Triangulation/) or from
- * an OFF file (cf. Delaunay_triangulation_off_reader).
+ * an OFF file (cf. Points_off_reader).
*
* Please refer to \ref alpha_complex for examples.
*
@@ -74,13 +77,19 @@ namespace alphacomplex {
template<class Kernel = CGAL::Epick_d<CGAL::Dynamic_dimension_tag>>
class Alpha_complex : public Simplex_tree<> {
public:
+ // Add an int in TDS to save point index in the structure
+ typedef CGAL::Triangulation_data_structure<CGAL::Dynamic_dimension_tag,
+ CGAL::Triangulation_vertex<Kernel, int>,
+ CGAL::Triangulation_full_cell<Kernel> > TDS;
/** \brief A Delaunay triangulation of a set of points in \f$ \mathbb{R}^D\f$.*/
- typedef typename CGAL::Delaunay_triangulation<Kernel> Delaunay_triangulation;
+ typedef CGAL::Delaunay_triangulation<Kernel, TDS> Delaunay_triangulation;
+
/** \brief A point in Euclidean space.*/
typedef typename Kernel::Point_d Point_d;
/** \brief Geometric traits class that provides the geometric types and predicates needed by Delaunay
* triangulations.*/
typedef Kernel Geom_traits;
+
private:
// From Simplex_tree
// Type required to insert into a simplex_tree (with or without subfaces).
@@ -104,7 +113,7 @@ class Alpha_complex : public Simplex_tree<> {
// Double map type to switch from CGAL vertex iterator to simplex tree vertex handle and vice versa.
typedef typename std::map< CGAL_vertex_iterator, Vertex_handle > Map_vertex_iterator_to_handle;
- typedef typename std::vector< CGAL_vertex_iterator > Vector_vertex_iterator;
+ typedef typename std::map< Vertex_handle, CGAL_vertex_iterator > Vector_vertex_iterator;
private:
/** \brief Map to switch from CGAL vertex iterator to simplex tree vertex handle.*/
@@ -128,28 +137,13 @@ class Alpha_complex : public Simplex_tree<> {
Alpha_complex(const std::string& off_file_name,
Filtration_value max_alpha_square = std::numeric_limits<Filtration_value>::infinity())
: triangulation_(nullptr) {
- Gudhi::Delaunay_triangulation_off_reader<Delaunay_triangulation> off_reader(off_file_name);
+ Gudhi::Points_off_reader<Point_d> off_reader(off_file_name);
if (!off_reader.is_valid()) {
std::cerr << "Alpha_complex - Unable to read file " << off_file_name << "\n";
exit(-1); // ----- >>
}
- triangulation_ = off_reader.get_complex();
- init(max_alpha_square);
- }
- /** \brief Alpha_complex constructor from a Delaunay triangulation.
- *
- * @param[in] triangulation_ptr Pointer on a <a target="_blank"
- * href="http://doc.cgal.org/latest/Triangulation/index.html#Chapter_Triangulations">
- * CGAL::Delaunay_triangulation<Kernel></a> \cite cgal:hdj-t-15b.
- * Alpha_complex takes ownership of the Delaunay_triangulation object, which must have been allocated using operator
- * new.
- * @param[in] max_alpha_square maximum for alpha square value. Default value is +\f$\infty\f$.
- */
- Alpha_complex(Delaunay_triangulation* triangulation_ptr,
- Filtration_value max_alpha_square = std::numeric_limits<Filtration_value>::infinity())
- : triangulation_(triangulation_ptr) {
- init(max_alpha_square);
+ init_from_range(off_reader.get_point_cloud(), max_alpha_square);
}
/** \brief Alpha_complex constructor from a list of points.
@@ -164,23 +158,7 @@ class Alpha_complex : public Simplex_tree<> {
Alpha_complex(const InputPointRange& points,
Filtration_value max_alpha_square = std::numeric_limits<Filtration_value>::infinity())
: triangulation_(nullptr) {
- auto first = std::begin(points);
- auto last = std::end(points);
-
- if (first != last) {
- // point_dimension function initialization
- Point_Dimension point_dimension = kernel_.point_dimension_d_object();
-
- // Delaunay triangulation is point dimension.
- triangulation_ = new Delaunay_triangulation(point_dimension(*first));
-
- size_type inserted = triangulation_->insert(first, last);
- if (inserted != (last -first)) {
- std::cerr << "Alpha_complex - insertion failed " << inserted << " != " << (last -first) << "\n";
- exit(-1); // ----- >>
- }
- init(max_alpha_square);
- }
+ init_from_range(points, max_alpha_square);
}
/** \brief Alpha_complex destructor.
@@ -191,6 +169,12 @@ class Alpha_complex : public Simplex_tree<> {
delete triangulation_;
}
+ // Forbid copy/move constructor/assignment operator
+ Alpha_complex(const Alpha_complex& other) = delete;
+ Alpha_complex& operator= (const Alpha_complex& other) = delete;
+ Alpha_complex (Alpha_complex&& other) = delete;
+ Alpha_complex& operator= (Alpha_complex&& other) = delete;
+
/** \brief get_point returns the point corresponding to the vertex given as parameter.
*
* @param[in] vertex Vertex handle of the point to retrieve.
@@ -202,6 +186,44 @@ class Alpha_complex : public Simplex_tree<> {
}
private:
+ template<typename InputPointRange >
+ void init_from_range(const InputPointRange& points, Filtration_value max_alpha_square) {
+ auto first = std::begin(points);
+ auto last = std::end(points);
+ if (first != last) {
+ // point_dimension function initialization
+ Point_Dimension point_dimension = kernel_.point_dimension_d_object();
+
+ // Delaunay triangulation is point dimension.
+ triangulation_ = new Delaunay_triangulation(point_dimension(*first));
+
+ std::vector<Point_d> points(first, last);
+
+ // Creates a vector {0, 1, ..., N-1}
+ std::vector<std::ptrdiff_t> indices(boost::counting_iterator<std::ptrdiff_t>(0),
+ boost::counting_iterator<std::ptrdiff_t>(points.size()));
+
+ // Sort indices considering CGAL spatial sort
+ typedef CGAL::Spatial_sort_traits_adapter_d<Kernel, Point_d*> Search_traits_d;
+ spatial_sort(indices.begin(),indices.end(),Search_traits_d(&(points[0])));
+
+ typename Delaunay_triangulation::Full_cell_handle hint;
+ for (auto index : indices) {
+ typename Delaunay_triangulation::Vertex_handle pos = triangulation_->insert(points[index], hint);
+ // Save index value as data to retrieve it after insertion
+ pos->data() = index;
+ hint = pos->full_cell();
+ }
+
+ if (triangulation_->number_of_vertices() != (last -first)) {
+ std::cerr << "Alpha_complex - insertion failed " << triangulation_->number_of_vertices() << " != " <<
+ (last -first) << "\n";
+ exit(-1); // ----- >>
+ }
+ init(max_alpha_square);
+ }
+ }
+
/** \brief Initialize the Alpha_complex from the Delaunay triangulation.
*
* @param[in] max_alpha_square maximum for alpha square value.
@@ -233,18 +255,15 @@ class Alpha_complex : public Simplex_tree<> {
// --------------------------------------------------------------------------------------------
// double map to retrieve simplex tree vertex handles from CGAL vertex iterator and vice versa
- // Start to insert at handle = 0 - default integer value
- Vertex_handle vertex_handle = Vertex_handle();
// Loop on triangulation vertices list
for (CGAL_vertex_iterator vit = triangulation_->vertices_begin(); vit != triangulation_->vertices_end(); ++vit) {
if (!triangulation_->is_infinite(*vit)) {
#ifdef DEBUG_TRACES
- std::cout << "Vertex insertion - " << vertex_handle << " -> " << vit->point() << std::endl;
+ std::cout << "Vertex insertion - " << vit->data() << " -> " << vit->point() << std::endl;
#endif // DEBUG_TRACES
- vertex_iterator_to_handle_.emplace(vit, vertex_handle);
- vertex_handle_to_iterator_.push_back(vit);
- vertex_handle++;
+ vertex_iterator_to_handle_.emplace(vit, vit->data());
+ vertex_handle_to_iterator_.emplace(vit->data(), vit);
}
}
// --------------------------------------------------------------------------------------------
diff --git a/src/Alpha_complex/test/Alpha_complex_unit_test.cpp b/src/Alpha_complex/test/Alpha_complex_unit_test.cpp
index 315582d1..80b39924 100644
--- a/src/Alpha_complex/test/Alpha_complex_unit_test.cpp
+++ b/src/Alpha_complex/test/Alpha_complex_unit_test.cpp
@@ -32,8 +32,6 @@
#include <string>
#include <vector>
-// to construct a Delaunay_triangulation from a OFF file
-#include <gudhi/Delaunay_triangulation_off_io.h>
#include <gudhi/Alpha_complex.h>
// Use dynamic_dimension_tag for the user to be able to set dimension
diff --git a/src/Persistent_cohomology/example/alpha_complex_persistence.cpp b/src/Persistent_cohomology/example/alpha_complex_persistence.cpp
index d2f9a4a2..8f9f077c 100644
--- a/src/Persistent_cohomology/example/alpha_complex_persistence.cpp
+++ b/src/Persistent_cohomology/example/alpha_complex_persistence.cpp
@@ -1,8 +1,7 @@
#include <boost/program_options.hpp>
#include <CGAL/Epick_d.h>
-// to construct a Delaunay_triangulation from a OFF file
-#include <gudhi/Delaunay_triangulation_off_io.h>
+
#include <gudhi/Alpha_complex.h>
#include <gudhi/Persistent_cohomology.h>
diff --git a/src/common/example/CGAL_points_off_reader.cpp b/src/common/example/CGAL_points_off_reader.cpp
new file mode 100644
index 00000000..076afd5b
--- /dev/null
+++ b/src/common/example/CGAL_points_off_reader.cpp
@@ -0,0 +1,43 @@
+#include <gudhi/Points_off_io.h>
+
+// For CGAL points type in dimension d
+// cf. http://doc.cgal.org/latest/Kernel_d/classCGAL_1_1Point__d.html
+#include <CGAL/Epick_d.h>
+
+#include <iostream>
+#include <string>
+
+typedef CGAL::Epick_d< CGAL::Dynamic_dimension_tag > Kernel;
+typedef typename Kernel::Point_d Point_d;
+
+void usage(int argc, char * const progName) {
+ std::cerr << "Error: Number of arguments (" << argc << ") is not correct" << std::endl;
+ std::cerr << "Usage: " << progName << " inputFile.off" << std::endl;
+ exit(-1);
+}
+
+int main(int argc, char **argv) {
+ if (argc != 2) usage(argc, (argv[0] - 1));
+
+ std::string offInputFile(argv[1]);
+ // Read the OFF file (input file name given as parameter) and triangulate points
+ Gudhi::Points_off_reader<Point_d> off_reader(offInputFile);
+ // Check the read operation was correct
+ if (!off_reader.is_valid()) {
+ std::cerr << "Unable to read file " << offInputFile << std::endl;
+ exit(-1);
+ }
+
+ // Retrieve the triangulation
+ std::vector<Point_d> point_cloud = off_reader.get_point_cloud();
+
+ int n = 0;
+ for (auto point : point_cloud) {
+ std::cout << "Point[" << n << "] = ";
+ for (int i = 0; i < point.dimension(); i++)
+ std::cout << point[i] << " ";
+ std::cout << "\n";
+ ++n;
+ }
+ return 0;
+}
diff --git a/src/common/example/CMakeLists.txt b/src/common/example/CMakeLists.txt
index 91e78ea2..2914756e 100644
--- a/src/common/example/CMakeLists.txt
+++ b/src/common/example/CMakeLists.txt
@@ -9,15 +9,9 @@ if(CGAL_FOUND)
message(STATUS "Eigen3 version: ${EIGEN3_VERSION}.")
include( ${EIGEN3_USE_FILE} )
- add_executable ( dtoffrw Delaunay_triangulation_off_rw.cpp )
- target_link_libraries(dtoffrw ${Boost_SYSTEM_LIBRARY} ${CGAL_LIBRARY})
- add_test(dtoffrw ${CMAKE_CURRENT_BINARY_DIR}/dtoffrw ${CMAKE_SOURCE_DIR}/data/points/alphacomplexdoc.off ${CMAKE_CURRENT_BINARY_DIR}/result.off)
-
- if (DIFF_PATH)
- # Do not forget to copy test results files in current binary dir
- file(COPY "dtoffrw_alphashapedoc_result.off" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
- add_test(dtoffrw_result_off_diff_files ${DIFF_PATH} ${CMAKE_CURRENT_BINARY_DIR}/dtoffrw_alphashapedoc_result.off ${CMAKE_CURRENT_BINARY_DIR}/result.off)
- endif()
+ add_executable ( cgaloffreader CGAL_points_off_reader.cpp )
+ target_link_libraries(cgaloffreader ${Boost_SYSTEM_LIBRARY} ${CGAL_LIBRARY})
+ add_test(cgaloffreader ${CMAKE_CURRENT_BINARY_DIR}/cgaloffreader ${CMAKE_SOURCE_DIR}/data/points/alphacomplexdoc.off)
else()
message(WARNING "Eigen3 not found. Version 3.1.0 is required for Alpha shapes feature.")
diff --git a/src/common/example/Delaunay_triangulation_off_rw.cpp b/src/common/example/Delaunay_triangulation_off_rw.cpp
deleted file mode 100644
index 4c7a9aaf..00000000
--- a/src/common/example/Delaunay_triangulation_off_rw.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-// to construct a Delaunay_triangulation from a OFF file
-#include <gudhi/Delaunay_triangulation_off_io.h>
-
-#include <CGAL/Delaunay_triangulation.h>
-#include <CGAL/Epick_d.h>
-
-#include <iostream>
-#include <string>
-
-// Use dynamic_dimension_tag for the user to be able to set dimension
-typedef CGAL::Epick_d< CGAL::Dynamic_dimension_tag > K;
-typedef CGAL::Delaunay_triangulation<K> T;
-// The triangulation uses the default instantiation of the
-// TriangulationDataStructure template parameter
-
-void usage(char * const progName) {
- std::cerr << "Usage: " << progName << " inputFile.off outputFile.off" << std::endl;
- exit(-1);
-}
-
-int main(int argc, char **argv) {
- if (argc != 3) {
- std::cerr << "Error: Number of arguments (" << argc << ") is not correct" << std::endl;
- usage(argv[0]);
- }
-
- std::string offInputFile(argv[1]);
- // Read the OFF file (input file name given as parameter) and triangulates points
- Gudhi::Delaunay_triangulation_off_reader<T> off_reader(offInputFile);
- // Check the read operation was correct
- if (!off_reader.is_valid()) {
- std::cerr << "Unable to read file " << offInputFile << std::endl;
- exit(-1);
- }
-
- // Retrieve the triangulation
- T* triangulation = off_reader.get_complex();
- // Operations on triangulation
- std::cout << "Number of vertices= " << triangulation->number_of_vertices() << std::endl;
- std::cout << "Number of finite full cells= " << triangulation->number_of_finite_full_cells() << std::endl;
-
- std::string outFileName(argv[2]);
- std::string offOutputFile(outFileName);
- // Write the OFF file (output file name given as parameter) with the points and triangulated cells as faces
- Gudhi::Delaunay_triangulation_off_writer<T> off_writer(offOutputFile, triangulation);
-
- // Check the write operation was correct
- if (!off_writer.is_valid()) {
- std::cerr << "Unable to write file " << offOutputFile << std::endl;
- exit(-1);
- }
-
- return 0;
-}
diff --git a/src/common/example/cgaloffreader_result.txt b/src/common/example/cgaloffreader_result.txt
new file mode 100644
index 00000000..1deb8dbd
--- /dev/null
+++ b/src/common/example/cgaloffreader_result.txt
@@ -0,0 +1,7 @@
+Point[0] = 1 1
+Point[1] = 7 0
+Point[2] = 4 6
+Point[3] = 9 6
+Point[4] = 0 14
+Point[5] = 2 19
+Point[6] = 9 17
diff --git a/src/common/example/dtoffrw_alphashapedoc_result.off b/src/common/example/dtoffrw_alphashapedoc_result.off
deleted file mode 100644
index d1839a43..00000000
--- a/src/common/example/dtoffrw_alphashapedoc_result.off
+++ /dev/null
@@ -1,15 +0,0 @@
-nOFF
-2 7 6 0
-9 17
-0 14
-1 1
-2 19
-4 6
-9 6
-7 0
-3 5 0 4
-3 0 1 4
-3 3 1 0
-3 4 1 2
-3 5 4 6
-3 6 4 2
diff --git a/src/common/example/dtoffrw_alphashapedoc_result.txt b/src/common/example/dtoffrw_alphashapedoc_result.txt
deleted file mode 100644
index 8e659740..00000000
--- a/src/common/example/dtoffrw_alphashapedoc_result.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Number of vertices= 7
-Number of finite full cells= 6
diff --git a/src/common/include/gudhi/Delaunay_triangulation_off_io.h b/src/common/include/gudhi/Delaunay_triangulation_off_io.h
deleted file mode 100644
index 50be9a59..00000000
--- a/src/common/include/gudhi/Delaunay_triangulation_off_io.h
+++ /dev/null
@@ -1,348 +0,0 @@
-/* This file is part of the Gudhi Library. The Gudhi library
- * (Geometric Understanding in Higher Dimensions) is a generic C++
- * library for computational topology.
- *
- * Author(s): Vincent Rouvreau
- *
- * Copyright (C) 2015 INRIA Saclay (France)
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-#ifndef DELAUNAY_TRIANGULATION_OFF_IO_H_
-#define DELAUNAY_TRIANGULATION_OFF_IO_H_
-
-#include <string>
-#include <vector>
-#include <fstream>
-#include <map>
-
-#include <CGAL/Spatial_sort_traits_adapter_d.h>
-
-#include <boost/iterator/counting_iterator.hpp>
-
-#include "gudhi/Off_reader.h"
-
-namespace Gudhi {
-
-/**
- * \class Delaunay_triangulation_off_visitor_reader Delaunay_triangulation_off_io.h gudhi/Delaunay_triangulation_off_io.h
- * \brief OFF file visitor implementation according to Off_reader in order to construct a CGAL Delaunay triangulation.
- *
- * For more informations on CGAL Delaunay triangulation, please refer to the corresponding chapter in page
- * http://doc.cgal.org/latest/Triangulation/
- */
-template<typename Complex>
-class Delaunay_triangulation_off_visitor_reader {
- private:
- Complex* complex_;
- typedef typename Complex::Point_d Point_d;
- typedef typename Complex::size_type size_type;
- std::vector<Point_d> point_cloud;
-
- public:
- // TODO(VR) : Pass a Complex as a parameter is required, even if not used. Otherwise, compilation is KO.
-
- /** \brief Delaunay_triangulation_off_visitor_reader constructor
- *
- * @param[in] complex_ptr_ pointer on a Delaunay triangulation.
- */
- Delaunay_triangulation_off_visitor_reader(Complex* complex_ptr_)
- : complex_(nullptr) { }
-
- /** \brief Off_reader visitor init implementation.
- *
- * The init parameters are set from OFF file header.
- * Dimension value is required in order to construct Delaunay triangulation.
- *
- * @param[in] dim space dimension of vertices.
- * @param[in] num_vertices number of vertices in the OFF file (not used).
- * @param[in] num_faces number of faces in the OFF file (not used).
- * @param[in] num_edges number of edges in the OFF file (not used).
- */
- void init(int dim, int num_vertices, int num_faces, int num_edges) {
-#ifdef DEBUG_TRACES
- std::cout << "Delaunay_triangulation_off_visitor_reader::init - dim=" << dim << " - num_vertices=" <<
- num_vertices << " - num_faces=" << num_faces << " - num_edges=" << num_edges << std::endl;
-#endif // DEBUG_TRACES
- if (num_faces > 0) {
- std::cerr << "Delaunay_triangulation_off_visitor_reader::init faces are not taken into account from OFF " <<
- "file for Delaunay triangulation - faces are computed.\n";
- }
- if (num_edges > 0) {
- std::cerr << "Delaunay_triangulation_off_visitor_reader::init edges are not taken into account from OFF " <<
- "file for Delaunay triangulation - edges are computed.\n";
- }
- // Complex construction with dimension from file
- complex_ = new Complex(dim);
- }
-
- /** \brief Off_reader visitor point implementation.
- *
- * The point function is called on each vertex line from OFF file.
- * This function inserts the vertex in the Delaunay triangulation.
- *
- * @param[in] point vector of vertex coordinates.
- */
- void point(const std::vector<double>& point) {
-#ifdef DEBUG_TRACES
- std::cout << "Delaunay_triangulation_off_visitor_reader::point ";
- for (auto coordinate : point) {
- std::cout << coordinate << " | ";
- }
- std::cout << std::endl;
-#endif // DEBUG_TRACES
- // Fill the point cloud
- point_cloud.push_back(Point_d(point.size(), point.begin(), point.end()));
- }
-
- // Off_reader visitor maximal_face implementation - not used
- void maximal_face(const std::vector<int>& face) {
- // For Delaunay Triangulation, only points are read
- }
-
- // Off_reader visitor done implementation
- void done() {
- // It is advised to insert all the points at a time in a Delaunay Triangulation because points are sorted at the
- // beginning of the insertion
- size_type inserted = complex_->insert(point_cloud.begin(), point_cloud.end());
- if (inserted != (point_cloud.end() -point_cloud.begin())) {
- std::cerr << "Delaunay_triangulation_off_visitor_reader::done - insertion failed " << inserted << " != " <<
- (point_cloud.end() -point_cloud.begin()) << "\n";
- }
- }
-
- /** \brief Returns the constructed Delaunay triangulation.
- *
- * @return A pointer on the Delaunay triangulation. Default value is <CODE>nullptr</CODE>.
- */
- Complex* get_complex() const {
- return complex_;
- }
-
- private:
- template<typename PointRangeIterator >
- size_type insert_with_index(const PointRangeIterator& first, const PointRangeIterator& last) {
- size_type vertices_before_insertion = complex_->number_of_vertices();
- std::vector<Point_d> points(first, last);
-
- std::vector<std::ptrdiff_t> indices;
- indices.reserve(points.size());
-
- // Creates a vector {0, 1, ..., N-1}
- std::copy(boost::counting_iterator<std::ptrdiff_t>(0), boost::counting_iterator<std::ptrdiff_t>(points.size()),
- std::back_inserter(indices));
-
- // Sort indices considering CGAL spatial sort
- typedef CGAL::Spatial_sort_traits_adapter_d<Kernel, Point_d*> Search_traits_d;
- spatial_sort(indices.begin(),indices.end(),Search_traits_d(&(points[0])));
-
- typename Delaunay_triangulation::Full_cell_handle hint;
- for (typename std::vector<std::ptrdiff_t>::const_iterator it = indices.begin(), end = indices.end();
- it != end; ++it) {
- typename Delaunay_triangulation::Vertex_handle pos = complex_->insert(points[*it], hint);
- // Save index value as data to retrieve it after insertion
- pos->data() = *it;
- hint = pos->full_cell();
- }
-
- return (complex_->number_of_vertices() - vertices_before_insertion);
- }
-
-};
-
-/**
- * \class Delaunay_triangulation_off_reader Delaunay_triangulation_off_io.h gudhi/Delaunay_triangulation_off_io.h
- * \brief OFF file reader implementation in order to construct a Delaunay triangulation.
- *
- * This class is using the Delaunay_triangulation_off_visitor_reader to visit the OFF file according to Off_reader.
- *
- * For more informations on CGAL Delaunay triangulation, please refer to the corresponding chapter in page
- * http://doc.cgal.org/latest/Triangulation/
- *
- * \section Example
- *
- * This example loads points from an OFF file and builds the Delaunay triangulation.
- * Then, it is asked to display the number of vertices and finites full cells from the Delaunay triangulation.
- *
- * \include Delaunay_triangulation_off_rw.cpp
- *
- * When launching:
- *
- * \code $> ./dtoffrw ../../data/points/alphacomplexdoc.off triangulated.off
- * \endcode
- *
- * the program output is:
- *
- * \include dtoffrw_alphashapedoc_result.txt
- */
-template<typename Complex>
-class Delaunay_triangulation_off_reader {
- public:
- /** \brief Reads the OFF file and constructs the Delaunay triangulation from the points
- * that are in the OFF file.
- *
- * @param[in] name_file OFF file to read.
- *
- * \post Check with is_valid() function to see if read operation was successful.
- */
- Delaunay_triangulation_off_reader(const std::string & name_file)
- : valid_(false) {
- std::ifstream stream(name_file);
- if (stream.is_open()) {
- Delaunay_triangulation_off_visitor_reader<Complex> off_visitor(complex_);
- Off_reader off_reader(stream);
- valid_ = off_reader.read(off_visitor);
- if (valid_) {
- complex_ = off_visitor.get_complex();
- if (complex_ == nullptr) {
- std::cerr << "Delaunay_triangulation_off_reader::Delaunay_triangulation_off_reader off_visitor returns " <<
- "an empty pointer\n";
- valid_ = false;
- }
- }
- } else {
- std::cerr << "Delaunay_triangulation_off_reader::Delaunay_triangulation_off_reader could not open file " <<
- name_file << "\n";
- }
- }
-
- /** \brief Returns if the OFF file read operation was successful or not.
- *
- * @return OFF file read status.
- */
- bool is_valid() const {
- return valid_;
- }
-
- /** \brief Returns the constructed Delaunay triangulation.
- *
- * @return A pointer on the Delaunay triangulation. Default value is <CODE>nullptr</CODE>.
- */
- Complex* get_complex() const {
- if (valid_)
- return complex_;
- return nullptr;
- }
-
- private:
- /** \brief OFF file read status.*/
- bool valid_;
- /** \brief A pointer on the Delaunay triangulation.*/
- Complex* complex_;
-};
-
-/**
- * \class Delaunay_triangulation_off_writer Delaunay_triangulation_off_io.h gudhi/Delaunay_triangulation_off_io.h
- * \brief OFF file writer from a Delaunay triangulation.
- *
- * This class constructs the OFF file header according to http://www.geomview.org/docs/html/OFF.html
- *
- * The header is followed by the list of points coordinates (Delaunay triangulation vertices)
- *
- * And finally is followed by the list of faces (Delaunay triangulation finite full cells)
- *
- * For more informations on CGAL Delaunay triangulation, please refer to the corresponding chapter in page
- * http://doc.cgal.org/latest/Triangulation/
- *
- * \section Example
- *
- * This example loads points from an OFF file and builds the Delaunay triangulation.
- * Then, the Delaunay triangulation is saved in a new file including the triangulation as a list of faces.
- *
- * \include Delaunay_triangulation_off_rw.cpp
- *
- * When launching:
- *
- * \code $> ./dtoffrw ../../data/points/alphashapedoc.off triangulated.off
- * \endcode
- *
- * The result will be an OFF file of dimension 2 with the 7 points from alphashapedoc.off followed by the 6
- * triangulations of dimension 3 (the first value on each faces):
- * \include dtoffrw_alphashapedoc_result.off
- */
-template<typename Complex>
-class Delaunay_triangulation_off_writer {
- public:
- typedef typename Complex::Point Point;
-
- /** \brief Writes the OFF file from the Delaunay triangulation.
- *
- * @param[in] name_file OFF file to write.
- * @param[in] complex_ptr pointer on a Delaunay triangulation.
- *
- * \post Check with is_valid() function to see if write operation was successful.
- */
- Delaunay_triangulation_off_writer(const std::string & name_file, Complex* complex_ptr)
- : valid_(false) {
- std::ofstream stream(name_file);
- if (stream.is_open()) {
- if (complex_ptr->current_dimension() == 3) {
- // OFF header
- stream << "OFF" << std::endl;
- // no endl on next line - don't know why...
- stream << complex_ptr->number_of_vertices() << " " << complex_ptr->number_of_finite_full_cells() << " 0";
- } else {
- // nOFF header
- stream << "nOFF" << std::endl;
- // no endl on next line - don't know why...
- stream << complex_ptr->current_dimension() << " " << complex_ptr->number_of_vertices() << " " <<
- complex_ptr->number_of_finite_full_cells() << " 0";
- }
-
- // bimap to retrieve vertex handles from points and vice versa
- std::map< Point, int > points_to_vh;
- // Start to insert at default handle value
- int vertex_handle = int();
-
- // Points list
- for (auto vit = complex_ptr->vertices_begin(); vit != complex_ptr->vertices_end(); ++vit) {
- for (auto Coord = vit->point().cartesian_begin(); Coord != vit->point().cartesian_end(); ++Coord) {
- stream << *Coord << " ";
- }
- stream << std::endl;
- points_to_vh[vit->point()] = vertex_handle;
- vertex_handle++;
- }
-
- for (auto cit = complex_ptr->finite_full_cells_begin(); cit != complex_ptr->finite_full_cells_end(); ++cit) {
- stream << std::distance(cit->vertices_begin(), cit->vertices_end()) << " ";
- for (auto vit = cit->vertices_begin(); vit != cit->vertices_end(); ++vit) {
- stream << points_to_vh[(*vit)->point()] - 1 << " ";
- }
- stream << std::endl;
- }
- stream.close();
- valid_ = true;
- } else {
- std::cerr << "Delaunay_triangulation_off_writer::Delaunay_triangulation_off_writer could not open file " <<
- name_file << "\n";
- }
- }
-
- /** \brief Returns if the OFF write operation was successful or not.
- *
- * @return OFF file write status.
- */
- bool is_valid() const {
- return valid_;
- }
-
- private:
- /* \brief OFF file write status. */
- bool valid_;
-};
-
-} // namespace Gudhi
-
-#endif // DELAUNAY_TRIANGULATION_OFF_IO_H_
diff --git a/src/common/include/gudhi/Points_off_io.h b/src/common/include/gudhi/Points_off_io.h
new file mode 100644
index 00000000..d9f9a74b
--- /dev/null
+++ b/src/common/include/gudhi/Points_off_io.h
@@ -0,0 +1,178 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Vincent Rouvreau
+ *
+ * Copyright (C) 2015 INRIA Saclay (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef POINTS_OFF_IO_H_
+#define POINTS_OFF_IO_H_
+
+#include <string>
+#include <vector>
+#include <fstream>
+#include <map>
+
+#include <gudhi/Off_reader.h>
+
+namespace Gudhi {
+
+/**
+ * \brief OFF file visitor implementation according to Off_reader in order to read points from an OFF file.
+ */
+template<typename Point_d>
+class Points_off_visitor_reader {
+ private:
+ std::vector<Point_d> point_cloud;
+
+ public:
+ /** \brief Off_reader visitor init implementation.
+ *
+ * The init parameters are set from OFF file header.
+ * Dimension value is required in order to construct Alpha complex.
+ *
+ * @param[in] dim space dimension of vertices.
+ * @param[in] num_vertices number of vertices in the OFF file (not used).
+ * @param[in] num_faces number of faces in the OFF file (not used).
+ * @param[in] num_edges number of edges in the OFF file (not used).
+ */
+ void init(int dim, int num_vertices, int num_faces, int num_edges) {
+#ifdef DEBUG_TRACES
+ std::cout << "Points_off_visitor_reader::init - dim=" << dim << " - num_vertices=" <<
+ num_vertices << " - num_faces=" << num_faces << " - num_edges=" << num_edges << std::endl;
+#endif // DEBUG_TRACES
+ if (num_faces > 0) {
+ std::cerr << "Points_off_visitor_reader::init faces are not taken into account from OFF file for Points.\n";
+ }
+ if (num_edges > 0) {
+ std::cerr << "Points_off_visitor_reader::init edges are not taken into account from OFF file for Points.\n";
+ }
+ }
+
+ /** \brief Off_reader visitor point implementation.
+ *
+ * The point function is called on each vertex line from OFF file.
+ * This function inserts the vertex in the Alpha complex.
+ *
+ * @param[in] point vector of vertex coordinates.
+ */
+ void point(const std::vector<double>& point) {
+#ifdef DEBUG_TRACES
+ std::cout << "Points_off_visitor_reader::point ";
+ for (auto coordinate : point) {
+ std::cout << coordinate << " | ";
+ }
+ std::cout << std::endl;
+#endif // DEBUG_TRACES
+ // Fill the point cloud
+ point_cloud.push_back(Point_d(point.size(), point.begin(), point.end()));
+ }
+
+ // Off_reader visitor maximal_face implementation - Only points are read
+ void maximal_face(const std::vector<int>& face) { }
+
+ // Off_reader visitor done implementation - Only points are read
+ void done() { }
+
+ /** \brief Point cloud getter.
+ *
+ * @return point_cloud.
+ */
+ const std::vector<Point_d>& get_point_cloud() {
+ return point_cloud;
+ }
+
+};
+
+/**
+ * \brief OFF file reader implementation in order to read points from an OFF file.
+ *
+ * This class is using the Points_off_visitor_reader to visit the OFF file according to Off_reader.
+ *
+ * Point_d must have a constructor with the following form:
+ *
+ * \code template<class InputIterator > Point_d::Point_d(int d, InputIterator first, InputIterator last) \endcode
+ *
+ * where d is the point dimension.
+ *
+ * \section Example
+ *
+ * This example loads points from an OFF file and builds a vector of CGAL points in dimension d.
+ * Then, it is asked to display the points.
+ *
+ * \include CGAL_points_off_reader.cpp
+ *
+ * When launching:
+ *
+ * \code $> ./cgaloffreader ../../data/points/alphacomplexdoc.off
+ * \endcode
+ *
+ * the program output is:
+ *
+ * \include cgaloffreader_result.txt
+ */
+template<typename Point_d>
+class Points_off_reader {
+ public:
+ /** \brief Reads the OFF file and constructs the Alpha complex from the points
+ * that are in the OFF file.
+ *
+ * @param[in] name_file OFF file to read.
+ *
+ * \post Check with is_valid() function to see if read operation was successful.
+ */
+ Points_off_reader(const std::string& name_file)
+ : valid_(false) {
+ std::ifstream stream(name_file);
+ if (stream.is_open()) {
+ Off_reader off_reader(stream);
+ Points_off_visitor_reader<Point_d> off_visitor;
+ valid_ = off_reader.read(off_visitor);
+ if (valid_) {
+ point_cloud = off_visitor.get_point_cloud();
+ }
+ } else {
+ std::cerr << "Points_off_reader::Points_off_reader could not open file " << name_file << "\n";
+ }
+ }
+
+ /** \brief Returns if the OFF file read operation was successful or not.
+ *
+ * @return OFF file read status.
+ */
+ bool is_valid() const {
+ return valid_;
+ }
+
+ /** \brief Point cloud getter.
+ *
+ * @return point_cloud.
+ */
+ const std::vector<Point_d>& get_point_cloud() {
+ return point_cloud;
+ }
+
+ private:
+ /** \brief point_cloud.*/
+ std::vector<Point_d> point_cloud;
+ /** \brief OFF file read status.*/
+ bool valid_;
+};
+
+} // namespace Gudhi
+
+#endif // POINTS_OFF_IO_H_
diff --git a/src/common/test/CMakeLists.txt b/src/common/test/CMakeLists.txt
index 12eecda8..6205f0e4 100644
--- a/src/common/test/CMakeLists.txt
+++ b/src/common/test/CMakeLists.txt
@@ -18,22 +18,16 @@ if(CGAL_FOUND)
message(STATUS "Eigen3 version: ${EIGEN3_VERSION}.")
include( ${EIGEN3_USE_FILE} )
- add_executable ( dtoffrw_UT dtoffrw_unit_test.cpp )
- target_link_libraries(dtoffrw_UT ${Boost_SYSTEM_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
+ add_executable ( poffreader_UT points_off_reader_unit_test.cpp )
+ target_link_libraries(poffreader_UT ${Boost_SYSTEM_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
# Do not forget to copy test files in current binary dir
file(COPY "${CMAKE_SOURCE_DIR}/data/points/alphacomplexdoc.off" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
# Unitary tests
- add_test(dtoffrw_UT ${CMAKE_CURRENT_BINARY_DIR}/dtoffrw_UT
+ add_test(poffreader_UT ${CMAKE_CURRENT_BINARY_DIR}/poffreader_UT
# XML format for Jenkins xUnit plugin
- --log_format=XML --log_sink=${CMAKE_SOURCE_DIR}/dtoffrw_UT.xml --log_level=test_suite --report_level=no)
-
- if (DIFF_PATH)
- # Do not forget to copy test result files in current binary dir
- file(COPY "dtoffrw_alphashapedoc_result.off" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
- add_test(dtoffrw_diff_files_UT ${DIFF_PATH} ${CMAKE_CURRENT_BINARY_DIR}/UT.off ${CMAKE_CURRENT_BINARY_DIR}/dtoffrw_alphashapedoc_result.off)
- endif()
+ --log_format=XML --log_sink=${CMAKE_SOURCE_DIR}/poffreader_UT.xml --log_level=test_suite --report_level=no)
else()
message(WARNING "Eigen3 not found. Version 3.1.0 is required for Alpha shapes feature.")
diff --git a/src/common/test/dtoffrw_alphashapedoc_result.off b/src/common/test/dtoffrw_alphashapedoc_result.off
index d1839a43..1deb8dbd 100644
--- a/src/common/test/dtoffrw_alphashapedoc_result.off
+++ b/src/common/test/dtoffrw_alphashapedoc_result.off
@@ -1,15 +1,7 @@
-nOFF
-2 7 6 0
-9 17
-0 14
-1 1
-2 19
-4 6
-9 6
-7 0
-3 5 0 4
-3 0 1 4
-3 3 1 0
-3 4 1 2
-3 5 4 6
-3 6 4 2
+Point[0] = 1 1
+Point[1] = 7 0
+Point[2] = 4 6
+Point[3] = 9 6
+Point[4] = 0 14
+Point[5] = 2 19
+Point[6] = 9 17
diff --git a/src/common/test/dtoffrw_unit_test.cpp b/src/common/test/dtoffrw_unit_test.cpp
deleted file mode 100644
index f682df1a..00000000
--- a/src/common/test/dtoffrw_unit_test.cpp
+++ /dev/null
@@ -1,90 +0,0 @@
-/* This file is part of the Gudhi Library. The Gudhi library
- * (Geometric Understanding in Higher Dimensions) is a generic C++
- * library for computational topology.
- *
- * Author(s): Vincent Rouvreau
- *
- * Copyright (C) 2015 INRIA Saclay (France)
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-// to construct a Delaunay_triangulation from a OFF file
-#include "gudhi/Delaunay_triangulation_off_io.h"
-
-#include <CGAL/Delaunay_triangulation.h>
-#include <CGAL/Epick_d.h>
-
-#include <stdlib.h>
-
-#include <iostream>
-#include <string>
-
-#define BOOST_TEST_DYN_LINK
-#define BOOST_TEST_MODULE "delaunay_triangulation_off_read_write"
-#include <boost/test/unit_test.hpp>
-
-// Use dynamic_dimension_tag for the user to be able to set dimension
-typedef CGAL::Epick_d< CGAL::Dynamic_dimension_tag > K;
-typedef CGAL::Delaunay_triangulation<K> T;
-
-BOOST_AUTO_TEST_CASE( Delaunay_triangulation_doc_test )
-{
- // Read the OFF file (input file name given as parameter) and triangulates points
- Gudhi::Delaunay_triangulation_off_reader<T> off_reader("alphacomplexdoc.off");
- // Check the read operation was correct
- BOOST_CHECK(off_reader.is_valid());
-
- // Retrieve the triangulation
- T* triangulation = off_reader.get_complex();
- BOOST_CHECK(triangulation != nullptr);
- // Operations on triangulation
- BOOST_CHECK(triangulation->number_of_vertices() == 7);
- BOOST_CHECK(triangulation->number_of_finite_full_cells() == 6);
-
- // Write the OFF file (output file name given as parameter) with the points and triangulated cells as faces
- Gudhi::Delaunay_triangulation_off_writer<T> off_writer("UT.off", triangulation);
-
- // Check the write operation was correct
- BOOST_CHECK(off_writer.is_valid());
-
- delete triangulation;
-}
-
-BOOST_AUTO_TEST_CASE( Delaunay_triangulation_unexisting_file_read_test )
-{
- Gudhi::Delaunay_triangulation_off_reader<T> off_reader("some_impossible_weird_file_name.off");
- // Check the read operation was correct
- BOOST_CHECK(!off_reader.is_valid());
- T* triangulation = off_reader.get_complex();
- BOOST_CHECK(triangulation == nullptr);
-}
-
-BOOST_AUTO_TEST_CASE( Delaunay_triangulation_unexisting_file_write_test )
-{
- // Read the OFF file (input file name given as parameter) and triangulates points
- Gudhi::Delaunay_triangulation_off_reader<T> off_reader("alphacomplexdoc.off");
-
- // Retrieve the triangulation
- T* triangulation = off_reader.get_complex();
-
- // Write the OFF file (output file name given as parameter) with the points and triangulated cells as faces
- Gudhi::Delaunay_triangulation_off_writer<T> off_writer("/some_impossible_weird_directory_name/another_weird_directory_name/some_impossible_weird_file_name.off", triangulation);
-
- // Check the write operation was correct
- BOOST_CHECK(!off_writer.is_valid());
-
- delete triangulation;
-}
-
diff --git a/src/common/test/points_off_reader_unit_test.cpp b/src/common/test/points_off_reader_unit_test.cpp
new file mode 100644
index 00000000..73e19cbc
--- /dev/null
+++ b/src/common/test/points_off_reader_unit_test.cpp
@@ -0,0 +1,78 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Vincent Rouvreau
+ *
+ * Copyright (C) 2015 INRIA Saclay (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Points_off_io.h>
+
+// For CGAL points type in dimension d
+// cf. http://doc.cgal.org/latest/Kernel_d/classCGAL_1_1Point__d.html
+#include <CGAL/Epick_d.h>
+
+#include <iostream>
+#include <string>
+#include <vector>
+
+#define BOOST_TEST_DYN_LINK
+#define BOOST_TEST_MODULE "points_off_read_write"
+#include <boost/test/unit_test.hpp>
+
+typedef CGAL::Epick_d< CGAL::Dynamic_dimension_tag > Kernel;
+typedef typename Kernel::Point_d Point_d;
+
+BOOST_AUTO_TEST_CASE( points_doc_test )
+{
+ // Read the OFF file (input file name given as parameter) and triangulates points
+ Gudhi::Points_off_reader<Point_d> off_reader("alphacomplexdoc.off");
+ // Check the read operation was correct
+ BOOST_CHECK(off_reader.is_valid());
+
+ // Retrieve the triangulation
+ std::vector<Point_d> point_cloud = off_reader.get_point_cloud();
+ BOOST_CHECK(point_cloud.size() == 7);
+
+ std::vector<Point_d> expected_points;
+ std::vector<double> point = {1.0, 1.0};
+ expected_points.push_back(Point_d(2, point.begin(), point.end()));
+ point = {7.0, 0.0};
+ expected_points.push_back(Point_d(2, point.begin(), point.end()));
+ point = {4.0, 6.0};
+ expected_points.push_back(Point_d(2, point.begin(), point.end()));
+ point = {9.0, 6.0};
+ expected_points.push_back(Point_d(2, point.begin(), point.end()));
+ point = {0.0, 14.0};
+ expected_points.push_back(Point_d(2, point.begin(), point.end()));
+ point = {2.0, 19.0};
+ expected_points.push_back(Point_d(2, point.begin(), point.end()));
+ point = {9.0, 17.0};
+ expected_points.push_back(Point_d(2, point.begin(), point.end()));
+
+ BOOST_CHECK(point_cloud == expected_points);
+}
+
+BOOST_AUTO_TEST_CASE( Delaunay_triangulation_unexisting_file_read_test )
+{
+ Gudhi::Points_off_reader<Point_d> off_reader("some_impossible_weird_file_name.off");
+ // Check the read operation was correct
+ BOOST_CHECK(!off_reader.is_valid());
+
+ std::vector<Point_d> point_cloud = off_reader.get_point_cloud();
+ BOOST_CHECK(point_cloud.size() == 0);
+}