From d6ddce7983636608f3e3a4729bbce701ab132b39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sat, 12 Feb 2011 08:50:51 +0000 Subject: [PATCH] oops bad place --- .gitattributes | 130 - .gitignore | 43 - Triangulation_3_copy_tds/TODO | 105 - .../Triangulation_benchmark_3.cpp | 246 - .../benchs_results_tigre_10_7.txt | 116 - .../demo/Triangulation_3/CMakeLists.txt | 82 - .../demo/Triangulation_3/MainWindow.cpp | 243 - .../demo/Triangulation_3/MainWindow.h | 55 - .../demo/Triangulation_3/MainWindow.ui | 577 -- .../demo/Triangulation_3/PreferenceDlg.cpp | 399 -- .../demo/Triangulation_3/PreferenceDlg.h | 70 - .../demo/Triangulation_3/Scene.cpp | 225 - .../demo/Triangulation_3/Scene.h | 40 - .../demo/Triangulation_3/T3_demo.cpp | 37 - .../demo/Triangulation_3/T3_demo.qrc | 31 - .../demo/Triangulation_3/Viewer.cpp | 1297 ---- .../demo/Triangulation_3/Viewer.h | 290 - .../Triangulation_3/documentation/about.html | 13 - .../documentation/about_CGAL.html | 7 - .../Triangulation_3/icons/about_CGAL.html | 8 - .../demo/Triangulation_3/icons/cgal_logo.xpm | 24 - .../demo/Triangulation_3/icons/clear.jpeg | Bin 768 -> 0 bytes .../Triangulation_3/icons/coordinates.jpeg | Bin 1268 -> 0 bytes .../Triangulation_3/icons/empty_sphere.jpeg | Bin 10703 -> 0 bytes .../demo/Triangulation_3/icons/fileOpen.png | Bin 1662 -> 0 bytes .../demo/Triangulation_3/icons/fileSave.png | Bin 1205 -> 0 bytes .../demo/Triangulation_3/icons/flat.png | Bin 2326 -> 0 bytes .../demo/Triangulation_3/icons/grid.jpeg | Bin 798 -> 0 bytes .../demo/Triangulation_3/icons/insert.jpeg | Bin 12409 -> 0 bytes .../Triangulation_3/icons/insert_point.jpg | Bin 15701 -> 0 bytes .../demo/Triangulation_3/icons/move_1.jpeg | Bin 2592 -> 0 bytes .../demo/Triangulation_3/icons/nearest_nb.png | Bin 38356 -> 0 bytes .../Triangulation_3/icons/normal_view.jpeg | Bin 797 -> 0 bytes .../demo/Triangulation_3/icons/pause.jpeg | Bin 4075 -> 0 bytes .../demo/Triangulation_3/icons/play.jpeg | Bin 3881 -> 0 bytes .../Triangulation_3/icons/pointRandom.png | Bin 1585 -> 0 bytes .../Triangulation_3/icons/preferences.jpeg | Bin 1003 -> 0 bytes .../demo/Triangulation_3/icons/quit.jpeg | Bin 4298 -> 0 bytes .../Triangulation_3/icons/select_hand.jpeg | Bin 5835 -> 0 bytes .../Triangulation_3/icons/show_delaunay.jpeg | Bin 5781 -> 0 bytes .../Triangulation_3/icons/show_facet.jpeg | Bin 1201 -> 0 bytes .../Triangulation_3/icons/show_point.jpeg | Bin 326 -> 0 bytes .../Triangulation_3/icons/show_voronoi.jpeg | Bin 2126 -> 0 bytes .../demo/Triangulation_3/icons/stereo.png | Bin 2350 -> 0 bytes .../demo/Triangulation_3/icons/stop.jpeg | Bin 3295 -> 0 bytes .../demo/Triangulation_3/typedefs.h | 101 - .../demo/Triangulation_3/ui_MainWindow.h | 584 -- .../CMakeLists.txt | 33 - .../Triangulation_3_Geomview_demos/README | 39 - .../Triangulation_3_color_demo.cpp | 86 - .../Triangulation_3_demo.cpp | 188 - .../Triangulation_3_remove_demo.cpp | 146 - .../Triangulation_3_voronoi_demo.cpp | 85 - .../data/points | 7 - .../TriangulationDS_3/PkgDescription.tex | 15 - .../doc_tex/TriangulationDS_3/TDS3.tex | 386 -- .../doc_tex/TriangulationDS_3/comborient.gif | Bin 1484 -> 0 bytes .../doc_tex/TriangulationDS_3/comborient.pdf | Bin 12914 -> 0 bytes .../doc_tex/TriangulationDS_3/comborient.xml | 50 - .../doc_tex/TriangulationDS_3/design_tds.fig | 130 - .../doc_tex/TriangulationDS_3/design_tds.gif | Bin 368983 -> 0 bytes .../doc_tex/TriangulationDS_3/design_tds.pdf | Bin 5762 -> 0 bytes .../doc_tex/TriangulationDS_3/flips.gif | Bin 2783 -> 0 bytes .../doc_tex/TriangulationDS_3/flips.pdf | Bin 7269 -> 0 bytes .../doc_tex/TriangulationDS_3/flips.xml | 67 - .../doc_tex/TriangulationDS_3/main.tex | 9 - .../doc_tex/TriangulationDS_3/repres.gif | Bin 2748 -> 0 bytes .../doc_tex/TriangulationDS_3/repres.pdf | Bin 13463 -> 0 bytes .../doc_tex/TriangulationDS_3/repres.xml | 64 - .../doc_tex/TriangulationDS_3/tds3_small.pdf | Bin 2713 -> 0 bytes .../doc_tex/TriangulationDS_3/tds3_small.png | Bin 6709 -> 0 bytes .../TriangulationDS_3/topo-simplex2.gif | Bin 2237 -> 0 bytes .../TriangulationDS_3/topo-simplex2.pdf | Bin 13201 -> 0 bytes .../TriangulationDS_3/topo-simplex2.xml | 34 - .../TriangulationDS_3/topo-simplex3.gif | Bin 3075 -> 0 bytes .../TriangulationDS_3/topo-simplex3.pdf | Bin 14607 -> 0 bytes .../TriangulationDS_3/topo-simplex3.xml | 101 - .../TriangulationDS_3/topo-simplex4.gif | Bin 4303 -> 0 bytes .../TriangulationDS_3/topo-simplex4.pdf | Bin 14693 -> 0 bytes .../TriangulationDS_3/topo-simplex4.xml | 102 - .../TriangulationDS_3_ref/Tds_cell_3.tex | 119 - .../TriangulationDS_3_ref/Tds_vertex_3.tex | 95 - .../TriangulationDSCellBase_3.tex | 189 - .../TriangulationDSVertexBase_3.tex | 132 - .../TriangulationDataStructure_3.tex | 736 --- .../Triangulation_data_structure_3.tex | 82 - .../Triangulation_ds_cell_base_3.tex | 47 - .../Triangulation_ds_vertex_base_3.tex | 44 - .../Triangulation_utils_3.tex | 61 - .../doc_tex/TriangulationDS_3_ref/flips.gif | Bin 2783 -> 0 bytes .../doc_tex/TriangulationDS_3_ref/flips.pdf | Bin 7269 -> 0 bytes .../doc_tex/TriangulationDS_3_ref/intro.tex | 75 - .../doc_tex/TriangulationDS_3_ref/main.tex | 19 - .../TriangulationDS_3_ref/tds-dim_down.eps | 575 -- .../TriangulationDS_3_ref/tds-dim_down.gif | Bin 41543 -> 0 bytes .../TriangulationDS_3_ref/tds-dim_down.pdf | Bin 15066 -> 0 bytes .../TriangulationDS_3_ref/tds-dim_down.png | Bin 101732 -> 0 bytes .../topo-insert_outside_affine_hull.gif | Bin 2752 -> 0 bytes .../topo-insert_outside_affine_hull.pdf | Bin 16889 -> 0 bytes .../doc_tex/TriangulationDS_3_ref/utils.gif | Bin 2357 -> 0 bytes .../doc_tex/TriangulationDS_3_ref/utils.pdf | Bin 20604 -> 0 bytes .../doc_tex/TriangulationDS_3_ref/utils.xml | 80 - .../Triangulation_3/PkgDescription.tex | 24 - .../doc_tex/Triangulation_3/Triang3.tex | 810 --- .../Triangulation_3/concept_hierarchy.fig | 33 - .../Triangulation_3/concept_hierarchy.gif | Bin 3788 -> 0 bytes .../Triangulation_3/concept_hierarchy.pdf | Bin 6471 -> 0 bytes .../doc_tex/Triangulation_3/derivation.fig | 30 - .../doc_tex/Triangulation_3/derivation.gif | Bin 2605 -> 0 bytes .../doc_tex/Triangulation_3/derivation.pdf | Bin 5947 -> 0 bytes .../doc_tex/Triangulation_3/design.fig | 132 - .../doc_tex/Triangulation_3/design.gif | Bin 252498 -> 0 bytes .../doc_tex/Triangulation_3/design.pdf | Bin 5029 -> 0 bytes .../Triangulation_3/fig/Delaunay_3.jpg | Bin 123194 -> 0 bytes .../doc_tex/Triangulation_3/fig/HD.gif | Bin 41917 -> 0 bytes .../doc_tex/Triangulation_3/fig/HD.pdf | Bin 20585 -> 0 bytes .../doc_tex/Triangulation_3/fig/api1_01.gif | Bin 45623 -> 0 bytes .../doc_tex/Triangulation_3/fig/api1_01.pdf | Bin 23817 -> 0 bytes .../doc_tex/Triangulation_3/fig/b35-1.gif | Bin 114602 -> 0 bytes .../doc_tex/Triangulation_3/fig/b35-1.pdf | Bin 62955 -> 0 bytes .../doc_tex/Triangulation_3/fig/twotets.png | Bin 24251 -> 0 bytes .../insert_outside_affine_hull.gif | Bin 1694 -> 0 bytes .../insert_outside_affine_hull.pdf | Bin 11856 -> 0 bytes .../insert_outside_affine_hull.xml | 76 - .../insert_outside_convex_hull.gif | Bin 1893 -> 0 bytes .../insert_outside_convex_hull.pdf | Bin 6929 -> 0 bytes .../insert_outside_convex_hull.xml | 114 - .../doc_tex/Triangulation_3/main.tex | 9 - .../doc_tex/Triangulation_3/orient.gif | Bin 992 -> 0 bytes .../doc_tex/Triangulation_3/orient.pdf | Bin 9995 -> 0 bytes .../doc_tex/Triangulation_3/orient.xml | 43 - .../doc_tex/Triangulation_3/ortho.gif | Bin 840 -> 0 bytes .../doc_tex/Triangulation_3/ortho.pdf | Bin 9683 -> 0 bytes .../doc_tex/Triangulation_3/ortho.xml | 38 - .../doc_tex/Triangulation_3/remimpos.gif | Bin 2002 -> 0 bytes .../doc_tex/Triangulation_3/remimpos.pdf | Bin 9158 -> 0 bytes .../doc_tex/Triangulation_3/remimpos.xml | 54 - .../doc_tex/Triangulation_3/sidedim2.gif | Bin 3086 -> 0 bytes .../doc_tex/Triangulation_3/sidedim2.pdf | Bin 20171 -> 0 bytes .../doc_tex/Triangulation_3/sidedim2.xml | 122 - .../topo-insert_outside_affine_hull.gif | Bin 2752 -> 0 bytes .../topo-insert_outside_affine_hull.pdf | Bin 16890 -> 0 bytes .../topo-insert_outside_affine_hull.xml | 101 - .../Triangulation_3/triangulation3.png | Bin 248716 -> 0 bytes .../DelaunayTriangulationTraits_3.tex | 148 - .../Delaunay_triangulation_3.tex | 391 -- .../Triangulation_3_ref/RegularCellBase_3.tex | 89 - .../RegularTriangulationTraits_3.tex | 198 - .../Regular_triangulation_3.tex | 426 -- .../Regular_triangulation_cell_base_3.tex | 55 - ...gular_triangulation_euclidean_traits_3.tex | 273 - ...egular_triangulation_filtered_traits_3.tex | 46 - .../TriangulationCellBase_3.tex | 49 - .../TriangulationHierarchyVertexBase_3.tex | 55 - .../TriangulationTraits_3.tex | 113 - .../TriangulationVertexBase_3.tex | 85 - .../Triangulation_3_ref/Triangulation_3.tex | 1052 ---- .../Triangulation_cell_base_3.tex | 53 - ...gulation_cell_base_with_circumcenter_3.tex | 61 - .../Triangulation_cell_base_with_info_3.tex | 62 - .../Triangulation_hierarchy_3.tex | 85 - .../Triangulation_hierarchy_vertex_base_3.tex | 54 - .../Triangulation_locate_type_3.tex | 30 - .../Triangulation_simplex_3.tex | 126 - .../Triangulation_vertex_base_3.tex | 58 - .../Triangulation_vertex_base_with_info_3.tex | 61 - .../Triangulation_3_ref/WeightedPoint.tex | 53 - .../doc_tex/Triangulation_3_ref/flips.gif | Bin 2783 -> 0 bytes .../doc_tex/Triangulation_3_ref/flips.pdf | Bin 7269 -> 0 bytes .../insert_outside_affine_hull.gif | Bin 1694 -> 0 bytes .../insert_outside_affine_hull.pdf | Bin 11856 -> 0 bytes .../insert_outside_convex_hull.gif | Bin 1893 -> 0 bytes .../insert_outside_convex_hull.pdf | Bin 6929 -> 0 bytes .../doc_tex/Triangulation_3_ref/intro.tex | 96 - .../doc_tex/Triangulation_3_ref/main.tex | 40 - .../doc_tex/Triangulation_3_ref/sidedim2.gif | Bin 3086 -> 0 bytes .../doc_tex/Triangulation_3_ref/sidedim2.pdf | Bin 20173 -> 0 bytes Triangulation_3_copy_tds/dont_submit | 2 - .../examples/Triangulation_3/README | 52 - .../Triangulation_3/adding_handles_3.cpp | 61 - .../examples/Triangulation_3/color.cpp | 32 - .../Triangulation_3/fast_location_3.cpp | 35 - .../Triangulation_3/find_conflicts_3.cpp | 58 - .../Triangulation_3/linking_2d_and_3d.cpp | 82 - .../examples/Triangulation_3/regular_3.cpp | 56 - .../simple_triangulation_3.cpp | 72 - .../examples/Triangulation_3/simplex.cpp | 53 - .../examples/Triangulation_3/tds.cpp | 65 - .../include/CGAL/Delaunay_triangulation_3.h | 1585 ----- .../IO/Triangulation_geomview_ostream_3.h | 97 - .../include/CGAL/Regular_triangulation_3.h | 1693 ----- .../CGAL/Regular_triangulation_cell_base_3.h | 88 - ...Regular_triangulation_euclidean_traits_3.h | 774 --- .../Regular_triangulation_filtered_traits_3.h | 42 - .../include/CGAL/Triangulation_3.h | 5590 ----------------- .../include/CGAL/Triangulation_cell_base_3.h | 103 - ...angulation_cell_base_with_circumcenter_3.h | 131 - .../Triangulation_cell_base_with_info_3.h | 65 - .../CGAL/Triangulation_data_structure_3.h | 3472 ---------- .../CGAL/Triangulation_ds_cell_base_3.h | 243 - .../CGAL/Triangulation_ds_vertex_base_3.h | 100 - .../CGAL/Triangulation_geom_traits_3.h | 79 - .../include/CGAL/Triangulation_hierarchy_3.h | 731 --- .../Triangulation_hierarchy_vertex_base_3.h | 65 - .../include/CGAL/Triangulation_simplex_3.h | 284 - .../include/CGAL/Triangulation_utils_3.h | 84 - .../CGAL/Triangulation_vertex_base_3.h | 86 - .../Triangulation_vertex_base_with_info_3.h | 63 - ...tructions_on_weighted_points_cartesian_3.h | 498 -- .../Delaunay_triangulation_hierarchy_3.h | 118 - .../include/CGAL/internal/Dummy_tds_3.h | 46 - .../Regular_triangulation_filtered_traits_3.h | 172 - .../Compare_weighted_squared_radius_3.h | 362 -- .../internal/Static_filters/Power_test_3.h | 664 -- ...ar_triangulation_static_filters_traits_3.h | 51 - .../internal/Triangulation_ds_circulators_3.h | 497 -- .../internal/Triangulation_ds_iterators_3.h | 458 -- .../spatial_sorting_traits_with_indices.h | 148 - .../predicates/Regular_triangulation_ftC3.h | 160 - .../predicates/Regular_triangulation_rtH3.h | 86 - ...redicates_on_weighted_points_cartesian_3.h | 283 - .../Triangulation_3/description.txt | 3 - .../package_info/Triangulation_3/maintainer | 1 - .../Triangulation_3/data/regular_remove_3 | 83 - .../include/CGAL/_test_cls_circulator.h | 230 - .../include/CGAL/_test_cls_delaunay_3.h | 1196 ---- .../include/CGAL/_test_cls_iterator.h | 210 - .../include/CGAL/_test_cls_regular_3.h | 210 - .../_test_cls_regular_euclidean_traits_3.h | 241 - .../include/CGAL/_test_cls_tds_3.h | 323 - .../include/CGAL/_test_cls_tds_cell.h | 133 - .../include/CGAL/_test_cls_tds_vertex.h | 58 - .../include/CGAL/_test_cls_triangulation_3.h | 990 --- .../CGAL/_test_cls_triangulation_simplex_3.h | 147 - .../include/CGAL/_test_remove_cluster.h | 758 --- .../include/CGAL/_test_types.h | 33 - .../test/Triangulation_3/test_delaunay_3.cpp | 48 - .../test_delaunay_hierarchy_3.cpp | 36 - .../test_delaunay_hierarchy_3_old.cpp | 39 - .../test/Triangulation_3/test_regular_3.cpp | 441 -- .../test_regular_as_delaunay_3.cpp | 42 - .../Triangulation_3/test_regular_remove_3.cpp | 387 -- .../Triangulation_3/test_regular_traits_3.cpp | 38 - .../test/Triangulation_3/test_simplex_3.cpp | 39 - .../Triangulation_3/test_static_filters.cpp | 250 - .../Triangulation_3/test_triangulation_3.cpp | 45 - .../test_triangulation_tds.cpp | 33 - 247 files changed, 39364 deletions(-) delete mode 100644 Triangulation_3_copy_tds/TODO delete mode 100644 Triangulation_3_copy_tds/benchmark/Triangulation_3/Triangulation_benchmark_3.cpp delete mode 100644 Triangulation_3_copy_tds/benchmark/Triangulation_3/benchs_results_tigre_10_7.txt delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/CMakeLists.txt delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/MainWindow.cpp delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/MainWindow.h delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/MainWindow.ui delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/PreferenceDlg.cpp delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/PreferenceDlg.h delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/Scene.cpp delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/Scene.h delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/T3_demo.cpp delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/T3_demo.qrc delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/Viewer.cpp delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/Viewer.h delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/documentation/about.html delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/documentation/about_CGAL.html delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/about_CGAL.html delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/cgal_logo.xpm delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/clear.jpeg delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/coordinates.jpeg delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/empty_sphere.jpeg delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/fileOpen.png delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/fileSave.png delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/flat.png delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/grid.jpeg delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/insert.jpeg delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/insert_point.jpg delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/move_1.jpeg delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/nearest_nb.png delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/normal_view.jpeg delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/pause.jpeg delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/play.jpeg delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/pointRandom.png delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/preferences.jpeg delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/quit.jpeg delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/select_hand.jpeg delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/show_delaunay.jpeg delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/show_facet.jpeg delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/show_point.jpeg delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/show_voronoi.jpeg delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/stereo.png delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/icons/stop.jpeg delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/typedefs.h delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3/ui_MainWindow.h delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/CMakeLists.txt delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/README delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/Triangulation_3_color_demo.cpp delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/Triangulation_3_demo.cpp delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/Triangulation_3_remove_demo.cpp delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/Triangulation_3_voronoi_demo.cpp delete mode 100644 Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/data/points delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/PkgDescription.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/TDS3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/comborient.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/comborient.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/comborient.xml delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/design_tds.fig delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/design_tds.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/design_tds.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/flips.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/flips.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/flips.xml delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/main.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/repres.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/repres.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/repres.xml delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/tds3_small.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/tds3_small.png delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex2.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex2.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex2.xml delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex3.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex3.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex3.xml delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex4.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex4.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex4.xml delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Tds_cell_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Tds_vertex_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/TriangulationDSCellBase_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/TriangulationDSVertexBase_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/TriangulationDataStructure_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Triangulation_data_structure_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Triangulation_ds_cell_base_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Triangulation_ds_vertex_base_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Triangulation_utils_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/flips.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/flips.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/intro.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/main.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/tds-dim_down.eps delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/tds-dim_down.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/tds-dim_down.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/tds-dim_down.png delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/topo-insert_outside_affine_hull.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/topo-insert_outside_affine_hull.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/utils.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/utils.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/utils.xml delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/PkgDescription.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/Triang3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/concept_hierarchy.fig delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/concept_hierarchy.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/concept_hierarchy.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/derivation.fig delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/derivation.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/derivation.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/design.fig delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/design.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/design.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/Delaunay_3.jpg delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/HD.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/HD.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/api1_01.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/api1_01.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/b35-1.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/b35-1.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/twotets.png delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/insert_outside_affine_hull.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/insert_outside_affine_hull.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/insert_outside_affine_hull.xml delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/insert_outside_convex_hull.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/insert_outside_convex_hull.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/insert_outside_convex_hull.xml delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/main.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/orient.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/orient.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/orient.xml delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/ortho.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/ortho.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/ortho.xml delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/remimpos.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/remimpos.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/remimpos.xml delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/sidedim2.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/sidedim2.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/sidedim2.xml delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/topo-insert_outside_affine_hull.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/topo-insert_outside_affine_hull.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/topo-insert_outside_affine_hull.xml delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3/triangulation3.png delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/DelaunayTriangulationTraits_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Delaunay_triangulation_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/RegularCellBase_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/RegularTriangulationTraits_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Regular_triangulation_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Regular_triangulation_cell_base_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Regular_triangulation_euclidean_traits_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Regular_triangulation_filtered_traits_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/TriangulationCellBase_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/TriangulationHierarchyVertexBase_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/TriangulationTraits_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/TriangulationVertexBase_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_cell_base_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_cell_base_with_circumcenter_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_cell_base_with_info_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_hierarchy_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_hierarchy_vertex_base_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_locate_type_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_simplex_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_vertex_base_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_vertex_base_with_info_3.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/WeightedPoint.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/flips.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/flips.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/insert_outside_affine_hull.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/insert_outside_affine_hull.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/insert_outside_convex_hull.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/insert_outside_convex_hull.pdf delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/intro.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/main.tex delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/sidedim2.gif delete mode 100644 Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/sidedim2.pdf delete mode 100644 Triangulation_3_copy_tds/dont_submit delete mode 100644 Triangulation_3_copy_tds/examples/Triangulation_3/README delete mode 100644 Triangulation_3_copy_tds/examples/Triangulation_3/adding_handles_3.cpp delete mode 100644 Triangulation_3_copy_tds/examples/Triangulation_3/color.cpp delete mode 100644 Triangulation_3_copy_tds/examples/Triangulation_3/fast_location_3.cpp delete mode 100644 Triangulation_3_copy_tds/examples/Triangulation_3/find_conflicts_3.cpp delete mode 100644 Triangulation_3_copy_tds/examples/Triangulation_3/linking_2d_and_3d.cpp delete mode 100644 Triangulation_3_copy_tds/examples/Triangulation_3/regular_3.cpp delete mode 100644 Triangulation_3_copy_tds/examples/Triangulation_3/simple_triangulation_3.cpp delete mode 100644 Triangulation_3_copy_tds/examples/Triangulation_3/simplex.cpp delete mode 100644 Triangulation_3_copy_tds/examples/Triangulation_3/tds.cpp delete mode 100644 Triangulation_3_copy_tds/include/CGAL/Delaunay_triangulation_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/IO/Triangulation_geomview_ostream_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/Regular_triangulation_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/Regular_triangulation_cell_base_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/Regular_triangulation_euclidean_traits_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/Regular_triangulation_filtered_traits_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/Triangulation_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/Triangulation_cell_base_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/Triangulation_cell_base_with_circumcenter_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/Triangulation_cell_base_with_info_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/Triangulation_data_structure_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/Triangulation_ds_cell_base_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/Triangulation_ds_vertex_base_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/Triangulation_geom_traits_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/Triangulation_hierarchy_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/Triangulation_hierarchy_vertex_base_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/Triangulation_simplex_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/Triangulation_utils_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/Triangulation_vertex_base_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/Triangulation_vertex_base_with_info_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/constructions/constructions_on_weighted_points_cartesian_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/internal/Delaunay_triangulation_hierarchy_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/internal/Dummy_tds_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/internal/Regular_triangulation_filtered_traits_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/internal/Static_filters/Compare_weighted_squared_radius_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/internal/Static_filters/Power_test_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/internal/Static_filters/Regular_triangulation_static_filters_traits_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/internal/Triangulation_ds_circulators_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/internal/Triangulation_ds_iterators_3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/internal/spatial_sorting_traits_with_indices.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/predicates/Regular_triangulation_ftC3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/predicates/Regular_triangulation_rtH3.h delete mode 100644 Triangulation_3_copy_tds/include/CGAL/predicates/predicates_on_weighted_points_cartesian_3.h delete mode 100644 Triangulation_3_copy_tds/package_info/Triangulation_3/description.txt delete mode 100644 Triangulation_3_copy_tds/package_info/Triangulation_3/maintainer delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/data/regular_remove_3 delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_circulator.h delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_delaunay_3.h delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_iterator.h delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_regular_3.h delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_regular_euclidean_traits_3.h delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_tds_3.h delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_tds_cell.h delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_tds_vertex.h delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_triangulation_3.h delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_triangulation_simplex_3.h delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_remove_cluster.h delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_types.h delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/test_delaunay_3.cpp delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/test_delaunay_hierarchy_3.cpp delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/test_delaunay_hierarchy_3_old.cpp delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/test_regular_3.cpp delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/test_regular_as_delaunay_3.cpp delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/test_regular_remove_3.cpp delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/test_regular_traits_3.cpp delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/test_simplex_3.cpp delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/test_static_filters.cpp delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/test_triangulation_3.cpp delete mode 100644 Triangulation_3_copy_tds/test/Triangulation_3/test_triangulation_tds.cpp diff --git a/.gitattributes b/.gitattributes index f693f12f245..d00198eafc6 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4063,136 +4063,6 @@ Triangulation_3/include/CGAL/internal/Static_filters/Regular_triangulation_stati Triangulation_3/include/CGAL/internal/spatial_sorting_traits_with_indices.h -text Triangulation_3/test/Triangulation_3/include/CGAL/_test_remove_cluster.h -text Triangulation_3/test/Triangulation_3/test_static_filters.cpp -text -Triangulation_3_copy_tds/demo/Triangulation_3/CMakeLists.txt -text -Triangulation_3_copy_tds/demo/Triangulation_3/MainWindow.cpp -text -Triangulation_3_copy_tds/demo/Triangulation_3/MainWindow.h -text -Triangulation_3_copy_tds/demo/Triangulation_3/MainWindow.ui -text -Triangulation_3_copy_tds/demo/Triangulation_3/PreferenceDlg.cpp -text -Triangulation_3_copy_tds/demo/Triangulation_3/PreferenceDlg.h -text -Triangulation_3_copy_tds/demo/Triangulation_3/Scene.cpp -text -Triangulation_3_copy_tds/demo/Triangulation_3/Scene.h -text -Triangulation_3_copy_tds/demo/Triangulation_3/T3_demo.cpp -text -Triangulation_3_copy_tds/demo/Triangulation_3/T3_demo.qrc -text -Triangulation_3_copy_tds/demo/Triangulation_3/Viewer.cpp -text -Triangulation_3_copy_tds/demo/Triangulation_3/Viewer.h -text -Triangulation_3_copy_tds/demo/Triangulation_3/documentation/about.html -text -Triangulation_3_copy_tds/demo/Triangulation_3/documentation/about_CGAL.html -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/about_CGAL.html -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/cgal_logo.xpm -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/clear.jpeg -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/coordinates.jpeg -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/empty_sphere.jpeg -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/fileOpen.png -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/fileSave.png -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/flat.png -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/grid.jpeg -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/insert.jpeg -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/insert_point.jpg -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/move_1.jpeg -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/nearest_nb.png -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/normal_view.jpeg -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/pause.jpeg -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/play.jpeg -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/pointRandom.png -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/preferences.jpeg -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/quit.jpeg -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/select_hand.jpeg -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/show_delaunay.jpeg -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/show_facet.jpeg -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/show_point.jpeg -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/show_voronoi.jpeg -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/stereo.png -text -Triangulation_3_copy_tds/demo/Triangulation_3/icons/stop.jpeg -text -Triangulation_3_copy_tds/demo/Triangulation_3/typedefs.h -text -Triangulation_3_copy_tds/demo/Triangulation_3/ui_MainWindow.h -text -Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/CMakeLists.txt -text -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/comborient.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/comborient.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/comborient.xml svneol=native#text/xml -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/design_tds.fig -text svneol=unset#application/octet-stream -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/design_tds.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/design_tds.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/flips.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/flips.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/flips.xml svneol=native#text/xml -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/repres.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/repres.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/repres.xml svneol=native#text/xml -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/tds3_small.pdf -text -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/tds3_small.png -text -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex2.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex2.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex2.xml svneol=native#text/xml -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex3.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex3.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex3.xml svneol=native#text/xml -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex4.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex4.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex4.xml svneol=native#text/xml -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/flips.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/flips.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/tds-dim_down.eps -text -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/tds-dim_down.gif -text -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/tds-dim_down.pdf -text -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/tds-dim_down.png -text -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/topo-insert_outside_affine_hull.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/topo-insert_outside_affine_hull.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/utils.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/utils.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/utils.xml svneol=native#text/xml -Triangulation_3_copy_tds/doc_tex/Triangulation_3/concept_hierarchy.fig -text svneol=unset#application/octet-stream -Triangulation_3_copy_tds/doc_tex/Triangulation_3/concept_hierarchy.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/Triangulation_3/concept_hierarchy.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/Triangulation_3/derivation.fig -text svneol=unset#application/octet-stream -Triangulation_3_copy_tds/doc_tex/Triangulation_3/derivation.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/Triangulation_3/derivation.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/Triangulation_3/design.fig -text svneol=unset#application/octet-stream -Triangulation_3_copy_tds/doc_tex/Triangulation_3/design.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/Triangulation_3/design.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/Delaunay_3.jpg -text -Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/HD.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/HD.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/api1_01.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/api1_01.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/b35-1.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/b35-1.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/twotets.png -text -Triangulation_3_copy_tds/doc_tex/Triangulation_3/insert_outside_affine_hull.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/Triangulation_3/insert_outside_affine_hull.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/Triangulation_3/insert_outside_affine_hull.xml svneol=native#text/xml -Triangulation_3_copy_tds/doc_tex/Triangulation_3/insert_outside_convex_hull.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/Triangulation_3/insert_outside_convex_hull.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/Triangulation_3/insert_outside_convex_hull.xml svneol=native#text/xml -Triangulation_3_copy_tds/doc_tex/Triangulation_3/orient.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/Triangulation_3/orient.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/Triangulation_3/orient.xml svneol=native#text/xml -Triangulation_3_copy_tds/doc_tex/Triangulation_3/ortho.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/Triangulation_3/ortho.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/Triangulation_3/ortho.xml svneol=native#text/xml -Triangulation_3_copy_tds/doc_tex/Triangulation_3/remimpos.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/Triangulation_3/remimpos.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/Triangulation_3/remimpos.xml svneol=native#text/xml -Triangulation_3_copy_tds/doc_tex/Triangulation_3/sidedim2.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/Triangulation_3/sidedim2.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/Triangulation_3/sidedim2.xml svneol=native#text/xml -Triangulation_3_copy_tds/doc_tex/Triangulation_3/topo-insert_outside_affine_hull.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/Triangulation_3/topo-insert_outside_affine_hull.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/Triangulation_3/topo-insert_outside_affine_hull.xml svneol=native#text/xml -Triangulation_3_copy_tds/doc_tex/Triangulation_3/triangulation3.png -text svneol=unset#image/png -Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/flips.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/flips.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/insert_outside_affine_hull.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/insert_outside_affine_hull.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/insert_outside_convex_hull.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/insert_outside_convex_hull.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/sidedim2.gif -text svneol=unset#image/gif -Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/sidedim2.pdf -text svneol=unset#application/pdf -Triangulation_3_copy_tds/include/CGAL/internal/Static_filters/Compare_weighted_squared_radius_3.h -text -Triangulation_3_copy_tds/include/CGAL/internal/Static_filters/Power_test_3.h -text -Triangulation_3_copy_tds/include/CGAL/internal/Static_filters/Regular_triangulation_static_filters_traits_3.h -text -Triangulation_3_copy_tds/include/CGAL/internal/spatial_sorting_traits_with_indices.h -text -Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_remove_cluster.h -text -Triangulation_3_copy_tds/test/Triangulation_3/test_static_filters.cpp -text Voronoi_diagram_2/doc_tex/Voronoi_diagram_2/voronoi.png -text iostream/doc_tex/IOstream/io.png -text iostream/test/iostream/data/io.cin -text diff --git a/.gitignore b/.gitignore index 80e78b7e756..de42b519866 100644 --- a/.gitignore +++ b/.gitignore @@ -1212,46 +1212,3 @@ Triangulation_3/test/Triangulation_3/test_simplex_3 Triangulation_3/test/Triangulation_3/test_static_filters Triangulation_3/test/Triangulation_3/test_triangulation_3 Triangulation_3/test/Triangulation_3/test_triangulation_tds -Triangulation_3_copy_tds/examples/Triangulation_3/*.exe -Triangulation_3_copy_tds/examples/Triangulation_3/CMakeLists.txt -Triangulation_3_copy_tds/examples/Triangulation_3/adding_handles_3 -Triangulation_3_copy_tds/examples/Triangulation_3/cgal_test_with_cmake -Triangulation_3_copy_tds/examples/Triangulation_3/color -Triangulation_3_copy_tds/examples/Triangulation_3/fast_location_3 -Triangulation_3_copy_tds/examples/Triangulation_3/find_conflicts_3 -Triangulation_3_copy_tds/examples/Triangulation_3/hierarchy -Triangulation_3_copy_tds/examples/Triangulation_3/linking_2d_and_3d -Triangulation_3_copy_tds/examples/Triangulation_3/makefile -Triangulation_3_copy_tds/examples/Triangulation_3/output -Triangulation_3_copy_tds/examples/Triangulation_3/output_tds -Triangulation_3_copy_tds/examples/Triangulation_3/regular -Triangulation_3_copy_tds/examples/Triangulation_3/regular_3 -Triangulation_3_copy_tds/examples/Triangulation_3/simple_triangulation_3 -Triangulation_3_copy_tds/examples/Triangulation_3/simplex -Triangulation_3_copy_tds/examples/Triangulation_3/tds -Triangulation_3_copy_tds/test/Triangulation_3/CMakeLists.txt -Triangulation_3_copy_tds/test/Triangulation_3/Makefile -Triangulation_3_copy_tds/test/Triangulation_3/Test1_triangulation_IO_3_binary -Triangulation_3_copy_tds/test/Triangulation_3/Test2_triangulation_IO_3_binary -Triangulation_3_copy_tds/test/Triangulation_3/Test3_triangulation_IO_3_binary -Triangulation_3_copy_tds/test/Triangulation_3/Test4_triangulation_IO_3_binary -Triangulation_3_copy_tds/test/Triangulation_3/Test5_triangulation_IO_3_binary -Triangulation_3_copy_tds/test/Triangulation_3/Test6_triangulation_IO_3_binary -Triangulation_3_copy_tds/test/Triangulation_3/Test7_triangulation_IO_3_binary -Triangulation_3_copy_tds/test/Triangulation_3/Test8_triangulation_IO_3_binary -Triangulation_3_copy_tds/test/Triangulation_3/Test??_triangulation_IO_3 -Triangulation_3_copy_tds/test/Triangulation_3/Test?_triangulation_IO_3 -Triangulation_3_copy_tds/test/Triangulation_3/Test_tds_IO_3 -Triangulation_3_copy_tds/test/Triangulation_3/cgal_test_with_cmake -Triangulation_3_copy_tds/test/Triangulation_3/makefile -Triangulation_3_copy_tds/test/Triangulation_3/test_delaunay_3 -Triangulation_3_copy_tds/test/Triangulation_3/test_delaunay_hierarchy_3 -Triangulation_3_copy_tds/test/Triangulation_3/test_delaunay_hierarchy_3_old -Triangulation_3_copy_tds/test/Triangulation_3/test_regular_3 -Triangulation_3_copy_tds/test/Triangulation_3/test_regular_as_delaunay_3 -Triangulation_3_copy_tds/test/Triangulation_3/test_regular_remove_3 -Triangulation_3_copy_tds/test/Triangulation_3/test_regular_traits_3 -Triangulation_3_copy_tds/test/Triangulation_3/test_simplex_3 -Triangulation_3_copy_tds/test/Triangulation_3/test_static_filters -Triangulation_3_copy_tds/test/Triangulation_3/test_triangulation_3 -Triangulation_3_copy_tds/test/Triangulation_3/test_triangulation_tds diff --git a/Triangulation_3_copy_tds/TODO b/Triangulation_3_copy_tds/TODO deleted file mode 100644 index 302b6fba736..00000000000 --- a/Triangulation_3_copy_tds/TODO +++ /dev/null @@ -1,105 +0,0 @@ -TDS -- operator->() dans it/circ de facettes/edges (idem T2, a coordonner) -- reflechir a un support de facettes explicites (cf papier de Giesen) -- nettoyer les trucs 2d only (face_circulator etc) -- Bistellar flips ? (cf shewchuck's SoCG'03 paper). - (it's when you have 4 coplanar points, you break 4 cells, - and it gives 4 cells back). -- More compact representation [inspired by a CUJ article for lists] : - instead of having a cell which stores 4 vertex pointers, it only stores the - XOR of them. And a Cell_handle now additionaly stores the 4 vertex pointers - of the cell, the "context". - One problem is the Cell_iterator : it looses the context, so I think that - one way to work around this is to write the Cell_iterator as based on the - Vertex_iterator (a bit like the reverse used to be made) : we iterate over - the vertices, and for each vertex, we compute the incident cells, but we - pick only those whose smallest vertex (adress-wise) is the one in question. - -T3 -- documenter le 2eme tableau de Triangulation_utils -- degree() devrait-il, au niveau geometrique, ne pas compter le sommet infini ? -- is_valid devrait verifier l'enveloppe convexe -- prevoir differentes sorties : geomview (ameliorer le rendu pour - donner un effet de perspective), vrml... - cf Polyhedron_3, file I/O. - -Delaunay -- Put side_of_bounded_sphere_3 into the DelaunayTriangulationTraits_3 as - it is used in the is_Gabriel tests -- dual(vertex) -> Polyhedron_3 -- faire en sorte que les types line, ray, etc Voronoi ne soient plus - qu'optionnels dans la traits, et requis seulement si les fonctions - dual sont effectivement utilisees -- remplacer les create_face du remove2D par des create_cell et virer - les create_face de la tds -- optimiser remove : - - algo d'Olivier si constructions filtrees disponibles (cf Olivier - rappel de la reunion a ce sujet) - - pour la creation de la TDS_2, on devrait pouvoir faire plus simple, - sachant que le trou n'est pas quelconque, mais etoile, et donc on peut - profiter de ca pour avoir les adjacences directement (peut-etre en - squattant le flag des cellules pour y mettre un pointeur vers la facette - 2d correspondante). -- natural neighbors de Raphaelle a integrer -- Pb du type de points pour les fonctions "dual" (robustesse dans le cas -des tetraedres presque plats) rounding ? - -Regular : -- acces aux hidden points et remove sur hidden points, etc -- Regular_triangulation_euclidean_traits_3.h - add a functor Construct_smallest_orthogonal_weighted_point_3 - to build at the same time both the center and the square radius - of the smallest orthogonal sphere -- la cell_base speciale qui stocke une liste de points caches ou pas (et un - tag qui dit si oui ou non elle stocke les points caches ou pas), et un - iterator pour y acceder. A DOCUMENTER. -- remove - les dimensions 1 et 2 ne sont pas gerees. -- faire marcher la hierarchie avec. Le probleme est qu'on delete des - vertex, et donc la hierarchie est perdue avec ses pointeurs up/down qui - pointent dans l'espace, du coup... - La solution qu'on a discutee est : - - la hierarchy devrait avoir tous les etages superieurs simplement Delaunay, - et pas autre chose. - - le insert() (ou find_conflict) de Regular devrait fournir un iterator sur - les Vertex_handle correspondant aux points qui seront caches, et en - fonction de ca, une hierarchy speciale Regular fera ce qu'il faut. -- programmer centre ortho-sphere de 4 points. Aussi centre de l'ortho-cercle - de 3 points... (requete Tamal Dey) -- .dual() - -Hierarchie -- nettoyer hierarchie - cf mail Mariette - la hierarchie surcharge correctement certaines - versions du insert() et locate() - et fait n'importe quoi pour les autres.... - (c'est tout ce qui se trouve apres - // added to make the test program of usual triangulations work - // undocumented - public: - ..... - ) - --------------------------------------------------------------------- - -General -- mettre des locate_2D, locate_3D, insert idem, pour eviter les tests - redondants sur la dimension a chaque insertion. -- trouver une interface avec T_2 qui permette d'eviter de reprogrammer - tout le 2d dans le 3d -- valgrind -- gcov -- const handle, const it, const circ ... -- utiliser le cell_container_iterator partout ou c'est possible - (unifier le code pour differentes dimensions) - -TEST-SUITE -- si un jour elle est revue, voici quelques idees pour l'organiser : - - prendre un noyau exact pour tout, et supposer qu'on l'a dans les tests. - - avoir des fonctions qui generent differentes distributions - (cas degeneres, grands nombre de points...) - - pour nearest_vertex() : comparer le resultat avec Spatial_searching ? - (c'est impossible dans le cas ou il y a plusieurs points equidistants, - puisqu'il y a un choix arbitraire, il n'y a aucune raison que ca soit - le meme dans un autre package) -- Test-suite Delaunay : .dual() n'est pas vraiment teste... diff --git a/Triangulation_3_copy_tds/benchmark/Triangulation_3/Triangulation_benchmark_3.cpp b/Triangulation_3_copy_tds/benchmark/Triangulation_3/Triangulation_benchmark_3.cpp deleted file mode 100644 index e8af03ff494..00000000000 --- a/Triangulation_3_copy_tds/benchmark/Triangulation_3/Triangulation_benchmark_3.cpp +++ /dev/null @@ -1,246 +0,0 @@ -// Benchmark program for the Triangulation_3 package. -// -// Sylvain Pion, 2009. -// -// The data produced by this program is meant to be used -// in the Benchmarks section of the User Manual. -// -// We measure : -// - construction time -// - point location time function of triangulation size -// - vertex removal time -// - memory usage -// -// And this, for the following 4 configurations : -// - Delaunay -// - Delaunay -// - Regular -// - Regular -// -// Notes : -// - points are randomly generated using drand48() -// - weights are zero for regular -// -// TODO (?) : -// - impact of the choice of various kernels -// - impact of the kind of data set ? More or less degenerate... -// - replace drand48() by CGAL Generators -// - move/document Time_accumulator to CGAL/Profiling_tools (?) - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include // for drand48 - -#ifdef SHOW_ITERATIONS -# undef SHOW_ITERATIONS -# define SHOW_ITERATIONS "\t( " << iterations << " iterations used)" << endl -#else -# define SHOW_ITERATIONS endl -#endif - -#ifndef BENCH_MIN_TIME -# define BENCH_MIN_TIME 1 // minimum time for a bench -#endif - -using namespace std; -using namespace CGAL; - -// Choose the kernel type by defining one of those macros: -// - SC_DOUBLE, -// - EPEC, -// - or EPIC (the default) -#ifdef SC_DOUBLE -typedef Simple_cartesian K; -#elif defined(EPEC) -# ifdef CGAL_DONT_USE_LAZY_KERNEL -typedef Epeck K; -# else -typedef Simple_cartesian SK; -typedef Lazy_kernel K; -# endif -#else // EPIC -typedef Exact_predicates_inexact_constructions_kernel K; -#endif -typedef Regular_triangulation_euclidean_traits_3 WK; -typedef K::Point_3 Point; - -vector pts, pts2; -size_t min_pts = 100; -size_t max_pts = 100000; - -bool input_file_selected = false; -std::ifstream input_file; - - -class Time_accumulator -{ - double &accumulator; - Timer timer; -public: - Time_accumulator(double &acc) : accumulator(acc) { timer.reset(); timer.start(); } - ~Time_accumulator() { timer.stop(); accumulator += timer.time(); } -}; - -Point rnd_point() -{ - return Point(drand48(), drand48(), drand48()); -} - -void generate_points() -{ - if (input_file_selected) { - Point p; - while (input_file >> p) - pts.push_back(p); - cout << " [ Read " << pts.size() << " points from file ] " << endl; - min_pts = max_pts = pts.size(); - } - else { - pts.reserve(max_pts); - pts2.reserve(max_pts); - for(size_t i = 0; i < std::max(std::size_t(100000), max_pts); ++i) { - pts.push_back(rnd_point()); - pts2.push_back(rnd_point()); - } - } -} - - -// Triangulation construction -template < typename Tr > -void benchmark_construction() -{ - cout << "\nTriangulation construction : " << endl; - cout << "#pts\tTime" << endl; - size_t mem_size_init = Memory_sizer().virtual_size(); - size_t mem_size = 0; - - for (size_t nb_pts = min_pts; nb_pts <= max_pts; nb_pts *= 10) - { - double time = 0; - size_t iterations = 0; - do { - ++iterations; - Time_accumulator tt(time); - Tr tr(pts.begin(), pts.begin() + nb_pts); - mem_size = Memory_sizer().virtual_size(); - // cout << "#vertices = " << tr.number_of_vertices() << endl; - // cout << "#cells = " << tr.number_of_cells() << endl; - } while (time < BENCH_MIN_TIME); - cout << nb_pts << "\t" << time/iterations << SHOW_ITERATIONS; - } - cout << "\nMemory usage : " << (mem_size - mem_size_init)*1./max_pts << " Bytes/Point" - << " (observed for the largest data set, and may be unreliable)" << endl; -} - - -// Point location -template < typename Tr > -void benchmark_location() -{ - cout << "\nPoint location : " << endl; - cout << "#pts\tTime" << endl; - for (size_t nb_pts = min_pts; nb_pts <= max_pts; nb_pts *= 10) - { - Tr tr(pts.begin(), pts.begin() + nb_pts); - double time = 0; - size_t iterations = 0; - do { - ++iterations; - Time_accumulator tt(time); - // We do chunks of 100000 point locations at once. - for(size_t i = 0; i < 100000; ++i) - tr.locate(pts2[i]); - } while (time < BENCH_MIN_TIME); - cout << nb_pts << "\t" << (time/iterations)/100000 << SHOW_ITERATIONS; - } -} - - -// Vertex removal -template < typename Tr > -void benchmark_remove() -{ - typedef typename Tr::Vertex_handle Vertex_handle; - typedef typename Tr::Vertex_iterator Vertex_iterator; - - cout << "\nVertex removal : " << endl; - cout << "#pts\tTime" << endl; - size_t nb_pts = 100000; // only one size of triangulation hard-coded. - { - Tr tr(pts.begin(), pts.begin() + nb_pts); - vector vhs; - for (Vertex_iterator vit = tr.finite_vertices_begin(), end = tr.finite_vertices_end(); - vit != end; ++vit) - vhs.push_back(vit); - double time = 0; - size_t iterations = 0; - size_t j = 0; - do { - ++iterations; - Time_accumulator tt(time); - // We do chunks of 1024 vertex removal at once. - for(size_t i = 0; i < 1024; ++i, ++j) - tr.remove(vhs[j]); - } while (time < BENCH_MIN_TIME); - cout << nb_pts << "\t" << (time/iterations)/1024 << SHOW_ITERATIONS; - } -} - - -template < typename Tr > -void do_benchmarks(string name) -{ - cout << "\n\nBenchmarking configuration : " << name << endl; - benchmark_construction(); - if (input_file_selected) - return; - benchmark_location(); - benchmark_remove(); -} - -int main(int argc, char **argv) -{ - if (argc >= 2) { - input_file.open(argv[1], std::ios::in); - if (input_file.is_open()) - input_file_selected = true; - else { - input_file_selected = false; - max_pts = atoi(argv[1]); - } - } - - cout << "Usage : " << argv[0] << " [filename]" - << " [max_points = " << max_pts << ", and please use a power of 10]" << endl; - cout << "Benchmarking the Triangulation_3 package for "; - if (input_file_selected) - cout << "data file : " << argv[1] << endl; - else - cout << "up to " << max_pts << " random points." << endl; - - cout.precision(3); - - generate_points(); - - cout << "\nProcessor : " - << ((sizeof(void*)==4) ? 32 : (sizeof(void*)==8) ? 64 : -1) << " bits\n"; - // cout << "Kernel : EPICK\n"; - - do_benchmarks >("Delaunay [Compact_location]"); - if (input_file_selected) - return 0; - do_benchmarks >("Delaunay with Fast_location"); - do_benchmarks >("Regular [with hidden points kept, except there's none in the data sets]"); - do_benchmarks, Triangulation_cell_base_3 > > >("Regular with hidden points discarded"); -} diff --git a/Triangulation_3_copy_tds/benchmark/Triangulation_3/benchs_results_tigre_10_7.txt b/Triangulation_3_copy_tds/benchmark/Triangulation_3/benchs_results_tigre_10_7.txt deleted file mode 100644 index 6624b46e356..00000000000 --- a/Triangulation_3_copy_tds/benchmark/Triangulation_3/benchs_results_tigre_10_7.txt +++ /dev/null @@ -1,116 +0,0 @@ -spion@tigre:~/CGAL/Triangulation_3_Location_policy/benchmark/Triangulation_3> time ./Triangulation_benchmark_3 10000000 -Benchmarking the Triangulation_3 package for up to 10000000 random points. -Usage : ./Triangulation_benchmark_3 [max_points = 100000, and please use a power of 10] - -Processor : 64 bits -Kernel : EPICK - - -Benchmarking configuration : Delaunay [Compact_location] - -Triangulation construction : -#pts Time -100 0.000541 -1000 0.00724 -10000 0.0785 -100000 0.827 -1000000 8.5 -10000000 87.4 - -Memory usage : 519 Bytes/Point (observed for the largest data set) - -Point location : -#pts Time -100 9.93e-07 -1000 2.25e-06 -10000 4.79e-06 -100000 2.98e-05 -1000000 0.0001 -10000000 0.000259 - -Vertex removal : -#pts Time -100000 0.0001 - - -Benchmarking configuration : Delaunay with Fast_location - -Triangulation construction : -#pts Time -100 0.000576 -1000 0.00748 -10000 0.0838 -100000 0.878 -1000000 9.07 -10000000 92.5 - -Memory usage : 553 Bytes/Point (observed for the largest data set) - -Point location : -#pts Time -100 1.06e-06 -1000 1.93e-06 -10000 3.09e-06 -100000 6.12e-06 -1000000 9.65e-06 -10000000 1.33e-05 - -Vertex removal : -#pts Time -100000 0.000103 - - -Benchmarking configuration : Regular with hidden points discarded - -Triangulation construction : -#pts Time -100 0.000955 -1000 0.0111 -10000 0.117 -100000 1.19 -1000000 12.2 -10000000 125 - -Memory usage : 527 Bytes/Point (observed for the largest data set) - -Point location : -#pts Time -100 6.99e-06 -1000 1.76e-05 -10000 3.87e-05 -100000 0.000106 -1000000 0.000267 -10000000 0.000625 - -Vertex removal : -#pts Time -100000 0.000138 - - -Benchmarking configuration : Regular [with hidden points kept, except there's none in the data sets] - -Triangulation construction : -#pts Time -100 0.000948 -1000 0.0114 -10000 0.122 -100000 1.25 -1000000 12.6 -10000000 129 - -Memory usage : 630 Bytes/Point (observed for the largest data set) - -Point location : -#pts Time -100 7.19e-06 -1000 1.73e-05 -10000 3.96e-05 -100000 0.000106 -1000000 0.00027 -10000000 0.000625 - -Vertex removal : -#pts Time -100000 0.000142 -./Triangulation_benchmark_3 10000000 1247.23s user 29.78s system 99% cpu 21:18.95 total - diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/CMakeLists.txt b/Triangulation_3_copy_tds/demo/Triangulation_3/CMakeLists.txt deleted file mode 100644 index c4d9fadfda5..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3/CMakeLists.txt +++ /dev/null @@ -1,82 +0,0 @@ -# Created by the script cgal_create_cmake_script -# This is the CMake script for compiling a CGAL application. - -project (Triangulation_demo_3) - -cmake_minimum_required(VERSION 2.4.5) - -set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true) - -if ( COMMAND cmake_policy ) - cmake_policy( SET CMP0003 NEW ) -endif() - -find_package(CGAL COMPONENTS Qt4) -include(${CGAL_USE_FILE}) - -set( QT_USE_QTXML TRUE ) -set( QT_USE_QTMAIN TRUE ) -set( QT_USE_QTSCRIPT TRUE ) -set( QT_USE_QTOPENGL TRUE ) -set( QT_USE_QTASSISTANT TRUE ) -find_package(Qt4) - -find_package(OpenGL) - -if(QT4_FOUND) - include( ${QT_USE_FILE} ) - find_package(QGLViewer) -endif(QT4_FOUND) - -if ( CGAL_FOUND AND QT4_FOUND AND OPENGL_FOUND AND QGLVIEWER_FOUND ) - - include(${QT_USE_FILE}) - - include_directories (${QGLVIEWER_INCLUDE_DIR}) - include_directories (BEFORE ../../include ./ ) - - # ui files, created with Qt Designer - qt4_wrap_ui( uis MainWindow.ui ) - - # qrc files (resources files, that contain icons, at least) - qt4_add_resources ( RESOURCE_FILES ./T3_demo.qrc ) - - # moc files (meta object compiler files, run moc preprocessor on the files with Widget defs) - qt4_automoc( MainWindow.cpp Viewer.cpp PreferenceDlg.cpp ) - - # cpp files - add_executable ( T3_demo T3_demo.cpp - MainWindow.cpp Viewer.cpp - PreferenceDlg.cpp - Scene.cpp ${uis} ${RESOURCE_FILES} ) - - add_to_cached_list( CGAL_EXECUTABLE_TARGETS T3_demo ) - - target_link_libraries( T3_demo ${CGAL_LIBRARIES} ${CGAL_3RD_PARTY_LIBRARIES}) - target_link_libraries( T3_demo ${QT_LIBRARIES} ${QGLVIEWER_LIBRARIES} ) - target_link_libraries( T3_demo ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} ) - -else( CGAL_FOUND AND QT4_FOUND AND OPENGL_FOUND AND QGLVIEWER_FOUND ) - - set(TRIANGULATION_3_MISSING_DEPS "") - - if(NOT CGAL_FOUND) - set(TRIANGULATION_3_MISSING_DEPS "the CGAL Qt4 library, ${TRIANGULATION_3_MISSING_DEPS}") - endif() - - if(NOT QT4_FOUND) - set(TRIANGULATION_3_MISSING_DEPS "Qt4, ${TRIANGULATION_3_MISSING_DEPS}") - endif() - - if(NOT OPENGL_FOUND) - set(TRIANGULATION_3_MISSING_DEPS "OpenGL, ${TRIANGULATION_3_MISSING_DEPS}") - endif() - - if(NOT QGLVIEWER_FOUND) - set(TRIANGULATION_3_MISSING_DEPS "QGLViewer, ${TRIANGULATION_3_MISSING_DEPS}") - endif() - - - message(STATUS "NOTICE: This demo requires ${TRIANGULATION_3_MISSING_DEPS}and will not be compiled.") - -endif( CGAL_FOUND AND QT4_FOUND AND OPENGL_FOUND AND QGLVIEWER_FOUND ) diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/MainWindow.cpp b/Triangulation_3_copy_tds/demo/Triangulation_3/MainWindow.cpp deleted file mode 100644 index 1f1c271168e..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3/MainWindow.cpp +++ /dev/null @@ -1,243 +0,0 @@ -#include "MainWindow.h" -#include - -#include "MainWindow.moc" // .moc will be the output from moc preprocessor - -MainWindow::MainWindow(QWidget* parent) - : CGAL::Qt::DemosMainWindow(parent) -{ - // Qt Automatic Connections - // http://doc.trolltech.com/4.4/designer-using-a-component.html#automatic-connections - // setupUi(this) automatically generates connections to the slots named - // "on__" - setupUi(this); - - this->viewer->setScene(&m_scene); - m_scene.setViewer(this->viewer); - - // setup Mode menu group actions - QActionGroup *modeGroup = new QActionGroup(this); - modeGroup->addAction(this->actionNormal_View); - modeGroup->addAction(this->actionInsert_Vertex); - modeGroup->addAction(this->actionInsert_Point); - modeGroup->addAction(this->actionSelect_Vertex); - modeGroup->addAction(this->actionMove_Vertex); - modeGroup->addAction(this->actionFind_NearestNb); - modeGroup->addAction(this->actionEmpty_Sphere); - QObject::connect(modeGroup, SIGNAL(triggered(QAction *)), this, SLOT(setMode(QAction *))); - - // connect menu actions to viewer slots - connectActions(); - - // About menu - // addAboutCGAL() is a function in DemoMainWindow - // it will add a menu action "About CGAL..." to Help menu and connect to popupAboutCGAL - // default popupAboutCGAL points to a fixed file directory ":/cgal/help/about_CGAL.html" - // here we override it with our directory - this->addAboutCGAL(); - // addAboutDemo(QString htmlResourceName) is also a function in DemoMainWindow - // it will add a menu action "About Demo..." to Help menu - // when the action is invoked, it will popup a messageBox showing the given html - this->addAboutDemo( "documentation/about.html" ); - - // read last setting from .ini file - viewer->readSettings(); -} - -void MainWindow::connectActions() -{ - // Edit menu actions - QObject::connect(this->actionIncremental_Construct, SIGNAL(toggled(bool)), - this->viewer, SLOT(toggleIncremental(bool))); - QObject::connect(this->actionStop_Animation, SIGNAL(triggered()), - this->viewer, SLOT(stopIncremental())); - QObject::connect(this->viewer, SIGNAL(stopIncAnimation()), - this, SLOT(stopAnimation())); - - // Show menu actions - QObject::connect(this->actionShow_Axis, SIGNAL(toggled(bool)), - this->viewer, SLOT(toggleShowAxis(bool))); - QObject::connect(this->actionShow_Vertex, SIGNAL(toggled(bool)), - this->viewer, SLOT(toggleShowVertex(bool))); - QObject::connect(this->actionShow_DEdge, SIGNAL(toggled(bool)), - this->viewer, SLOT(toggleShowDEdge(bool))); - QObject::connect(this->actionShow_VEdge, SIGNAL(toggled(bool)), - this->viewer, SLOT(toggleShowVEdge(bool))); - QObject::connect(this->actionShow_Facet, SIGNAL(toggled(bool)), - this->viewer, SLOT(toggleShowFacet(bool))); - QObject::connect(this->actionFlat, SIGNAL(toggled(bool)), - this->viewer, SLOT(toggleFlat(bool))); - - // Preferences - QObject::connect(this->actionPreferences, SIGNAL(triggered()), - this->viewer, SLOT(setPreferences())); - - // Help menu actions - QObject::connect(this->actionDemo_Help, SIGNAL(triggered()), - this->viewer, SLOT(help())); - QObject::connect(this->actionAbout_T3_demo, SIGNAL(triggered()), - this, SLOT(popupAboutDemo())); - - // Quit - QObject::connect(this->actionQuit, SIGNAL(triggered()), - qApp, SLOT(closeAllWindows())); - - // Viewer signals - QObject::connect(this, SIGNAL(sceneChanged()), - this->viewer, SLOT(updateGL())); -} - -void MainWindow::closeEvent(QCloseEvent *event) -{ - viewer->writeSettings(); -} - -/*************************************************************/ -/* Action functions */ - -void MainWindow::setMode(QAction *action) -{ - if( action == this->actionNormal_View ) - this->viewer->setMode( viewer->NONE ); - else if( action == this->actionInsert_Vertex ) - this->viewer->setMode( viewer->INSERT_V ); - else if( action == this->actionInsert_Point ) - this->viewer->setMode( viewer->INSERT_PT ); - else if( action == this->actionSelect_Vertex ) - this->viewer->setMode( viewer->SELECT ); - else if( action == this->actionMove_Vertex ) - this->viewer->setMode( viewer->MOVE ); - else if( action == this->actionFind_NearestNb ) - this->viewer->setMode( viewer->FINDNB ); - else if( action == this->actionEmpty_Sphere ) - this->viewer->setMode( viewer->EMPTYSPH ); -} - -void MainWindow::on_actionLoad_Points_triggered() -{ - QString fileName = QFileDialog::getOpenFileName(this, - tr("Open an file"), // dialog caption - ".", // initial directory - tr("OFF files (*.off);;XYZ files (*.xyz);;All files (*.*)")); // selection filter - if( fileName.isEmpty() ) return; - - // erase old data - viewer->clear(); - - // parse fileName to get the file type - std::string fname = fileName.toAscii().data(); - std::string ftype = fname.substr( fname.find_last_of('.')+1 ); - - if ( ftype.compare("off")==0 || ftype.compare("OFF")==0 ) { // read from OFF file - m_scene.loadPointsOFF( fname.data() ); - // set selectBuffer size (if necessary) - viewer->setSelBuffSize(); - } else if ( ftype.compare("xyz")==0 || ftype.compare("XYZ")==0 ) { // read from XYZ file - m_scene.loadPointsXYZ( fname.data() ); - // set selectBuffer size (if necessary) - viewer->setSelBuffSize(); - } else { - viewer->displayMessage( tr("Please select an OFF or XYZ file to open!") ); - } - - // update viewer - emit( sceneChanged() ); -} - -void MainWindow::on_actionSave_Points_triggered() -{ - if( m_scene.isDTEmpty() ) { - viewer->displayMessage( tr("Error: no existing triangulation to be saved.") ); - return; - } - - QString fileName = QFileDialog::getSaveFileName(this, - tr("Save an file"), // dialog caption - ".", // initial directory - tr("OFF files (*.off);;XYZ files (*.xyz);;All files (*.*)")); // selection filter - if( fileName.isEmpty() ) return; - - // parse fileName to get the file type - std::string fname = fileName.toAscii().data(); - std::string ftype = fname.substr( fname.find_last_of('.')+1 ); - - if ( ftype.compare("off")==0 || ftype.compare("OFF")==0 ) { // save to OFF file - m_scene.savePointsOFF( fname.data() ); - } else if ( ftype.compare("xyz")==0 || ftype.compare("XYZ")==0 ) { // save to XYZ file - m_scene.savePointsXYZ( fname.data() ); - } else { - viewer->displayMessage( tr("Please select an OFF or XYZ file to open!") ); - } -} - -void MainWindow::on_actionGenerate_Points_triggered() -{ - bool isOk; - int nPoints = QInputDialog::getInteger(this, - "3D Triangulation demo", "Number of points: ", // caption and label - 100, // default value - 4, // min value - 2147483647, // max value - 1, // step value of arrow button - &isOk); // if OK is pressed - - if ( isOk) { - // erase old data - viewer->clear(); - - // generate points - m_scene.generatePoints(nPoints); - // set selectBuffer size (if necessary) - viewer->setSelBuffSize(); - - // update viewer - emit( sceneChanged() ); - }// if(isOk) -} - -void MainWindow::stopAnimation() -{ - if( this->actionIncremental_Construct->isChecked() ) - this->actionIncremental_Construct->setChecked( false ); -} - -void MainWindow::on_actionClear_Scene_triggered() -{ - viewer->clear(); - - // update viewer - emit( sceneChanged() ); -} - -void MainWindow::popupAboutCGAL() -{ - // read contents from .html file - QFile about_CGAL( "documentation/about_CGAL.html" ); - about_CGAL.open(QIODevice::ReadOnly); - QString about_CGAL_txt = QTextStream(&about_CGAL).readAll(); -#ifdef CGAL_VERSION_STR - about_CGAL_txt.replace("", - QString(" (version %1, svn r%2)") - .arg(CGAL_VERSION_STR).arg(CGAL_SVN_REVISION)); -#endif - - // popup a message box - QMessageBox mb(QMessageBox::NoIcon, - tr("About CGAL..."), - about_CGAL_txt, - QMessageBox::Ok, - this); - - // set links to be accessible by mouse or keyboard - QLabel* mb_label = mb.findChild("qt_msgbox_label"); - if(mb_label) { - mb_label->setTextInteractionFlags(mb_label->textInteractionFlags() | - ::Qt::LinksAccessibleByMouse | - ::Qt::LinksAccessibleByKeyboard); - } else { - std::cerr << "Cannot find child \"qt_msgbox_label\" in QMessageBox\n" - << " with Qt version " << QT_VERSION_STR << "!\n"; - } - - mb.exec(); -} diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/MainWindow.h b/Triangulation_3_copy_tds/demo/Triangulation_3/MainWindow.h deleted file mode 100644 index a033fbb5b70..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3/MainWindow.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef MAIN_WINDOW_H -#define MAIN_WINDOW_H - -#include "ui_MainWindow.h" -#include -#include -#include -#include - -#include - -#include "Scene.h" - -class QWidget; - -class MainWindow : public CGAL::Qt::DemosMainWindow, private Ui::MainWindow -{ - Q_OBJECT - -public: - MainWindow(QWidget* parent = 0); - ~MainWindow() {} - -public slots: - // file menu - void on_actionLoad_Points_triggered(); - void on_actionSave_Points_triggered(); - - // edit menu - void on_actionGenerate_Points_triggered(); - void stopAnimation(); - - // mode menu - void setMode(QAction *a); - - // show menu - void on_actionClear_Scene_triggered(); - - // about menu - void popupAboutCGAL(); - - signals: - void sceneChanged(); - -protected: - void closeEvent(QCloseEvent *event); - -private: - void connectActions(); - -private: - Scene m_scene; -}; - -#endif diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/MainWindow.ui b/Triangulation_3_copy_tds/demo/Triangulation_3/MainWindow.ui deleted file mode 100644 index 97e9b74f51e..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3/MainWindow.ui +++ /dev/null @@ -1,577 +0,0 @@ - - - MainWindow - - - Qt::NonModal - - - - 0 - 0 - 1100 - 500 - - - - - 0 - 0 - - - - - Arial - - - - PointingHandCursor - - - Triangulation_demo_3 - - - - :/T3_demo/icons/icons/cgal_logo.xpm:/T3_demo/icons/icons/cgal_logo.xpm - - - - - - - - 0 - 0 - - - - PointingHandCursor - - - - - - - - - 0 - 0 - 1010 - 22 - - - - - &File - - - - - - - - - Edit - - - - - - - - - - - Mode - - - - - - - - - - - - Show - - - - - - - - - - - - - - - Help - - - - - - - - - - - - - - toolBar - - - TopToolBarArea - - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - :/T3_demo/icons/icons/pointRandom.png:/T3_demo/icons/icons/pointRandom.png - - - Generate Points - - - Generate Points - - - Generate Points - - - Ctrl+G - - - - - - :/T3_demo/icons/icons/fileOpen.png:/T3_demo/icons/icons/fileOpen.png - - - Load Points... - - - Load Points from a file - - - Load Points from a file - - - Ctrl+O - - - - - - :/T3_demo/icons/icons/fileSave.png:/T3_demo/icons/icons/fileSave.png - - - Save Points... - - - Save points to a file - - - Save points to a file - - - Ctrl+S - - - - - true - - - - :/T3_demo/icons/icons/coordinates.jpeg:/T3_demo/icons/icons/coordinates.jpeg - - - Show Axis - - - Show/Hide Axis - - - Show/Hide Axis - - - - - - :/T3_demo/icons/icons/quit.jpeg:/T3_demo/icons/icons/quit.jpeg - - - Quit - - - Quit - - - Quit - - - - - - :/T3_demo/icons/icons/clear.jpeg:/T3_demo/icons/icons/clear.jpeg - - - Clear Scene - - - Clear Scene - - - Clear Scene - - - - - true - - - true - - - - :/T3_demo/icons/icons/show_point.jpeg:/T3_demo/icons/icons/show_point.jpeg - - - Show Vertices - - - Show Vertices - - - Show Vertices - - - - - true - - - true - - - - :/T3_demo/icons/icons/show_delaunay.jpeg:/T3_demo/icons/icons/show_delaunay.jpeg - - - Show Delaunay Edges - - - Show Delaunay edges - - - Show Delaunay edges - - - - - true - - - - :/T3_demo/icons/icons/show_voronoi.jpeg:/T3_demo/icons/icons/show_voronoi.jpeg - - - Show Voronoi Edges - - - Show Voronoi edges - - - Show Voronoi edges - - - - - true - - - - :/T3_demo/icons/icons/show_facet.jpeg:/T3_demo/icons/icons/show_facet.jpeg - - - Show Facets - - - Show Delaunay Facets - - - Show Delaunay Facets - - - - - true - - - - :/T3_demo/icons/icons/flat.png - :/T3_demo/icons/icons/stereo.png:/T3_demo/icons/icons/flat.png - - - Flat - - - Toggle 3D effect - - - Toggle 3D effect - - - - - - :/T3_demo/icons/icons/preferences.jpeg:/T3_demo/icons/icons/preferences.jpeg - - - Preferences... - - - Change Colors, Transparency, etc. - - - Change Colors, Transparency, etc. - - - - - true - - - - :/T3_demo/icons/icons/insert.jpeg:/T3_demo/icons/icons/insert.jpeg - - - Insert Vertex - - - Insert a point and update the triangulation - - - Insert a point and update the triangulation - - - - - true - - - - :/T3_demo/icons/icons/insert_point.jpg:/T3_demo/icons/icons/insert_point.jpg - - - Insert Point - - - Show the conflict region of a point and insert it - - - Show the conflict region of a point and insert it - - - - - true - - - - :/T3_demo/icons/icons/select_hand.jpeg:/T3_demo/icons/icons/select_hand.jpeg - - - Select Vertex - - - Select vertices - - - Select vertices - - - - - true - - - - :/T3_demo/icons/icons/move_1.jpeg:/T3_demo/icons/icons/move_1.jpeg - - - Move Vertex - - - Move a vertex - - - Move a vertex - - - - - true - - - - :/T3_demo/icons/icons/nearest_nb.png:/T3_demo/icons/icons/nearest_nb.png - - - Nearest Neighbor Search - - - Find the nearest neighbor of the query point - - - Find the nearest neighbor of the query point - - - - - true - - - - :/T3_demo/icons/icons/empty_sphere.jpeg:/T3_demo/icons/icons/empty_sphere.jpeg - - - Show Empty Sphere - - - Click to select a cell and show empty sphere of that cell. - - - Locate the query point in a cell and show empty sphere of that cell - - - Locate the query point in a cell and show empty sphere of that cell - - - - - true - - - true - - - - :/T3_demo/icons/icons/normal_view.jpeg:/T3_demo/icons/icons/normal_view.jpeg - - - Normal Mode - - - Normal Mode - - - Normal Mode - - - - - Triangulation_3D Demo Help - - - Triangulation_3D Demo Help - - - Triangulation_3D Demo Help - - - H - - - - - true - - - - :/T3_demo/icons/icons/play.jpeg - :/T3_demo/icons/icons/pause.jpeg:/T3_demo/icons/icons/play.jpeg - - - Insertion Animation - - - Animation of incremental Delaunay triangulation - - - Animation of incremental Delaunay triangulation - - - - - - :/T3_demo/icons/icons/stop.jpeg:/T3_demo/icons/icons/stop.jpeg - - - Stop Animation - - - Stop Animation - - - Stop Animation - - - - - About T3_demo - - - - - - - Viewer - QWidget -
Viewer.h
- 1 -
-
- - - - -
diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/PreferenceDlg.cpp b/Triangulation_3_copy_tds/demo/Triangulation_3/PreferenceDlg.cpp deleted file mode 100644 index dca25d9ce5f..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3/PreferenceDlg.cpp +++ /dev/null @@ -1,399 +0,0 @@ -#include -#include "PreferenceDlg.h" - -#include "PreferenceDlg.moc" // .moc will be the output from moc preprocessor - -PreferenceDlg::PreferenceDlg(QWidget *parent) : QDialog(parent) -{ - /* Vertex */ - - // create groupbox - QGroupBox *groupV = new QGroupBox( tr("Vertex") ); - // create buttons - QPushButton *btnVertex = new QPushButton( tr("Set Color") ); - // create color label - m_labelVertex = new QLabel; - m_labelVertex->setFrameStyle(QFrame::Sunken | QFrame::Panel); - // create size label - QLabel *labelSizeV = new QLabel( tr("Set Size") ); - // create lineedit - m_editSizeV = new QLineEdit; - - // connect to actions - connect( btnVertex, SIGNAL(clicked()), this, SLOT(setVertexColor()) ); - connect( m_editSizeV, SIGNAL(textChanged(const QString&)), this, SLOT(setVertexSize(const QString&)) ); - - // lay out the buttons - QGridLayout *layoutV = new QGridLayout; - layoutV->addWidget( btnVertex, 0, 0 ); - layoutV->addWidget( m_labelVertex, 0, 1 ); - layoutV->addWidget( labelSizeV, 1, 0 ); - layoutV->addWidget( m_editSizeV, 1, 1 ); - groupV->setLayout( layoutV ); - - /* Delaunau Edge */ - - // create groupbox - QGroupBox *groupDE = new QGroupBox( tr("Delaunay Edge") ); - // create button - QPushButton *btnDEdge = new QPushButton( tr("Set Color") ); - // create color label - m_labelDEdge = new QLabel; - m_labelDEdge->setFrameStyle(QFrame::Sunken | QFrame::Panel); - // create size label - QLabel *labelSizeDE = new QLabel( tr("Set Size") ); - // create lineedit - m_editSizeDE = new QLineEdit; - - // connect to actions - connect( btnDEdge, SIGNAL(clicked()), this, SLOT(setDEdgeColor()) ); - connect( m_editSizeDE, SIGNAL(textChanged(const QString&)), this, SLOT(setDEdgeSize(const QString&)) ); - - // lay out the buttons - QGridLayout *layoutDE = new QGridLayout; - layoutDE->addWidget( btnDEdge, 0, 0 ); - layoutDE->addWidget( m_labelDEdge, 0, 1 ); - layoutDE->addWidget( labelSizeDE, 1, 0 ); - layoutDE->addWidget( m_editSizeDE, 1, 1 ); - groupDE->setLayout( layoutDE ); - - /* Voronoi Edge */ - - // create groupbox - QGroupBox *groupVE = new QGroupBox( tr("Voronoi Edge") ); - // create button - QPushButton *btnVEdge = new QPushButton( tr("Set Color") ); - // create color label - m_labelVEdge = new QLabel; - m_labelVEdge->setFrameStyle(QFrame::Sunken | QFrame::Panel); - // create size label - QLabel *labelSizeVE = new QLabel( tr("Set Size") ); - // create lineedit - m_editSizeVE = new QLineEdit; - - // connect to actions - connect( btnVEdge, SIGNAL(clicked()), this, SLOT(setVEdgeColor()) ); - connect( m_editSizeVE, SIGNAL(textChanged(const QString&)), this, SLOT(setVEdgeSize(const QString&)) ); - - // lay out the buttons - QGridLayout *layoutVE = new QGridLayout; - layoutVE->addWidget( btnVEdge, 0, 0 ); - layoutVE->addWidget( m_labelVEdge, 0, 1 ); - layoutVE->addWidget( labelSizeVE, 1, 0 ); - layoutVE->addWidget( m_editSizeVE, 1, 1 ); - groupVE->setLayout( layoutVE ); - - /* Facet */ - - // create groupbox - QGroupBox *groupF = new QGroupBox( tr("Facet") ); - // create button - QPushButton *btnFacet = new QPushButton( tr("Set Color") ); - // create color label - m_labelFacet = new QLabel; - m_labelFacet->setFrameStyle(QFrame::Sunken | QFrame::Panel); - // create label and spinbox - QLabel *labelFacetA = new QLabel( tr("Transparency") ); - m_spinAlphaF = new QSpinBox; - m_spinAlphaF->setRange(0, 255); - - // connect to actions - connect( btnFacet, SIGNAL(clicked()), this, SLOT(setFacetColor()) ); - connect( m_spinAlphaF, SIGNAL(valueChanged(int)), this, SLOT(setFacetAlpha()) ); - - // lay out the buttons - QGridLayout *layoutF = new QGridLayout; - layoutF->addWidget( btnFacet, 0, 0 ); - layoutF->addWidget( m_labelFacet, 0, 1 ); - layoutF->addWidget( labelFacetA, 1, 0 ); - layoutF->addWidget( m_spinAlphaF, 1, 1 ); - groupF->setLayout( layoutF ); - - /* Trackball */ - - // create groupbox - QGroupBox *groupB = new QGroupBox( tr("Trackball") ); - // create button - QPushButton *btnBall = new QPushButton( tr("Set Color") ); - // create color label - m_labelBall = new QLabel; - m_labelBall->setFrameStyle(QFrame::Sunken | QFrame::Panel); - // create label and spinbox - QLabel *labelBallA = new QLabel( tr("Transparency") ); - m_spinAlphaB = new QSpinBox; - m_spinAlphaB->setRange(0, 255); - // create label and spinbox - QLabel *labelStep = new QLabel( tr("Step-long of Resizing") ); - m_spinStep = new QSpinBox; - m_spinStep->setRange(1, 300); - - // connect to actions - connect( btnBall, SIGNAL(clicked()), this, SLOT(setTrackballColor()) ); - connect( m_spinAlphaB, SIGNAL(valueChanged(int)), this, SLOT(setTrackballAlpha()) ); - connect( m_spinStep, SIGNAL(valueChanged(int)), this, SLOT(setStepLong()) ); - - // lay out the buttons - QGridLayout *layoutB = new QGridLayout; - layoutB->addWidget( btnBall, 0, 0 ); - layoutB->addWidget( m_labelBall, 0, 1 ); - layoutB->addWidget( labelBallA, 1, 0 ); - layoutB->addWidget( m_spinAlphaB, 1, 1 ); - layoutB->addWidget( labelStep, 2, 0 ); - layoutB->addWidget( m_spinStep, 2, 1 ); - groupB->setLayout( layoutB ); - - /* Empty Sphere */ - - // create groupbox - QGroupBox *groupS = new QGroupBox( tr("Empty Sphere") ); - // create color label - m_labelSphere = new QLabel; - m_labelSphere->setFrameStyle(QFrame::Sunken | QFrame::Panel); - // create button - QPushButton *btnSphere = new QPushButton( tr("Set Color") ); - // create label and spinbox - QLabel *labelSphereA = new QLabel( tr("Transparency") ); - m_spinAlphaS = new QSpinBox; - m_spinAlphaS->setRange(0, 255); - - // connect to actions - connect( btnSphere, SIGNAL(clicked()), this, SLOT(setEmptySphereColor()) ); - connect( m_spinAlphaS, SIGNAL(valueChanged(int)), this, SLOT(setEmptySphereAlpha()) ); - - // lay out the buttons - QGridLayout *layoutS = new QGridLayout; - layoutS->addWidget( btnSphere, 0, 0 ); - layoutS->addWidget( m_labelSphere, 0, 1 ); - layoutS->addWidget( labelSphereA, 1, 0 ); - layoutS->addWidget( m_spinAlphaS, 1, 1 ); - groupS->setLayout( layoutS ); - - /* OK buttons */ - // create groupbox - QGroupBox *groupBtn = new QGroupBox(); - // buttons - QPushButton *ok = new QPushButton( tr("OK") ); - QPushButton *apply = new QPushButton( tr("Apply") ); - QPushButton *cancel = new QPushButton( tr("Cancel") ); - cancel->setFocus(); - - // connect to actions - connect( ok, SIGNAL(clicked()), this, SLOT(okClicked()) ); - connect( apply, SIGNAL(clicked()), this, SLOT(applyClicked()) ); - connect( cancel, SIGNAL(clicked()), this, SLOT(reject()) ); - - // lay out the buttons - QGridLayout *layoutBtn = new QGridLayout; - layoutBtn->addWidget( ok, 0, 0 ); - layoutBtn->addWidget( cancel, 0, 1 ); - layoutBtn->addWidget( apply, 0, 2 ); - groupBtn->setLayout( layoutBtn ); - - /* dialog layout */ - - // lay out the buttons - QGridLayout *main = new QGridLayout; - main->addWidget( groupV, 0, 1 ); - main->addWidget( groupDE, 0, 2 ); - main->addWidget( groupVE, 0, 3 ); - main->addWidget( groupF, 1, 1 ); - main->addWidget( groupB, 1, 2 ); - main->addWidget( groupS, 1, 3 ); - main->addWidget( groupBtn, 2, 2, 2, 3 ); - setLayout( main ); - - // set dialog title - setWindowTitle( tr("Preferences") ); -} - -void PreferenceDlg::init(QColor clrVt, float sizeV, QColor clrDE, float sizeDE, - QColor clrVE, float sizeVE, - QColor clrF, QColor clrB, QColor clrS, int iStep) -{ - // vertex color - m_colorVertex = clrVt; - // show the color in label - m_labelVertex->setText(m_colorVertex.name()); - m_labelVertex->setPalette( QPalette(m_colorVertex) ); - m_labelVertex->setAutoFillBackground(true); - // vertex size - m_fSizeVertex = sizeV; - m_editSizeV->setText( QString::number( m_fSizeVertex ) ); - - // Delaunay edge color - m_colorDEdge = clrDE; - // show the color in label - m_labelDEdge->setText( m_colorDEdge.name() ); - m_labelDEdge->setPalette( QPalette(m_colorDEdge) ); - m_labelDEdge->setAutoFillBackground(true); - // edge size - m_fSizeDEdge = sizeDE; - m_editSizeDE->setText( QString::number( m_fSizeDEdge ) ); - - // Voronoi edge color - m_colorVEdge = clrVE; - // show the color in label - m_labelVEdge->setText( m_colorVEdge.name() ); - m_labelVEdge->setPalette( QPalette(m_colorVEdge) ); - m_labelVEdge->setAutoFillBackground(true); - // edge size - m_fSizeVEdge = sizeVE; - m_editSizeVE->setText( QString::number( m_fSizeVEdge ) ); - - // facet color - m_colorFacet = clrF; - // show the color in label - m_labelFacet->setText( m_colorFacet.name() ); - m_labelFacet->setPalette( QPalette(m_colorFacet) ); - m_labelFacet->setAutoFillBackground(true); - // facet transparency - m_spinAlphaF->setValue( m_colorFacet.alpha() ); - - // trackball color - m_colorTrackball = clrB; - // show the color in label - m_labelBall->setText(m_colorTrackball.name()); - m_labelBall->setPalette( QPalette(m_colorTrackball) ); - m_labelBall->setAutoFillBackground(true); - // trackball transparency - m_spinAlphaB->setValue( m_colorTrackball.alpha() ); - // trackball resizing fineness - m_spinStep->setValue( iStep ); - - // empty sphere color - m_colorEmptySphere = clrS; - // show the color in label - m_labelSphere->setText(m_colorEmptySphere.name()); - m_labelSphere->setPalette( QPalette(m_colorEmptySphere) ); - m_labelSphere->setAutoFillBackground(true); - // trackball transparency - m_spinAlphaS->setValue( m_colorEmptySphere.alpha() ); -} - -void PreferenceDlg::setVertexColor() -{ - m_colorVertex = QColorDialog::getColor(m_colorVertex, this); - if( m_colorVertex.isValid() ) { - m_labelVertex->setText(m_colorVertex.name()); - m_labelVertex->setPalette( QPalette(m_colorVertex) ); - m_labelVertex->setAutoFillBackground(true); - } -} - -void PreferenceDlg::setVertexSize(const QString& str) -{ - bool ok; - float size = str.toFloat(&ok); - if( ok ) - m_fSizeVertex = size; - else { - QMessageBox mb(QMessageBox::NoIcon, tr("Error!"), - tr("Enter a valid floating number."), - QMessageBox::Ok, this); - mb.exec(); - m_editSizeV->setFocus(); - } -} - -void PreferenceDlg::setDEdgeColor() -{ - m_colorDEdge = QColorDialog::getColor(m_colorDEdge, this); - if( m_colorDEdge.isValid() ) { - m_labelDEdge->setText( m_colorDEdge.name() ); - m_labelDEdge->setPalette( QPalette(m_colorDEdge) ); - m_labelDEdge->setAutoFillBackground(true); - } -} - -void PreferenceDlg::setDEdgeSize(const QString& str) -{ - bool ok; - float size = str.toFloat(&ok); - if( ok ) - m_fSizeDEdge = size; - else { - QMessageBox mb(QMessageBox::NoIcon, tr("Error!"), - tr("Enter a valid floating number."), - QMessageBox::Ok, this); - mb.exec(); - m_editSizeDE->setFocus(); - } -} - -void PreferenceDlg::setVEdgeColor() -{ - m_colorVEdge = QColorDialog::getColor(m_colorVEdge, this); - if( m_colorVEdge.isValid() ) { - m_labelVEdge->setText( m_colorVEdge.name() ); - m_labelVEdge->setPalette( QPalette(m_colorVEdge) ); - m_labelVEdge->setAutoFillBackground(true); - } -} - -void PreferenceDlg::setVEdgeSize(const QString& str) -{ - bool ok; - float size = str.toFloat(&ok); - if( ok ) - m_fSizeVEdge = size; - else { - QMessageBox mb(QMessageBox::NoIcon, tr("Error!"), - tr("Enter a valid floating number."), - QMessageBox::Ok, this); - mb.exec(); - m_editSizeVE->setFocus(); - } -} - -void PreferenceDlg::setFacetColor() -{ - m_colorFacet = QColorDialog::getColor(m_colorFacet, this); - if( m_colorFacet.isValid() ) { - m_labelFacet->setText( m_colorFacet.name() ); - m_colorFacet.setAlpha( m_spinAlphaF->value() ); - m_labelFacet->setPalette( QPalette(m_colorFacet) ); - m_labelFacet->setAutoFillBackground(true); - } -} - -void PreferenceDlg::setFacetAlpha() -{ - m_colorFacet.setAlpha( m_spinAlphaF->value() ); -} - -void PreferenceDlg::setTrackballColor() -{ - m_colorTrackball = QColorDialog::getColor(m_colorTrackball, this); - if( m_colorTrackball.isValid() ) { - m_labelBall->setText( m_colorTrackball.name() ); - m_colorTrackball.setAlpha( m_spinAlphaB->value() ); - m_labelBall->setPalette( QPalette(m_colorTrackball) ); - m_labelBall->setAutoFillBackground(true); - } -} - -void PreferenceDlg::setTrackballAlpha() -{ - m_colorTrackball.setAlpha( m_spinAlphaB->value() ); -} - -void PreferenceDlg::setStepLong() -{ - m_iStep = m_spinStep->value(); -} - -void PreferenceDlg::setEmptySphereColor() -{ - m_colorEmptySphere = QColorDialog::getColor(m_colorEmptySphere, this); - if( m_colorEmptySphere.isValid() ) { - m_labelSphere->setText( m_colorEmptySphere.name() ); - m_colorEmptySphere.setAlpha( m_spinAlphaS->value() ); - m_labelSphere->setPalette( QPalette(m_colorEmptySphere) ); - m_labelSphere->setAutoFillBackground(true); - } -} - -void PreferenceDlg::setEmptySphereAlpha() -{ - m_colorEmptySphere.setAlpha( m_spinAlphaS->value() ); -} diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/PreferenceDlg.h b/Triangulation_3_copy_tds/demo/Triangulation_3/PreferenceDlg.h deleted file mode 100644 index d4ab184fac1..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3/PreferenceDlg.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef PREFERENCE_DLG_H -#define PREFERENCE_DLG_H - -#include - -class QLabel; -class QSpinBox; -class QLineEdit; - -class PreferenceDlg : public QDialog -{ - Q_OBJECT - - friend class Viewer; - -public: - PreferenceDlg(QWidget *parent=0); - -private: - void init(QColor, float, QColor, float, QColor, float, QColor, QColor, QColor, int); - -private slots: - void okClicked() { hide(); emit( applyChanges() ); } - void applyClicked() { emit( applyChanges() ); } - - void setVertexColor(); - void setVertexSize(const QString&); - void setDEdgeColor(); - void setDEdgeSize(const QString&); - void setVEdgeColor(); - void setVEdgeSize(const QString&); - void setFacetColor(); - void setFacetAlpha(); - void setTrackballColor(); - void setTrackballAlpha(); - void setStepLong(); - void setEmptySphereColor(); - void setEmptySphereAlpha(); - - signals: // Signals do not have access specifier - void applyChanges(); - -private: - QLabel *m_labelVertex; - QLineEdit *m_editSizeV; - QLabel *m_labelDEdge; - QLineEdit *m_editSizeDE; - QLabel *m_labelVEdge; - QLineEdit *m_editSizeVE; - QLabel *m_labelFacet; - QSpinBox *m_spinAlphaF; - QLabel *m_labelBall; - QSpinBox *m_spinAlphaB; - QSpinBox *m_spinStep; - QLabel *m_labelSphere; - QSpinBox *m_spinAlphaS; - - float m_fSizeVertex; - float m_fSizeDEdge; - float m_fSizeVEdge; - QColor m_colorVertex; - QColor m_colorDEdge; - QColor m_colorVEdge; - QColor m_colorFacet; - QColor m_colorTrackball; - int m_iStep; - QColor m_colorEmptySphere; -}; - -#endif diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/Scene.cpp b/Triangulation_3_copy_tds/demo/Triangulation_3/Scene.cpp deleted file mode 100644 index ffb03f63a0b..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3/Scene.cpp +++ /dev/null @@ -1,225 +0,0 @@ -#include "Scene.h" - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -void Scene::generatePoints(int num) -{ - if(num <= 0) return; - - /* Generate 'num' points: */ - /* 1. randomly in the cube [ (-1,-1,-1), (1,1,1) ] --tested */ - CGAL::Random_points_in_cube_3 pts_generator(1.0); - /* 2. randomly on a sphere of radius 1.0 --tested */ - // CGAL::Random_points_in_sphere_3 pts_generator(1.0); - - /* Insert them into the point list: */ - /* 1. use CGAL's copy function --tested */ - list pts; - CGAL::copy_n( pts_generator, num, std::back_inserter(pts) ); - /* 2. use STL's function */ - //for (int i=0; i & points) -{ - ifstream fin; - fin.open( filename ); - // Check whether the file is opened properly - if( !fin ) { - showError( QObject::tr("Error: cannot open file %1 for reading.").arg(filename) ); - return; - } - - istream *pIn = &fin; - - // Use CGAL::File_scanner_OFF to read in data - CGAL::File_scanner_OFF scanner(*pIn); - if( !(*pIn) ) { - showError( QObject::tr("Input error: file %1 is not in OFF format.").arg(filename) ); - return; - } - if( scanner.size_of_vertices() <= 0 ) { - showError( QObject::tr("Input error: file %1 has no vertices.").arg(filename) ); - return; - } - // Get points data from scanner - double x, y, z; - for(int i=0; i pts; - - /* Read point data from file */ - /* 1. use CGAL::File_scanner_OFF to read in data --tested */ - readOFFPointsandFacets( filename, pts ); - - /* 2. use CGAL::read_off_points to read in data -- tested */ - /* Note: read in points only, i.e. normals and faces are ignored */ - /* Note: this function can NOT omit comments (starting with '#') */ -// ifstream fin; -// fin.open( filename ); - // check whether the file is opened properly -// if( !fin ) { -// showError( QObject::tr("Error: cannot open file %1 for reading.").arg(filename) ); -// return; -// } -// if ( !CGAL::read_off_points( fin, // inout ifstream -// back_inserter(pts) ) ) { // output iterator over points -// showError( QObject::tr("Error: cannot read file %1.").arg(filename) ); -// } - - /* Insert the points to build a Delaunay triangulation */ - /* Note: this function returns the number of inserted points; - it is not guaranteed to insert the points following the order of iteraror. */ - m_dt.insert( pts.begin(), pts.end() ); - /* Check the combinatorial validity of the triangulation */ - /* Note: when it is set to be true, - messages describing the first invalidity encountered are printed. */ - if( !m_dt.is_valid() ) // default: false - verbosity off - showError( QObject::tr("Error: fail to build a Delaunay triangulation.") ); - /* Check the dimension */ - if( m_dt.dimension() != 3 ) - showError( QObject::tr("Error: cannot built a 3D triangulation.") ); - /* Store the vertex handles into an array for future usage (move, delete, etc) */ - for(vertices_iterator vit=m_dt.finite_vertices_begin(); - vit!=m_dt.finite_vertices_end(); ++vit) { - m_vhArray.push_back( vit ); - } - assert( m_dt.number_of_vertices() == m_vhArray.size() ); -} - -void Scene::loadPointsXYZ(const char* filename) -{ - ifstream fin; - fin.open( filename ); - // Check whether the file is opened properly - if( !fin ) { - showError( QObject::tr("Error: cannot open file %1 for reading.").arg(filename) ); - return; - } - - /* Use CGAL::read_xyz_points to read in data -- tested */ - /* Note: this function reads in points only (normals are ignored) */ - /* Note: this function can NOT omit comments (starting with '#') */ - list pts; - if( !CGAL::read_xyz_points( fin, // input ifstream - back_inserter(pts) ) ) { // output iterator over points - showError( QObject::tr("Error: cannot read file %1.").arg(filename) ); - } - - /* Insert the points to build a Delaunay triangulation */ - /* Note: this function returns the number of inserted points; - it is not guaranteed to insert the points following the order of iteraror. */ - m_dt.insert( pts.begin(), pts.end() ); - /* Check the combinatorial validity of the triangulation */ - /* Note: when it is set to be true, - messages describing the first invalidity encountered are printed. */ - if( !m_dt.is_valid() ) // default: false - verbosity off - showError( QObject::tr("Error: fail to build a Delaunay triangulation.") ); - /* Check the dimension */ - if( m_dt.dimension() != 3 ) - showError( QObject::tr("Error: cannot build a 3D triangulation.") ); - /* Store the vertex handles into an array for future usage (move, delete, etc) */ - for(vertices_iterator vit=m_dt.finite_vertices_begin(); - vit!=m_dt.finite_vertices_end(); ++vit) { - m_vhArray.push_back( vit ); - } - assert( m_dt.number_of_vertices() == m_vhArray.size() ); -} - -void Scene::savePointsOFF(const char* filename) -{ - ofstream fout; - fout.open( filename ); - if( !fout ) { - showError( QObject::tr("Error: cannot open file %1 for writting.").arg(filename) ); - return; - } - - ostream *pOut = &fout; - - /* Use CGAL::File_writer_OFF to write points */ - // initialize header_OFF - CGAL::File_header_OFF header(false, // true: binary output; false: ASCII - false, // true: no comments in file - false, // true: Geomview SKEL format - true); // true: verbosity on; false: verbosity off - // a simpler way to initialize header_OFF -// CGAL::File_header_OFF header(true); // true: verbosity on -// // (ASCII output, comments, no SKEL) - CGAL::File_writer_OFF writer( header ); - // write header - writer.write_header(*pOut, // output ostream - m_dt.number_of_vertices(), // number of points/vertices - 0, // number of halfedges - 0, // number of facets - false); // true: has normals - // write points (get from point array) - for(vertices_iterator vit=m_dt.finite_vertices_begin(); - vit!=m_dt.finite_vertices_end(); ++vit) { - Point_3& p = vit->point(); - writer.write_vertex( p.x(), p.y(), p.z() ); - } - // write footer - writer.write_footer(); -} - -void Scene::savePointsXYZ(const char* filename) -{ - ofstream fout; - fout.open( filename ); - // Check whether the file is opened properly - if( !fout ) { - showError( QObject::tr("Error: cannot open file %1 for writting.").arg(filename) ); - return; - } - - /* Use CGAL::write_xyz_points to write out data */ - /* Note: this function writes out points only (normals are ignored) */ - if( !CGAL::write_xyz_points( fout, // output ofstream - m_dt.points_begin(), // first output point - m_dt.points_end() ) ) { // past-the-end output point - showError( QObject::tr("Error: cannot read file %1.").arg(filename) ); - } -} diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/Scene.h b/Triangulation_3_copy_tds/demo/Triangulation_3/Scene.h deleted file mode 100644 index 2401e336c3c..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3/Scene.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef SCENE_H -#define SCENE_H - -#include "typedefs.h" -#include - -class Scene { - - friend class Viewer; - -public: - Scene() {} - ~Scene() { eraseOldData(); } - -public: - inline void setViewer(QGLViewer* v) { m_viewer = v; } - inline void showError(const QString & msg) { - if(!m_viewer) m_viewer->displayMessage( msg ); - } - inline bool isDTEmpty() { return m_dt.number_of_vertices()==0; } - inline void eraseOldData() { m_dt.clear(); m_vhArray.clear(); } - -public: - void generatePoints(int); - void loadPointsOFF(const char*); - void loadPointsXYZ(const char*); - void savePointsOFF(const char*); - void savePointsXYZ(const char*); - - void readOFFPointsandFacets(const char*, std::list &); - -private: - //added for T3 demo - DT3 m_dt; - QList m_vhArray; - - QGLViewer* m_viewer; -}; - -#endif diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/T3_demo.cpp b/Triangulation_3_copy_tds/demo/Triangulation_3/T3_demo.cpp deleted file mode 100644 index a79e94031d2..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3/T3_demo.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2010 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL: svn+ssh://sccode@scm.gforge.inria.fr/svn/cgal/branches/experimental-packages/GSoC10-demoT3/demos/Triangulation_demo_3/ $ -// $Id: r58170 2010-08-19 20:46:16 -0400 $ -// -// -// Author(s) : Sophie Fei Che -// -// File Description : Demo of CGAL 3D Triangulation package - -#include "MainWindow.h" -#include - -int main(int argc, char** argv) -{ - QApplication app(argc, argv); - - app.setOrganizationDomain("inria.fr"); - app.setOrganizationName("INRIA"); - app.setApplicationName("3D Triangulation Demo"); - - MainWindow mw; - mw.show(); - - return app.exec(); -} diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/T3_demo.qrc b/Triangulation_3_copy_tds/demo/Triangulation_3/T3_demo.qrc deleted file mode 100644 index 66067aac059..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3/T3_demo.qrc +++ /dev/null @@ -1,31 +0,0 @@ - - - icons/flat.png - icons/stereo.png - icons/pause.jpeg - icons/show_delaunay.jpeg - icons/show_facet.jpeg - icons/show_point.jpeg - icons/show_voronoi.jpeg - icons/play.jpeg - icons/stop.jpeg - icons/empty_sphere.jpeg - icons/normal_view.jpeg - icons/nearest_nb.png - icons/quit.jpeg - icons/insert_point.jpg - icons/clear.jpeg - icons/coordinates.jpeg - icons/fileOpen.png - icons/pointRandom.png - icons/fileSave.png - icons/cgal_logo.xpm - icons/insert.jpeg - icons/move_1.jpeg - icons/select_hand.jpeg - icons/preferences.jpeg - - - icons/about_CGAL.html - - diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/Viewer.cpp b/Triangulation_3_copy_tds/demo/Triangulation_3/Viewer.cpp deleted file mode 100644 index 068ce983961..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3/Viewer.cpp +++ /dev/null @@ -1,1297 +0,0 @@ -#include "Viewer.h" - -using namespace std; - -#include "Viewer.moc" // .moc will be the output from moc preprocessor - -void Viewer::init() -{ - /* Initial timer for playing incremental construction */ - m_pTimer = new QTimer(this); - connect(m_pTimer, SIGNAL(timeout()), this, SLOT(incremental_insert())); - - /* Scene inits */ - setBackgroundColor(::Qt::white); - // scene are defined by a sphere of 2.0, camera at the center, i.e. (0, 0, 0) - setSceneCenter( qglviewer::Vec(-0.,-0.,-0.) ); - setSceneRadius( 2. ); - // show text message - setTextIsEnabled(true); - setForegroundColor(::Qt::red); - setFont(QFont("Arial Black", 16, QFont::Bold)); - - /* OpenGL inits */ - // Increase the material shininess, so that the difference between - // the two versions of the spiral is more visible. - glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 50.0); - GLfloat specular_color[4] = { 0.8f, 0.8f, 0.8f, 1.0 }; - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular_color); - // Set Smooth Shading - ::glShadeModel(GL_SMOOTH); - - // depth buffer setup - ::glClearDepth(1.0f); - ::glEnable(GL_DEPTH_TEST); - ::glDepthFunc(GL_LEQUAL); - ::glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); - - // enable semi-transparent culling planes - ::glEnable(GL_BLEND); - ::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - // anti-aliasing, i.e. reduce jaggedness (if the OpenGL driver permits that) - ::glEnable(GL_POINT_SMOOTH); - ::glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); - ::glEnable(GL_LINE_SMOOTH); - ::glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); - - /* Add mouse and key description */ - setKeyDescription( Qt::CTRL + Qt::Key_G, tr("Generate points") ); - setKeyDescription( Qt::CTRL + Qt::Key_O, tr("Load points") ); - setKeyDescription( Qt::CTRL + Qt::Key_S, tr("Save points") ); - setKeyDescription( Qt::CTRL + Qt::Key_Comma, tr("Preference") ); - setKeyDescription( Qt::CTRL + Qt::Key_H, tr("Hide Kernel Demo") ); - setKeyDescription( Qt::CTRL + Qt::Key_Q, tr("Quit Kernel Demo") ); - setKeyDescription( Qt::Key_Return, - tr("Insert new point to triangulation in Input-Point mode") ); - setKeyDescription( Qt::Key_Escape, - tr("Cancel insertion in Input-Point mode;
") - + tr("Cancel current selection in Select mode") ); - setKeyDescription( Qt::Key_Delete, tr("Delete selected vertices in Select mode") ); - - setMouseBindingDescription( Qt::LeftButton, - tr("Hold to move new point in Input-Point mode;
") - + tr("Hold to move a vertex in Move mode") ); - setMouseBindingDescription( Qt::SHIFT + Qt::LeftButton, - tr("Click to insert a vertex in Input-Vertex mode;
") - + tr("Click to insert a point in Input-Point mode;
") - + tr("Click or Drag to select multiple points in Select mode;
") - + tr("Click to place a query point in Find-Nearest-Neighbor mode;
") - + tr("Click to place a query point in Show-Empty-Sphere mode") ); - setMouseBindingDescription( Qt::CTRL + Qt::LeftButton, - tr("Drag to add vertices to current selection in Select mode") ); -} - -QString Viewer::helpString() const -{ - QString text("

3D Triangulation Demo

"); - - text += "This example illustrates a generic interactive demo for 3D Triangulation in CGAL. "; - text += "This demo could be used as a simple skeleton "; - text += "for potential demos of other 3D packages or for teaching CGAL.

"; - - text += "The key feature is to edit vertices/points with mouse."; - text += "There are several modes:

"; - - text += " - Normal Mode: "; - text += "Rotate, zoom, or translate camera using mouse.
"; - text += " - Insert Vertex: "; - text += "Insert a vertex on the surface of the trackball "; - text += "and the triangulation will be updated correspondingly.
"; - text += " - Insert Point: "; - text += "Insert a point on the surface of the trackball. "; - text += "Its conflict region will be highlighted. "; - text += "When the new point is moving, "; - text += "its conflict region will be updated correspondingly.
"; - text += " - Select: "; - text += "Click or drag mouse left button to select multiple points.
"; - text += " - Move: Hold mouse left button to move a vertex "; - text += "and the triangulation will be updated correspondingly.
"; - text += " - Find Nearest Neighbor: "; - text += "Place a query point and its nearest neighbor will be highlighted.
"; - text += " - Show Empty Sphere: "; - text += "Place a query point, locate the point in a cell "; - text += "and then show the empty sphere of that cell. "; - text += "An empty sphere of a cell is a sphere "; - text += "with all four vertices of the cell lying on it "; - text += "and no other vertices inside it.

"; - text += "Shift+Wheel to resize the trackball when it exists. "; - text += "See Mouse page for more details.

"; - - text += "Other basic features include:
"; - text += " - Randomly generate points,
"; - text += " - Read/Write files,
"; - text += " - Show vertices, Voronoi edges, Delaunay edges, and/or facets,
"; - text += " - Incremental Construct: "; - text += "Re-construct the current triangulation incrementally. "; - text += "If no triangulation exists yet, randomly generate 100 points "; - text += "and construct a Delaunay triangulation of those points.
"; - - return text; -} - -/*************************************************************/ -/* Draw functions */ - -void Viewer::draw() -{ - if( m_pScene == NULL ) return; - - QFont fontPrompt("Arial", 14); - - if( m_showAxis ) { - qglColor(::Qt::black); - drawAxis( sceneRadius() ); - } - - /* Draw vertices */ - if ( m_showVertex && m_pScene->m_dt.number_of_vertices()>0 ) { - for(QList::iterator vit = m_pScene->m_vhArray.begin(); - vit < m_pScene->m_vhArray.end(); ++vit) { - if( m_curMode == SELECT && (*vit)->isSeled() ) continue; - if( (*vit) == m_nearestNb ) continue; - drawVertex( (*vit)->point(), m_colorVertex, m_fSizeVertex ); - }//end-for-points - }//end-if-points - - /* Draw all points during incremental mode */ - if( !m_incrementalPts.isEmpty() ) { - /* draw the rest to-be-inserted vertices */ - for(QList::iterator pit=m_incrementalPts.begin(); - pit < m_incrementalPts.end(); ++pit) { - drawVertex( (*pit), ::Qt::gray, m_fSizeVertex ); - } - - switch( m_curStep ) { - case NEWPT: - /* Show prompt messages */ - qglColor( ::Qt::black ); - drawText( 10, 20, tr("Highlight the next-to-insert point"), fontPrompt ); - /* Highlight the next-to-insert point */ - drawVertex( m_curIncPt, ::Qt::red, m_fSizeVertex ); - break; - case CELL: // show the tetrahedron that contains the point - /* Show prompt messages */ - qglColor( ::Qt::black ); - drawText( 10, 20, tr("Show the tetrahedron containing the point"), fontPrompt ); - drawText( 10, 40, tr("(Only finite facets are drawn)"), fontPrompt ); - /* Highlight the next-to-insert vertex */ - drawVertex( m_curIncPt, ::Qt::red, m_fSizeVertex ); - /* Draw the cell containing that point */ - for(int i=0; i<4; ++i) { - if( m_pScene->m_dt.is_infinite(m_cellContain, i) ) continue; - drawFacet( m_pScene->m_dt.triangle( m_cellContain, i ), m_colorFacet ); - }//end-for-facets - break; - case CONFLICT: // show the conflict region - /* Show prompt messages */ - qglColor( ::Qt::black ); - drawText( 10, 20, tr("Show the conflict region"), fontPrompt ); - /* Highlight the next-to-insert vertex */ - drawVertex( m_curIncPt, ::Qt::red, m_fSizeVertex ); - /* Draw conflict region */ - for(QList::iterator fit = m_boundaryFacets.begin(); - fit < m_boundaryFacets.end(); ++fit) { - if( m_pScene->m_dt.is_infinite(*fit) ) continue; - drawFacet( m_pScene->m_dt.triangle(*fit), QColor(215, 80, 0, 96) ); //semi-transparent purple - }//end-for-facets - break; - default: - break; - }//end-of=switch - }//end-if-incpts - - /* Draw Delaunay edges */ - if( m_showDEdge ) { - for(edges_iterator eit = m_pScene->m_dt.finite_edges_begin(); - eit != m_pScene->m_dt.finite_edges_end(); ++eit) { - Segment_3 seg = m_pScene->m_dt.segment(*eit); - drawEdge( seg.vertex(0), seg.vertex(1), m_colorDEdge, m_fSizeDEdge ); - }//end-for-edges - }//end-if-dt - - /* Draw Voronoi edges */ - if( m_showVEdge ) { - for(facets_iterator fit = m_pScene->m_dt.finite_facets_begin(); - fit != m_pScene->m_dt.finite_facets_end(); ++fit) { - Object_3 o = m_pScene->m_dt.dual(*fit); - if (const Segment_3 *s = CGAL::object_cast(&o)) { - drawEdge( s->vertex(0), s->vertex(1), m_colorVEdge, m_fSizeVEdge ); - } else if (const Ray_3 *r = CGAL::object_cast(&o)) { - drawEdge( r->point(0), // the source of the ray - r->point(1), // another point on the ray, different from the source - m_colorVEdge, m_fSizeVEdge ); - } - }//end-for-edges - }//end-if-vd - - /* Draw facets */ - if( m_showFacet ) { - for(facets_iterator fit = m_pScene->m_dt.finite_facets_begin(); - fit != m_pScene->m_dt.finite_facets_end(); ++fit) { - drawFacet( m_pScene->m_dt.triangle(*fit), m_colorFacet ); - }//end-for-facets - }//end-if-facets - - /* Insert vertex mode */ - if( m_curMode == INSERT_V ) { - /* Show prompt messages */ - qglColor( ::Qt::black ); - drawText( width()-200, 20, tr("Shift+Left: Insert a vertex"), fontPrompt ); - drawText( width()-200, 40, tr("Shift+Wheel: Resize trackball"), fontPrompt ); - /* Draw the trackball */ - drawSphere( m_fRadius, m_colorTrackball ); - }//end-if-insv - - /* Insert point mode */ - else if( m_curMode == INSERT_PT ) { - /* Show prompt messages */ - qglColor( ::Qt::black ); - drawText( width()-200, 20, tr("Shift+Left: Insert a point"), fontPrompt ); - drawText( width()-200, 40, tr("Hold Left: Move the point"), fontPrompt ); - drawText( width()-200, 60, tr("Return: Insert to DT"), fontPrompt ); - drawText( width()-200, 80, tr("Escape: Cancel insertion"), fontPrompt ); - drawText( width()-200, 100, tr("Shift+Wheel: Resize trackball"), fontPrompt ); - - /* Draw the trackball */ - drawSphere( m_fRadius, m_colorTrackball ); - - if( m_hasNewPt ) { - /* Draw the newly inserted point */ - drawVertex( m_newPt, ::Qt::red, m_fSizeVertex ); - /* Draw conflict region */ - for(QList::iterator fit = m_boundaryFacets.begin(); - fit < m_boundaryFacets.end(); ++fit) { - if( m_pScene->m_dt.is_infinite(*fit) ) continue; - drawFacet( m_pScene->m_dt.triangle(*fit), QColor(215, 80, 0, 96) ); //semi-transparent purple - }//end-for-facets - }//end-if-shown - }//end-if-inspt - - /* Select mode */ - else if( m_curMode == SELECT) { - /* Show prompt messages */ - qglColor( ::Qt::black ); - drawText( width()-200, 20, tr("Shift+Left: Select"), fontPrompt ); - drawText( width()-200, 40, tr("Ctrl+Left: Add selection"), - QFont("Arial", 14) ); - drawText( width()-200, 60, tr("Escape: Cancel selection"), fontPrompt ); - drawText( width()-200, 80, tr("DEL: Delete selected"), fontPrompt ); - /* Highlight the selected vertices */ - for(QList::iterator vit=m_vidSeled.begin(); vitm_vhArray.at(*vit)->point(), ::Qt::red, m_fSizeVertex ); - }//end-for-seledpts - /* Draw the multiple selection window */ - if( m_isPress ) { - ::glDisable( GL_LIGHTING ); - startScreenCoordinatesSystem(); - qglColor( QColor(80, 180, 180, 64) ); - ::glBegin(GL_QUADS); - ::glVertex2i(m_rectSel.left(), m_rectSel.top()); - ::glVertex2i(m_rectSel.right(), m_rectSel.top()); - ::glVertex2i(m_rectSel.right(), m_rectSel.bottom()); - ::glVertex2i(m_rectSel.left(), m_rectSel.bottom()); - ::glEnd(); - stopScreenCoordinatesSystem(); - ::glEnable( GL_LIGHTING ); - }//end-if-press - }//end-if-sel - - /* Move mode */ - else if( m_curMode == MOVE ) { - /* Show prompt messages */ - qglColor( ::Qt::black ); - drawText( width()-200, 20, tr("Left Click: Select"), fontPrompt ); - - if( m_isMoving ) { - drawText( width()-200, 40, tr("Shift+Wheel: Resize trackball"), fontPrompt ); - /* Draw the trackball */ - drawSphere( m_fRadius, m_colorTrackball ); - /* Highlight the moving point */ - drawVertex( m_pScene->m_vhArray.at( m_vidMoving )->point(), ::Qt::red, m_fSizeVertex ); - }//end-if-v - }//end-if-move - - /* FindNb mode */ - else if( m_curMode == FINDNB ) { - /* Show prompt messages */ - qglColor( ::Qt::black ); - drawText( width()-200, 20, tr("Shift+Left: Place query point"), fontPrompt ); - drawText( width()-200, 40, tr("Shift+Wheel: Resize trackball"), fontPrompt ); - /* Draw the trackball */ - drawSphere( m_fRadius, m_colorTrackball ); - /* Draw the nearest neighbor */ - if( m_nearestNb != NULL ) { - drawVertex( m_queryPt, ::Qt::red, m_fSizeVertex ); - drawVertex( m_nearestNb->point(), ::Qt::red, m_fSizeVertex ); - } - }//end-if-findnb - - /* EmptySphere mode */ - else if( m_curMode == EMPTYSPH ) { - /* Show prompt messages */ - qglColor( ::Qt::black ); - drawText( width()-200, 20, tr("Shift+Left: Place query point"), fontPrompt ); - drawText( width()-200, 40, tr("Press S: Show/Hide trackball"), fontPrompt ); - drawText( width()-200, 60, tr("Shift+Wheel: Resize trackball"), fontPrompt ); - /* Draw the trackball */ - if( m_showTrackball ) - drawSphere( m_fRadius, m_colorTrackball ); - - if( m_hasEmptyS ) { - /* Draw the query point */ - drawVertex( m_queryPt, ::Qt::red, m_fSizeVertex ); - /* Draw the cell containing that point */ - for(int i=0; i<4; ++i) { - if( m_pScene->m_dt.is_infinite(m_cellContain, i) ) continue; - drawFacet( m_pScene->m_dt.triangle( m_cellContain, i ), m_colorFacet ); - }//end-for-facets - /* Draw the sphere */ - drawSphere( m_fREmptyS, m_colorEmptySphere, m_centerPt ); - } - }//end-if-emptyS -} - -void Viewer::drawVertex(const Point_3& p, const QColor& clr, float r) -{ - /* Draw regular points */ - if( m_isFlat ) { - // disable lighting - ::glDisable( GL_LIGHTING ); - - ::glPointSize(8.0); - qglColor( clr ); - - ::glBegin(GL_POINTS); - ::glVertex3f( p.x(), p.y(), p.z() ); - ::glEnd(); - - // resume lighting - ::glEnable( GL_LIGHTING ); - - return; - } - - /* Draw vertices as 3D balls */ - GLboolean lighting, colorMaterial; - ::glGetBooleanv( GL_LIGHTING, &lighting ); - ::glGetBooleanv( GL_COLOR_MATERIAL, &colorMaterial ); - ::glEnable( GL_LIGHTING ); - ::glDisable(GL_COLOR_MATERIAL); - - float color[4]; - color[0] = clr.redF(); - color[1] = clr.greenF(); - color[2] = clr.blueF(); - color[3] = clr.alphaF(); - - // move to the point - ::glPushMatrix(); - ::glTranslatef( p.x(), p.y(), p.z() ); - - // draw - GLUquadricObj* quadratic = ::gluNewQuadric(); // Create A Pointer To The Quadric Object - ::gluQuadricNormals( quadratic, GLU_SMOOTH ); // Create Smooth Normals - ::glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color ); - ::gluSphere( quadratic, r, 16, 16 ); - - // move back to origin - ::glPopMatrix(); - - if ( colorMaterial ) - ::glEnable( GL_COLOR_MATERIAL ); - if ( !lighting ) - ::glDisable( GL_LIGHTING ); -} - -void Viewer::drawEdge(const Point_3& from, const Point_3& to, const QColor& clr, float r) -{ - /* Draw regular lines */ - if( m_isFlat ) { - // disable lighting - ::glDisable( GL_LIGHTING ); - - ::glLineWidth(1.0); - qglColor( clr ); - - ::glBegin(GL_LINES); - ::glVertex3f( from.x(), from.y(), from.z() ); - ::glVertex3f( to.x(), to.y(), to.z() ); - ::glEnd(); - - // resume lighting - ::glEnable( GL_LIGHTING ); - - return; - } - - /* Draw edges as 3D cylinders */ - GLboolean lighting, colorMaterial; - ::glGetBooleanv( GL_LIGHTING, &lighting ); - ::glGetBooleanv( GL_COLOR_MATERIAL, &colorMaterial ); - ::glEnable( GL_LIGHTING ); - ::glDisable(GL_COLOR_MATERIAL); - - float color[4]; - color[0] = clr.redF(); - color[1] = clr.greenF(); - color[2] = clr.blueF(); - color[3] = clr.alphaF(); - - Vector_3 v = to - from; - - // compute the length of the edge - // method 1: -// float length = sqrt( CGAL::squared_distance( from, to ) ); - // method 2: - float length = sqrt( v.squared_length() ); - - // normalize - v = v / length; - // compute the angle: cos theta = v.z/1.0 - GLfloat angle = acos( v.z() ) / 3.1415927 * 180; - - ::glPushMatrix(); - - // move to "from" point - ::glTranslatef( from.x(), from.y(), from.z() ); - // rotate from z-axis to from-->to - // axis: cross product of z-axis and from-->to - ::glRotatef( angle, -v.y(), v.x(), 0.0f ); - // draw - GLUquadricObj* quadratic = ::gluNewQuadric(); // Create A Pointer To The Quadric Object - ::gluQuadricNormals( quadratic, GLU_SMOOTH ); // Create Smooth Normals - ::glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color ); - // gluCylinder draws a cylinder oriented along the z-axis - ::gluCylinder( quadratic, r, r, length, 16, 4 ); - - // move back to origin - ::glPopMatrix(); - - if ( colorMaterial ) - ::glEnable( GL_COLOR_MATERIAL ); - if ( !lighting ) - ::glDisable( GL_LIGHTING ); -} - -void Viewer::drawFacet(const Triangle_3& t, const QColor& clr) -{ - // disable lighting - ::glDisable( GL_LIGHTING ); - - // disable depth buffer writing - ::glDepthMask( GL_FALSE ); - - qglColor( m_colorFacet ); - - ::glBegin(GL_TRIANGLES); - Point_3 p0 = t.vertex(0); - Point_3 p1 = t.vertex(1); - Point_3 p2 = t.vertex(2); - ::glVertex3f( p0.x(), p0.y(), p0.z() ); - ::glVertex3f( p1.x(), p1.y(), p1.z() ); - ::glVertex3f( p2.x(), p2.y(), p2.z() ); - ::glEnd(); - - // resume depth buffer writing - ::glDepthMask( GL_TRUE ); - - // resume lighting - ::glEnable( GL_LIGHTING ); -} - -void Viewer::drawSphere(float r, const QColor& clr, const Point_3& center) -{ - GLboolean lighting, colorMaterial; - ::glGetBooleanv( GL_LIGHTING, &lighting ); - ::glGetBooleanv( GL_COLOR_MATERIAL, &colorMaterial ); - ::glEnable( GL_LIGHTING ); - ::glDisable(GL_COLOR_MATERIAL); - - float color[4]; - color[0] = clr.redF(); - color[1] = clr.greenF(); - color[2] = clr.blueF(); - color[3] = clr.alphaF(); - - ::glPushMatrix(); - - // move to the point - if( center != CGAL::ORIGIN ) ::glTranslatef( center.x(), center.y(), center.z() ); - - // disable depth buffer writing - ::glDepthMask( GL_FALSE ); - // draw - GLUquadricObj* quadratic = ::gluNewQuadric(); // Create A Pointer To The Quadric Object - ::gluQuadricNormals( quadratic, GLU_SMOOTH ); // Create Smooth Normals - ::glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color ); - ::gluSphere( quadratic, r, 32, 32 ); - // resume depth buffer writing - ::glDepthMask( GL_TRUE ); - - // move back to origin - ::glPopMatrix(); - - if ( colorMaterial ) - ::glEnable( GL_COLOR_MATERIAL ); - if ( !lighting ) - ::glDisable( GL_LIGHTING ); -} - -/*************************************************************/ -/* Select functions */ - -void Viewer::drawWithNames() -{ - for(int i=0; im_vhArray.size(); ++i) { - // push a name for each point onto the name stack - // note: it can NOT be used between glBegin and glEnd - ::glPushName( i ); - - // draw the point - ::glBegin(GL_POINTS); - Point_3& p = m_pScene->m_vhArray.at(i)->point(); - ::glVertex3f(p.x(), p.y(), p.z()); - ::glEnd(); - - // pop one name off the top of the name stack - ::glPopName(); - }//end-for-points - - // push a name for the newly inserted point - if( m_curMode == INSERT_PT && m_hasNewPt ) { - ::glPushName( ::GLuint(-1) ); - ::glBegin(GL_POINTS); - ::glVertex3f(m_newPt.x(), m_newPt.y(), m_newPt.z()); - ::glEnd(); - ::glPopName(); - }//end-if-newPt -} - -void Viewer::endSelection(const QPoint& point) -{ - // flush GL buffers - ::glFlush(); - - // reset GL_RENDER mode (was GL_SELECT) and get the number of selected points - size_t nSel = ::glRenderMode(GL_RENDER); - - /* No selection */ - if( nSel <= 0 ) { - if( m_curMode == SELECT ) - m_isPress = false; - }//end-if-notselected - - // each hit record has 4 data: # of names in name stack, min and max depth of old hits, - // name stack contents [see glSelectBuffer man page for more details] - // i.e. (selectBuffer())[4*i+3] is the id pushed on the stack - - /* Check whether the new point is clicked on */ - else if( m_curMode == INSERT_PT ) { - if( m_hasNewPt && (selectBuffer())[3] == ::GLuint(-1) ) - m_isMoving = true; - }//end-if-inspt - - /* Check whether vertex is clicked on */ - else if( m_curMode == MOVE ) { - m_isMoving = true; - m_vidMoving = (selectBuffer())[3]; - // compute the corresponding size of trackball, i.e. selectedV is on the ball - Point_3 p = m_pScene->m_vhArray.at( m_vidMoving )->point(); - m_fRadius = sqrt( p.x()*p.x() + p.y()*p.y() + p.z()*p.z() ); - }//end-if-move - - /* Store current selections */ - else { // m_curMode == SELECT - if( m_selMode == NORMAL ) { - // remove the old selections - for(QList::iterator vit=m_vidSeled.begin(); - vit < m_vidSeled.end(); ++vit) { - m_pScene->m_vhArray.at(*vit)->setSeled( false ); - } - m_vidSeled.clear(); - - // record the new selections - for(int i=0; im_vhArray.at( m_vidSeled.back() )->setSeled(); - } - } else { - for(int i=0; im_vhArray.at( (selectBuffer())[4*i+3] )->setSeled(); - }//end-if-contain - }//end-for - }//end-if-add - }//end-if-sel -} - -/*************************************************************/ -/* Mouse and Keyboard functions */ - -void Viewer::mousePressEvent(QMouseEvent *event) -{ - // button() holds the button that caused the event - // note: for mouse move event, button() always return Qt::NoButton - // modifiers() holds the keyboard modifier flags at the time of the event - // buttons() holds the button state when the event was generated, - // i.e. all buttons that are pressed down - // pos() holds the mouse cursor's position relative to the receiving widget - - // Get event modifiers key -#if QT_VERSION < 0x040000 - // Bug in Qt : use 0x0f00 instead of Qt::KeyButtonMask with Qt versions < 3.1 - const Qt::ButtonState modifiers = (Qt::ButtonState)(event->state() & Qt::KeyButtonMask); -#else - const Qt::KeyboardModifiers modifiers = event->modifiers(); -#endif - - if( m_curMode == INSERT_V - && event->button() == Qt::LeftButton && modifiers == Qt::SHIFT ) { - m_isPress = true; - }//end-if-insv - - else if(m_curMode == INSERT_PT && event->button() == Qt::LeftButton ) { - /* shift+left to insert */ - if( modifiers == Qt::SHIFT ) { - if( m_pScene->m_dt.is_valid() && m_pScene->m_dt.dimension() == 3 ) - m_isPress = true; - else - displayMessage( tr("There exists no triangulation yet.") ); - m_hasNewPt = false; - } else { /* left button to move */ - m_isMoving = false; - // define selection window (default was 3) - setSelectRegionWidth( 10 ); - setSelectRegionHeight( 10 ); - // perform the selection - select( event->pos() ); - if( m_isMoving ) - // redraw window - updateGL(); - else - // if no point is selected, then regular action (rotation) will be performed - QGLViewer::mousePressEvent(event); - }//end-if-shift - }//end-if-inspt - - else if( m_curMode == SELECT && event->button() == Qt::LeftButton ) { - // set the selection mode - switch( modifiers ) { - case Qt::SHIFT : // select - m_isPress = true; - m_selMode = NORMAL; - // initialize multiple selection window - m_rectSel = QRect( event->pos(), event->pos() ); - // redraw window - updateGL(); - break; - case Qt::CTRL : // add selection - m_isPress = true; - m_selMode = ADD; - // initialize multiple selection window - m_rectSel = QRect( event->pos(), event->pos() ); - // redraw window - updateGL(); - break; - default: // rotate - QGLViewer::mousePressEvent(event); - break; - } - }//end-if-select - - else if(m_curMode == MOVE && event->button() == Qt::LeftButton ) { - m_isMoving = false; - // define selection window (default was 3) - setSelectRegionWidth( 10 ); - setSelectRegionHeight( 10 ); - // perform the selection - select( event->pos() ); - if( m_isMoving ) // redraw window - updateGL(); - else // if no point is selected, then regular action (rotation) will be performed - QGLViewer::mousePressEvent(event); - }//end-if-move - - else if( m_curMode == FINDNB - && event->button() == Qt::LeftButton && modifiers == Qt::SHIFT ) { - if( m_pScene->m_dt.is_valid() && m_pScene->m_dt.dimension() == 3 ) - m_isPress = true; - else - displayMessage( tr("There exists no triangulation yet.") ); - }//end-if-findnb - - else if( m_curMode == EMPTYSPH - && event->button() == Qt::LeftButton && modifiers == Qt::SHIFT ) { - if( m_pScene->m_dt.is_valid() && m_pScene->m_dt.dimension() == 3 ) - m_isPress = true; - else - displayMessage( tr("There exists no triangulation yet.") ); - m_hasEmptyS = false; - }//end-if-emptyS - - else - QGLViewer::mousePressEvent(event); -} - -void Viewer::mouseMoveEvent(QMouseEvent *event) -{ - if( m_curMode == INSERT_PT && m_isMoving ) { - Vec pt; - if( computeIntersect( event->pos(), pt ) ) { - m_newPt = Point_3(pt.x, pt.y, pt.z); - // compute the conflict hole induced by point p - computeConflict( m_newPt ); - }//end-if-compute - - // redraw - updateGL(); - }//end-if-inspt - - else if( m_curMode == SELECT && m_isPress ) { - // update multiple selection window - m_rectSel.setBottomRight( event->pos() ); - // redraw - updateGL(); - }//end-if-sel - - else if( m_curMode == MOVE && m_isMoving ) { - Vec pt; - if( computeIntersect( event->pos(), pt ) ) { - // note: QList::operator[] return a modifiable reference; - // while QList::at return a const reference -#if CGAL_VERSION_NR < 1030700000 - // move_point moves the point stored in v to p while preserving the Delaunay property - // it calls remove(v) followed by insert(p) and return the new handle - // it supposely faster when the point has not moved much - m_pScene->m_vhArray[m_vidMoving] = m_pScene->m_dt.move_if_no_collision( - m_pScene->m_vhArray.at( m_vidMoving ), - Point_3( pt.x, pt.y, pt.z ) ); -#else - // move_if_no_collision moves the point stored in v to pt - // if there is not already another vertex placed on pt, - // the triangulation is modified s.t. the new position of v is pt; - // otherwise, the vertex at point pt is returned. - Vertex_handle vh = m_pScene->m_dt.move_if_no_collision( - m_pScene->m_vhArray.at( m_vidMoving ), - Point_3( pt.x, pt.y, pt.z ) ); - int id1 = m_pScene->m_vhArray.indexOf( vh ); - int id2 = m_pScene->m_vhArray.indexOf( vh, m_vidMoving+1 ); - // remove the duplicate in vhArray - if( id1 != m_vidMoving ) - m_pScene->m_vhArray.removeAt( id1 ); - else if( id2 != -1 ) - m_pScene->m_vhArray.removeAt( id2 ); - m_pScene->m_vhArray[m_vidMoving] = vh; -#endif - }//end-if-compute - - // redraw - updateGL(); - }//end-if-move - - else - QGLViewer::mouseMoveEvent(event); -} - -void Viewer::mouseReleaseEvent(QMouseEvent *event) -{ - /* INS_V mode - Shift+Left: compute and insert a vertex */ - if( m_curMode == INSERT_V && m_isPress ) { - m_isPress = false; - Vec pt; - if( computeIntersect( event->pos(), pt ) ) { - m_pScene->m_vhArray.push_back( m_pScene->m_dt.insert( Point_3( pt.x, pt.y, pt.z ) ) ); - }//end-if-compute - - // redraw - updateGL(); - }//end-if-ins - - /* INS_PT mode - Shift+Left: compute and insert a point */ - else if( m_curMode == INSERT_PT && m_isPress ) { - m_isPress = false; - Vec pt; - if( computeIntersect( event->pos(), pt ) ) { - m_hasNewPt = true; - m_newPt = Point_3(pt.x, pt.y, pt.z); - // compute the conflict hole induced by point p - computeConflict( m_newPt ); - }//end-if-compute - - // redraw - updateGL(); - }//end-if-inspt - - /* INS_PT mode - Left: compute and insert a point */ - else if( m_curMode == INSERT_PT && m_isMoving ) { - m_isMoving = false; - Vec pt; - if( computeIntersect( event->pos(), pt ) ) { - m_newPt = Point_3(pt.x, pt.y, pt.z); - // compute the conflict hole induced by point p - computeConflict( m_newPt ); - }//end-if-compute - - // redraw - updateGL(); - }//end-if-inspt - - /* SEL mode - Left: terminate multiple point selection */ - else if( m_curMode == SELECT && m_isPress ) { - // might swap left/right and top/bottom to make rectanle valid -#if QT_VERSION < 0x040000 - m_rectSel = m_rectSel.normalize(); -#else - m_rectSel = m_rectSel.normalized(); -#endif - - if( m_rectSel.width() == 1 && m_rectSel.height() == 1 ) { /* select a point */ - // set a default selection window - setSelectRegionWidth( 10 ); - setSelectRegionHeight( 10 ); - // compute rectangle center and perform selection - select( m_rectSel.center() ); - if( m_isPress ) { - m_isPress = false; - } else { - displayMessage( tr("No point is selected.") ); - } - } else { /* select multiple points, ie. selection window > 1 */ - // define selection window - if( m_rectSel.width() < 10 ) - setSelectRegionWidth( 10 ); - else - setSelectRegionWidth( m_rectSel.width() ); - if( m_rectSel.height() < 10 ) - setSelectRegionHeight( 10 ); - else - setSelectRegionHeight( m_rectSel.height() ); - // compute rectangle center and perform selection - select( m_rectSel.center() ); - if( m_isPress ) { - m_isPress = false; - displayMessage( QString::number(m_vidSeled.size()) + tr(" points are selected") ); - } else { // empty window will cancel the current selection - for(QList::iterator iit = m_vidSeled.begin(); iit < m_vidSeled.end(); ++iit) - m_pScene->m_vhArray.at(*iit)->setSeled( false ); - m_vidSeled.clear(); - } - }//end-if-selwindow - - // update display to show - updateGL(); - }//end-if-select - - /* MOVE mode - Left: terminate point moving */ - else if( m_curMode == MOVE && m_isMoving ) { - Vec pt; - if( computeIntersect( event->pos(), pt ) ) { - // note: QList::operator[] return a modifiable reference; - // while QList::at return a const reference -#if CGAL_VERSION_NR < 1030700000 - // move_point moves the point stored in v to p while preserving the Delaunay property - // it calls remove(v) followed by insert(p) and return the new handle - // it supposely faster when the point has not moved much - m_pScene->m_vhArray[m_vidMoving] = m_pScene->m_dt.move_if_no_collision( - m_pScene->m_vhArray.at( m_vidMoving ), - Point_3( pt.x, pt.y, pt.z ) ); -#else - // move_if_no_collision moves the point stored in v to pt - // if there is not already another vertex placed on pt, - // the triangulation is modified s.t. the new position of v is pt; - // otherwise, the vertex at point pt is returned. - Vertex_handle vh = m_pScene->m_dt.move_if_no_collision( - m_pScene->m_vhArray.at( m_vidMoving ), - Point_3( pt.x, pt.y, pt.z ) ); - int id1 = m_pScene->m_vhArray.indexOf( vh ); - int id2 = m_pScene->m_vhArray.indexOf( vh, m_vidMoving+1 ); - // remove the duplicate in vhArray - if( id1 != m_vidMoving ) - m_pScene->m_vhArray.removeAt( id1 ); - else if( id2 != -1 ) - m_pScene->m_vhArray.removeAt( id2 ); - m_pScene->m_vhArray[m_vidMoving] = vh; -#endif - }//end-if-compute - - // redraw - updateGL(); - }//end-if-move - - /* FindNb mode - Shift+Left: find the nearest neighbor of the point */ - else if( m_curMode == FINDNB && m_isPress ) { - m_isPress = false; - Vec pt; - if( computeIntersect( event->pos(), pt ) ) { - m_queryPt = Point_3( pt.x, pt.y, pt.z ); - m_nearestNb = m_pScene->m_dt.nearest_vertex( m_queryPt ); - }//end-if-compute - - // redraw - updateGL(); - }//end-if-findnb - - /* EmptySphere mode - Shift+Left: show the empty sphere of the cell */ - else if( m_curMode == EMPTYSPH && m_isPress ) { - m_isPress = false; - Vec pt; - m_hasEmptyS = computeIntersect( event->pos(), pt ); - if( m_hasEmptyS ) { - m_queryPt = Point_3( pt.x, pt.y, pt.z ); - // find the cell that contains point p in its interior - m_cellContain = m_pScene->m_dt.locate( m_queryPt ); - // show error if point is outside the convex hull - if( m_pScene->m_dt.is_infinite( m_cellContain ) ) { - m_hasEmptyS = false; - displayMessage( tr("Query point is outside the convex hull!") ); - } else { /* compute the empty sphere */ - // find the circumcenter of the four vertices of c - m_centerPt = m_pScene->m_dt.dual( m_cellContain ); - // compute the radius of the empty sphere - m_fREmptyS = sqrt( CGAL::squared_distance( m_centerPt, - m_cellContain->vertex(0)->point() ) ); - } - }//end-if-compute - // redraw - updateGL(); - }//end-if-emptysphere - - else - QGLViewer::mouseReleaseEvent(event); -} - -void Viewer::wheelEvent(QWheelEvent *event) -{ - // Get event modifiers key -#if QT_VERSION < 0x040000 - // Bug in Qt : use 0x0f00 instead of Qt::KeyButtonMask with Qt versions < 3.1 - const Qt::ButtonState modifiers = (Qt::ButtonState)(event->state() & Qt::KeyButtonMask); -#else - const Qt::KeyboardModifiers modifiers = event->modifiers(); -#endif - - if( (m_curMode == INSERT_V || m_curMode == FINDNB || m_curMode == EMPTYSPH ) - && modifiers == Qt::SHIFT ) { - // delta() returns the distance that the wheel is rotated, in eighths of a degree. - // note: most mouse types work in steps of 15 degrees - // positive value: rotate forwards away from the user; - // negative value: rotate backwards toward the user. - m_fRadius += (event->delta()*1. / m_iStep ); // inc-/decrease by 0.1 per step - if( m_fRadius < 0.1 ) - m_fRadius = 0.1; - - // redraw - updateGL(); - }//end-if-insv - - else if( m_curMode == INSERT_PT && modifiers == Qt::SHIFT ) { - // delta() returns the distance that the wheel is rotated, in eighths of a degree. - // note: most mouse types work in steps of 15 degrees - // positive value: rotate forwards away from the user; - // negative value: rotate backwards toward the user. - float origR = m_fRadius; - m_fRadius += (event->delta()*1. / m_iStep ); // inc-/decrease by 0.1 per step - if( m_fRadius < 0.1 ) - m_fRadius = 0.1; - // update the new point and its conflict region - if( m_hasNewPt ) { - origR = m_fRadius / origR; - m_newPt = Point_3( m_newPt.x()*origR, m_newPt.y()*origR, m_newPt.z()*origR ); - // compute the conflict hole induced by point p - computeConflict( m_newPt ); - }//end-if-conflict - - // redraw - updateGL(); - }//end-if-inspt - - // resize the trackball when moving a point - else if( m_curMode == MOVE && modifiers == Qt::SHIFT && m_isMoving ) { - float origR = m_fRadius; - m_fRadius += (event->delta()*1. / m_iStep ); // inc-/decrease by 0.1 per step - if( m_fRadius < 0.1 ) - m_fRadius = 0.1; - origR = m_fRadius / origR; - Point_3 pt = m_pScene->m_vhArray.at( m_vidMoving )->point(); - // note: QList::operator[] return a modifiable reference; - // while QList::at return a const reference -#if CGAL_VERSION_NR < 1030700000 - // move_point moves the point stored in v to p while preserving the Delaunay property - // it calls remove(v) followed by insert(p) and return the new handle - // it supposely faster when the point has not moved much - m_pScene->m_vhArray[m_vidMoving] = m_pScene->m_dt.move_if_no_collision( - m_pScene->m_vhArray.at( m_vidMoving ), - Point_3( pt.x()*origR, pt.y()*origR, pt.z()*origR ) ); -#else - // move_if_no_collision moves the point stored in v to pt - // if there is not already another vertex placed on pt, - // the triangulation is modified s.t. the new position of v is pt; - // otherwise, the vertex at point pt is returned. - Vertex_handle vh = m_pScene->m_dt.move_if_no_collision( - m_pScene->m_vhArray.at( m_vidMoving ), - Point_3( pt.x()*origR, pt.y()*origR, pt.z()*origR ) ); - int id1 = m_pScene->m_vhArray.indexOf( vh ); - int id2 = m_pScene->m_vhArray.indexOf( vh, m_vidMoving+1 ); - // remove the duplicate in vhArray - if( id1 != m_vidMoving ) - m_pScene->m_vhArray.removeAt( id1 ); - else if( id2 != -1 ) - m_pScene->m_vhArray.removeAt( id2 ); - m_pScene->m_vhArray[m_vidMoving] = vh; -#endif - - // redraw - updateGL(); - }//end-if-move - - else - QGLViewer::wheelEvent(event); -} - -void Viewer::keyPressEvent(QKeyEvent *event) -{ - // Get event modifiers key -#if QT_VERSION < 0x040000 - // Bug in Qt : use 0x0f00 instead of Qt::KeyButtonMask with Qt versions < 3.1 - const Qt::ButtonState modifiers = (Qt::ButtonState)(event->state() & Qt::KeyButtonMask); -#else - const Qt::KeyboardModifiers modifiers = event->modifiers(); -#endif - - /* Insert the newly inserted point as a vertex */ - if( m_curMode == INSERT_PT && m_hasNewPt - && ( event->key()==Qt::Key_Return || event->key()==Qt::Key_Enter ) - && modifiers==Qt::NoButton ) { - Facet& f = m_boundaryFacets.first(); // a boundary facet, i.e. a pair (cell_handle, i) - // insert_in_hole will create a new vertex by starring a hole - // i.e. delete all conflict cells, create a new vertex, - // and for each boundary facet, create a new cell with the new vertex - // it takes in an iterator range of conflict cells which specifies a hole - // and (begin, i) is a boundary facet that begin is one of the conflict cell - // but begin->neighbor(i) is not - // it returns the handle of the new vertex - m_pScene->m_vhArray.push_back( m_pScene->m_dt.insert_in_hole( m_newPt, // the point - m_conflictCells.begin(), // cell_begin - m_conflictCells.end(), // cell_end - f.first, // cell_handle begin - f.second ) ); // integer i - - m_hasNewPt = false; - // erase old conflict hole info - m_boundaryFacets.clear(); - m_conflictCells.clear(); - - // redraw - updateGL(); - }//end-if-insVertex - - /* Cancel the newly inserted point and its conflict region */ - else if( m_curMode == INSERT_PT && m_hasNewPt - && event->key()==Qt::Key_Escape && modifiers==Qt::NoButton ) { - m_hasNewPt = false; - // erase old conflict hole info - m_boundaryFacets.clear(); - m_conflictCells.clear(); - - // redraw - updateGL(); - }//end-if-escapeIns - - /* Delete selected points */ - else if( m_curMode == SELECT - && event->key()==Qt::Key_Delete && modifiers==Qt::NoButton ) { - // sort selected id's in descending order - qSort(m_vidSeled.begin(), m_vidSeled.end(), qGreater()); - for(QList::iterator vit=m_vidSeled.begin(); vitm_dt.remove( m_pScene->m_vhArray.takeAt( *vit ) ); - } - // clear the selection buffer - m_vidSeled.clear(); - - // redraw - updateGL(); - }//end-if-del - - /* Cancel the selection */ - else if( m_curMode == SELECT - && event->key()==Qt::Key_Escape && modifiers==Qt::NoButton ) { - // clear the selection buffer - for(QList::iterator iit=m_vidSeled.begin(); iitm_vhArray.at(*iit)->setSeled( false ); - } - m_vidSeled.clear(); - - // redraw - updateGL(); - }//end-if-escapeSel - - - /* Show/hide the trackball when drawing the empty sphere */ - else if( m_curMode == EMPTYSPH - && event->key()==Qt::Key_S && modifiers==Qt::NoButton ) { - m_showTrackball = !m_showTrackball; - // redraw - updateGL(); - }//end-if-showBall - - else - QGLViewer::keyPressEvent(event); -} - -/*************************************************************/ -/* Computation functions */ - -bool Viewer::computeIntersect( const QPoint & pos, Vec & pt ) -{ - Vec eye, dir; - // Compute eye position and direction to the clicked point, - // used to draw a representation of the intersecting line - camera()->convertClickToLine( pos, eye, dir ); - // Compute the intersection point with the sphere - // note that the center of the sphere is at the origin (0, 0, 0) - // thus, (1) pt = eye + t*dir and (2) dist( pt, origin ) = radius - // i.e. (x_eye + t*x_dir)^2 + (y_eye + t*y_dir)^2 + (z_eye + t*z_dir)^2 = r^2 - // --> t^2( dir*dir ) + 2t( eye*dir ) + eye*eye - r^2 = 0 - // where "dir*dir" is the dot product of vector dir - // we need to solve t and the smaller t (nearer to eye position) is what we want - float a = dir*dir; - float b = eye*dir; - float c = eye*eye - m_fRadius*m_fRadius; - float delta = b*b - a*c; - if( delta < 0 ) { - displayMessage( tr("Point is not on the sphere!") ); - return false; - } else { - float t = ( (-1.)*b - sqrt(delta) ) / a; - pt = eye + t*dir; - return true; - } -} - -void Viewer::computeConflict( Point_3 pt ) -{ - // find the cell that contains point p in its interior - m_cellContain = m_pScene->m_dt.locate( pt ); - // erase old conflict hole info - m_boundaryFacets.clear(); - m_conflictCells.clear(); - // show msg if point is outside the convex hull - if( m_pScene->m_dt.is_infinite( m_cellContain ) ) - displayMessage( tr("Note: point is outside the convex hull.") ); - // compute the conflict hole induced by point p - m_pScene->m_dt.find_conflicts( pt, // the point - m_cellContain, // starting cell that must be in conflict - std::back_inserter(m_boundaryFacets), // the facets on the boundary - std::back_inserter(m_conflictCells) ); // the cells in conflict -} - -/*************************************************************/ -/* Animation functions */ - -void Viewer::toggleIncremental(bool on) { - if( on ) { // play - if( m_incrementalPts.isEmpty() ) { - /* start play */ - if( m_pScene->m_dt.number_of_vertices() == 0 ) { - CGAL::Random_points_in_cube_3 pts_generator(1.0); - CGAL::copy_n( pts_generator, 100, std::back_inserter(m_incrementalPts) ); - } else { - for(QList::iterator vit = m_pScene->m_vhArray.begin(); - vit < m_pScene->m_vhArray.end(); ++vit) { - m_incrementalPts.push_back( (*vit)->point() ); - }//end-for - // erase existing vertices - initClean(); - }//end-if-pts - // sorts points in a way that improves space locality - CGAL::spatial_sort( m_incrementalPts.begin(), m_incrementalPts.end() ); - // set the current to "hightlight the new point" - m_curStep = INIT; - }/* else resume play */ - - // set up the timer - m_pTimer->start(1000); - } else { // pause - m_pTimer->stop(); - } - - // redraw - updateGL(); -} - -void Viewer::stopIncremental() { - if( !m_incrementalPts.isEmpty() ) { - // will call toggleIncremental to stop the timer - emit( stopIncAnimation() ); - - // insert the rest points - for(QList::iterator pit=m_incrementalPts.begin(); - pit < m_incrementalPts.end(); ++pit) { - Vertex_handle hint; - if( m_pScene->m_vhArray.isEmpty() ) { - hint = m_pScene->m_dt.insert( *pit ); - } else { - hint = m_pScene->m_vhArray.last(); - hint = m_pScene->m_dt.insert( *pit, hint ); - } - m_pScene->m_vhArray.push_back( hint ); - } - m_incrementalPts.clear(); - } - - // redraw - updateGL(); -} - -void Viewer::incremental_insert() { - Vertex_handle hint; - if( !m_incrementalPts.isEmpty() ) { - switch( m_curStep ) { - case INIT: // end of INIT: get the next-to-insert point - m_curIncPt = m_incrementalPts.at(0); - m_curStep = NEWPT; - break; - case NEWPT: // end of NEWPT: locate the cell containing the point - if( m_pScene->m_dt.is_valid() && m_pScene->m_dt.dimension() == 3 ) { - computeConflict( m_curIncPt ); - m_curStep = CELL; - } - else { - // popup the first point and insert it - m_curIncPt = m_incrementalPts.takeFirst(); - if( m_pScene->m_vhArray.isEmpty() ) { - hint = m_pScene->m_dt.insert( m_curIncPt ); - } - else { - hint = m_pScene->m_vhArray.last(); - hint = m_pScene->m_dt.insert( m_curIncPt, hint ); - } - m_pScene->m_vhArray.push_back( hint ); - m_curStep = INIT; - } - break; - case CELL: // end of CELL: compute the conflict region - m_curStep = CONFLICT; - break; - case CONFLICT: // end of CONFLICT: do the insertion and go back to INIT - // popup the first point and insert it - m_curIncPt = m_incrementalPts.takeFirst(); - if( m_pScene->m_vhArray.isEmpty() ) { - hint = m_pScene->m_dt.insert( m_curIncPt ); - } else { - hint = m_pScene->m_vhArray.last(); - hint = m_pScene->m_dt.insert( m_curIncPt, hint ); - } - m_pScene->m_vhArray.push_back( hint ); - m_curStep = INIT; - break; - }//end-of-switch - } else { - /* if finished, then start over */ - for(QList::iterator vit = m_pScene->m_vhArray.begin(); - vit < m_pScene->m_vhArray.end(); ++vit) { - m_incrementalPts.push_back( (*vit)->point() ); - }//end-for - // erase existing vertices - initClean(); - // set the current to "hightlight the new point" - m_curStep = INIT; - } - - // redraw - updateGL(); -} diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/Viewer.h b/Triangulation_3_copy_tds/demo/Triangulation_3/Viewer.h deleted file mode 100644 index ddf9151d646..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3/Viewer.h +++ /dev/null @@ -1,290 +0,0 @@ -#ifndef VIEWER_H -#define VIEWER_H - -#include "Scene.h" -#include -#include -#include -#include -#include "PreferenceDlg.h" - -#include -using namespace qglviewer; - -class MainWindow; - -class Viewer : public QGLViewer { - - Q_OBJECT - -public: - Viewer(QWidget* parent) - : QGLViewer(parent) - , m_showAxis(false) - , m_showVertex(true) - , m_showDEdge(true) - , m_showVEdge(false) - , m_showFacet(false) - , m_isFlat(false) - , m_fRadius(1.) - , m_curMode(NONE) - , m_selMode(NORMAL) - , m_isPress(false) - , m_isMoving(false) - , m_hasNewPt(false) - , m_nearestNb(NULL) - , m_hasEmptyS(false) - , m_showTrackball(true) - , m_pDlgPrefer(NULL) - {} - - enum Mode { NONE, INSERT_V, INSERT_PT, MOVE, SELECT, FINDNB, EMPTYSPH }; - -public: - inline void setScene(Scene* pScene) { m_pScene = pScene; } - - // set current mode - inline void setMode(Mode m) { - m_curMode = m; - m_isMoving = false; - m_hasEmptyS = false; - m_nearestNb = NULL; - updateGL(); - } - - // set selectBuffer size (if necessary) - inline void setSelBuffSize() { - // Default selectBuffer size is 4000 - // (i.e. 1000 objects in selection region, since each object pushes 4 values). - if( m_pScene->m_vhArray.size() > 900 ) - // The previous selectBuffer is deleted and a new one is created. - setSelectBufferSize( 4*(m_pScene->m_vhArray.size() + 100) ); - } - - void readSettings() { - // read from an .ini file - QSettings settings("settings.ini", QSettings::IniFormat); - // QVariant value ( const QString & key, const QVariant & defaultValue = QVariant() ) - // Because QVariant is part of the QtCore library, - // it cannot provide conversion functions to data types such as QColor and QImage, - // which are part of QtGui. - // In other words, there is no toColor(), toImage(), or toPixmap() functions in QVariant. - // Instead, use the QVariant::value() or the qVariantValue() template function - m_colorVertex = settings.value( "Show/vertexcolor", QColor(255, 150, 0) ).value(); -#if QT_VERSION >= 0x040600 - m_fSizeVertex = settings.value( "Show/vertexsize", 0.04f ).toFloat(); -#else - m_fSizeVertex = settings.value( "Show/vertexsize", 0.04f ).value(); -#endif - m_colorDEdge = settings.value( "Show/dedgecolor", QColor(0, 255, 0) ).value(); -#if QT_VERSION >= 0x040600 - m_fSizeDEdge = settings.value( "Show/dedgesize", 0.01f ).toFloat(); -#else - m_fSizeDEdge = settings.value( "Show/dedgesize", 0.01f ).value(); -#endif - m_colorVEdge = settings.value( "Show/vedgecolor", QColor(0, 0, 255) ).value(); -#if QT_VERSION >= 0x040600 - m_fSizeVEdge = settings.value( "Show/vedgesize", 0.01f ).toFloat(); -#else - m_fSizeVEdge = settings.value( "Show/vedgesize", 0.01f ).value(); -#endif - m_colorFacet = settings.value( "Show/facetcolor", - QColor(255, 255, 0, 96) ).value(); - m_colorTrackball = settings.value( "Show/ballcolor", - QColor(150, 150, 150, 128) ).value(); - m_iStep = settings.value( "Show/ballstep", 4000 ).toInt(); - m_colorEmptySphere = settings.value( "Show/spherecolor", - QColor(180, 50, 180, 64) ).value(); - } - - void writeSettings() { - // write to an .ini file - QSettings settings("settings.ini", QSettings::IniFormat); - // The inverse conversion (e.g., from QColor to QVariant) is automatic - // for all data types supported by QVariant, including GUI-related types - settings.setValue("Show/vertexcolor", m_colorVertex); - settings.setValue("Show/vertexsize", m_fSizeVertex); - settings.setValue("Show/dedgecolor", m_colorDEdge); - settings.setValue("Show/dedgesize", m_fSizeDEdge); - settings.setValue("Show/vedgecolor", m_colorVEdge); - settings.setValue("Show/vedgesize", m_fSizeVEdge); - settings.setValue("Show/facetcolor", m_colorFacet); - settings.setValue("Show/ballcolor", m_colorTrackball); - settings.setValue("Show/ballstep", m_iStep); - settings.setValue("Show/spherecolor", m_colorEmptySphere); - } - -public slots : - // clear scene - void clear() { - m_pScene->eraseOldData(); - m_hasNewPt = false; - m_boundaryFacets.clear(); - m_conflictCells.clear(); - m_vidSeled.clear(); - m_isMoving = false; - m_nearestNb = NULL; - m_hasEmptyS = false; - if( !m_incrementalPts.isEmpty() ) { - emit( stopIncAnimation() ); - m_incrementalPts.clear(); - } - } - - // play/pause incremental construction - void toggleIncremental(bool on); - // clean up old data and information - void initClean() { - m_pScene->eraseOldData(); - m_hasNewPt = false; - m_boundaryFacets.clear(); - m_conflictCells.clear(); - m_vidSeled.clear(); - m_isMoving = false; - m_nearestNb = NULL; - m_hasEmptyS = false; - } - // stop incremental construction - void stopIncremental(); - // incremental insert a vertex (invoked by Timer) - void incremental_insert(); - - // show options - inline void toggleShowAxis(bool flag) { m_showAxis = flag; updateGL(); } - inline void toggleShowVertex(bool flag) { m_showVertex = flag; updateGL(); } - inline void toggleShowDEdge(bool flag) { m_showDEdge = flag; updateGL(); } - inline void toggleShowVEdge(bool flag) { m_showVEdge = flag; updateGL(); } - inline void toggleShowFacet(bool flag) { m_showFacet = flag; updateGL(); } - inline void toggleFlat(bool flag) { m_isFlat = flag; updateGL(); } - - // set preferences - void setPreferences() { - if (!m_pDlgPrefer) { - m_pDlgPrefer = new PreferenceDlg(this); - m_pDlgPrefer->init( m_colorVertex, m_fSizeVertex, m_colorDEdge, m_fSizeDEdge, m_colorVEdge, m_fSizeVEdge, - m_colorFacet, m_colorTrackball, m_colorEmptySphere, m_iStep/40 ); // 5*8, 5 degrees of wheel - connect(m_pDlgPrefer, SIGNAL(applyChanges()), this, SLOT(acceptChanges()) ); - } - m_pDlgPrefer->show(); - m_pDlgPrefer->raise(); - m_pDlgPrefer->activateWindow(); - } - - void acceptChanges() { - m_colorVertex = m_pDlgPrefer->m_colorVertex; - m_fSizeVertex = m_pDlgPrefer->m_fSizeVertex; - m_colorDEdge = m_pDlgPrefer->m_colorDEdge; - m_fSizeDEdge = m_pDlgPrefer->m_fSizeDEdge; - m_colorVEdge = m_pDlgPrefer->m_colorVEdge; - m_fSizeVEdge = m_pDlgPrefer->m_fSizeVEdge; - m_colorFacet = m_pDlgPrefer->m_colorFacet; - m_colorTrackball = m_pDlgPrefer->m_colorTrackball; - m_iStep = m_pDlgPrefer->m_iStep*40; - m_colorEmptySphere = m_pDlgPrefer->m_colorEmptySphere; - // redraw - updateGL(); - } - - signals: - void stopIncAnimation(); - -// overloading QGLViewer virtual functions -protected: - // initialize Viewer OpenGL context - // Note: the default implement is empty and this is overloading. - void init(); - // draw points, segments, and polygons - void draw(); - - // customize selection process - void drawWithNames(); - void endSelection(const QPoint& point); - // customize mouse events - void mousePressEvent(QMouseEvent *event); - void mouseMoveEvent(QMouseEvent *event); - void mouseReleaseEvent(QMouseEvent *event); - void wheelEvent(QWheelEvent *event); - // customize key events - void keyPressEvent(QKeyEvent *event); - - // customize help message - QString helpString() const; - -private: - // draw a 3d effect vertex - void drawVertex(const Point_3& p, const QColor& clr, float r); - // draw a 3d effect edge - void drawEdge(const Point_3& from, const Point_3& to, const QColor& clr, float r); - // draw a facet - void drawFacet(const Triangle_3& t, const QColor& clr); - // draw a sphere with/without Axis - void drawSphere(float r, const QColor& clr, const Point_3& center=CGAL::ORIGIN); - - // test whether the give 3D point is on the sphere - inline bool isOnSphere( const Point_3 & pt ) { - return ( (pt.x()*pt.x() + pt.y()*pt.y() + pt.z()*pt.z()) == (m_fRadius*m_fRadius) ); - } - - // compute the intersection point with the sphere - bool computeIntersect( const QPoint & pos, Vec & pt ); - // compute the conflict region - void computeConflict( Point_3 pt ); - -private: - Scene* m_pScene; - // play timer - QTimer* m_pTimer; - Point_3 m_curIncPt; - QList m_incrementalPts; - enum Step { INIT, NEWPT, CELL, CONFLICT }; - Step m_curStep; - Cell_handle m_cellContain; - QList m_boundaryFacets; - QList m_conflictCells; - // show options - bool m_showAxis; - bool m_showVertex; - bool m_showDEdge; - bool m_showVEdge; - bool m_showFacet; - bool m_isFlat; - // trackball - float m_fRadius; - // mode - Mode m_curMode; - bool m_isPress; - bool m_isMoving; - // insert point - bool m_hasNewPt; - Point_3 m_newPt; - // select vertex - enum selectionMode { NORMAL, ADD }; - selectionMode m_selMode; - QRect m_rectSel; - QList m_vidSeled; - // move vertex/point - int m_vidMoving; - // nearest neighbor - Point_3 m_queryPt; - Vertex_handle m_nearestNb; - // empty sphere - bool m_hasEmptyS; - bool m_showTrackball; - Point_3 m_centerPt; - float m_fREmptyS; - // change colors - PreferenceDlg* m_pDlgPrefer; - float m_fSizeVertex; - float m_fSizeDEdge; - float m_fSizeVEdge; - QColor m_colorVertex; - QColor m_colorDEdge; - QColor m_colorVEdge; - QColor m_colorFacet; - QColor m_colorTrackball; - QColor m_colorEmptySphere; - // trackball resizing fineness - int m_iStep; -}; - -#endif diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/documentation/about.html b/Triangulation_3_copy_tds/demo/Triangulation_3/documentation/about.html deleted file mode 100644 index 4149acaf9d5..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3/documentation/about.html +++ /dev/null @@ -1,13 +0,0 @@ - - -

CGAL Triangulation_3 Demo

-

Copyright ©2010-2011
- INRIA Sophia Antipolis - Mediterranee

-

This application illustrates an interactive demo for 3D Delaunay Triangulation package - of CGAL.

-

See also the package manual:
- - 3D Triangulations -

- - diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/documentation/about_CGAL.html b/Triangulation_3_copy_tds/demo/Triangulation_3/documentation/about_CGAL.html deleted file mode 100644 index b8a610ce41e..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3/documentation/about_CGAL.html +++ /dev/null @@ -1,7 +0,0 @@ - - -

Computational Geometry Algorithms Library

-

CGAL provides efficient and reliable geometric algorithms in the form of a C++ library.

-

For more information visit www.cgal.org.

- - diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/icons/about_CGAL.html b/Triangulation_3_copy_tds/demo/Triangulation_3/icons/about_CGAL.html deleted file mode 100644 index d87503a3469..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3/icons/about_CGAL.html +++ /dev/null @@ -1,8 +0,0 @@ - - -

-

Computational Geometry Algorithms Library

-

CGAL provides efficient and reliable geometric algorithms in the form of a C++ library.

-

For more information visit www.cgal.org

- - diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/icons/cgal_logo.xpm b/Triangulation_3_copy_tds/demo/Triangulation_3/icons/cgal_logo.xpm deleted file mode 100644 index 6a69b3d67e1..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3/icons/cgal_logo.xpm +++ /dev/null @@ -1,24 +0,0 @@ -/* XPM */ -const char * demoicon_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 16 3 1", -" c None", -". c #FFFF00", -"+ c #000000", -/* pixels */ -"................", -"...++++...++++..", -"..+....+.+....+.", -"..+......+......", -"..+......+..+++.", -"..+......+....+.", -"..+....+.+....+.", -"...++++...++++..", -"................", -"...++++...+.....", -"..+....+..+.....", -"..+....+..+.....", -"..++++++..+.....", -"..+....+..+.....", -"..+....+..+++++.", -"................"}; diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/icons/clear.jpeg b/Triangulation_3_copy_tds/demo/Triangulation_3/icons/clear.jpeg deleted file mode 100644 index af5d1221412881e8727fe26930e5d0b5b0633aae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 768 zcmV+b1ONPqP)R27cmB`+Wkx8a_@65j^u^siVQp>_ zPwn8;)Y0kK7)l|lBE%wFmC-v$eL~)Yfy# z^Ob>gz1owlwa4nuL@ZOXxYpY|_=&3meg}r2l-hGYxpQ6xt+akF&AwE-Rj{%5WonE%=bMnbMjE6fFxi8F4En`*+~J=7Qars`&=Io zhuwOigX}AaoB2WbpNI;Z{V^LaLk(JDtl#%qy z0f>Sm3j{{aCY8&CEXN`MM|ZE8%R+uhohP>-UnM8m)ey5NDv83-9qxc}B#Vq3KoHKA zr9$dh3?K|tQxUGnzF?FXfupNPBJcqpK@|`Kj_Uz9$Li`v=>Q=x&=v?xE!YNlY%Pp2 z`(c97k@x;0y2r zSkx79I6z~aP_V?vz+;97?mOd?a$#bTcUmw3OasdW&9Ju0FEPu=Z0000kRL<7X#>~{n+`^QRlZ%U$m6aEWG$n*2 zG)V^k4=@OFFhny%GczhNFbOg;3o`yc!XN{5CL;qAGtikZz|O|P%E-jb0hF~6U|?cm zVqjrmVrS(9%QG@DFtZ4gZVEkftdG*K3?LY5GUAw3@TWd%5?UyCOe*oQ zID0nj9n+gd*V?~3+P|FI!O_vsF`ws)Zg6Aaf~mO?Op^nzU%Sj?UG-h+E%SR}?h|v) zPd=h2SGq4^wb(WeL5FiXXZDLM>Fql2ajCaFdE-md88yXHzvWhKTD9#~XLO)WSk;L) zjsax~#fy~KxqCizZO+&%_f$7@Rp0?Dt3N!)ir=eU_viE8$baZb!K~gJef$L-d;NN9 z4>Q!(o`00el>8^=)TbSKiTAcgtpEI~G`8jp&v(w}a>=I_?SB1W$Jy8wI?f+uZM~|S zFU2Q+owM<{<=owM$By_P-Q>vpg@5O!r#a4ke7f$}_GD$-&$`C=pCR*>!@RmH&+0$j z;eT%bZ~5NJJLm4-*-=#Yb=%zk3{0s^3JLqPXYN1r;rz4M{|v?bQ|6p5+GJ9bcA#HfnxcfO^-gzdb8GM)g0}wq4Bw^<|p1Llikg!eEjL1-P)(l z-iiO(bS*@-?{C|7`{0w$^?#W5x`pnH)c?5V`^{R>4OdORnundO zJ#7A{x=eOK%^#^pG0|#mn=SvG$z?s3Exhcv>8pFq+3Sn%Ow{yCpoVj-<3pgWXeItM}YC<~c$?ZzjfDeLB~W(^HbaL@X1;Hz0r}7oCz)X%uaXL^^5CUA{ zi;3Xk;(QVldx=Yk#Nse8+haL%S#=P4h*DfeYA`jI3h#aZsEUYemNpd?p(rARu0Nm3 z`&EJ)_cdcF<8+>a#srdkzl3WOIdVZ%zI@I572BQNn>FOx=05L2+{}H}rai4{vCpB8 z+QO3s#U|F+dwKAzn`)!tBDayGIjPgD+GmobpzXS&Zn3WqLfA_PUVOGBXC$aCWaZhG z@-srR-+W(ka`|p${?J5ayIQKO`N-_X821EztNhPK!4kABtSwKmTA)MreKP0I4sX>@k$bbq;x=O8La_mN}CL02~IlFFTyN!+6d5+`WacD zrZDB^V(p9s`j1l$;^Jzgi2eJ&#eMSk2R*7U4!i|G=RsP|3f=_P;yX-M=fFOpZ=PH) zwO$5E>-I)QdDa8R6w^KQkVG^F2o5(UR22DBH#O#kPn^_-M+Z>p!kbTZ7B6bkSn!+D z10;xt(5|%gmYqkslo19~IrQIQmzH6{E6%nH0*#p-7WD%T;ZulC(k6rM4W@?}O z%VV`zg|@PUq47*EiEU4;Qg4|smuPH|e4CXdm5GHXrm&dUd*#0l>3l4w6eFQ`dLc39 zhC;;6p|YHDSry6b@EtwOC?bIEGOe5|zLqXYkMP=rfPgCUuJ+=M4Yl3Hbl&F`y98mS z_uNbU(Z;Cl5)Xh6A4{@l$LZ#LNU)W++13K&jEk_IOT8ZTI~NROl)o~hw?Lj5)G_}+ zs>T=cwUc}@r*}ZCA2V%*iYE@U#x@+9CO;uVv34#rEB;HJ`QE&%0L1)bYgM|I&+y`= z_W_XgF;0?p+d^R4jRH~q)h!(|+~5Ft-h%>B?K3WctT66BPWz3HzdjI(F399{U^&Yj zePxM)K-l>8Pl8>GpJip^sxFV##P#Y;opGi5Z|m2|E*(b*rmeSA=f`-*ej_<4nXPk# zT?OGi0KC#x7#y)Ojic3i4lZK&L3&md-BKjXMlX^Zg|B%|<@Q7>9UMgp1woV4UahF9Q^)v!Y{5=qf%|0)?iEVJ{F51M8 zf|;Y^%6UA89ypM^MEW>|I33i*>)kN^GtO+- zNIe3LKL%}F(*uB@GhZQ=#FWu%o_Hw6!&T>-@tx??2SBsp(bvlZT`|p|&dZZ67N}@r z-|8cT)rZstn&w1So!d`o%1+v%74~!UEVYUpG>e#>gY!o;OBR^OwgwqE27&}?lAlID zFWw+vL6>FlDYpM<2eK2{XtS!7abNO`8}*6(e%+?qj?WnHYHb>HV-(|`1wm6!B?vhv zY~7(-a6fitd$jkWCq3zCciqOZ~8icuRjc8eZfp7>xwuF_=xp`SdU#v zK)ApK`Kw1R7de*HCnY-zEbuUpSz$3d`*KbDj8k#7V^;yZef*{Q5Ql6}eO~fobV~q6pQio`g`5jLj7ky7B z8}}?Y(A|VDX)U|>CaP?~g=HzyZe&s@9J|O~ZG%j1w4TSFH@K|5ljP<3HvcW|1Ay$! z-rk)}?tP+oQAxd_?%6Ju$LS$)@y9>Z!xV5b|E0^FRI0wP87vJli2lsPOj7cyFm``L zKbPy)maF9bJE+-!u-yVeZn!w+70~MW1OO7R6g$0zl#UE))8*I4#%sSCtc;?Ym&lyE zDXvy9qS3H<0HBi$#E`jx6cuxJ@`u&#w93kNqI{@R0;~Dvb{VffMn88Hguq(Ae0czv zQknIm*>jUiwth_)6YF#NujqbcHH9BFkF3W3F%hOPyiY!De##fbI1w3Z}@eS% zQGAc^Tez;L_Nvqwx#yS0_8(@Yu?_1<`j~ zv~RZdZ!*D2Ok=mJ4HM&!KSoq zWa%^f1qn|&S2iMbbuWShMl9MK=cdlsXlElav$;ffuy{q%hOq)8lI~tjNTwQ*A71=Q}?ypWL{nP$?A|%84@laPb3NK6vL^z zb>XmcnB3jb-GHX8ai%A)=C1KM__R&l@O{iNPpFRUoELO6?q#rw9Wd+XQ>b+sj%kVe z`~^BALqkEWGcst#y2=v7RTHFY3pR?;RT?uJYKfdI9<7rJhHC zVd((9{Y{X$h-qTLO?HV(1y(ys$Tr{El34;DD^3pssCe;7TZfONb`7q*wLwKt1d<5{HkU_oB;p9s7Uc9V7N7 zzBfqJ^D=d!@Yq=?C}qg}y@SARUf9a2#bbKoAnUY5s}eEk&Ir(0TA@TK0ou7*0;`s| z7G4yI46TaR?aYBsHV+*S(2SdEc$6(H_DL~e{uhGC*&ia1itVXP=dsXYk6x+%l_wS| zEA_K11nt#bgnLDk;D$ndv8@)>fj1~+z0GK-tW>*z_=~m%n1?28X;kVr4 z0ugS!?T>(Rez7yg%rSgE-e7HFmJs8rAAgx>@>>3=KzM@hPWT-DrM0N5> zZ4|~?xXNy77k07jDfJspPsjA67V!GXLO66$3o;{DMV{!~*C&H(ch1icYs)<`-?X#W z*{$`s&hH5T8`MR7Bc_6^qtYVwySCo#)O_m~i!+~<(vPYAc+S=BRXL=Z^LkL^ra;kp@D#!md*FhtEX;F8Hd$2^2gBAw;_!$o<>f)yugbD$ zP=IkP$qX&KuTS7r2jh4+>1I4)HO3}Pxm-AZOW%;|jnn)&n=(}Nc3r5zYbg=(9`@$7 z^$TbAQl6-NG~;Af+$I6Tsz3^H?gDF{BHm~l7$y7O2?>evED<@?$SRni_g|$}b!-=3 z$b_e_>QwK*+rP`|zso7J(!bFw#Pgr%<=EY$8T^kj+qkK@JOgg-k|5C=u3(J#7@07c zjw;0H|+rFauG4;BpcDhU9Y_Pe?ojA$22k$ZkDDi$uN^(Ih5AQzcuAHtGmcJEmL$(8o>>5=f{s+>1 zFoN~=oR#>xgKVGtk_3F5hB-@P`**&8w2c4oWUmJ?x(X`GtYyXokoJd#F9)b41h2(^ zW*B(Rw_Ois(Gk~9zQ=N6*W+-^9Q9tGAum@aS0_Ix4#cue`eqfj051|apt^u$MNZM{ z`n>O+t(GI+l;LP*D1&!mkYnz@Dju?pyqi^3bXx5eeGw zM2-hNAJV%t4mhk`uRF0@TGoZQzN`+8pCrxy_I2=SL|< zgG%|c7~b-KI){fxSs%)2n>}ys)sTSiKwsz_22;#6na+MHy^lc_n8v8O=(1w_ zO(96XDMX?Yr^3hB^Dr)bf#WY^4k##X>+SU))JNHf) z|5(4ye-ygF7-wXeKelzuNdj+iF|8#l^tkb31dI|G8|f*8!(pezLK6sRC1I3@b{N=|O^-Fb0qscH5T_bCO#()Oz0_Wrl5DHAGhQ5 zwH0>u$gM1$cj_)=pI^g#fh&%HCdDOKHFl|$$=q>ez&$Z0`KG!7&8*ggnKnd&CBp>f{r8W zV6SfSj$Oq-9lp&s7Zh6Klr_86X#;MZ-s87a;@_?~JDQEL4bOAiipfriJ+X@{6H#0Y z!oUKv$t>fwE)a~M1q;L+buY;UhdCzXRK(MHU+O&M!QAYeAaJebFeVLr)_?qmWAyvL zIATuj(9P;7I(IrU0_6%tbd0tQL0B|iQ0g)>$1dWoalG@8x80L_=D`)R0sUTb*(!=r zFXPNwR;m1RVNI)#MQv+sQXf6251P-_N1fy?f9mOpMeQXgk7ky;FS)HEygJiOAHt3k zR^wTK001f$`-Hdm)|(SoYI_JK)L^YjEk!`0_N?b%a3hRAo=@ z`JCb=->TqFWNb#eshYfDC5PkiyplPG7T0m@uxk)k>prbntGXykPft3>@w6y@R06A0 zN=gb%`4E%;6w1XsJ!jehaRcSFV(_dqnAZ)9%HtFjn({fP?-@AAFX&{hJ7Rx`yh+zO zO^S0cG?>Iwb?6SHyZXymT<$Q%*oqcdeS`qs;R&zJYeAiH8%W<1th)Z=QPm@U*p*P!ej{kg{Le|!P;1==3?F};BQ8`t>&v=?d-)y? zWE^fQ2L0u9xwdkJ1nC^y@v_RnRkP}q5|={h@m$HIDvOhNTvkyt{ZBEQ5~vN3%*-*7 zy%l2n073~aEY?MZirF~mIA{7QxG^DoP#U~(*h6hYIs|a^ z&!V90gg8iqK|`uA0AZ?fa&jODEX&YA+~&r;4M5o{H(yNy z(JFgf>OkCSAcJiE49VTAR-T_P<5xoE8><4cWqai)>FdX-@gs9`1}gw0C7#Uav9}Tq zgP0(cA&B+Vnt=rX1HgzT5*v5+s*Hr9|I1cGl2^hhh7H`)MompQn=6#e!am)N4bZA` z0P~=;CUql8v40R#KlG5nCxODY{S^_eHBT4$mh33)9PFdRahyG0!uSRoRU8` zu8r-A@K)m*BtzcU^)hc!9Us3-SjvJA64*b7yr@sJFA7;szH1vbt>fwYn`G zWl%Ca56_J-Y|nsd=;llC1RrvQUr%9B@9Mm^*eUA%1hk5+9<43ahqk(GmPl*pB;-6R z>Us_7aSliiOm;mk8d=8ECKHI$=w@QFUl3JP(rsg~4C$H0h|&&e^xCd@=Kcc57AxkX z`q<~Vb858l9`~aZELVt_r`1bcsm@=q=}T048z#>~GqJDHSbH*tjm_)nsd7kzE_>@y zbJ9M1-%~3nKvt@kw6bXV;Q}GE=93~LAf3cMszBU57#eA18TWKXkxy?u$0CLzEnyMJ z%#mZmQ|Z)wMh|RPRA+n5w!UrFe2NL$zGj*%5T3Tpp6`>x{Q9MQyhSDQ1qJ@Db+D+P zfb1b4Yx!r!he9V|K8^-ya!(ifr@Jqm<*h#t5uL&Ybxk6wQG<>|0KAnoItxi^r{O%A2 zCPmd+DgI}<4}j;c7>8T5=$fpBi*O-&{oyYL63E+eHWat-b-*yx^BGI z0W_S%aW>Bkr?g(G{M9e6h>*xGJotLerLSAmTUXhU|O%y@Xi=(j(hjRUApRHRZE3MkvE{4bZ5|9eW zIS(E=z)!W+qGWx~&+EP>?^Ji-K_v+S)rt+!q)U}g%tET!8SbcI0t;yGPM3<*Z7V^t zDNpbX`h|CN9C#KBQk|o1fQtu6%w`7!YH!8FJ8vEv|8#>)!QygVSEm;&q+Vg|ny=mickq4qZ zf5%n1BRJ=zdclwL1dJxd;J;^bG^b5%J2*sy{82>?M6gVmKo<>!-ha5}Iz<@JD#xDb zv$l8hCw|P-_z5Ew1J+LZzKAIItG~p(*ChXfWx`*uynX<@(f3g9#%blSkHhe{m37(X z-M9akNFzIj3(ARamvb6^b4@ku(`?##a2tx?jRW&-Jg^PM)DB2*t^3N|7_~15gi>eg zj9pbjBC@bB$5--JWg1ZucPK}+>CN67*c4_bKyI==_#Z1&*E(|}O_V3O(%%%4yUIGK zN|E+TEIv;SuDZL1`z=}4FEJ9n7kgbsqq37*L^h~eE7&Pcx6>fK;QezOO%Y=cMylP3 z0XxUW!O!p&XD}Iw=Jb7Co?bcQnP23nF^=bD-uSFL@N1T+aeCl4E%sc<1Z+$Wnp1yZWn z^lffS9lQ<+CBWC5X=c*W&gYG!`U9d2WygPm$SJr)T`R*ZZXsutg?zrNS6i7>i+pI@ z4s=f1)fd;7yeXKWm8S<%lzU203&w6ikO)RjE5W`7JHi0~!;G8i|1?-=F zy>_2D9i!XF%ftFjTR>EooV??sJ60eMFz1VVN=i+}`VEp6pp+2lJ!dr`Vyl%7@n?%L zTB&_`qMv+dnj=Y-vmX`5x|cb~vo@Wykb@An$mzM5Ju`B69eT{YQqJtsPMw&ZD3zN< z`~#ObKFpiRuW0~kqEy{wHVU4&g!0N5Q&;A{GFx0oNRk32<;$mp(jd0_v4Is=ZN8>*n|SZv~d|#l$)CnW3z~p+7f2&t^sL z33+7s6x4>vJ6K{7e`2hugT63r|9M*H5Qxz|V&q^N{SK|j<)j|c1eX~vPM;@V;7N6Y z*xJ3-@gQ`6CW@Cm!L2sY4Gx{_t`YUaNM!U4G1R~8{q-DLt&vfsr31Ur!T2m>X@5Z{ zy=-!9BlI*Hv1<9XCKHT((DNt`X92ugqt-;FpTzu&N40HSW`FR7_0+-Z$sv)uR=QeV ziLd8JL@vStNqMCAKQj`97oF3i2r!8#7xN7Y}_xGom?}=)E*@(J&j=N}$Hz znt6&P;b4opOm3vH2o7;u8v7Y*;Fw2KO)LgcdxVM;&$?jF_b0ZlB&k$`c5mHM9JQpO zn3Nn;LLD9FmN~qt_PQ2Hni&IrYgfYOC!HHQQ&LJ(?QNKhm8IrEecFt6PK$coaeK=) zE*7Brr{iu|?5FwIZSj{3?g;?6v9<7^m%)=o&Ty>-Eh0k9h}zmV?!j+O(d6vjE$>Lf z7N}LC-j2sOSWq9(>T{yWXtUbnY~hu=b}?;|1Vwb#VK?Ck{>$A>DcNcJ@Ndfk z!=F`{D6B48-+&wZ`oA@NR*eY>{j&4O<{=@UUXw_;lUVLlae;|9g^v3TQ$3Q8V9vVw zI;tu~abVWfeRn4N#V2J?CFG}g>Lx09PudJfU3y8@Wx(634ZBE9>ToxF_^pO8aYav> zh}|lO`s3*S%i|#XZ_;0)$)Tfzy6QF^C;sFmV%B&7;I#W5#^1g2@yu%%$FL%1zLC!O zVYlFpMHWSy=e42Ic3vx*Y&$J?i8Nq9?UArf=767;BLS7CcE{nNk1`G@`0C~GOlUGj zUoX8x>gUsw0MAWouqcHP-O`O)QbGS<*Occ{Gi2!?&r?WCntDk={sG`3&I0WI^nx`| z(0tn%E$h_N?&beR;Bmlm4x8zht$|<4HQs8s9x<1R*$Qdp7q2I1HUMK zRgxGvq692AlCbqTZTiy9H5Yg{_Lt}`?XHGcnsTpXEkKvG@f5j94tJg=u!M0ziKKQ@ zEUYDJxVNoAjqwKc*8)NHuluvX$?7CDeC#2lYWHe>KwctI;4Ev4P_I^kREpWBriRu< z1zK+e*n0w1FiBeqpF}DglpPIhJExZ_@md;(%*2LFe1o!4WX*y(9hZEAYAi@G(@o1mG zw}5RrDm;=foJn@Sq-{V7jFw+<;;`IirS2_nB9Gp-SfDMrG3x<%1DZ4Yr)~J?Vd$Di zyh+hG#%x$3H6Qn z!2L6WGpOB%b;YojI!nXQ$f0lhD23H24bse{o#%5E4gV9Bi3t%61`_j5ylSVz*F1=y zn0+N?jQ8Ic3kB7r?QqtbhV~F*1SIt)D5tSsD=eIA?{BK)=YIo{UXud5!|OU{0QK(0 z0t5nqq0Uk3Vr>wr=6=bn8K>e%LA+O@b4&&ZMLeU*NUj`v&bimofFxhT0YANIP-yxVm)RqRNuI9-t^^R&ago|j7U9~x!;^_ao4zpTX!U4ysB=dSC% z1gnLV<=2trRXUJEZ+5XN45v!g2XSr8H2MFkfa7?o7U%DJ53}kIqgY19+~0YmJ^e9w zQH=8p^I#c^ba0-&FoQDB;xVuPJpp^9PRiw?^e8hzneL`wZ5;%1@5WsSZrJv#oJ<0M z0ejm6;6x>LG@s;ME^^A|=g~a>M^=fF=sXet%wd zbmjjd1|1j*tOvhbVD3nsR<^*g?O9t+sDznAsmS|3`@VYsAU3wgFFa3xo)GWQKxT(g zMYYd`$KGy}n_hU2YlA;Q&IXPRbCac+hN&Yk?UZ?^b2H2cH8mCzIbk<`zhk14Qd2Kl^Zkszt-74BM3smbq06vFN0DW6iE{fu4koE#r zK+UYbo??5&k>%EB8~YHx_Og7m#cnnY17DEi0pJhb*QVC}$(WXK7~vc6nJmBij`7{q z_%Gz8D#3sDR!c?2^v1PF~^qV|! zm^|Z>D(MPJiII-E$jRYGrRAjn(G)}eAp^^4ww)UaJ4$R1i%u<9u zH}x_QuW&K8G<3FUWNkluMLp6h%0z3=<;A2g_#%st8T@8|R6`^WPY zN+~|cy!}H_Tu~a@KD%tm_m%7DBeBj`kG8vQU){vgw8h}2SJgOx_Wy$a@FNi_DPZfe z`nBJwsC#Z*QE@GJoQ`tuDa(UlIM}E5i50 zBA$rOU%pfGhYOm1CieM!Vph$nt*?~TY^loi`LXV`5}%pm#t@`))-rF!=crz=2waH* z;&%?&t(Tk+00|(JQV1c$vDa8QD>{33#j+hQ&7QY9D6ARciDBIrh-i^WiBC;mWoDv} z!6`vsx{B(RFHl;wgmA7OUDr{{iz~czzq@99`0t%p{lXW}qVfl#^_OC$#}{5(QTOzo zk_Fo%L2DS5x`{{AAP_~_I{M52cSceSW=aW^ZDx7>212EvwFb$?inmyRDnA3U(o1R+5=&d7U!}&E2ZTB0{=@8pPcNL+3uBftDi44tm{OIN(koEl8E)va^lqVyXUj5-2)s2 zuHBC#0hkYqo2M57N?UsXwh`2YX_07*qo IM6N<$f-Pt`I{*Lx diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/icons/fileSave.png b/Triangulation_3_copy_tds/demo/Triangulation_3/icons/fileSave.png deleted file mode 100644 index 8feec99bee8685290ec292e7baeb2e23ba4bdf0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1205 zcmV;m1WNmfP)NMq!WhGU zDb0?ir%%5E<_$1MjY0D7B#lW{;<)?El`Cg|1R~9@%$x6h^uLpO_>ug@xmmgJ*No_P znnEHG0)+hmDMa6YiFRG4o_LlgUp&G194;$ z#|Q7e%Hu~Tky2s+BT^*7)&c<-q*B=0DRAb}Cf_b=^dCQH;0Q1UG+z@p-S0s>z(fLJdaXofa#Y{a{XE!DHR|93_w4?hG<8kq+lom3=aj}y`daH}yY*TMGX*PU}a?k^Z$mMe=dBBKr3MP(B@#**TcTpzBa|A=h93v%QS-kjptJB{4u^z@&y0LCI4T6TSa45CS|$;yRAqEsIM__GKF%A16&yfb3{?Ev3O= zWp`NK(`0awX_vDHsHDgM8ZYP2344@ECC0|a7#$t8fc=zn6g_`~Gzu^#jRElxKudw6 z9$4;tmaREZLZad}%d_8@%6e3-*Khp}bb(|KKnidjfs}wT93TtVTG{6kY+YmJ^6l=8 z>lZ#>U;q0&umyDY?jo%iDv^z46gTJE4_y{w-(;l(uB)>!J7T{u)|M^Y%M$(Q0;0yWQjJ)lC|WuBldAVWm>@ zYqi>@@7LCS|K4h~T3%gTynM%)v;o`!%0SCx>I0b8{Dmvcx$`r{^6IAfuzWTu7V=>n zht*cAvEloba;37qRxV#(t5)yUfG*GhflRd$wsDcfR`M{f{>xbi>|uW%=st z#`gB=U1QP^==3?TwFS`Yb4+F%ysJLI!or#FfIoo|Kmay)=NJKTf0)V094!6;(N7PE TmU#bB00000NkvXXu0mjf&~!wG diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/icons/flat.png b/Triangulation_3_copy_tds/demo/Triangulation_3/icons/flat.png deleted file mode 100644 index e48d6fc39a477a6c79f9504e74862aff593b9781..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2326 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 Oh!wm%R8X;0oc$NfI;DmH diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/icons/grid.jpeg b/Triangulation_3_copy_tds/demo/Triangulation_3/icons/grid.jpeg deleted file mode 100644 index 3df03a6a79048c3ccb8d55475d6f2f02068c4eb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 798 zcmex=~;k+`^QRlZ%U&n^%&LPtsIH zM8y;gG$E8egfcZX0Wl0TO-#*9O`&q8I$B^^&Ho1&1UVQK7!;Tpl^B==8JPtc{~uwH zU|?VdITQg{SlO5vfHL|53`~s7Ow8;|>`-||CT12^K_Nv3VM7s7C1oSWK(>RbiG__5 zAAV2)Y7l1x8ig=~A?-XW(YlBwUu$l@wIJAT5^ zC0A-A@36k!cDwpRh{@JTw^TBoHzt`!nyhy4X1>iIye7T&SIO6K;RB%AZ%L4N-k>}9l;E?W2Qx7e(%gvI_kQe~<&?XMr-&-qik zBlpX_Ougw*QMx{Xx{LC$7 ztNpKYH~CfN{w+AFdu8uq^9QTKr_At+iO&1|_1N!vnZjRb+l-Zh;R?rl?=>yz_C5SoT^||BULluI}w@mWnOfjC0bxnBTvt;8qoK_0fEhnYs4LvmGv* zHqJ6JY`GLZQ;o0Wc>y1{U}KN5*6YxQn14%~mfbZu?dz;jnQf~ZsPrZzIj1zZM+0(QR8&+z zBIO6z!vUT;2&bC>U}y-)0sz1W&{7Ejbd)P9N`X=d|9P!Tbp)XK_IGLk2yp^vfB()! z%6b2wJnh>(-_O*~sQ>r|)tP5Be_m7WrPMkBXam$#RQtcwlwZn0Lr1fJ(9_b=&@s?6 zFfh>5(=#x#FflMPGt$#Du`w~Tu&}bSGBB~Rv$3*ME?M>;vVSklw|nVW80i^V{@2G| z6TrntX~!8FDsh0Ci;9MeYOf7|Pc+x-Z}mASFc?+GBzK+&z8Xg&aH#UyL&(3}L z_-TG&k@)$``o`uK_;q`~UsM3i_ip{!v!D9KMd=qcy@IRv27m(2LXD?sI*Ex&-}%@e`~yQ=T$ zUix4iCKRwur@$K)#_5ij%BqlxD646`-E`$1I~=suLo8T;bUsfs)&J0pLUA6qN@jb^ z`+XI$9*87|HE!P=j zS}c$yUSNmh6(x?tT|ExGW}QdK&Nl@!^o0ZE(UO;5Y0I$&vTJ3PaG~E#l1_Ns-8lrl zxCT0R`>=7pCJzzXa&~eqBy^6&k9V6}Be!6cf2byo+I3c_lvSFX#J(WVjKvHJF&w$F_CswkcpwY7KhpB>Pjp)zu5 zf{JnP+(25?5{{-JdxJ$8>$LG-N1u@Naw_2-p^QB*@5(X z8df{xBfa1eg$Ir9kWeU1^81MwhMCqGZ8^IcqE+sC6^08|{Z@)Qrs#IX*_a@dqIImY zqHuHe`^K%JjZ-dBDwlSIYYX_c)5ABzfg|bRz~|{uOxact@-9A)WPqFBP^1OBXX)Ww zpw;|B&4W45or`_8^_RzvW;}(B6~b25qF^*2QTJ&!=>~yh{rPJ~Xa$<9C9T}F8$YnT zA(fu^Zk>gN+v>dz;JeiVACGB<2w|PpOBh|~C)yI7K3XBr*Q(+TM{XtU47{6^y}*5v z`gE4Cppi|FADg>1Ka>VMHQNzShiUI+Ur5HAHl{eq6Y(Eg;9r+q@4QT$g6l;kgcSL1 zk!1FOa5NnXeQ!!7rej>$Qsd-ob!MEW^{V;OT?q@tkwv*m$=wYes+A$*D934v1FTz` zO`qFMU$3V)KsChyc!=WZPD$mW)Z>e>C(JIG?7n*was1Vr^B3jDxY|O6lmty~aJn-- zqx%^R|L*fFR1@h^3bGJZ13Zi?tB2O4l23`qov&!F9Vz*6>eq^UqAagSH%Ph9Q$x?* z1P+$0$PwXY>Xk`^(V6Sr&9iF)XFdzB$)8W-8{`dy=bz6B?1m@Ny0*oa&++J=-$FBy z`5YVRpdt%a{2=<)$hc7~M*^phl7ZX-(+`QdUo#W+9Af8gy{LV0K>u*H_5YSN0ZR9n zk5DWvev{aD6gxde(>Z`ZNk9vpFGS(lRF4m@DQ}rC-O*%99?=jTULcE%t{{zZJ8W0A z9~;`|nRj}*i7iOpexA_Csg<{OD}AW&V^w3+;Xs_wNeP<-F9}+%c`cPWSSj1`G~pGQ zb3jE#)V!Bo?=Frd$s@_hv*4-c$juG;TU!nd%UjPl?0y(;>Pl?-7#O4fvXsb{h24#s zyD76$Y-?(p%0Xu-z}d9T6;7<$jS6YibHR*pxBKO^sxjQ@H-fFeSkI$tJgZGu>^IBf zhSKInEBjB2O6&n_aepBXgK~)gOsj>vhgmbk&5fW{1)H7~W6b zfP`3c*PSH#xAeJSm^W4=+Wa)%p7p75o%FeMT*TP#fExQgY_K01xzKid06n*Z)0caK=Gv{iZ6Nju49;-KaRFlI(@VR{jY!XrO}-MlYL(j zyDxSnDzf0%$9tO0;YXfP|I5NW{mmi+B^k|qY_T9lx>vj zQ5tp&r6rF+_>YoUaxf=wA%TjVV1w637}ugq<+*ixO(Dhx{oA$2KNr2#dU<_|aO~JG z)ZgrG-}ab^=&=a03_NmL7G9dF>v;6R~`ouw-e6&^y!fyy9xzmloIF%72-ox#?$Q_1=_b;utY zst%~M1l-Q3v%}P-7dh?$m6i9OFIH~DS46U0AWYcWr?kgPLWlVc>L2|^haI-PS@F26 zo?4|NFyE6BH;CNzE^V)mV z5Sgkz0v;1ggasv9x}ERbT23vD+I3UoXB> z5Mv1Z3=@RO9&xbc5)4*b9wr#=0l4D$e3w0dXVn!84@D_IRV3*J&|f%Sp2zuaeD#B? zYi#7*pun~+IkwN$Vj{*Z=!eOQ&F~OEY5+v4<#!+#KiCH%XEXnYcJy19hEq&pcB^?dN?^v=k3YEj2;x$x(;)unFvRFqh& zx8v)mX7*|M{_Fx0#)Y}wSJ8?WQ9nLn&~tKxJjrq9CN_ql>=}nedLHO+g(Y6RZS=;~6(1B=~6b z)7&?D@CqJLOMLWQks%N19hHZ>SYpl$T2y?nVmfk4G@@wav3P%-KJ#{cVX^$0aGt`! z%KE^zj{2H#;LG%bMyy&O^u!XklPK@-cyHTC*gjW`D&sGV+@f&B)I!$a1%)eDh3#bD zoGdw0498D5l`xQe`k$A9wYc{uEQ9+=6UHwiwlKoJM7w#ITDG1jMRE#q(euFIVcyychv^l`Duq|jz) zIlFR5LjT!I-Efn4_Le5U25K@&UaPpo5RGaw9#mV7n%R}U8vCJ+aLZVfv&QG7Pty77 zBtvgE_gk+W8a$@zqwB0UZ73?pcox#p%hdQ<1QVV*4Aq^GAul;yDK+=n;Bz;NpG@8yKSI-n#$_U%2>uiyuXfLk`#X4yEL{vJ z;E^AOPPi=I~2XNwa7G)miriT`>iB) z%ZLRtKB8i!gQyb-KgF+pgS6^uVYYB%Z0y5?Sud%KxWQ7BC!@xMq|F?HUWe;VS4hkD z3sXc|zsBnl4(H7Qr{tdWEr;@#*OG2(wS{M^c3gkraauIw+i>!BApO8m8v;LWa{FV6 zt4H3HfwH%{QG!#DPmy)Ece4|q!5<5DeZ8!GiZk>LaMF6*7@t<*<*JA)X(~tv>YO_E za87N?Btb(VTaFfUEdfsV7;}_yB23!;)seV_RWdh8z8}SmJT*|KNFa|DRTPOsWW`o* zBpOM+cr73GMPEL;SK`%}gU?OLI79cw7sk!z6x!EZ%qt;Xt*#t~9s&n$G!jMD1&?)f zXKLHI)Fxmnb&q$jvv5lms&&t8+XFn8b^cZm_0y!w7{Vp2Da!uUs)&4zJPF9o#hs?E`$QHRH336* z8pkqln20)4VM1~PmW%Kf>_Qohy-+tKZX-LK*zpGR$JDmQ4 zJK`C;%lC$UM)g2gNtXCm(+`F>a$|x$FV7<<+IFtx`fKpLkU1DM2<6)GBC&uEcTR(L zttcK!Lt|Jb5G5T#k17anV{rk@s;*p*eUsE9YqI9!X6*|PWqwhJ>l%k27VEYb+;O`) zv{GTIivMDgCTwnSF4^hR(-uAEBT`SF5S{`0($9GD)8!pcJ%~Z=LRB3l0?o>b_}5;g zgoMobD~5`#i#vGtkjII{rkeQYjIMSzPaJ6`_a}ozg-d*CA_GUUY^cSl?v@Vzm(?%R zvnHWSow1bG}kp;H-dfDYLhacY;kTNfEsRCXiPvm!^vBb`+0-?;LWm3G&Z zHq-iXo+}aGy;t%PJ;vWWZj>kS+J9!=fe9@uteAn-H!nZDDg15@D2USs*j?VDaYZUIp=jyl zenM~ilw1_~V@Z)N@^I#q@Es*1{tWmtq%uNQX5OlDkhgj~LW8&L6D2 z=^6&j3lPaa|2|f&bgEN~&LZv{;9=#l2Qa(fd)px?vx;pmkuo;YQv(_dzgDirtQzD^ zG2M*c1;s0Fr=ILJAhd28fWCwfEA`$78Y(V|q3^xBN}S_f=ewNX&>K2BZV-GhjrGYK z@$|t_l1gzIkz;N*87c_Yw%=`>q*!$CzC~ZC3fs)Pw24r-dF3QSHk=ai`A|nl(}F0e zR-6G7bTfA56kQb(?QVIIV4#dyYv#@H-0H|C@Ao-Zn z9zaFrbDlavIcAgG%(c`OlW{PpMYpBVOq{&eg|WM}~%ddQ}xBUKyeB^^OeexNX4UZ+Z=S z1f(JecQn3$w599;57OAcD!eAM=BU|pkZx^`nTwfGz3mr4>1e|)-m&_sM7L?WT2W_% zgEP0C&Z6G$0ZfgZ*1%o-Gz~%#&z2srgkg12%$(LIuVQj(7)fsR^-IOO&ryup#KER8 zd)I)YVR$z24=QjDmrG*4>y~GZA@hde(-tQ>C2!zOGUHUgS`535way}^1?m+1U1!Y& zDqsf@W}kKx+s4(a@7j6u97C9Vk*aw0T3N~NV^qhT#l>fo_pIg+L{j^Vygg9oLU?<9 z4=^E1_c;W1C|Zs`rZ(q_*#@^3di>D$$daH3KJ7trPOAu7hba0~`hD%dT6*36hPbnD za=sMhe}RaiI$$g)373)rFr-;sp`mWqD^*E#VB_+7L&fn)c3<3fA4AS%E5$v4wV4u8 z=#bO2C?&)wJPP^|gGW3gs)Vk;m&7Sj29gG5MNwQ2CT2_S{X%rRPvRxg_d_>&gH@6S z+$eJ#?-r7>1hHWc5CS&C<=Pu@wHk+TjY+fK@w0Bh?uy%;L}-wP>T$o-p=Sr)MWRPL z8!x&H*3l6aTQR)K$`mDo2s%qV{8JB}vDN%2z$uf_AhL{gBurT2@E#y*ipW<$b!jSK zg@t{emaX}VW_bkr=1ZHdnXYI!4^aK+7pF~ z$5d7>ntB=Dw3*+2IH7;1HNH9iV47Ti?oU%ELaH!XDPl7<{yKUZ!7{VET`UoFpR3GzZRfa#OgznhCpE#hAuHgpj#Ee#%61^ zW=Le3>fkJV!w(&n5z;myG3c2@_03rsKJ`EdDM&8@gQz?~FAya*E_*vv%3aWvsiXkjIkxq5{GMyR@VWcz^fj7#2;n{I0Aad|SgS{DY}GejYYeLpOfQQV_0Dqp zWb!+YKJCmcv zWF5NivuA%6B5sT%?!MrheIddTEH6?ixt+D{T_ERucB<9?;5}YT!3^YM%DFo;a}gi!O7|OWhPsP3~#l4;E++6z3(M`hI725 z_1I|DfVliQzGJ-Ceg%#JS$|2+u~HT-LHGsY+C!`ecZav?cv@`1gua8ngNHzzaPEyO zCBk_#1u|kWexEtUmfDjs&C?={&C?M{qiSEq%r!p+sT6dvyvB>jD&_YX9@^QeOqq>7 zeeVLu}e_Q zfG19O^5ir2)$lKkKPVCdiXssP|5PM4`-q>OhF!^aNRO9m5)4Zf?+eBK&f{P4t98wE29IYsHTF1L04NX^ZE0BphCw(%y$F zX>T`L$q%nftyCuq+??kU5#ks3too6$6CaL_fqneD@GtGb@9-m{SEgwzDFJ5A@`=030D z3EDuF*LlpiLhuej8;TsH(}S)mQT!%VF6I+*xowXobzA97;d?-#sGiC!l%DvuZ087~ z)sUdrX?T9kgmAO$PNfwm(Q7$aKRq^DVgPFjCsoatTB`BWa8-XH+y*pP|A;65aAr4{ z#dNU2W?(Hn#_ghqg7L&#Tz1&9N?>x)=Soexn-c)@GtEZewRS%VHgy%k#{6f<&j}?> zK57`Qk5%==(TFu+3!=`PWQDuctNezuXTQvux5b+4q#SdAC!H^83DdA{5-a4d; zu;_QV>Q<7s&+$(OI$9;fW(wFJo})V_c2A2JYeiLv?hruUh&Kw^vSw-!U$omX^wYs9 zxZ_%i`j!)u%9RT1Gpg<5Ge4ID{<}Xavi)mB&T+LUpn#i0qd5Bc9n}H z>wiON4pVY~6{|e!a_*UaX-S(E;Bzz~WYd?ZS~k-cgFpGJ;R&s%8pC|6^NEQ^0;1j! zXhtJPwFxe`fRJX`gET<`I+&$CBv`pN;3xySQMOemdrNbya#eCJPG8fJCabXIASkQ{ zKAqV$pfI0PdBV_IXLx0NWV3tmxTG;xX|vH)$_hL~Y>zW#7R55-c5n$&9uuiNO-=F~ zD&9cTJ8!Yr;~@N2uWlsE2;ep4u2Yr;UZW!D2JhZEE{uWEqy7GM4T#bEB#%N=x9G7! zBnxryO6@R7u+Tyw=>gKx|4^J`rd{ZI(SBe!h2^E{HjDLRayTGdXSzrxfH7`z_9lWjRl@jXesvz!^ljgv5@OZ9N z>JvgfAQ|7cze;3%p&D$&2bj+qM;3hyg!7pfg*+&dJ`?AJf*4P8Ki0^sil!S%Wz=>R zW^Fw!nnFmydB+lram5ihIJLHLkZ)`xVM{caWt)7tl`&Zy)=03CArqjC=w?W)eBV^BC~@F zWOk%QLv`cJ@=E_+dKcq3{-iebYd7Syltb30#&1WTWcp|_E?BK_1nySMy%`K1;^>4^ zXQgJ5k|Cj<{*Q-|nnh>sf9&^SY-P;34huNv5PhzT`W$7JhwCxg{SEqyAu*<}8Lxd9>NsbC3(CLeC-sB5i^>pFzT>d>KR7h8 z#=ZZBL&!?6$K5-PD^64IprckYJ5qZOXC! zwxm70eJ$qdis!c-7e>a>NVW{p1p+FIqC`T4T(e8k7dKa2{O!F2;^ac#{aQd-#NP;d z^%3j%jDwb-7VQ-?rrjarb|0ngZ0y$;L!(aM!poNe zQN5TTSpCSqt)R}KY3k$%%pM}()IbL=1abTK}j^`O5J&KcoG|B<}LD zWaDRS)u1TW8PTo3CC+)fke*<34v7IY%?C5uj!jxA1j>6?eoI2E{+NVNzkT;N)@0xd zdR%2ghHlN*hDIthl+evxdTJ#N{3Th~p({ zyGackix6fKore!m)Wv^V1kpgm_VQSr(T_G5<2CLIO+!W?;^Z7(^d?brf8moJaQxdQ zrXP}KK#AaPCRB6@%0)CxYRBBKV4`P(+T-oN=h8EdS^1JGdWL-g^!m2 z!+XFiD^y88zkR3V!8DiG@!iaNaYADC9h}j;w}HW!fPCscakJVA)AoSxi#5KzD^A2S zlm$J8t>Smq8vGM$U9x^qb8>Q>Q2KuIVFc_7WgAW# zo9du(zn8x^w(dnuq&{!ktz-Kb-EM9^I8wwzHIw!|VuOD~Y-7UBl5Y_^fD*B7e~Q?Q zpL&}yQ%nE0g3(A&xKq7zIb&8tt*KE&MXuhuIk~-M458gVS}rIRuKP>O`C)t5=jrrj z&q)hb2@2BhaQOe_T{HEgXOA>Gjd?l20%jD0w#vsAS_{oOLn{SVk7^3a+xb*o9bDnI zaA2brnnyb~hO0L|M5<+ha2#uYCy@rv_S#9ECo)iHkmu-9(fPBQcGwWlCmI^T0_Cjf zwXg@%EbB3WjcgUx%!mVmhXyL-u49AVcu1DpCB_+RbV-ys_-MR1aeOWrn9u!TfPa?F ze|&yR^m$Ox3qcrP=_5JWx#l}=w^t4$abHTn4&Bz`x0;G5d1r@ zAVt9101vc>{jIGuwvpn=x(4w9JK1c(Oc-i&5P7#7uGG=j)8$L;?{x=Lq1McZQb+L0 zuPA2rk#sU9vkP!5&O98d5xKeoI_h~l^V%Bjy5|n)NXAyNJJQsq*R5^d0jJeEV9Zk! z;M*2WmJTw1HTgABHM-cs#EOnp^zbi#!Kv)F6u^telv|T5U;?BIU=pks629@NUpZub zU_Ea0?#z~P9eMEO)xM(c*hN3L@m@SdT()qGeQF!;3<`vWX5Clrp;ui{&GV5pGkL!0 z@^prwgmzTxy9NKQ7Jj#2rN5|!&-#*m3nq!Mr zQip8M6-(Fz7IJ)9WM}*aTsjJHu`y$M-+{Ym?AICO6+r=R$T#2~{0X>v6e5y0{^jHA zT$&oxDY#V>SZJUHm+~x^MA^RMR*`~RdH0`iYjf}`c;cS_@P1g*%6Il2Kb&&czi?99 z$-#-+P~*!l=WtP4H@)pza)CHFz?@bmw;2`N=ok~W?bDnp5;5;e>-Q-pOZ#(iQvJh* zCvBcC3$}M=$pJ;H`v+Y^`mHk;Z5vh@2NsP>n>QCV3J zjS!-Xq`NKvumUpw9jZS#9Zd(ClB5i&p=8pp+Y=pTTpx^wgx6`hZfd&dRW-Ts&Eq2K za~Xj5XG}j<+L3Oa3%j2B&d;s2G1N@0J%)M#Dh2wZ*>loeyt{lHJovm{3$sSEGspJj z0eQ5XjN+9pO)73+D@SCUb1Z5J2WzvufOb+mS0`0$@e7ORDXFaGNWP2xljU6lc%##7 zlua{4PqYh1Fp4#1D^Zj;`cr3e%O1c!|9EVnAGY&la?(O^$IPda13May>cSB3knD*k z@D_W321<4mb9Uh1<~P&5=btf!cAAu#H~MgH13LQG<@G-##0_w%sRq_I&9G<%0fVx~ zU4#yo-5#l`^tl`+{xT|-gCgAF2CWPX4$*^e89+>HX3ga6! zBejt(4_Eh){4VamV$D!-%GMb|t&kOg){ttp-l0EpM< zmk5c7FB1}7A-Z(wGRfsD#Kc#xUM0LtLP~O#6xbyG`5`~wi}&lj1jIy_h=~8=<>Djg z8WC_Dckys;fN-zj;9bMH=mvp-o)7@%=;vwreZj%S!zTca2sjR4hgx#r@bU0)frBN$ z2TlY|An<<>{xt#$R$+xp*R?DNZ@5#6yhzL=V!K<_L8U#6WEZu37IOItH4QBtJ;zN> zE^Zz%@mms-x1|*CDJiR{s@>OltgEMQU}$7zZDVU^@8Ia+>E-R?>*xP6G%P$KGAcSL z`E^QaT6#uienDZ;yW;mHrPVdC+PeCN#-`4$?w;Ph{((;;qhsUniSLtBh{dJll^?5X z>l>)O{e#1!WAw@C&wk;6@P6yopFR7Req96lg$rB*e8Qjo!ol?c8s0U00#@Nm6bf2| z7Vg(?h`b=8yqlO;)p40kR2xZU`E2+KHMsZMDs%L+8>>vG_0$s(! z0WKciHIO{$9Frf-1^U+p#Xql;cL>x()V5_Un1|2^6?ePR^bWZ`8|GU_G!s0jar99B zSVqM;7%qXYF3QD{e_#Kby!{0z;Z$X79Qp3J8_N?Nuue5Hsxiv{!KF59{o!|h7Q*r* zc{+KX_jZ<4vs#N1M|3YoM^eP48*dc zo&F}wdgIU9Du|s{ zq;P0%H8kc>5Wj=2|68%cIXIFPEvhlq~^Mtd8kPk+;Q)ajDVo-yu9UlVE(-p ziAanH2OQ>o0dln0B3P;Pf78QfFWU6<>O_{gV1=TwsUP#vb*aw91MQVGyJ8I9h7m6@ zVyOE9M1pyOENW{;7MKlV)beNTKDCVsvNhE|lX{Ly5|NHCXmy#myh%W*b?5)7>A}6S zG)dQv{Uag;Dz={Tu?ECsWh`Ioai!q4^YKRLKBiDxz|nJB3ZA+EEjFGPx3QaIgpjX` zFn9>{*K(pwv6#%+4aCy$czZM#R!zXY3oL;5%1*0-UIZ#m^afr2SjaQmC`)jokJoEy zx_xSNvBjLCMTM%TJ`4s+n*P{iy=G;<{l+<2H}lqtU85Pf&}Y3f{VOA%c}w43y-Eto zZ)*ypMJ(i9-+y4nGYD z(qhT8%285&&fxZ0?RtClQH2*`R#YGDwK%ZSFy6+j!Sv?(=bpm$kwSuU0X3Pby_C1! zGO)TD=EYKM4>P!GEZFJ-6rz88^QpiN(fU!!Bg zTZu^JGyJUkx8(HLG7p;2#*2iV38WC6+WMHjQ>C1IxaN8iF@~i=hpco98~bKxGcYug;W*cF zO;+6GQ=JBi*}`D_*R6GT(g6?hY$aafJQH z14IAvnF=O&MBWw}Ceg-;daN_ATA7;ZlHvT)t9<^xcZUN=);bYAaH6XyP5!=Hta2-K zD!N%_|7h;KuvRdl?iMo+n)6vAMhW#s;G4-71vLENP}**6MW=%|SAf!mJ>&HgV1DkC z1Ea|_&^8O3Ok|yj157C)R62a&YPQ}SIfmA*nQBav*|XJ#8Rfo;}{*3 z;|7UJpP5jGt9V)ZvnTaaMB$&NWh!c$uG5neQ|w6$u_ce|k3A8JAt4@I47dO#p6qyJ zv;>+NV2EAih4Q0$TTlsEGS_aESzLhdvygEYpcj>b{IzjlL}g0pWNmo`WsLx%vT%q%C&Z%RGSMLLmsbv1ZK_kHK(r^AWLcA9pJBE zsFvvsb;`C&!->NmZQP!+;*!t!1;mKI-FGCg18s<2ZA~^6;dB*q0{tbDld!oy*CCU~VHq zt3h=q;T_&_-u?@a{f8hbG_>miL|GoB?n<_LA0;5ARxl&AlhM8jx1j1>I<}-?2|PXg z=yNq*p_oK=u6z8rLVRL>6B`Vi51!8<(Ohq@oK~hdRXU7LZhFIyQ`5MtGA}PtsPN>J ze)(PGo1Sv`0_1>xrg;=xvtn^%a|BEJp0hk*qhzNS z%gd`_G8fKMNo_J#I4UJicme9TR}01u17HAhEwJDh3wR zq9&e+V;eEb`uo245UD8x@nEbc4UR(ewu+>BC@@(-Z?-+kf#nY5s)sH*2>M)OIDziT zo#wa6B7L@fP-2%DVEp!2Lohr`odb=SsP`pWP)vRvgRw87wd>QxkQyYVLr@o4a5``)Es)L57 zURNz!xrXedoL^jeR*Gs2mly$&gmAw@eS zZO33eZX4HVxT7C>Rg|i2yc1S)Wux8c0u;S^l!H$6L3VX&rysM7NENd00Nfp<-~~HU9xgBezX$qfWj6(VPV5&H()gi0J$7q`?EPG2jbO6`RrpXoSeo{6%Kbm$V*mbP)4+CFdK5sROB$$ke+(q}2zx*gp;+ zls@~s#rcSve;y&f{3(d+0`xsG{{pm*FTP&&U4d$=URaT0=0OZ&QYg-{E}yPp(<|aS zob`s&%&%8aG1xkZGTw(y&F9LFr%KRBv8*x@7oy5?s6{|PB!}sMm`jnN0rT4s1?Iya z!PQ4lFT}Q>KHBFO*kJ*%dwu=$GyrzXzk!`F@0~3_2WMN^9{(ag@HQm?W7NI@zhLaG z-JioK`_Ex?rV0*vb8sA0ylcjEba(-JSp@(XDI&37OgH17h=<2Kxf~_hV=?;;Ir;*m zS~C`xby8O&wcSvi3`^Y?U=QoFi%W^9@D$T_P&14darcR-5rHr*U4UZRalN5k!Bjm< z=cEFe;JBOKO+TTdiUPLu8+0JdnvuKME7A*rc3O2KK@tij7~Y8;6Gcj9j>}YGGZD}0 zrd~gVSEsT&$Mz=y@IXejN_DBYXxhmi0?+)?LgW2&Y||C|HnwNT14;bG_nLIQBAPBh zWDUn|Zxo}t)^+C00?sc$KLWEEV|aM)b^Jn>1TA%QT(k-TUXQ%p-3}1HT0y+K5pLg> zHMa$S5kJpzxv%Yq>l{_G15jOLFosf52dO;mI@Q%d({zu!%QvBOQ=q1>{!GWXG_ZPN z47*|f4c7=@ehI%bKd@Hl*AETN0xpK${z1}U?O_9Xk~VI%(-Jt0Wg_Uh)2V!vr_-Cr zUC+V(owt@!l?UvXn8x?tiBg%XO%Z;w}x>T?PrF~GJIsW;!knuLYqK$Ko z-qh^nI6{IbKZe!Bft`;C=9@mjSLQJZY?7Z-aZ?IVt?i$O(ZLI{5{R^y<(~3aRM@@s zh;$!R({W^cPxZ4&Y;$1uvGwsDu(h>RyIE(S-&Vw)l6W#xxI7&I0Q&<4CCW#Hso1XE zJ)56X?Uw3r@IeT@&o-5hU^v7W+1E|3&hBR5TgfkVaEa9>{B$lrOpgf|r?xc~JNa4v zI(VJNIKntJYD$}yZ_!#?GrmNVlOYUyJQM^K{RUIZbF-LqYvXQAbkl2$hu7ol>*;@M zZSAJ0T+WoxE{`R9q`;EkU!!FI#Lw;*iUs^cG4wxBOy(zw3H*j)*C}A6eY*gP9YA%U z?C1Fr7#?8o{l+2x%fZ+Bl&OpDl_P6$^LIG3)uFOI*L?p3I0<^z|88P+pXvipBA8lj zQ4@ct)K|18X(^}?F0VVNPz$`8!NFQOC>{RyRC;ee)Uqi~F}k%2mYIQ;_Z5WMO8E=wcgu zFu7O&zvfnwAH2FhJ?GQI5e1P&Rg)(c!@wM2i1bMa5`bL(-cABB1Sfb(HrbnrXUwfo z29vZ^(ZeY};Gk zAF$k-Tb`yKg8XQeO0Or{m$6^7j>Y{%#zXcXezF5oa;T-JcI~!@+F+xx!3aM@p>Wo~ z$xX@2CXje~MuBHXt-y?uZKCd8hLOqO%geEyy_r|k zPi$b4z;0RMXO9F;G!dAq-_oyvAqu1{lIZLeuI zoPTc{A)GJC$w7IZZ+5lKwIjV{pGD)$hycQ@hUKr9`d_wjNi-kS!C@yA;xWDg+b)m# z_(YZ2<8@_qUn3O`#6S6}BYJC*cNGM;Di&weKPIxyo=2{q7a<1ZC$V2sp4Xe3SF1gJ zc>88E53kf~3qvEv9|yv^Zq+}EZe|SoN@K5pOVMo3_1oqPF|$0Bh!z!uO`73IBo+hz zl>4-HNL!|{;L&A=sxN_L$ce?`@E{SiHi-{HFj6d-Vr_!`cc8Fk()XvpBMsAJLEeF; zl*Pk?i0qH$_>#MGuI4^Q`owVbo_loFt7x`nF%k3*%>q-xvCm~5k7K6+=xfdj&ON&k z3&~9N+3sGf6DFa}9-07QIx~S7q2(yR(NeMzJ#nORB-r>HBM=4p_&p=l&XM(|q~QUl z?|kJzNL*g%##5-_=Zo)3|8Q2higb1z|6KeQaa0zFxMMZu{Y3PY3v2O zFY9;t`)Ai|Jj+{1;T#NOh`MP*%axRZ8j8T;jRw*AO7$rs3!kajJPCU|$eLuB9c7nl z$nYac#oNy3X{xO)dyi7{$=sfC(|y=nZ#@dsl%|4|5Qb=?rJvrELF zLWiZ9^2zcu|I*XgOV=#&{2-dad-AehJtPv!2Ei|!SAPJ*&nHLdFSw1f(*9u;lcCvh z0Xm})Ge2huZ@u4Af5dnJO6Eq(0|HAq<^ohmK2h>m2ThY#;ku|ko@37OW{%;!x}Y(d zTW(;9j1VUBiSoqhR+cZlxYak&n-#)z%aK`UwHs6#S29a@O`_B@JATJErSb4aSE|{R13_1J{IbTIabsm{cw^+MY;)zq50XD! zfNZwSHoH#spvc{xdWsoGfIi(+=d#PFS9|a93>Qwro@0;>SSj-U#)b(+|6rGBfL+FG zPbhp%UVQ4AtkU2$D;+#h-pPFoZl;;Kb9T7-e20$lr4}I4dTRqWHM}sV7ognFT>1a) zINTdPQ`!g;ZrPK&>`UA|g)u&2(s`V4Myzh;W+3}1CQ84--g#MP@`JKYl5q;{?JfTl zTi=-8CW%m+s)U}*x{P;fB{Lk^nX|L(H+Srwlu#-}&TV~u%Qe9MoaaZerMT>^#mS-^ z9QW(@tiwL3F)t`DTO1qMu^fr_LFCS}TCO7p4Wx?0#Te`+7@d<1+LJUCAHVjO-5!+L zx-CP~#~ICZitiURJm&juSNj9ACy@_*hoJnO#Fy6T+LJL(} zJ%x6e^5ngl_O{G5G)1Pc-i2W7IuXfzc>y|Nw{JgHAn{L8l7Hb( z567~%8m@wCCnBH_l`{$S2Vcu6<1gk9VDw+JT`5wN0-Cug_GZaR)#;p<@R<6ccdJ@7 zlzSOs0vB&D8PYsUd3r7Jl^i!P}#9I)SCFQKHmguPAq*Zetx0C>I~}t=xj<{X^c-{x0tTFB6b= z=e$4V-E@?TcyL5A$7@kQ-i?Vh;y4i}Y4Sa||4ka)%3t2w`miP8C>o3`Z881>1z%=! z{u2rg{f>g~0Tir|_dht>-n;-2T1{}h{mD4(%S5hl3ch6t9pJT!Hp)D3P zG`oGm0rz#s)nXKuPHacazGY@BV;%W6jS1;nI2#>nlASoKN7fBUVtTY@A@Kz$Y6_cx zIJ+gSZF+Z`AFhnuaAosg25BWd6XJ2j1(QpJ=eb68shC5{h1Kn`8hC^FuSE0Kyj4rPWR>sqcT^Iaqji^Z!A@!I$P|o1 z?%i)!clbRoKv&n-9iAawqzQVqe%SHpxb%zr4p`+hU6*m!Ch zHpB#TqJWLSs)Zhb_;%E#-3Nu)bJV_QC{gxb;VLJKx&V>ISzH?$=&y_zyK zj+>y58>_5Ra3b1euWoUFkKKqphFhs%i#?iV0AqzPWgn&#|U30aVW-?Io2i=N|KI(93O7q$#^Y*VL;^v#Snl>!&pq;oufTXHyi z3P=l+;-({mVmctYBI0q32Ff)G!*Rsjf`b5~)%kNjpFMrFQDr!%7}qS5zKYB3k@j`nYPvS) zXsLc%;jwIqJcDvst;s^6w9uQeT#L(fS=|+!cb9g%a+PWh5@KU%ru~Iz;NU zVjdoJs~vUKKPLf2+AGV@n?v1*{errbUTNrDi5qUnY87&{&&F4!mXN_{ca=_mt$Iek zE}}YlJV>Q$wb7$X_q1Dgi64`TAxAr)#4ySsyW2rbD3$QaEkivgQ``Q#^S9hr1{q{T z$zCt_u`R_evB}CU7{tcLs}@x%F6w`Dy$msJsclC6NTB*!U>PoLdiQb>tgTl2nI7+Z zI*wQhoX&=2+g4L;xqw+$Q<^!i1AS@aJmM2XY-F{%1`bgvHy#wspgHP&d%QP&6{pHJ zS)>}3J16=k`HL+?1(gs7;jHM!5+Y5Z(FZypQHDSVesT6R4;$^vO9rO5wpimj8Ix`; z;HpoWh9rnq2j@)<8<>;HxC$nCQn$2ytKB8lWc+e9)d(is=N1dPeTkb{!aOTn#YR#F zWvn&R$2X!v89Aa9w?RvhK}W|_%{{ja8~t#~mH*=BeEA>GlLq=(5W;V+E#M{Bs3z0% z>@oVMIUG`zX`+d>G-3foT`V?8(c%8SB9y%3>VxXfTHje%uClvKT7>ngzT2`* zcIiF0fZRdnA=<;}1&`9YX9HBf@u~Yc$>n*cuCwJt7WL2cRmUcO*VF7WeT&W+4Q|i(ZkiGt4$e$U%%tyvW2+?t;Int%^eAFKG4s`EpH@lqns*L1KK1mnNIx_U zaEM=AWuoI-@_s?aHk29^hnu;K<#P0gmwDu)MG<^4;5ZqtXP(<4wwl78{hd3FW9(+A z>8_>+%*=|EewP%??J;1qRz8LpZJvi#M65I$+s}bv>gqP$^K4;Yv83B8%ierDs{rSh zNjAIX6un~BE8RL&g81A%rM{_S#NQf#X|IS+ispiX&VVR^3j}?00dmotoY#RD!q5ds zsg7M4SA>(5Yw)|fAXln&)|dgiH5WF%z3Hm8l_d^6ABzJUD$iA(XWB92bnt>JNY5XY z87Oc_i`_fOJ!DR9rSGjB>21NsFI@QFJ$Sy+)gV(ws-TU7Pkx6bdaSe^b^+>yqOFIb zM|}so5+mE_eD@!LrxUrlgJ|KLZe_mG92GOMWrEfXHpzv1B1X{i&PA)JkfiyNlS+#h zIk+{&{7rIez&T!*yxWi)8C;VPBFDYyREi$zfpji!@;}8g5ty{=^Is~e zm}<;en7^jJI7DK!L38@BIPZ%aLtuD*RZNy8ZRNyX_Gq1g{u2d!`g)r(qYdpL=4>xl zwUZs}|J6S{RalE&HG5cH?ywr@b(4Kw zhGjt|0O9;)r}{XukOMNRwIGiy+mYJ#YDXvPhvQBG@8Q%>gop!+6y!SzRbRr`)*Q5D z#@W++R>lr8_jBXs=*9#ffyg0qsxeKLEANfAI7{{(lI`q=P4Q6)|?;Wn`h~< z8u}`*rY2b9=t^T4M}Tp5j#rfpejjJ*=d9Onn993Y781We_EAgND;5hwlkH0Y*O5nQ z!<_)Xx{}U054B7qY_fLbUn-4LY;vNMNy8P}F%QZCv6{Xr;pz$a+L`yzBjs)7pH$4j4DdG${`S?*n4CoUeq!mJlrB!T&lvQ zNBF6swV6VVhw({zK^?pMX6{2aS;u78Jdx;_xz+S_c?NztvAGM7m9Ke+84p}Wv{d=% z__VH|IM{Z*O_B8~uIcNX1tDpL_?vf0eQ*Z4(1P#g9I?0)SW0x63H)H&>SK+f6?2h| z+l{uCk@S;P31VJe#uhI4o~oP`N6RvmB->Qk&$Kb|0(7OUXO0^5UeYk_r-u*sd;rd!!3tR1IDc)AHvT)k zr(x274w|o(=xvop#NM|?eu>p`3X*&k2>&pr)Rw7P@mJRPPU! zU1-iJ0g~YZw7z_##TZ~J{eT;Y3o;m2K*P6-?^Zh)U8zH>>3mZ6UNBXal-7Vf6(tG0 ztr}UyV(?K{>pAEnZfcuck&52KXS2D*j|v!NB}YSs0aEeE@ei-j&bPVK$S$FUx5Pe3 z{6p=ySfJ&UI`6b}diSeY#T&1EXEg~7)$ju*y6SRh#x6j%?a|s00d$y;N3i{qfcZ@@D;8Gm6tJN9lKX3VjU%g;(0!9V-jvU*f-p3NukkPueAmX_vP=ydCPWzpMB zVP)n(nn$q`DQ?ftS57jRMeZbVv&SNTG<`@<3(FOmE?KqpCHg^W0`9I0vKxZw3nGVl zC$KkSbVlS@4OH^cqn#7xlWi=cRD=ArA0G{}^SPPLS=*#?3-7bVB3|+wQXRg^eDgT} z!0yK(_ovvIo8{jCclF*M((`{or&hrj>S=^>0m^@59?|y^NZOiM#~>D0MK{gKcRd@H zLVB!Q;^&CDI2GEQCM%h#u1tQfWW*cnIlcY37D{U18*3C7^mXdM(4=UkAya6P?$rvr z$$ost`A zea8Q;^3%Hxmnd9mLv!!7!eq`tzC6ab7xgK6+@p`#KGiY#kMwG0L;a^tPA))QOwN>A zMsEPyDVuqsTS{pzx6-)B=ik`AWnw_e6Et|*1AkHEI8P>H?9Sg?h1|2QiuTL$%nZ+9 z;kS6Ewh|R(L}LXvc8K%O1_DhAAkd`wEzoqzvr|Lel9Eew+syc7`~DKVqY15M4W!B{ zx8H~7>{=N$O*uhVCootGCCYyZGyzsj3%-tJnFi{eG=5YCy1ECl8?(Zy>lrG=8A?no zL*Uou)NFj0w9Z$V%GTz;4;}e8oaY8zBWiKtXkCqiXgr&mj~29GFPs=DeM$MiPpE@l z$(1^IK*|Ro&pbm^Gxa%fFKdV=cF;)pV*p~?;j#0{N$lfaHFyoF%ewXDZ)ko^# zhEkeroE527vaefT&n39tgvNu0_C+b{&~u~rt*tL!QGLnXa-*JfkuDff?xf$*)I)b z8P*B!K@-K-<7=5J3iWOcki=?rUA1y#ccgmk50a$PFwLhd&)iWnY!gI=rvbtARr9qr zv8uYUgNldL^-Z-6cTitrg>-?;i|u^{5BCoHcBx1U81WuMj8NAQ;oZJ_I?u>RFE{+6b-*gNMtDG~7JxyfDpYWU>p|{yW2Jz18>u5krqlf*$z3;Ids?jN zM#>v4%8{%E@t|EROwl?$`!l{TyHY>+ol-Z;H1EJ!IyAD^Wd`^H(yTEVI?~8BBemA@ z=z0;C)0`;a&L#h)maaL__y;xrdkeQ^;>Zjx03+elL;Edm0^U&q;2p*4{PK&@MUWQjKfk{a;RO&5d*)XALQd|L zRTREdLa#ZK(cq<`B`2?1v~J`RPQfhzuWB(*;OlLj#5pw$1A zn-91mf3LH&^KI{xvP;1H1=ir|yqo_DYw$Qq9HdQgxHwRov-mofxQ%soW`4?#EMQ^Q zc71T5!r}cLC%;1Zpq&YS_K5OCn2whNu9w#V*|yr5ltIuan7DA*WoKR$Ue0N%eg|$D zD>EgKN9)Ri!0G)fu(j!-ZI+w>sisu24kj;W8-_R_oS<9tl#wSvj0@#l*-x}>?i@i+Mv@N(>)tXxB55tdJ zPdiReQ}l)p%jC(|*L~iaPMaI`8)`fG=^1=4qk2N8MtHRle3z(9T+OBbHPq%iFsWJp zyb8>Li-NHe@}zRyQ|sXCTW@QSyOHdwVy51law=2P300;qvF}tQ_X-Ep)VTNL#*@D} zCPYDm-=T*Tnnqg8E$m7i(uUJ3odpnvdD&#To=+6XEP0shx|>v9@I8%)JS3JCm|OHM zch1>xryt;bRn<*5B+z%I>`fKR)yx#HfGuNKg-uDxZ_s5V3qaR&kB`;g6U#C&UGiV< z#H_v4!wTen&jiJc6PWaeI&JZZYa$Sr1l~YQh}NI`e`U*cKdWMR6S#5s@tMf&FZaZb1L()$qo%=f?W_C1>{;Ib z+obGKk8El`MH)P2~zphIpXJTrkBrJuUXxx zdR|%p!g)^MC$VLBCTkKjluHz9CYCz4-`jSx(b=_!=0lQpz=^Ixw8-zE=YH1kI5)jY zuGX9*rdvisMIf7Or1~?($48G(ch2udb5-hm`vU>~wmupB4a6(~5Hklr?6?<8^E-%P zet}p}_~MNr@n-OnAoJa?TXJ#vmDy_ANw3Y`f32m}e_1TR3@-d;DAhpPcAMEe~{C8d-*=6I^VW6Gkpu3Wl4>j1eBq+!qFi zi$~4y%#jW_`LOW}P72Ujugk=ymTd|(q%S&@RGj8!{-C8>;FWqdU9b}ZbSF7+X=pA3K6Z&dW52_O5*1s8V%YkW??xo!8_4BXpy^yHd`4ZQC%$_-y9}O!nkIj1K1MnUl z@}Kjyo@)$-wFoHP>Y_OnjN@~zmF3k5tJtYSq98LG>v~P@hO)|aG%COaYj&^&2H_H!)53XB_R!W3?Y(ApYPg@U?pJ=1OJa#36 z7~76{g0Gva&M{6{h4M`IZ+#V;{#Zb?A;OyVg6F+*_glJm8`MgZtnf;IN}do)Y2S_~N3#}0 zj`nkbPf0{J8PvO;)f^3RU0)5CM6HjFOSP+I&L_9E)?(>%rc_=Lk0d?i`Y}F z;LhAo&3g&zVj))`+#tdahz_L0`Qp2}Seb%cGWq5#^JLU;8Xdm;eR^IhIKS_i`-%cz z?%tQ8L45u&Thol0{))y5dw34p@Xo=x_Z)9C1KMnE@v{Ci4TcguWy1F?uT)y~P{E;M z?O?R!1xN{16jxVVJaPbNTF=k#YrqO2-s4oALmH5v^v_ ztG{>nw+KcCAehi^2sWw+Bz`J?p^frsazI(Ogyb1uurIso0C|6p?w<%2@ssyG{U_cR z^$*^c+31Ca1UtIMWd?WAz8*lt5aq)$?kr~&RxL4sV!6fxR&Gn!z=a0FOZRR%!5_1% z3WTT2@KvQ0+-C|Vm^su$a~5|tViYbFpwjyEsyj-2r)HfY63$Z2$@jnM)_48P!d+uZ z2nikP;=(PU#oX7Z#fWLIlnQ}pLE002V%DKNfBMufALaj>2e$s@ zHM~{9>9ixCu|vO#AZ`fhhk$toU$e344Jm67AxbZawt4cDAu>j$ZYwyp#gAB8Xdg^~ z9(;g~K*-9QAf0D?rp!ukXN(_a;0%ZR{Z)Xu{1jk8e+V$te^gWmOav_D&5Jw{} zyiY;QXjgM&cu@dye-R?V%#ZXsd|g(!seey{*LZ<#eJb8B=}x@2=1>;>2Z(A>Q7{k- z{c+m@#A{O?C{+2cZd-GSpz(QHvaR{EJHDd5Sgw)fQOvC~PZCXIwfbpICwG?5KI*W* z?1gkC85eb4WtUe}KDv-1M{m0af~E}|Wta)T(ddxvTa4&t2o7hy+yWPL-VrQ{ETm4o zwIo5G0_42LQ=QTSd{9P5`IaRa{o(nl;;lpXGdai&a`cFCzz{t;bEUSO(yUueZFdDo zX$O|O@ExdH4EuHv+Ci4x=!mTXp!^xgiNdmajhg)0h|$Jg{PD5nqReHL+rl$5O9dQn zT)wd``|Ztm+EY$UiZ9suLY?I8n9_a(rje~&fb@#C-?gp>5o1X&KyCoFU&+1uhcWkm zTT`ibx6zM6>=2vVY`ye>sTGAAZn70CDa*vNtuq2eX1A@}bcbKR(tUx?NYC}|MS2bm znsuQa5B+RV1*sn@BUrFb|CHC&&dRDt!PVJ`B9_m+JCcf$6!$r(>;i~YH-Qj1r z0D*vF_(l8t)^rHhiBUVlAsJfVjQIlemKu0g<+)ZcN-Vgu33+@Dg1KUFV}N-jKe_;T zC?U)Xv3rVRKaVB=>KCu8V0fWq!QY6LFF+r;+R>R@Z}G5H6A|re1O>qhl;#)>@ZZ1i z`TzZkK=KGv-vI1$BMB@HQ0w1440yqtUGoRH!|li`g4mnDH1HoE$s?2|VDJ(6u6EUD zs>HRhA_A?{#w>+q4b2@MnHbOX`WGfPQF+OQUQ?nHMH?0g#>C@BKdJz|`)3>ZXXW(8 Gm3$RzXF&fCUi|h=LHstO_WuSU`%h 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 diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/icons/nearest_nb.png b/Triangulation_3_copy_tds/demo/Triangulation_3/icons/nearest_nb.png deleted file mode 100644 index 7fcfcba4ad582adfbdbe298edefb006e3fafdbfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38356 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 diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/icons/normal_view.jpeg b/Triangulation_3_copy_tds/demo/Triangulation_3/icons/normal_view.jpeg deleted file mode 100644 index 8d4d74044aa4529e34b6c235eb16101e1722eeae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 797 zcmex=HX)D(TPF2@2mNea-Zq+IBD=P1Pi$~a|G~e|7u=&ZH0-+GV2`Xqj&6geA%IPUt(#CyC(*jd6p{2P1zE*RD*%RnsI}emULx8OJ>ihD(4*8I@#LW-D2Bz$1K0Yr2jt8 zaf`j`_1C3o)1F10xuojd#dO_g-2y8yy9W>MFFm^5`qq!)lV3%yF=t^$N|e5WTvz@Kv|`r471wbbdL= z$my_0dsas+_v)Op^i+*z;Io%y)_0a>USe&0dHnI~z7_MibiJfEJU^c2l0JFqu{pk% z7QSua+&fj3BiMxN&kjMZtsF%&U5-hce_49YUR~;b_Ox`HZJicx=Du2*ZmPF4pnzjT z!jIB@K?2cJT~3dy5i`H=-vKz8qfZHd&1%_ z|E4Qe()othmtA?ZEl<(tR+772^+NfF5_RojHWF)H+YaZrXIe#PZfRMn{DR?V{&N-4 KugmKH-vj`?cofb6 diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/icons/pause.jpeg b/Triangulation_3_copy_tds/demo/Triangulation_3/icons/pause.jpeg deleted file mode 100644 index 1da108b76f8a3a0403604767454d424eeadbdbf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4075 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 TlmrDT1Ujg&?%R#NVDrBKAos_M diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/icons/play.jpeg b/Triangulation_3_copy_tds/demo/Triangulation_3/icons/play.jpeg deleted file mode 100644 index c039554ae988be2fd1fc5ec7a403152b9a89a29e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3881 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 GsQ2#<$}H>v diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/icons/pointRandom.png b/Triangulation_3_copy_tds/demo/Triangulation_3/icons/pointRandom.png deleted file mode 100644 index a296047db38a33c8f17f585f257ea37ddadd9df2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1585 zcmb7EYfw{16h1fRk{F}}Oh82?v13IeC?gi5)x;EvsKsCvi713e5Fd~)TBkU6%F_p#2QE<#rU8=6;uQ?fK`!!UaHtDhNPE1{`6P7J3G7Qo3r1yXV00F zD~t$pqfMa!fLr*AkhK5^aYTUXLTsDl-zAS(>1)FTU}&1!M;I;%tHMISIX3mRr@thS z@v;@7bO6_hV+(bgIVfR-vkqZJ=YQ&S~r3Sfn&#&40Z zwn)+>@_2ujExOPVxm0#Fw22V`GVZ7T!1k^!1R5+92MjXRBx70T+5^kgLD zxEs&kn&Rv}>8b23UgAhY(-vX9zm#Zf$0KL#HND8#h$a=7nEbMAD<0REYC|7$iqs6P(!KARg+W zB)F+{B)Zb#ZU2!(x7RKk6&zyYqY(!N4;H2ydsdzv*bUbTC-W4pEIYMsJ76hT*QRoy z+j#~7)6zdYa+|G}VJ4qF9g!&iqD|%b6!)w`^*w8SIiT5MFTR-hYL1x(3+k94M#U~R zk-->)Kol%Z_OD>a{(0>S)y?(JzUFgtSg*hK zO}8X6;J%lzVZB+a+rFWZCLU0KmD_*V{2-|M6GX3mU2KlVj!g<6B`mBueXMfsG!9Tt z0UrSx2*Gl_TSr0lY6hLA-$>1A=0*;73Sqm;j!m))vsnyt59`Da6+5V=;_i0_$;J#& zjmAEv$nIa6e|29R;>Ws{FGBdTz^g7`VSwL1q-qi{Ku^@)U(n1hM?A|nC#QwUKW;M9 zqM+HUp~n73)S!oJE5&V%hC&$JRg(bK!90{^*{bge!)yrsla`1UI6N;js?B>g=yyXb>pg@2W%(K5u zVJwbMyxJi}4O8-tJGAx;UB2J~NgRo#i5d#3u#S-+5%S=RO4ambjJ+h`3XjUW_pDwZ znPrcHlSkF(h|2X4yAp8-;a^exR5Ow8i0kM$zy$kT+{8PTtthT6$aUZ!W2A3o^EpLBgXW2nsbWRViLNN+qQxTGWhV zr9L$9=A1|A4u8(n6C(7IZuA@swi_B}%vy8j$kS82Ap=yEb89@Y-S9!(Vbf0L{NqOL z#28Kg1Bt)x9qqi?Yt1 zg%fUt`Nhej71lU}JmJEh^quY7b_8Uz@txXy(sR@5%|n4*O)(`m2w~&W7kPz!T3he^ z-!ikjS^ZCj1G{$rK5*1;6$cI{i!mmDFt>Ba=W}u#qPB5>9EUMMGtW)~i?@DhDU!aiCZNl0E4 zK_l1*(#N~hN;axdc?6T#1TPV?8Vmc>gKpUXEc|aD4$-YB8QkD;Y`mKy8qdPvzYOzo Y)wsq5~;&+`^QRlZ%U&n^%&LPtsIH zPQ?@%m}r`SxjGO*2&JhBjKe5@ci+Wc+`GL7IVq ziJ1}PR2X1oV`gDzVq^eH8VWElGBY!>va+*6Wf_^6Sr}Lag@hFy0~6Vl3=duuQBEps zT)0ux$avxhpcW~hk6DpSV_;wbn!(D(1e8+|WMBdUAQxsABNGENi=d*R5Ub+{5u?Dy zjsI^k@Gvt1oyRQ5V9#*t4pT_Fz~xrujI z@vEnA>(h-!x;(#~J!0CfY+dH9d2hjn#rNc<#yzdReRuJ$Z8CkgJ%Sht5?xj-SC`qn zzbep8I_J7v@WiDoojS>Z{!N!^MC@;OtiHl^Q`IPcrDnjXWZBs2!*V4_KGPl^-&Uwvz zZsFA8iCUhM7l^3ux@F^4e0pvCrn1asdTehs7rtHXH{}oK*99Lxy*@2hVs^mF;AqsV zu;}TNEUaJrc_&z>e8!{jN2hn=o!rR4WBvveQtU-ryytn%Y6@`syrqEWi^Q^BT|Uzm zLEYtM%qnf`aNs^uTJN3sc2i!{EnH3?ZqGP%D_mqnp-AP=NqVV#-iLxFFgV#5UtYOR zrR{mloLQ0HRUhWPDqlU}RYv$Lz1@YmM_(mriMCyvdvxnp(aHOM*CyRxe*DqKn}7a% zli#c(8ZKHh``thH=+M>4?N65E8s2edJHA$QVc6^glUy=gH7Bt-%5S}R)^1AJmK`^) zKDws0B7=i_XYpp`$%=x>7N3`M;O(OAAxpJQkbIeOjybQIV0slzC07|9XqPIiThCF}~7POgB3D&ep80 zIVC41Ox$|BP)1sAtN#`;*#$)@ZilA1?@O1SBXd0dtn95nYWskAjp4@CN7sY~To7U} zdY+cPafzCSldM)u(E73mw%u;>M9qp rM(uxL9C!9Dp7{LyXZEz*;$$E1NwcDLj6|fIu1?MWB;xX@{{Kw?*~xtI diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/icons/quit.jpeg b/Triangulation_3_copy_tds/demo/Triangulation_3/icons/quit.jpeg deleted file mode 100644 index aff16901583af2862a02dd4495b2a77eac98deb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4298 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 Ygu^8>({cL6T0_I_iOM%)324{90LmEY3;+NC diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/icons/select_hand.jpeg b/Triangulation_3_copy_tds/demo/Triangulation_3/icons/select_hand.jpeg deleted file mode 100644 index c5501d750b033281d23ff52a18bd5d124fc55281..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5835 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 WN~lIj1A4CreEV_*&YeS`-v0qOA)xF4 diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/icons/show_delaunay.jpeg b/Triangulation_3_copy_tds/demo/Triangulation_3/icons/show_delaunay.jpeg deleted file mode 100644 index 505e2c847a1a3cb987c02b6ae9cf5380516799f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5781 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 diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/icons/show_facet.jpeg b/Triangulation_3_copy_tds/demo/Triangulation_3/icons/show_facet.jpeg deleted file mode 100644 index bb8c2701bf900ea7bc1276af7be770758036442b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1201 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 PPS0z*&DBQ8{+oXT0y?a& diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/icons/stereo.png b/Triangulation_3_copy_tds/demo/Triangulation_3/icons/stereo.png deleted file mode 100644 index 74788d1002868c7847f71435d346ff603e26a576..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2350 zcmZuzYgAKL7T)*f1`;9?0)ik&Kt?F?Qb8!7TmqQbiUJ~_prE!&MbQyK#s|3xXjK%_ zvZ%a-P+yE7gdzgND}Yo*khsuBp-Ax2q6v@=Vq!otw_R&~%vy8TI&1ImJNtb5?0wH! z_nr&i#5FduHUa?S4ZM&@0EBcApc#-R{z&ECKT&EVmjgAAY~GTK_sHxGTh zcN<>2rs|LVt7)Y{vbWN@uZtXVX7v8Y4&af0bi~y!{NSrv(tGUcU%V2 zo~DgU3*`SEZ?FsWoajoUKN^r)1h&uT<24WYc{Kr3Gg?GBuYl1h>(9!h(Gc2NyPOO;ES(nw(pin00bu$Z2B!p%>gD zB&uF(X?NBw3mdX zV8iHIVui4Ev7(IM%Rxwa84D=BafxKsj2OB5ogyq)TiDN0F@EODZ%vz4DD~#gKG7AC z+oH_Qer^x(Ue4tYcHfEZGeX!=t|2myIgIGWgg>H(?FD^m{R&uQ!X{cosBFdDC<{yh z!wv9!b)XwKz`HYgPeg>^5CY~#`hTKq3KI|}!ow-dlOntnFuT||GzCRF9iC;|-7g?K zE`TspLJt(J5QeD*@$>^ilh@}H%`(|BSc!tt?C=b;yT7P&`5az@tr;^s5~_$32og=T zPcKnCetuD|Mr*#8F4rboef00pa9uOfKMZ~HdNzBx>D_Zx(uecZwouu6$ecaZj^7sP zSV{IoL1yQjD!45wV>x?}FTc`47PHhh#e)0BGJUFNhZU#$yvxhhv~{D>$-GgeCL;Ze zddYTWVf_zN^3*8$e3?3#(Umu=JRY}J>uwoc)U%1Bo7uizqi(TE(gf~56*AA5B@4uMdxAWO+rk~OKh5VlWy;rFT3~BZAO39e9AZtWFcdR11zw;X( zB*vtDiou+(s=4wcx^nu>sr6+Q7~0ZqUU;wwXV68Ld8?mQvPk82&kL z-Qugd8?^(xrHZO@{`N)DpX4PEb{LC?AHA^^RI6jQO2=EH(KbVo#c>U)>%BFoTiSd*SWE3m?mf85r}JCslT%>>U!=Ea>VwjE zci+@$c23#P375?^yK&VGFlJIVYCowo-u%=;aXn#e$`3HoHC0}1gY=p-lyfZSt&%sx zB$dWj2l$~USB5`o7d-+7J9?gM&eydha?%2q*ul)GmLSHZzVPAUrGT7_jy@CDtds2WES@M1yQrxC6H|;EYB$+$Qi)O0R&Ef zKcfTlBnsJO0Hh*5{ud-))r;1K|*bi(D6C#hrvDmPy^nHel4?;Er!Drb5^C#=N z=Q|X&*1q@5jiDH5;0Ro}M+|07`ic?UOon;EQCk(4Q$tSz8Ahuw0arGU-HOCYe-)k5 z{J|5yHI<@W&Hi&sfiC_D>zm3)C1?K;JlFT?J3JVP4H4l@;Of9*$AiVnWg9Oa8ZR1k zq9&R~>~Q=|vjK^{`+{=fH5t0)e?#jMG9DcdU?sUg4vj^#BtkKIHbd(0VR4^T9v2NG z1%l8qG7(#F7!lzkBJFtHGRSu*d-B}YV$}&|%qNT8EN2(8@8mK9Q)H5x;EC5e*DS2? zF#E>!zdTNAumx%IZ>}jh=tU|{0#c4_a6C9leo@!zqHXA27C|4kvUOQgkvgWT)vBT4SB%j1wEauGSaXZnezEL{AR5lgb%x<0mfK%{zP2amKh$?Uiof_rOcEi))l@ t4V>+dAHJIUlZlb747`vewC%TgEbG8V!!(51tL z00*{%)^9pru?T%h1DzJuT2^&c5Um+UASSm+)59Dy9oI21Rpp#v4zVXfnfMrsXUvTRVG)xu1XG z{H2TQ;w5fNJ-t@0@?O1W?WWCJw)$?{?iU;q`fXVFu85fZv2h2!i%&R`^0&VqJ@$R7 zBr_}fWKQm>(`WJvE)-t8bookAX<2#2&0DwcRMy?AZ@Az1;Nhc|)@NFMoztLj$|;-UfL9jswwqi`8uTy&fRE%qQT8a)gThJhAy>TK4yg&u65K*MQs_Gud} zNq|=wNFC^Q7s1AyV+gVXy)zoqBkvI1ellGIonCbadJ?UAOu#ZT;e*3U&zo8pChWZ< zOFrH4ex9LUQ)HPLCA5)kmi60-HECUFMhVwB>?7Ki)XHAo)YptJJS)CC;o6(oha=)Q z`ufW**-*Iy?q!tmUjueXIV*D9VuM1SJ`Rr%U2M&J+}2Q#{ReA{NgD*;iF-U3%p_XY zpTY&FelE`=UN!wpMf(v?gAfQBv4UrbxW~MdXqnHaoZ5vgVdNqNnW;)g1Uj!4BS^vp z$d$DkYmBPnn^oR^LNfA7ktOv@l}v7tOR@QH^i{F*cnB8Fn@Jhs(6^0Ap^S-gzIs-= zp-hoiPpCBZ;zYBtNA1m9eakze+{wd_k`S2XeVZm!U)O_o)qhOaDf z6RMm`5e)gGNzkN(4!q`3mADJ++zr<^i96OFi?zLa_G)U=wM%oZ|L|3}qvP5{)-t-laF+nw0(7FlF}q6CGx~_KUp{T3W7WldDwmAV$Mec1 zAGrW>mV!^ln>c8~OK=eH7y4Tl%etp;YwmrOu&q$2F11u2q*d$nH=>IGo%|9FV4$MGs z=L{)8aNZL)THV~UHQV5now%RbgrL!aa?KsNh!X1T;UbvkdKkfm&j@+pxwVy}LeL*P ziBfu!?r(%oY)lX&yXsTdJ+a}j9xlA9-5B|DnkZd^Usbfd9L{luCZ8Av6bN zZFg@N5)aa{5VY&swTC`WKOaV>HkR%jFbp9yQ{%4N$j)Tt3yUSP$=6qpXh6^U_s#fK z)khP@pAtlAIvv67^Jgo z2{x_qa4~}6+=jkOcFrXWf-A&yu<>=jK)S!V&q9ts?W`BE{(}|WajG*(VIjT6U&Ujc zMexbhbah+v?fTvki+cj$A~|M1vPg3Tw`4=)L`<^e&?9lvni=_h_{?fc`hgg= zBS{tVw)nN$*shth3U#O4q*1h?v|Ct!jqDHQgbzc3r6pG8fX zuW+Pd{}G0H>PK8pNBrd-mek!+qWXITPp!$Ae`6qfr)v6(;uk9>l}Wnv*_73f-a|Ij z|H6i#BvSw04byN(x0-oVclL>9I_Dp7&yU&d)>bl3`I^O3JVx40nBys9s0 z`qMJ{xN`<~D*Z!aB=h{9hTawY(Yi=>xV2N=xgEBAwrXwV&C2PQu+(KFTADlYJPejI zSK_~%#h`;Tq;srP*7K=~K)|fQ2ZgPN6PvUW>maBpXhA?4J0mE^6!U+gRwpdwb8ep$ ZmzkPw@rfRj#$h9vg4;>H4S%7B{{)LO6>b0k diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/typedefs.h b/Triangulation_3_copy_tds/demo/Triangulation_3/typedefs.h deleted file mode 100644 index f754ff5a400..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3/typedefs.h +++ /dev/null @@ -1,101 +0,0 @@ -#ifndef TYPEDEFS_H -#define TYPEDEFS_H - -#include //dynamic array -#include //linked list - -// CGAL -#include -#include - -// Added for T3 demo -#include -#include - -// Use EPEC as Kernel -// Note: the computation of VD requires exact constructions; -// while computing the triangulation only requires exact predicates. -typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; - -// Ddefine field type -typedef Kernel::FT FT; - -typedef Kernel::Vector_3 Vector_3; -typedef Kernel::Direction_3 Direction_3; - -//typedef Kernel::Point_3 Point_3; -//typedef Kernel::Vector_3 Vector_3; -//typedef Kernel::Segment_3 Segment_3; -//typedef Kernel::Triangle_3 Triangle_3; - -// Added for T3 demo - -/* - * The user has several ways to add his own data in the vertex - * and cell base classes used by the TDS. He can either: * 1. use the classes Triangulation vertex base with info - * and Triangulation cell base with info, which allow to - * add one data member of a user provided type, and give access to it. * 2. derive his own classes from the default base classes - * Triangulation ds vertex base, and Triangulation ds cell base - * (or the geometric versions typically used by the geometric layer, - * Triangulation vertex base, and Triangulation cell base). * 3. write his own base classes following the requirements given by the concepts - * TriangulationCellBase 3 and TriangulationVertexBase 3 - * (described in page 2494 and page 2495). - */ -/* add index and color to vertex class */ -template < class GT, class Vb=CGAL::Triangulation_vertex_base_3 > -class Vertex_base : public Vb -{ -public: - typedef typename Vb::Point Point; - typedef typename Vb::Vertex_handle Vertex_handle; - typedef typename Vb::Cell_handle Cell_handle; - - template < class TDS2 > - struct Rebind_TDS { - typedef typename Vb::template Rebind_TDS::Other Vb2; - typedef Vertex_base< GT, Vb2 > Other; - }; - Vertex_base() - : m_isSelected(false) {} - Vertex_base(const Point& p) - : Vb(p), m_isSelected(false) {} - Vertex_base(const Point& p, Cell_handle c) - : Vb(p, c), m_isSelected(false) {} - - inline bool isSeled() const { return m_isSelected; } - inline void setSeled(bool flag=true) { m_isSelected = flag; } - -private: - bool m_isSelected; // whether it is selected -}; - -typedef CGAL::Triangulation_data_structure_3< Vertex_base > Tds; -/* - * Delaunay_triangulation_3 - * arg1: a model of the DelaunayTriangulationTraits_3 concept - * arg2: a model of the TriangulationDataStructure_3 concept - * default: Triangulation_data_structure_3 - * arg3: Fast_location or Compact_location (default) - * Fast_location offers O(logn) time point location, using additional data structure, - * good for fast point locations or random point insertions - * Compact_location saves memory by avoiding the separate data structure - * and point location is then O(n^(1/3)) time - */ -typedef CGAL::Delaunay_triangulation_3 DT3; - -typedef DT3::Object Object_3; -typedef DT3::Point Point_3; -typedef DT3::Segment Segment_3; -typedef DT3::Ray Ray_3; -typedef DT3::Triangle Triangle_3; - -typedef DT3::Vertex_handle Vertex_handle; -typedef DT3::Finite_vertices_iterator vertices_iterator; -typedef DT3::Edge Edge; -typedef DT3::Finite_edges_iterator edges_iterator; -typedef DT3::Facet Facet; -typedef DT3::Finite_facets_iterator facets_iterator; -typedef DT3::Cell_handle Cell_handle; -typedef DT3::Finite_cells_iterator cells_iterator; - -#endif diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3/ui_MainWindow.h b/Triangulation_3_copy_tds/demo/Triangulation_3/ui_MainWindow.h deleted file mode 100644 index 2e7cf4df3b2..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3/ui_MainWindow.h +++ /dev/null @@ -1,584 +0,0 @@ -/******************************************************************************** -** Form generated from reading ui file 'MainWindow.ui' -** -** Created: Mon Dec 20 14:14:32 2010 -** by: Qt User Interface Compiler version 4.4.1 -** -** WARNING! All changes made in this file will be lost when recompiling ui file! -********************************************************************************/ - -#ifndef UI_MAINWINDOW_H -#define UI_MAINWINDOW_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "Viewer.h" - -QT_BEGIN_NAMESPACE - -class Ui_MainWindow -{ -public: - QAction *actionGenerate_Points; - QAction *actionLoad_Points; - QAction *actionSave_Points; - QAction *actionShow_Axis; - QAction *actionQuit; - QAction *actionClear_Scene; - QAction *actionShow_Vertex; - QAction *actionShow_DEdge; - QAction *actionShow_VEdge; - QAction *actionShow_Facet; - QAction *actionFlat; - QAction *actionPreferences; - QAction *actionInsert_Vertex; - QAction *actionInsert_Point; - QAction *actionSelect_Vertex; - QAction *actionMove_Vertex; - QAction *actionFind_NearestNb; - QAction *actionEmpty_Sphere; - QAction *actionNormal_View; - QAction *actionDemo_Help; - QAction *actionIncremental_Construct; - QAction *actionStop_Animation; - QAction *actionAbout_T3_demo; - QWidget *centralwidget; - QHBoxLayout *horizontalLayout; - Viewer *viewer; - QMenuBar *menubar; - QMenu *menuFile; - QMenu *menuEdit; - QMenu *menuMode; - QMenu *menuShow; - QMenu *menuHelp; - QStatusBar *statusbar; - QToolBar *toolBar; - - void setupUi(QMainWindow *MainWindow) - { - if (MainWindow->objectName().isEmpty()) - MainWindow->setObjectName(QString::fromUtf8("MainWindow")); - MainWindow->setWindowModality(Qt::NonModal); - MainWindow->resize(1100, 500); - QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); - sizePolicy.setHorizontalStretch(0); - sizePolicy.setVerticalStretch(0); - sizePolicy.setHeightForWidth(MainWindow->sizePolicy().hasHeightForWidth()); - MainWindow->setSizePolicy(sizePolicy); - QFont font; - font.setFamily(QString::fromUtf8("Arial")); - MainWindow->setFont(font); - MainWindow->setCursor(QCursor(Qt::PointingHandCursor)); - QIcon icon; - icon.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/cgal_logo.xpm")), QIcon::Normal, QIcon::Off); - MainWindow->setWindowIcon(icon); - actionGenerate_Points = new QAction(MainWindow); - actionGenerate_Points->setObjectName(QString::fromUtf8("actionGenerate_Points")); - QIcon icon1; - icon1.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/pointRandom.png")), QIcon::Normal, QIcon::Off); - actionGenerate_Points->setIcon(icon1); - actionLoad_Points = new QAction(MainWindow); - actionLoad_Points->setObjectName(QString::fromUtf8("actionLoad_Points")); - QIcon icon2; - icon2.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/fileOpen.png")), QIcon::Normal, QIcon::Off); - actionLoad_Points->setIcon(icon2); - actionSave_Points = new QAction(MainWindow); - actionSave_Points->setObjectName(QString::fromUtf8("actionSave_Points")); - QIcon icon3; - icon3.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/fileSave.png")), QIcon::Normal, QIcon::Off); - actionSave_Points->setIcon(icon3); - actionShow_Axis = new QAction(MainWindow); - actionShow_Axis->setObjectName(QString::fromUtf8("actionShow_Axis")); - actionShow_Axis->setCheckable(true); - QIcon icon4; - icon4.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/coordinates.jpeg")), QIcon::Normal, QIcon::Off); - actionShow_Axis->setIcon(icon4); - actionQuit = new QAction(MainWindow); - actionQuit->setObjectName(QString::fromUtf8("actionQuit")); - QIcon icon5; - icon5.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/quit.jpeg")), QIcon::Normal, QIcon::Off); - actionQuit->setIcon(icon5); - actionClear_Scene = new QAction(MainWindow); - actionClear_Scene->setObjectName(QString::fromUtf8("actionClear_Scene")); - QIcon icon6; - icon6.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/clear.jpeg")), QIcon::Normal, QIcon::Off); - actionClear_Scene->setIcon(icon6); - actionShow_Vertex = new QAction(MainWindow); - actionShow_Vertex->setObjectName(QString::fromUtf8("actionShow_Vertex")); - actionShow_Vertex->setCheckable(true); - actionShow_Vertex->setChecked(true); - QIcon icon7; - icon7.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/show_point.jpeg")), QIcon::Normal, QIcon::Off); - actionShow_Vertex->setIcon(icon7); - actionShow_DEdge = new QAction(MainWindow); - actionShow_DEdge->setObjectName(QString::fromUtf8("actionShow_DEdge")); - actionShow_DEdge->setCheckable(true); - actionShow_DEdge->setChecked(true); - QIcon icon8; - icon8.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/show_delaunay.jpeg")), QIcon::Normal, QIcon::Off); - actionShow_DEdge->setIcon(icon8); - actionShow_VEdge = new QAction(MainWindow); - actionShow_VEdge->setObjectName(QString::fromUtf8("actionShow_VEdge")); - actionShow_VEdge->setCheckable(true); - QIcon icon9; - icon9.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/show_voronoi.jpeg")), QIcon::Normal, QIcon::Off); - actionShow_VEdge->setIcon(icon9); - actionShow_Facet = new QAction(MainWindow); - actionShow_Facet->setObjectName(QString::fromUtf8("actionShow_Facet")); - actionShow_Facet->setCheckable(true); - QIcon icon10; - icon10.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/show_facet.jpeg")), QIcon::Normal, QIcon::Off); - actionShow_Facet->setIcon(icon10); - actionFlat = new QAction(MainWindow); - actionFlat->setObjectName(QString::fromUtf8("actionFlat")); - actionFlat->setCheckable(true); - QIcon icon11; - icon11.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/flat.png")), QIcon::Normal, QIcon::Off); - icon11.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/stereo.png")), QIcon::Normal, QIcon::On); - actionFlat->setIcon(icon11); - actionPreferences = new QAction(MainWindow); - actionPreferences->setObjectName(QString::fromUtf8("actionPreferences")); - QIcon icon12; - icon12.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/preferences.jpeg")), QIcon::Normal, QIcon::Off); - actionPreferences->setIcon(icon12); - actionInsert_Vertex = new QAction(MainWindow); - actionInsert_Vertex->setObjectName(QString::fromUtf8("actionInsert_Vertex")); - actionInsert_Vertex->setCheckable(true); - QIcon icon13; - icon13.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/insert.jpeg")), QIcon::Normal, QIcon::Off); - actionInsert_Vertex->setIcon(icon13); - actionInsert_Point = new QAction(MainWindow); - actionInsert_Point->setObjectName(QString::fromUtf8("actionInsert_Point")); - actionInsert_Point->setCheckable(true); - QIcon icon14; - icon14.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/insert_point.jpg")), QIcon::Normal, QIcon::Off); - actionInsert_Point->setIcon(icon14); - actionSelect_Vertex = new QAction(MainWindow); - actionSelect_Vertex->setObjectName(QString::fromUtf8("actionSelect_Vertex")); - actionSelect_Vertex->setCheckable(true); - QIcon icon15; - icon15.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/select_hand.jpeg")), QIcon::Normal, QIcon::Off); - actionSelect_Vertex->setIcon(icon15); - actionMove_Vertex = new QAction(MainWindow); - actionMove_Vertex->setObjectName(QString::fromUtf8("actionMove_Vertex")); - actionMove_Vertex->setCheckable(true); - QIcon icon16; - icon16.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/move_1.jpeg")), QIcon::Normal, QIcon::Off); - actionMove_Vertex->setIcon(icon16); - actionFind_NearestNb = new QAction(MainWindow); - actionFind_NearestNb->setObjectName(QString::fromUtf8("actionFind_NearestNb")); - actionFind_NearestNb->setCheckable(true); - QIcon icon17; - icon17.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/nearest_nb.png")), QIcon::Normal, QIcon::Off); - actionFind_NearestNb->setIcon(icon17); - actionEmpty_Sphere = new QAction(MainWindow); - actionEmpty_Sphere->setObjectName(QString::fromUtf8("actionEmpty_Sphere")); - actionEmpty_Sphere->setCheckable(true); - QIcon icon18; - icon18.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/empty_sphere.jpeg")), QIcon::Normal, QIcon::Off); - actionEmpty_Sphere->setIcon(icon18); - actionNormal_View = new QAction(MainWindow); - actionNormal_View->setObjectName(QString::fromUtf8("actionNormal_View")); - actionNormal_View->setCheckable(true); - actionNormal_View->setChecked(true); - QIcon icon19; - icon19.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/normal_view.jpeg")), QIcon::Normal, QIcon::Off); - actionNormal_View->setIcon(icon19); - actionDemo_Help = new QAction(MainWindow); - actionDemo_Help->setObjectName(QString::fromUtf8("actionDemo_Help")); - actionIncremental_Construct = new QAction(MainWindow); - actionIncremental_Construct->setObjectName(QString::fromUtf8("actionIncremental_Construct")); - actionIncremental_Construct->setCheckable(true); - QIcon icon20; - icon20.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/play.jpeg")), QIcon::Normal, QIcon::Off); - icon20.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/pause.jpeg")), QIcon::Normal, QIcon::On); - actionIncremental_Construct->setIcon(icon20); - actionStop_Animation = new QAction(MainWindow); - actionStop_Animation->setObjectName(QString::fromUtf8("actionStop_Animation")); - QIcon icon21; - icon21.addPixmap(QPixmap(QString::fromUtf8(":/T3_demo/icons/icons/stop.jpeg")), QIcon::Normal, QIcon::Off); - actionStop_Animation->setIcon(icon21); - actionAbout_T3_demo = new QAction(MainWindow); - actionAbout_T3_demo->setObjectName(QString::fromUtf8("actionAbout_T3_demo")); - centralwidget = new QWidget(MainWindow); - centralwidget->setObjectName(QString::fromUtf8("centralwidget")); - horizontalLayout = new QHBoxLayout(centralwidget); - horizontalLayout->setSpacing(3); - horizontalLayout->setMargin(1); - horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout")); - viewer = new Viewer(centralwidget); - viewer->setObjectName(QString::fromUtf8("viewer")); - sizePolicy.setHeightForWidth(viewer->sizePolicy().hasHeightForWidth()); - viewer->setSizePolicy(sizePolicy); - viewer->setCursor(QCursor(Qt::PointingHandCursor)); - - horizontalLayout->addWidget(viewer); - - MainWindow->setCentralWidget(centralwidget); - menubar = new QMenuBar(MainWindow); - menubar->setObjectName(QString::fromUtf8("menubar")); - menubar->setGeometry(QRect(0, 0, 1010, 22)); - menuFile = new QMenu(menubar); - menuFile->setObjectName(QString::fromUtf8("menuFile")); - menuEdit = new QMenu(menubar); - menuEdit->setObjectName(QString::fromUtf8("menuEdit")); - menuMode = new QMenu(menubar); - menuMode->setObjectName(QString::fromUtf8("menuMode")); - menuShow = new QMenu(menubar); - menuShow->setObjectName(QString::fromUtf8("menuShow")); - menuHelp = new QMenu(menubar); - menuHelp->setObjectName(QString::fromUtf8("menuHelp")); - MainWindow->setMenuBar(menubar); - statusbar = new QStatusBar(MainWindow); - statusbar->setObjectName(QString::fromUtf8("statusbar")); - MainWindow->setStatusBar(statusbar); - toolBar = new QToolBar(MainWindow); - toolBar->setObjectName(QString::fromUtf8("toolBar")); - MainWindow->addToolBar(Qt::TopToolBarArea, toolBar); - - menubar->addAction(menuFile->menuAction()); - menubar->addAction(menuEdit->menuAction()); - menubar->addAction(menuMode->menuAction()); - menubar->addAction(menuShow->menuAction()); - menubar->addAction(menuHelp->menuAction()); - menuFile->addAction(actionLoad_Points); - menuFile->addAction(actionSave_Points); - menuFile->addSeparator(); - menuFile->addAction(actionQuit); - menuEdit->addAction(actionGenerate_Points); - menuEdit->addSeparator(); - menuEdit->addAction(actionIncremental_Construct); - menuEdit->addAction(actionStop_Animation); - menuEdit->addSeparator(); - menuEdit->addAction(actionClear_Scene); - menuMode->addAction(actionNormal_View); - menuMode->addAction(actionInsert_Vertex); - menuMode->addAction(actionInsert_Point); - menuMode->addAction(actionSelect_Vertex); - menuMode->addAction(actionMove_Vertex); - menuMode->addAction(actionFind_NearestNb); - menuMode->addAction(actionEmpty_Sphere); - menuShow->addAction(actionShow_Axis); - menuShow->addSeparator(); - menuShow->addAction(actionShow_Vertex); - menuShow->addAction(actionShow_DEdge); - menuShow->addAction(actionShow_VEdge); - menuShow->addAction(actionShow_Facet); - menuShow->addSeparator(); - menuShow->addAction(actionFlat); - menuShow->addSeparator(); - menuShow->addAction(actionPreferences); - menuHelp->addAction(actionDemo_Help); - menuHelp->addAction(actionAbout_T3_demo); - toolBar->addAction(actionLoad_Points); - toolBar->addAction(actionSave_Points); - toolBar->addSeparator(); - toolBar->addAction(actionGenerate_Points); - toolBar->addAction(actionClear_Scene); - toolBar->addSeparator(); - toolBar->addAction(actionIncremental_Construct); - toolBar->addAction(actionStop_Animation); - toolBar->addSeparator(); - toolBar->addAction(actionShow_Axis); - toolBar->addSeparator(); - toolBar->addAction(actionFlat); - toolBar->addSeparator(); - toolBar->addAction(actionShow_Vertex); - toolBar->addAction(actionShow_DEdge); - toolBar->addAction(actionShow_VEdge); - toolBar->addAction(actionShow_Facet); - toolBar->addSeparator(); - toolBar->addAction(actionNormal_View); - toolBar->addAction(actionInsert_Vertex); - toolBar->addAction(actionInsert_Point); - toolBar->addAction(actionSelect_Vertex); - toolBar->addAction(actionMove_Vertex); - toolBar->addAction(actionFind_NearestNb); - toolBar->addAction(actionEmpty_Sphere); - toolBar->addSeparator(); - toolBar->addAction(actionPreferences); - toolBar->addSeparator(); - toolBar->addAction(actionQuit); - - retranslateUi(MainWindow); - - QMetaObject::connectSlotsByName(MainWindow); - } // setupUi - - void retranslateUi(QMainWindow *MainWindow) - { - MainWindow->setWindowTitle(QApplication::translate("MainWindow", "Triangulation_demo_3", 0, QApplication::UnicodeUTF8)); - actionGenerate_Points->setText(QApplication::translate("MainWindow", "Generate Points", 0, QApplication::UnicodeUTF8)); - -#ifndef QT_NO_TOOLTIP - actionGenerate_Points->setToolTip(QApplication::translate("MainWindow", "Generate Points", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_TOOLTIP - - -#ifndef QT_NO_STATUSTIP - actionGenerate_Points->setStatusTip(QApplication::translate("MainWindow", "Generate Points", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_STATUSTIP - - actionGenerate_Points->setShortcut(QApplication::translate("MainWindow", "Ctrl+G", 0, QApplication::UnicodeUTF8)); - actionLoad_Points->setText(QApplication::translate("MainWindow", "Load Points...", 0, QApplication::UnicodeUTF8)); - -#ifndef QT_NO_TOOLTIP - actionLoad_Points->setToolTip(QApplication::translate("MainWindow", "Load Points from a file", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_TOOLTIP - - -#ifndef QT_NO_STATUSTIP - actionLoad_Points->setStatusTip(QApplication::translate("MainWindow", "Load Points from a file", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_STATUSTIP - - actionLoad_Points->setShortcut(QApplication::translate("MainWindow", "Ctrl+O", 0, QApplication::UnicodeUTF8)); - actionSave_Points->setText(QApplication::translate("MainWindow", "Save Points...", 0, QApplication::UnicodeUTF8)); - -#ifndef QT_NO_TOOLTIP - actionSave_Points->setToolTip(QApplication::translate("MainWindow", "Save points to a file", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_TOOLTIP - - -#ifndef QT_NO_STATUSTIP - actionSave_Points->setStatusTip(QApplication::translate("MainWindow", "Save points to a file", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_STATUSTIP - - actionSave_Points->setShortcut(QApplication::translate("MainWindow", "Ctrl+S", 0, QApplication::UnicodeUTF8)); - actionShow_Axis->setText(QApplication::translate("MainWindow", "Show Axis", 0, QApplication::UnicodeUTF8)); - -#ifndef QT_NO_TOOLTIP - actionShow_Axis->setToolTip(QApplication::translate("MainWindow", "Show/Hide Axis", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_TOOLTIP - - -#ifndef QT_NO_STATUSTIP - actionShow_Axis->setStatusTip(QApplication::translate("MainWindow", "Show/Hide Axis", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_STATUSTIP - - actionQuit->setText(QApplication::translate("MainWindow", "Quit", 0, QApplication::UnicodeUTF8)); - -#ifndef QT_NO_TOOLTIP - actionQuit->setToolTip(QApplication::translate("MainWindow", "Quit", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_TOOLTIP - - -#ifndef QT_NO_STATUSTIP - actionQuit->setStatusTip(QApplication::translate("MainWindow", "Quit", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_STATUSTIP - - actionClear_Scene->setText(QApplication::translate("MainWindow", "Clear Scene", 0, QApplication::UnicodeUTF8)); - -#ifndef QT_NO_TOOLTIP - actionClear_Scene->setToolTip(QApplication::translate("MainWindow", "Clear Scene", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_TOOLTIP - - -#ifndef QT_NO_STATUSTIP - actionClear_Scene->setStatusTip(QApplication::translate("MainWindow", "Clear Scene", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_STATUSTIP - - actionShow_Vertex->setText(QApplication::translate("MainWindow", "Show Vertices", 0, QApplication::UnicodeUTF8)); - -#ifndef QT_NO_TOOLTIP - actionShow_Vertex->setToolTip(QApplication::translate("MainWindow", "Show Vertices", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_TOOLTIP - - -#ifndef QT_NO_STATUSTIP - actionShow_Vertex->setStatusTip(QApplication::translate("MainWindow", "Show Vertices", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_STATUSTIP - - actionShow_DEdge->setText(QApplication::translate("MainWindow", "Show Delaunay Edges", 0, QApplication::UnicodeUTF8)); - -#ifndef QT_NO_TOOLTIP - actionShow_DEdge->setToolTip(QApplication::translate("MainWindow", "Show Delaunay edges", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_TOOLTIP - - -#ifndef QT_NO_STATUSTIP - actionShow_DEdge->setStatusTip(QApplication::translate("MainWindow", "Show Delaunay edges", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_STATUSTIP - - actionShow_VEdge->setText(QApplication::translate("MainWindow", "Show Voronoi Edges", 0, QApplication::UnicodeUTF8)); - -#ifndef QT_NO_TOOLTIP - actionShow_VEdge->setToolTip(QApplication::translate("MainWindow", "Show Voronoi edges", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_TOOLTIP - - -#ifndef QT_NO_STATUSTIP - actionShow_VEdge->setStatusTip(QApplication::translate("MainWindow", "Show Voronoi edges", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_STATUSTIP - - actionShow_Facet->setText(QApplication::translate("MainWindow", "Show Facets", 0, QApplication::UnicodeUTF8)); - -#ifndef QT_NO_TOOLTIP - actionShow_Facet->setToolTip(QApplication::translate("MainWindow", "Show Delaunay Facets", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_TOOLTIP - - -#ifndef QT_NO_STATUSTIP - actionShow_Facet->setStatusTip(QApplication::translate("MainWindow", "Show Delaunay Facets", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_STATUSTIP - - actionFlat->setText(QApplication::translate("MainWindow", "Flat", 0, QApplication::UnicodeUTF8)); - -#ifndef QT_NO_TOOLTIP - actionFlat->setToolTip(QApplication::translate("MainWindow", "Toggle 3D effect", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_TOOLTIP - - -#ifndef QT_NO_STATUSTIP - actionFlat->setStatusTip(QApplication::translate("MainWindow", "Toggle 3D effect", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_STATUSTIP - - actionPreferences->setText(QApplication::translate("MainWindow", "Preferences...", 0, QApplication::UnicodeUTF8)); - -#ifndef QT_NO_TOOLTIP - actionPreferences->setToolTip(QApplication::translate("MainWindow", "Change Colors, Transparency, etc.", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_TOOLTIP - - -#ifndef QT_NO_STATUSTIP - actionPreferences->setStatusTip(QApplication::translate("MainWindow", "Change Colors, Transparency, etc.", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_STATUSTIP - - actionInsert_Vertex->setText(QApplication::translate("MainWindow", "Insert Vertex", 0, QApplication::UnicodeUTF8)); - -#ifndef QT_NO_TOOLTIP - actionInsert_Vertex->setToolTip(QApplication::translate("MainWindow", "Insert a vertex and update the triangulation", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_TOOLTIP - - -#ifndef QT_NO_STATUSTIP - actionInsert_Vertex->setStatusTip(QApplication::translate("MainWindow", "Insert a vertex and update the triangulation", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_STATUSTIP - - actionInsert_Point->setText(QApplication::translate("MainWindow", "Insert Point", 0, QApplication::UnicodeUTF8)); - -#ifndef QT_NO_TOOLTIP - actionInsert_Point->setToolTip(QApplication::translate("MainWindow", "Insert a point and show its conflict region", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_TOOLTIP - - -#ifndef QT_NO_STATUSTIP - actionInsert_Point->setStatusTip(QApplication::translate("MainWindow", "Insert a point and show its conflict region", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_STATUSTIP - - actionSelect_Vertex->setText(QApplication::translate("MainWindow", "Select Vertex", 0, QApplication::UnicodeUTF8)); - -#ifndef QT_NO_TOOLTIP - actionSelect_Vertex->setToolTip(QApplication::translate("MainWindow", "Select vertices", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_TOOLTIP - - -#ifndef QT_NO_STATUSTIP - actionSelect_Vertex->setStatusTip(QApplication::translate("MainWindow", "Select vertices", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_STATUSTIP - - actionMove_Vertex->setText(QApplication::translate("MainWindow", "Move Vertex", 0, QApplication::UnicodeUTF8)); - -#ifndef QT_NO_TOOLTIP - actionMove_Vertex->setToolTip(QApplication::translate("MainWindow", "Move a vertex", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_TOOLTIP - - -#ifndef QT_NO_STATUSTIP - actionMove_Vertex->setStatusTip(QApplication::translate("MainWindow", "Move a vertex", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_STATUSTIP - - actionFind_NearestNb->setText(QApplication::translate("MainWindow", "Nearest Neighbor Search", 0, QApplication::UnicodeUTF8)); - -#ifndef QT_NO_TOOLTIP - actionFind_NearestNb->setToolTip(QApplication::translate("MainWindow", "Find the nearest neighbor of the query point", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_TOOLTIP - - -#ifndef QT_NO_STATUSTIP - actionFind_NearestNb->setStatusTip(QApplication::translate("MainWindow", "Find the nearest neighbor of the query point", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_STATUSTIP - - actionEmpty_Sphere->setText(QApplication::translate("MainWindow", "Show Empty Sphere", 0, QApplication::UnicodeUTF8)); - actionEmpty_Sphere->setIconText(QApplication::translate("MainWindow", "Click to select a cell and show empty sphere of that cell.", 0, QApplication::UnicodeUTF8)); - -#ifndef QT_NO_TOOLTIP - actionEmpty_Sphere->setToolTip(QApplication::translate("MainWindow", "Locate the query point in a cell and show empty sphere of that cell", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_TOOLTIP - - -#ifndef QT_NO_STATUSTIP - actionEmpty_Sphere->setStatusTip(QApplication::translate("MainWindow", "Locate the query point in a cell and show empty sphere of that cell", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_STATUSTIP - - actionNormal_View->setText(QApplication::translate("MainWindow", "Normal Mode", 0, QApplication::UnicodeUTF8)); - -#ifndef QT_NO_TOOLTIP - actionNormal_View->setToolTip(QApplication::translate("MainWindow", "Normal Mode", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_TOOLTIP - - -#ifndef QT_NO_STATUSTIP - actionNormal_View->setStatusTip(QApplication::translate("MainWindow", "Normal Mode", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_STATUSTIP - - actionDemo_Help->setText(QApplication::translate("MainWindow", "Triangulation_3D Demo Help", 0, QApplication::UnicodeUTF8)); - -#ifndef QT_NO_TOOLTIP - actionDemo_Help->setToolTip(QApplication::translate("MainWindow", "Triangulation_3D Demo Help", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_TOOLTIP - - -#ifndef QT_NO_STATUSTIP - actionDemo_Help->setStatusTip(QApplication::translate("MainWindow", "Triangulation_3D Demo Help", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_STATUSTIP - - actionDemo_Help->setShortcut(QApplication::translate("MainWindow", "H", 0, QApplication::UnicodeUTF8)); - actionIncremental_Construct->setText(QApplication::translate("MainWindow", "Insertion Animation", 0, QApplication::UnicodeUTF8)); - -#ifndef QT_NO_TOOLTIP - actionIncremental_Construct->setToolTip(QApplication::translate("MainWindow", "Animation of incremental Delaunay triangulation", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_TOOLTIP - - -#ifndef QT_NO_STATUSTIP - actionIncremental_Construct->setStatusTip(QApplication::translate("MainWindow", "Animation of incremental Delaunay triangulation", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_STATUSTIP - - actionStop_Animation->setText(QApplication::translate("MainWindow", "Stop Animation", 0, QApplication::UnicodeUTF8)); - -#ifndef QT_NO_TOOLTIP - actionStop_Animation->setToolTip(QApplication::translate("MainWindow", "Stop Animation", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_TOOLTIP - - -#ifndef QT_NO_STATUSTIP - actionStop_Animation->setStatusTip(QApplication::translate("MainWindow", "Stop Animation", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_STATUSTIP - - actionAbout_T3_demo->setText(QApplication::translate("MainWindow", "About T3_demo", 0, QApplication::UnicodeUTF8)); - menuFile->setTitle(QApplication::translate("MainWindow", "&File", 0, QApplication::UnicodeUTF8)); - menuEdit->setTitle(QApplication::translate("MainWindow", "Edit", 0, QApplication::UnicodeUTF8)); - menuMode->setTitle(QApplication::translate("MainWindow", "Mode", 0, QApplication::UnicodeUTF8)); - menuShow->setTitle(QApplication::translate("MainWindow", "Show", 0, QApplication::UnicodeUTF8)); - menuHelp->setTitle(QApplication::translate("MainWindow", "Help", 0, QApplication::UnicodeUTF8)); - toolBar->setWindowTitle(QApplication::translate("MainWindow", "toolBar", 0, QApplication::UnicodeUTF8)); - } // retranslateUi - -}; - -namespace Ui { - class MainWindow: public Ui_MainWindow {}; -} // namespace Ui - -QT_END_NAMESPACE - -#endif // UI_MAINWINDOW_H diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/CMakeLists.txt b/Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/CMakeLists.txt deleted file mode 100644 index 3b6cb7ba399..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/CMakeLists.txt +++ /dev/null @@ -1,33 +0,0 @@ -# Created by the script cgal_create_cmake_script -# This is the CMake script for compiling a CGAL application. - - -project( Triangulation_3_Demo ) - -CMAKE_MINIMUM_REQUIRED(VERSION 2.4.5) - -set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true) - -if ( COMMAND cmake_policy ) - cmake_policy( SET CMP0003 NEW ) -endif() - -find_package(CGAL QUIET COMPONENTS Core ) - -if ( CGAL_FOUND ) - - include( ${CGAL_USE_FILE} ) - - include( CGAL_CreateSingleSourceCGALProgram ) - - create_single_source_cgal_program( "Triangulation_3_demo.cpp" ) - create_single_source_cgal_program( "Triangulation_3_color_demo.cpp" ) - create_single_source_cgal_program( "Triangulation_3_remove_demo.cpp" ) - create_single_source_cgal_program( "Triangulation_3_voronoi_demo.cpp" ) - -else() - - message(STATUS "This program requires the CGAL library, and will not be compiled.") - -endif() - diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/README b/Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/README deleted file mode 100644 index 2a2042cfc89..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/README +++ /dev/null @@ -1,39 +0,0 @@ -The demos use Geomview -[see the chapter Geomview in the cgal manual - support library: -Geomview 1.8.1 is required. The geomview command must be in the user's $PATH, -otherwise the program will not be able to execute.] - -------- demo ------------------------------------------------- -Construction of a Delaunay triangulation. - -Needs an input file "data/points" containing points (given by x y z) - -Draws the triangulation (vertices and edges) in geomview - -Locates a point a shows the cell containing it - -Draws the triangulation (edges and cells) in geomview, -then the user can move one of the two displayed versions -of the triangulation. --------------------------------------------------------------- - -------- demo_color ------------------------------------------- -Constructs a Delaunay triangulation with a special Vertex base class -containing a color (white by default). - -Sets the color of degree 6 vertices to red. - -Displays the triangulation where each vertex has its own color. --------------------------------------------------------------- - -------- demo_voronoi ------------------------------------------ -Constructs a Delaunay triangulation for points on a grid. - -Displays the Voronoi edges of the set of points --------------------------------------------------------------- - -------- demo_remove ------------------------------------------ -Constructs a Delaunay triangulation for points on a grid. - -Then removes all the vertices in random order --------------------------------------------------------------- diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/Triangulation_3_color_demo.cpp b/Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/Triangulation_3_color_demo.cpp deleted file mode 100644 index 4b1765b0124..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/Triangulation_3_color_demo.cpp +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) 2001, 2002, 2003, 2004, 2005 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Monique Teillaud - -#include - -#ifndef CGAL_USE_GEOMVIEW -#include -int main() -{ - std::cerr << "Geomview doesn't work on this platform," - " so this demo doesn't work" << std::endl; - return 0; -} -#else - -#include - -#include -#include - -#include - -typedef CGAL::Exact_predicates_inexact_constructions_kernel K; - -typedef CGAL::Triangulation_vertex_base_with_info_3 Vb; -typedef CGAL::Triangulation_data_structure_3 Tds; -typedef CGAL::Delaunay_triangulation_3 Delaunay; - -typedef Delaunay::Point Point; - -int main() -{ - CGAL::Geomview_stream gv(CGAL::Bbox_3(0,0,0, 2, 2, 2)); - gv.set_bg_color(CGAL::Color(0, 200, 200)); - gv.clear(); - - Delaunay T; - - T.insert(Point(0,0,0)); - T.insert(Point(1,0,0)); - T.insert(Point(0,1,0)); - T.insert(Point(0,0,1)); - T.insert(Point(2,2,2)); - T.insert(Point(-1,0,1)); - - // Set the color of finite vertices of degree 6 to red. - Delaunay::Finite_vertices_iterator vit; - for (vit = T.finite_vertices_begin(); vit != T.finite_vertices_end(); ++vit) - if (T.degree(vit) == 6) - vit->info() = CGAL::RED; - - std::cout << " Visualization of T" << std::endl; - gv.set_wired(true); - gv << T; - - std::cout << " Vertices of T with their own color" << std::endl - << " red for degree 6 (counting infinite vertex)" - << std::endl - << " white otherwise" << std::endl; - for (vit = T.finite_vertices_begin(); vit != T.finite_vertices_end(); ++vit) - gv << vit->info() << vit->point(); - - std::cout << "Enter any character to quit" << std::endl; - char ch; - std::cin >> ch; - - return 0; -} - -#endif // CGAL_USE_GEOMVIEW diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/Triangulation_3_demo.cpp b/Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/Triangulation_3_demo.cpp deleted file mode 100644 index 73b0016dfae..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/Triangulation_3_demo.cpp +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Monique Teillaud - -#include - -#ifndef CGAL_USE_GEOMVIEW -#include -int main() -{ - std::cerr << "Geomview doesn't work on this platform," - " so this demo doesn't work" << std::endl; - return 0; -} -#else - -#include - -#include - -#include - -#include -#include -#include -#include - -typedef CGAL::Exact_predicates_inexact_constructions_kernel K; - -typedef CGAL::Delaunay_triangulation_3 Triangulation; - -typedef Triangulation::Finite_vertices_iterator Finite_vertices_iterator; -typedef Triangulation::Cell_handle Cell_handle; -typedef Triangulation::Locate_type Locate_type; -typedef Triangulation::Point Point; - -////////////////////// -// VISU GEOMVIEW -////////////////////// -template -void visu_cell(CGAL::Geomview_stream & os, const TRIANGULATION & T, - Cell_handle c) -{ - if ( ! T.is_infinite(c) ) - os << T.tetrahedron(c); - else - os << T.triangle(c,c->index(T.infinite_vertex())); -} -template -void visu_facet(CGAL::Geomview_stream & os, const TRIANGULATION & T, - Cell_handle c, int i) -{ - if ( ! T.is_infinite(c,i) ) - os << T.triangle(c,i); -} -template -void visu_edge(CGAL::Geomview_stream & os, const TRIANGULATION & T, - Cell_handle c, int i, int j) -{ - if ( ! T.is_infinite(c,i,j) ) - os << T.segment(c,i,j); -} -template -void visu_vertices(CGAL::Geomview_stream & os, const TRIANGULATION & T) -{ - Finite_vertices_iterator vit = T.finite_vertices_begin(); - Finite_vertices_iterator vdone = T.finite_vertices_end(); - - if ( vit == vdone ) { std::cout << "no vertex" << std::endl ;} - else { - while(vit != vdone) { - os << vit->point(); - ++vit; - } - } -} -template -void visu_vertex(CGAL::Geomview_stream & os, const TRIANGULATION & T, - Cell_handle c, int i) -{ - if ( ! T.is_infinite(c->vertex(i)) ) - os << c->vertex(i)->point(); -} - -////////////////////// - -int main() -{ - CGAL::Geomview_stream gv(CGAL::Bbox_3(0,0,0, 2, 2, 2)); - gv.set_bg_color(CGAL::Color(0, 200, 200)); - gv.clear(); - - Triangulation T; - - std::ifstream iFile("data/points",std::ios::in); - - if (! iFile) { - std::cout <<"A file named points in directory data" - <<" containing points should be provided," << std::endl - <<"see README"< begin (iFile), end; - T.insert (begin, end); - } - - T.is_valid(true); - - std::cout <<" Visualizing vertices and edges" << std::endl; - visu_vertices(gv,T); - gv.set_wired(true); - gv << T; - gv.set_wired(false); - - sleep(3); - - std::cout <<" Locating point (1,1,1) :" << std::endl; - Point p(1,1,1); - gv.set_vertex_color(CGAL::ORANGE); - gv << p; - Locate_type lt; - int li, lj; - Cell_handle c = T.locate(p,lt,li,lj); - - sleep(3); - - gv << CGAL::VIOLET; - if ( lt == Triangulation::CELL ) { - std::cout <<" CELL" << std::endl; - visu_cell(gv,T,c); - } - if ( lt == Triangulation::FACET ) { - std::cout <<" FACET" << std::endl; - visu_facet(gv,T,c,li); - } - if ( lt == Triangulation::EDGE ) { - std::cout <<" EDGE" << std::endl; - visu_edge(gv,T,c,li,lj); - } - if ( lt == Triangulation::VERTEX ) { - std::cout <<" VERTEX" << std::endl; - visu_vertex(gv,T,c,li); - } - if ( lt == Triangulation::OUTSIDE_CONVEX_HULL ) - std::cout <<" OUTSIDE_CONVEX_HULL" << std::endl; - if ( lt == Triangulation::OUTSIDE_AFFINE_HULL ) - std::cout <<" OUTSIDE_AFFINE_HULL" << std::endl; - - sleep(6); - - std::cout <<" Visualizing T" << std::endl; - gv.clear(); - std::cout <<" - facets" << std::endl; - gv << T; - std::cout <<" - edges only" << std::endl; - gv.set_wired(true); - gv << T; - gv.set_wired(false); - std::cout <<" You can move one of the" <> ch; - - return 0; -} - -#endif // CGAL_USE_GEOMVIEW diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/Triangulation_3_remove_demo.cpp b/Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/Triangulation_3_remove_demo.cpp deleted file mode 100644 index 0e83e2ea57b..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/Triangulation_3_remove_demo.cpp +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright (c) 2001, 2002, 2003, 2004, 2005 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Monique Teillaud - -#include - -#ifndef CGAL_USE_GEOMVIEW -#include -int main() -{ - std::cerr << "Geomview doesn't work on this platform," - " so this demo doesn't work" << std::endl; - return 0; -} -#else - -#include - -#include - -#include - -#include -#include -#include -#include - -typedef CGAL::Exact_predicates_inexact_constructions_kernel K; -typedef CGAL::Delaunay_triangulation_3 Dt; - -typedef Dt::Vertex_iterator Vertex_iterator; -typedef Dt::Vertex_handle Vertex_handle; -typedef Dt::Cell_handle Cell_handle; -typedef Dt::Point Point; - -////////////////////// -// VISU GEOMVIEW -////////////////////// -template -void visu_cell(CGAL::Geomview_stream & os, const TRIANGULATION & T, - Cell_handle c) -{ - if ( ! T.is_infinite(c) ) - os << T.tetrahedron(c); - else - os << T.triangle(c,c->index(T.infinite_vertex())); -} -template -void visu_facet(CGAL::Geomview_stream & os, const TRIANGULATION & T, - Cell_handle c, int i) -{ - if ( ! T.is_infinite(c,i) ) - os << T.triangle(c,i); -} -template -void visu_edge(CGAL::Geomview_stream & os, const TRIANGULATION & T, - Cell_handle c, int i, int j) -{ - if ( ! T.is_infinite(c,i,j) ) - os << T.segment(c,i,j); -} -template -void visu_vertices(CGAL::Geomview_stream & os, const TRIANGULATION & T) -{ - Vertex_iterator vit = T.finite_vertices_begin(); - Vertex_iterator vdone = T.vertices_end(); - - if ( vit == vdone ) { std::cout << "no vertex" << std::endl ;} - else { - while(vit != vdone) { - os << vit->point(); - ++vit; - } - } -} -template -void visu_vertex(CGAL::Geomview_stream & os, const TRIANGULATION & T, - Cell_handle c, int i) -{ - if ( ! T.is_infinite(c->vertex(i)) ) - os << c->vertex(i)->point(); -} - -////////////////////// - -int main() -{ - CGAL::Geomview_stream gv(CGAL::Bbox_3(0,0,0, 5, 5, 5)); - gv.set_bg_color(CGAL::Color(0, 200, 200)); - gv.set_wired(true); - gv.clear(); - - Dt T; - - std::cout <<" Inserting points" << std::endl ; - int x,y,z; - std::vector V(125); - int i=0; - - for (z=0 ; z<5 ; z++) - for (y=0 ; y<5 ; y++) - for (x=0 ; x<5 ; x++) - V[i++] = T.insert(Point(x,y,z)); - - assert( T.is_valid() ); - assert( T.number_of_vertices() == 125 ); - assert( T.dimension() == 3 ); - - std::cout <<" Visualizing edges" << std::endl; - gv << T; - - sleep(3); - - std::cout <<" Removing vertices in random order" << std::endl; - - std::random_shuffle(V.begin(), V.end()); - - for (i=0; i<125; ++i) { - T.remove(V[i]); - gv.clear(); - gv << T; - } - - char ch; - std::cout << "Enter any character to quit" << std::endl; - std::cin >> ch; - - return 0; -} - -#endif // CGAL_USE_GEOMVIEW diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/Triangulation_3_voronoi_demo.cpp b/Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/Triangulation_3_voronoi_demo.cpp deleted file mode 100644 index 3a70f88a605..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/Triangulation_3_voronoi_demo.cpp +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) 2001, 2002, 2003, 2004, 2005 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Monique Teillaud - -#include - -#ifndef CGAL_USE_GEOMVIEW -#include -int main() -{ - std::cerr << "Geomview doesn't work on this platform," - " so this demo doesn't work" - << std::endl; - return 0; -} -#else - -#include - -#include -#include - -#include - -#include - -// exact constructions (circumcenter computations) are needed in this -// demo, not only predicates -typedef CGAL::Exact_predicates_exact_constructions_kernel K; - -typedef CGAL::Triangulation_vertex_base_3 Vb; -typedef CGAL::Triangulation_cell_base_with_circumcenter_3 Cb; -typedef CGAL::Triangulation_data_structure_3 TDS; -typedef CGAL::Delaunay_triangulation_3 Triangulation; -// typedef CGAL::Delaunay_triangulation_3 Triangulation; - -typedef Triangulation::Point Point; - -int main() -{ - CGAL::Geomview_stream gv(CGAL::Bbox_3(0,0,0, 3, 3, 3)); - gv.set_bg_color(CGAL::Color(0, 200, 200)); - gv.clear(); - - Triangulation T; - - std::cout <<" Inserting points" << std::endl ; - for (int z=0 ; z<3 ; z++) - for (int y=0 ; y<3 ; y++) - for (int x=0 ; x<3 ; x++) - T.insert(Point(x, y, z)); - - T.is_valid(true); - - std::cout <<" Visualizing T" << std::endl; - gv.set_wired(true); - gv << T; - - std::cout <<" Visualizing the Voronoi edges" << std::endl; - gv << CGAL::RED; - T.draw_dual(gv); - - char ch; - std::cout << "Enter any character to quit" << std::endl; - std::cin >> ch; - - return 0; -} - -#endif // CGAL_USE_GEOMVIEW diff --git a/Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/data/points b/Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/data/points deleted file mode 100644 index b50bfb6eee4..00000000000 --- a/Triangulation_3_copy_tds/demo/Triangulation_3_Geomview_demos/data/points +++ /dev/null @@ -1,7 +0,0 @@ -0 0 0 -1 0 0 -0 1 0 -0 0 1 -2 2 2 --1 0 1 - diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/PkgDescription.tex b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/PkgDescription.tex deleted file mode 100644 index c881d1bd775..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/PkgDescription.tex +++ /dev/null @@ -1,15 +0,0 @@ - -\begin{ccPkgDescription}{3D Triangulation Data Structure \label{Pkg:TDS3}} -\ccPkgHowToCiteCgal{cgal:pt-tds3-10} -\ccPkgSummary{ -This package provides a data structure to store a three-dimensional -triangulation that has the topology of a three-dimensional sphere. -The package acts as a container for the vertices -and cells of the triangulation -and provides basic combinatorial operations on the triangulation.} - -%\ccPkgDependsOn{} -\ccPkgIntroducedInCGAL{2.1} -\ccPkgLicense{\ccLicenseQPL} -\ccPkgIllustration{TriangulationDS_3/tds3_small.png}{TriangulationDS_3/tds3_small.png} -\end{ccPkgDescription} diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/TDS3.tex b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/TDS3.tex deleted file mode 100644 index e4ff1beb7d2..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/TDS3.tex +++ /dev/null @@ -1,386 +0,0 @@ -% file : doc_tex/basic/TriangulationDS_3/TDS3.tex -% revision : $Id$ -% -% author(s) : Monique Teillaud - -A geometric triangulation has two aspects: the combinatorial structure, which -gives the incidence and adjacency relations between faces, and the -geometric information related to the position of vertices. - -\cgal\ provides 3D geometric triangulations in which these -two aspects are clearly separated. -As described in Chapter~\ref{chapter-Triangulation3}, a geometric -triangulation of a set of points in $\R^d$, $d\leq 3$ is a partition of the -whole space $\R^d$ into cells having $d+1$ vertices. Some of them -are infinite, they are obtained by linking an additional vertex at -infinity to each facet of the convex hull of the points (see -Section~\ref{Triangulation3-sec-intro}). -The underlying combinatorial graph of such a triangulation -without boundary of $\R^d$ can be seen as a triangulation of the -topological sphere $S^d$ in $\R^{d+1}$. - -This chapter deals with 3D-triangulation data structures, meant to -maintain the combinatorial information for 3D-geometric -triangulations. The reader interested in geometric triangulations of -$\R^3$ is advised to read Chapter~\ref{chapter-Triangulation3}. - -\section{Representation\label{TDS3-sec-intro}} - -In \cgal, a 3D triangulation data structure is a -container of cells ($3$-faces) and vertices ($0$-faces). - -Following the standard vocabulary of simplicial complexes, an $i$-face -$f_i$ and a $j$-face $f_j$ $(0 \leq j < i \leq 3)$ are said to be -\textit{incident} in the triangulation if $f_j$ is a (sub)face of $f_i$, and -two $i$-faces $(0 \leq i \leq 3)$ are said to be \textit{adjacent} if -they share a commun incident (sub)face. - -Each cell gives access to its four incident vertices and to its four -adjacent cells. Each vertex gives direct access to one of its incident -cells, which is sufficient to retrieve all the incident cells when -needed. - -The four vertices of a cell are indexed with 0, 1, 2 and 3. The -neighbors of a cell are also indexed with 0, 1, 2, 3 -in such a way that the neighbor indexed by $i$ is opposite to the vertex -with the same index (see Figure~\ref{TDS3-fig-repres}). - -\begin{figure} -\begin{ccTexOnly} -\begin{center} -\includegraphics{TriangulationDS_3/repres} -\end{center} -\end{ccTexOnly} -\begin{ccHtmlOnly} -
-Representation -
-\end{ccHtmlOnly} -\caption{Representation. -\label{TDS3-fig-repres}} -\end{figure} - -Edges ($1$-faces) and facets ($2$-faces) are not explicitly -represented: a facet is given by a cell and an index (the facet -\ccc{i} of a cell \ccc{c} is the facet of \ccc{c} that is opposite to -the vertex of index \ccc{i}) and an edge is given by a cell and two -indices (the edge \ccc{(i,j)} of a cell \ccc{c} is the edge -whose endpoints are the vertices of indices \ccc{i} and \ccc{j} of -\ccc{c}). - -\paragraph{Degenerate Dimensions} -As \cgal\ explicitly deals with all degenerate cases, a -3D-triangulation data structure in \cgal\ can handle the cases when -the dimension of the triangulation is lower than~3. - -Thus, a 3D-triangulation data structure can store a triangulation of a -topological sphere $S^d$ of $\R^{d+1}$, for any $d \in \{-1,0,1,2,3\}$. - -Let us give, for each dimension, the example corresponding to the -triangulation data structure having a minimal number of vertices, i.e. a -simplex. These examples are illustrated by presenting their usual -geometric embedding. -\begin{itemize} -\item \emph{dimension 3.} The triangulation data structure consists of -the boundary of a 4-dimensional simplex, which has 5 vertices. A -geometric embedding consists in choosing one of these vertices to be -infinite, thus four of the five 3-cells become infinite: the geometric -triangulation has one finite tetrahedron remaining, each of its facets -being incident to an infinite cell. See Figure~\ref{TDS3-fig-topo-simplex4}. -\begin{figure} -\begin{ccTexOnly} -\begin{center} -\includegraphics{TriangulationDS_3/topo-simplex4} -\end{center} -\end{ccTexOnly} -\begin{ccHtmlOnly} -
- -
-\end{ccHtmlOnly} -\caption{4D simplex and a 3D geometric embedding. -\label{TDS3-fig-topo-simplex4}} -\end{figure} -\item \emph{dimension 2.} We have 4 vertices forming one 3-dimensional -simplex, i.e. the boundary of a tetrahedron. The geometric embedding in -the plane results from choosing one of these vertices to be infinite, -then the geometric triangulation has one finite triangle whose edges are -incident to the infinite triangles. See Figure~\ref{TDS3-fig-topo-simplex3}. -\begin{figure} -\begin{ccTexOnly} -\begin{center} -\includegraphics{TriangulationDS_3/topo-simplex3} -\end{center} -\end{ccTexOnly} -\begin{ccHtmlOnly} -
- -
-\end{ccHtmlOnly} -\caption{3D simplex and a 2D geometric embedding. -\label{TDS3-fig-topo-simplex3}} -\end{figure} -\item \emph{dimension 1.} A 2-dimensional simplex (a triangle) has 3 -vertices. The geometric embedding is an edge whose vertices are linked -to an infinite point. See Figure~\ref{TDS3-fig-topo-simplex2}. -\begin{figure} -\begin{ccTexOnly} -\begin{center} -\includegraphics{TriangulationDS_3/topo-simplex2} -\end{center} -\end{ccTexOnly} -\begin{ccHtmlOnly} -
- -
-\end{ccHtmlOnly} -\caption{2D simplex and a 1D geometric embedding. -\label{TDS3-fig-topo-simplex2}} -\end{figure} -\end{itemize} - -The last three cases are defined uniquely: -\begin{itemize} -\item \emph{dimension 0.} A 0-dimensional triangulation is -combinatorially equivalent to the boundary of a 1-dimensional simplex -(an edge), which consists of 2 vertices. One of them becomes infinite -in the geometric embedding, and there is only one finite vertex -remaining. The two vertices are adjacent. -\item \emph{dimension -1.} This dimension is a convention to represent a -0-dimensional simplex, that is a sole vertex, which will be -geometrically embedded as an ``empty'' triangulation, having only one -infinite vertex. -\item \emph{dimension -2.} This is also a convention. The -triangulation data structure has no vertex. There is no associated -geometric triangulation. -\end{itemize} - -Note that the notion of infinite vertex has no meaning for the -triangulation data structure. The infinite vertex of the geometric -embedding is a vertex that cannot be distinguished from the other -vertices in the combinatorial triangulation. - -The same cell class is used in all cases: triangular faces in -2D can be considered as degenerate cells, having only three vertices -(resp. neighbors) numbered $(0,1,2)$; -edges in 1D have only two vertices (resp. neighbors) numbered $0$ and $1$. - -The implicit representation of facets (resp. edges) still holds -for degenerate ($< 3$) dimensions : in dimension~2, each cell has only one -facet of index 3, and 3 edges $(0,1)$, $(1,2)$ and $(2,0)$; in -dimension~1, each cell has one edge $(0,1)$. - -\paragraph{Validity} -A 3D combinatorial triangulation is said to be \ccc{locally valid} -iff the following is true: - -{\bf (a)} When a cell $c$ has a neighbor pointer to another cell $c'$, -then reciprocally this cell $c'$ has a neighbor pointer to $c$, and -$c$ and $c'$ have three vertices in common. These cells are called -adjacent. -% Two adjacent cells have reciprocal neighbor pointers to each -% other and they have three vertices in common. - -{\bf (b)} The cells have a coherent orientation: if two cells $c_1$ -and $c_2$ are adjacent and share a facet with vertices $u,v,w$, then -the vertices of $c_1$ are numbered $(v_0^1 = u, v_1^1 = v, v_2^1 = w, -v_3^1)$, and the vertices of $c_2$ are numbered $(v_0^2 = v, v_1^2 = u, -v_2^2 = w, v_3^2)$, up to positive permutations of $(0,1,2,3)$. In -other words, if we embed the triangulation in $\R^3$, then the fourth -vertices $v_3^1$ and $v_3^2$ of $c_1$ and $c_2$ see the common facet -in opposite orientations. See Figure~\ref{TDS3-fig-comborient}. - -The set {\Large $\sigma$}$_4$ of permutations of -$(0,1,2,3)$ has cardinality 24, and the set of positive permutations -$A_4$ has cardinality 12. Thus, for a given orientation, there -are up to 12 different orderings of the four vertices of a cell. Note -that cyclic permutations are negative and so do not preserve the -orientation of a cell. - -\begin{figure}[htbp] -\begin{ccTexOnly} -\begin{center} -\includegraphics{TriangulationDS_3/comborient} -\end{center} -\end{ccTexOnly} -\begin{ccHtmlOnly} -
-Orientation of a cell (3-dimensional case) -
-\end{ccHtmlOnly} -\caption{Coherent orientations of two cells (3-dimensional case). -\label{TDS3-fig-comborient}} -\end{figure} - -The \ccc{is_valid()} method provided by -\ccc{Triangulation_data_structure_3} checks the local validity of a -given triangulation data structure. - -\section{Software Design\label{TDS3-sec-design}} - -The 3D-triangulation data structure class of \cgal, -\ccc{Triangulation_data_structure_3}, is designed to be used as a combinatorial -layer upon which a geometric layer can be built \cite{k-ddsps-98}. This -geometric layer is typically one of the 3D-triangulation classes of \cgal: -\ccc{Triangulation_3}, \ccc{Delaunay_triangulation_3} and -\ccc{Regular_triangulation_3}. This relation is described in more details in -Chapter~\ref{chapter-Triangulation3}, where the -Section~\ref{Triangulation3-sec-design} explains other important parts of the -design related to the geometry. - -We focus here on the design of the triangulation data structure (TDS) -itself, which the Figure~\ref{TDS3-fig-layers} illustrates. - -\begin{figure}[htbp] -\begin{ccTexOnly} -\begin{center} -\includegraphics[width=14cm]{TriangulationDS_3/design_tds} -\end{center} -\end{ccTexOnly} -\begin{ccHtmlOnly} -
-Triangulation Data Structure software design -
-\end{ccHtmlOnly} -\caption{Triangulation Data Structure software design. -\label{TDS3-fig-layers}} -\end{figure} - -\subsection{Flexibility of the Design} - -In order for the user to be able to add his own data in the vertices and cells, -the design of the TDS is split into two layers: - -\begin{itemize} -\item{} In the bottom layer, the (vertex and cell) base classes store -elementary incidence and adjacency (and possibly geometric or other) -information. These classes are parameterized by the TDS which provides the -handle types. (They can also be parameterized by a geometric traits class or -anything else.) A vertex stores a \ccc{Cell_handle}, and a cell stores four -\ccc{Vertex_handle}s and four \ccc{Cell_handle}s. - -\item{} The middle layer is the TDS, which is purely combinatorial. It -provides operations such as insertion of a new vertex in a given cell, on a $1$ -or $2$-face. It also allows one, if the dimension of the triangulation is -smaller than $3$, to insert a vertex so that the dimension of the triangulation -is increased by one. The TDS is responsible for the combinatorial integrity of -the eventual geometric triangulation built on top of it (the upper layer, -see Chapter~\ref{chapter-Triangulation3}). -\end{itemize} - -The user has several ways to add his own data in the vertex and cell base classes used by the TDS. He can either: -\begin{itemize} -\item{} use the classes \ccc{Triangulation_vertex_base_with_info} -and \ccc{Triangulation_cell_base_with_info}, which allow to add one data member -of a user provided type, and give access to it. -\item{} derive his own classes from the default base classes -\ccc{Triangulation_ds_vertex_base}, and \ccc{Triangulation_ds_cell_base} (or -the geometric versions typically used by the geometric layer, -\ccc{Triangulation_vertex_base}, and \ccc{Triangulation_cell_base}). -\item{} write his own base classes following the requirements given by the -concepts \ccc{TriangulationCellBase_3} and \ccc{TriangulationVertexBase_3} -\lcTex{(described in \ccRefPage{TriangulationCellBase_3} and -\ccRefPage{TriangulationVertexBase_3})}. -\end{itemize} - -\subsection{Cyclic Dependency\label{tds3-cyclic}} - -Since adjacency relations are stored in the vertices and cells, it means that -the vertex and cell base classes have to be able to store handles (an entity -akin to pointers) to their neighbors in the TDS. This in turns means that the -vertex and cell base classes have to know the types of these handles, which are -provided by the TDS. So in a sense, the base classes are parameterized by the -TDS, and the TDS is parameterized by the vertex and cell base classes ! -This is a cycle which cannot be resolved easily. - -The solution that we have chosen is similar to the mechanism used by the -standard class \ccc{std::allocator}: the vertex and cell base classes are -initially given a fake or dummy TDS template parameter, whose unique purpose -is to provide the types that can be used by the vertex and cell base classes -(such as handles). Then, inside the TDS itself, these base classes are -\textit{rebound} to the real TDS type, that is we obtain the same vertex -and cell base classes, but parameterized with the real TDS instead of the dummy -one. Rebinding is performed by a nested template class of the vertex and cell -base classes (see code below), which provides a type which is the rebound -vertex or cell base class\footnote{It is logically equivalent to a mechanism -that does not exist yet in the C++ language: \textit{template typedef} or -\textit{template aliasing}}. - -Here is how it works, schematically: - -\begin{ccExampleCode} -template < class Vb, class Cb > -class TDS -{ - typedef TDS Self; - - // Rebind the vertex and cell base to the actual TDS (Self). - typedef typename Vb::template Rebind_TDS::Other VertexBase; - typedef typename Cb::template Rebind_TDS::Other CellBase; - - // ... further internal machinery leads to the final public types: -public: - typedef ... Vertex; - typedef ... Cell; - typedef ... Vertex_handle; - typedef ... Cell_handle; -}; - -template < class TDS = ... > // The default is some internal type faking a TDS -class Triangulation_ds_vertex_base_3 -{ -public: - template < class TDS2 > - struct Rebind_TDS { - typedef Triangulation_ds_vertex_base_3 Other; - }; -... -}; -\end{ccExampleCode} - -When derivation is used for the vertex or cell base classes, which is the -case at the geometric level with \ccc{Triangulation_vertex_base_3}, then -it gets slightly more involved because its base class has to be rebound as -well: - -\begin{ccExampleCode} -template < class GT, class Vb = Triangulation_ds_vertex_base_3<> > -class Triangulation_vertex_base_3 : public Vb -{ -public: - template < class TDS2 > - struct Rebind_TDS { - typedef typename Vb::template Rebind_TDS::Other Vb2; - typedef Triangulation_vertex_base_3 Other; - }; -... -}; -\end{ccExampleCode} - -\section{Examples\label{TDS3-sec-examples}} - -\subsection{Incremental Construction} -The following example shows how to construct a 3D triangulation data -structure by inserting vertices. - -\ccIncludeExampleCode{Triangulation_3/tds.cpp} - -\subsection{Cross-Linking Between a 2D and a 3D Data Structures} -This example program illustrates how to setup a 2D and a 3D triangulation data -structures whose vertices respectively store vertex handles of the other one. - -\ccIncludeExampleCode{Triangulation_3/linking_2d_and_3d.cpp} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\section{Design and Implementation History} - -Monique Teillaud introduced the triangulation of the topological -sphere $S^d$ in $\R^{d+1}$ to manage the underlying graph of geometric -triangulations and handle degenerate dimensions \cite{t-tdtc-99}. - -Sylvain Pion improved the software in several ways, in particular -regarding the memory management. diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/comborient.gif b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/comborient.gif deleted file mode 100644 index 00d1b5580fa742ace79e4fa5c519ca7de52cfb4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1484 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 - - - - - --111.778 375.245 m --152.403 305.344 l - - --111.778 375.245 m --58.153 352.486 l - - --152.403 305.344 m --58.153 352.486 l - - --152.403 305.344 m --67.903 270.394 l --111.778 375.245 l - - --58.153 352.486 m --67.903 270.394 l - - --111.778 375.245 m --164.591 413.446 l --152.403 305.344 l - - --164.591 413.446 m --58.153 352.486 l - -$v_3^1$ -$v_3^2$ -$v_0^2 = v_1^1 = v$ -$v_1^2 = v_0^1 = u$ -$v_2^2 = v_2^1 = w$ - --50.8405 282.586 m -20.9708 0 0 20.9708 -67.903 270.394 -88.0664 264.631 a - - --141.029 415.072 m -21.9574 0 0 21.9574 -154.841 398.003 -174.479 388.18 a - - - diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/design_tds.fig b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/design_tds.fig deleted file mode 100644 index 07dfb1ae818..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/design_tds.fig +++ /dev/null @@ -1,130 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -6 3870 2070 7335 2430 -3 2 1 1 0 7 50 0 -1 4.000 0 1 0 3 - 1 1 1.00 60.00 120.00 - 4995 2340 4410 2160 3900 2355 - 0.000 -1.000 0.000 -3 2 1 1 0 7 50 0 -1 4.000 0 1 0 3 - 1 1 1.00 60.00 120.00 - 6300 2340 6855 2115 7335 2310 - 0.000 -1.000 0.000 -4 0 0 50 0 0 16 0.0000 4 165 1065 5130 2430 Derivation\001 --6 -6 585 6705 1890 7290 -4 0 0 50 0 0 12 0.0000 4 180 1065 720 6840 Optional User\001 -4 0 0 50 0 0 12 0.0000 4 135 1305 585 7065 and/or Geometric\001 -4 0 0 50 0 0 12 0.0000 4 135 735 855 7290 Additions\001 --6 -2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 - 1350 900 1350 5850 -2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7425 2880 7425 1350 -2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 13 - 2250 5850 2250 5400 5400 5400 5400 5850 5850 5850 5850 5400 - 9000 5400 9000 5850 9900 5850 9900 900 450 900 450 5850 - 2250 5850 -2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 240.00 480.00 - 3825 6750 3825 5400 -2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 240.00 480.00 - 7425 6750 7425 5400 -2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 90.00 180.00 - 3825 900 3825 450 -2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 90.00 180.00 - 7425 900 7425 450 -2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7425 5400 7425 3330 -2 2 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 5 - 6750 900 8100 900 8100 1350 6750 1350 6750 900 -2 2 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 5 - 3150 900 4500 900 4500 1350 3150 1350 3150 900 -2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 3825 2880 3825 1350 -2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 - 5850 2880 9000 2880 9000 3330 5850 3330 5850 2880 -2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 - 2250 2880 5400 2880 5400 3330 2250 3330 2250 2880 -2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 3825 5400 3825 3330 -2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 240.00 480.00 - 3825 8550 3825 7200 -2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 240.00 480.00 - 7425 8550 7425 7200 -2 2 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 5 - 2250 8550 5400 8550 5400 9000 2250 9000 2250 8550 -2 2 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 5 - 5850 8550 9000 8550 9000 9000 5850 9000 5850 8550 -2 2 1 2 0 7 50 0 -1 6.000 0 0 -1 0 0 5 - 2250 6750 5400 6750 5400 7200 2250 7200 2250 6750 -2 2 1 2 0 7 50 0 -1 6.000 0 0 -1 0 0 5 - 5850 6750 9000 6750 9000 7200 5850 7200 5850 6750 -2 2 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5 - 2205 2835 5445 2835 5445 3375 2205 3375 2205 2835 -2 2 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5 - 5805 2835 9045 2835 9045 3375 5805 3375 5805 2835 -2 2 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5 - 3105 900 4545 900 4545 1395 3105 1395 3105 900 -2 2 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5 - 6705 900 8145 900 8145 1395 6705 1395 6705 900 -3 2 1 1 0 7 50 0 -1 4.000 0 1 0 3 - 1 1 1.00 60.00 120.00 - 4950 4365 4485 4185 3915 4365 - 0.000 -1.000 0.000 -3 2 1 1 0 7 50 0 -1 4.000 0 1 0 3 - 1 1 1.00 60.00 120.00 - 6465 4365 6915 4185 7305 4335 - 0.000 -1.000 0.000 -3 2 1 1 0 7 50 0 -1 4.000 0 1 0 3 - 1 1 1.00 60.00 120.00 - 5985 1170 6255 1080 6615 1080 - 0.000 -1.000 0.000 -3 2 1 1 0 7 50 0 -1 4.000 0 1 0 3 - 1 1 1.00 60.00 120.00 - 5205 1215 4905 1125 4590 1125 - 0.000 -1.000 0.000 -3 2 1 1 0 7 50 0 -1 4.000 0 1 0 3 - 1 1 1.00 60.00 120.00 - 4995 8055 4410 7875 3900 8070 - 0.000 -1.000 0.000 -3 2 1 1 0 7 50 0 -1 4.000 0 1 0 3 - 1 1 1.00 60.00 120.00 - 6300 8055 6855 7830 7335 8025 - 0.000 -1.000 0.000 -3 2 1 1 0 7 50 0 -1 4.000 0 1 0 3 - 1 1 1.00 60.00 120.00 - 6780 6255 7020 6165 7335 6165 - 0.000 -1.000 0.000 -3 2 1 1 0 7 50 0 -1 4.000 0 1 0 3 - 1 1 1.00 60.00 120.00 - 4590 6255 4230 6120 3870 6165 - 0.000 -1.000 0.000 -4 0 0 50 0 0 24 1.5708 4 330 4245 990 5445 Triangulation Data Structure\001 -4 0 0 50 0 0 20 0.0000 4 195 780 3420 1215 Vertex\001 -4 0 0 50 0 0 20 0.0000 4 195 465 7200 1215 Cell\001 -4 0 0 50 0 0 16 0.0000 4 195 1290 5085 4455 Rebind_TDS\001 -4 0 0 50 0 0 16 0.0000 4 225 585 5310 1260 Types\001 -4 0 0 50 0 0 16 0.0000 4 165 1065 5130 8145 Derivation\001 -4 0 0 50 0 0 16 0.0000 4 225 2070 4635 6300 Template parameters\001 -4 0 0 50 0 0 15 0.0000 4 180 2790 2333 3187 UserVB<...,DSVB >\001 -4 0 0 50 0 0 16 0.0000 4 225 3135 2295 8865 DSVertexBase\001 -4 0 0 50 0 0 16 0.0000 4 225 2880 6030 8865 DSCellBase\001 -4 0 0 50 0 0 13 0.0000 4 195 3210 2295 7065 UserVB<...,DSVB >\001 -4 0 0 50 0 0 13 0.0000 4 195 3240 5940 7065 UserCB<...,DSCB >\001 -4 0 0 50 0 0 15 0.0000 4 180 2820 5940 3195 UserCB<...,DSCB >\001 diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/design_tds.gif b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/design_tds.gif deleted file mode 100644 index d502baaf4556da9c3455dba77e77dbea98284de4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368983 zcmd>{ePCThng1tAUn0~t5o))K-J};STHU_IweDuu8{pRZ(gl=8+-0+AExqWfX`wWC z-~8o@6;ePdve?9KHh}ULc3Tv&P4Bvm6)Di$7G$wPa<>JP0BvqjkW$**{GOR}&YU^t z%$zgl^`4aef#c12nU`mt`Fx+5Gqd!QAOGl|ue_}CPb!a(A^2BOQBhf0SyfdvVZwxo z6DLlZG->kW$<@`>?|8>M&N$92R=tuwj&;R@{{^Bnh8yo-fFaPqd z{_3wj_OXv8lgXy0rt{A~|AGrHxbVUYQ>oOFB}+d3@sBTEy7UvD_{1ka`N>ax>QkTo z^rx3CTlUv~{nr;=bkW5ZUwp|Wmwe_kpZV-(KYQt=mo8tvyt%pgbD#U%WtUy{`Okm; zZ~o?Q{`PPG_VUXw|GU5YyOx%gzyJHcZ*6T|v0}x_l`FsSg)gjHwd#s1u2{W#bvm8C z^2#f}_{A@N=}TYwhky8oFMs*VU-`;czWUX#wzajbS+i#C+O=0*b=B2ZU%hVKx@)ev zX8rp0?d|QEOy(c|@gM)`pZ@8e|M{Q)#n=+zWbhg?z#8gd+)pNzP`S``|rR1 zKmYST|Led0YwOmn+qP|c;DHBz_`@Im=tn<#@WBUv{No=#^w2{;`N>bVZ{NOS$BzE~ z{+&B_=5o3J{_p?(=}&+9KmYSTyLRmw7#R53&wjRh_wJwn{O1op{O~V+@ry?ud1TL? zJ&!*6=wpvP_W0wE@7=pMpU>~xw{QRc{Ra*lc;bmCo_zAjU;gr!Pd)Y2|Nig)KK=C5 zzxvg$4jw%C>tFx+nP;AP_St6#2M33Sh6;tk|NY#dU~Po6q;YIJn8R4R>)jm`s$U}tiGcD3;$HV^rGharC(gL?wWP0uKv>6YwF*B#p?Di zty=w8Yumnh^~%f#&Ojf+JqY(DR9!-2qbH9aJG84~tn@ZaIF>n?J)P^N?fBa()9kc@G zpUfRU55HqZfIYOcx#pkBhffKenY`KBRbm{lhYnh0;GY0$aa+YVBVxzE`A0Aw+8GR| zs5!LbP1=U#Ot|Hrz_5q*@Yp8S%s>+gCjNPQVb25T)mIJ8qhk++fwv3);12G=^F_cv zNeIWC{Z<4{BtYy5mVYj+$ezEQ<7KIl29k&pduXq7%|C$@l{OEP@QpnS5PH?9q5{Zk zbo}F?^P8X`Q-QJ<1W;x-T|FrN2?l#2F1&;gu=3AU2-W|>)N;q)KG?JUOqkpG7&Uf< zf8Ji$Lkq7ZIM_oixlH^sQVGqpfsM)7M6Z1QNvj50W*3Rj_^0mOPys)PLPUjuJ#<_R zIR4{iXpr!Z*l>Jd&(E=$qHlV)ptAFiPwYva4du^1F+v+W;6&*BP=2p?4cuq#y|6L1vK4Z5>am-?BP02j6J3RkQodkwe7mexRpK;xQOBwepiPb z_D}?flz-Y`*%JJ#qi+v05s2ptjei0jN315`8GGs){^+A0`O3g^KQBmhme}%-AMBaF z`|B@!{fzf~J^%|U7ytOg9*LF@#(@3tPj20?AR7TRU8F;UpctbL{F6-NcqKjUvB$zc zhFXXl_GE_lN7kWWATUIG;=wz?@M+#ekg@Pe>nEFC+_0m;X^9Qeoh z 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 NS0P<}YHCpP{{aEF%v=Bf diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/design_tds.pdf b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/design_tds.pdf deleted file mode 100644 index 4b74b31a5439693e26af6cf8c8d1d256fe43d14a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5762 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 vGlK%bXaa$J@sBSQ5UlI&L;xP|5qEG?AgDuV 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 HjS&9<_EG#= diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/flips.xml b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/flips.xml deleted file mode 100644 index 005e8107260..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/flips.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - --8.1225 76.95 m -38.1758 52.65 l -84.474 93.15 l -h - - - --122.65 172.53 m --156.764 -26.73 l --125.899 52.65 l -h - - --172.197 76.95 m --79.6005 93.15 l - - --122.65 172.53 m --156.764 -26.73 l - - --122.65 172.53 m --172.197 76.95 l --125.899 52.65 l --79.6005 93.15 l --122.65 172.53 l --125.899 52.65 l --156.764 -26.73 l --79.6005 93.15 l - - --172.197 76.95 m --156.764 -26.73 l - - - --8.1225 76.95 m -84.474 93.15 l - - -41.4248 172.53 m --8.1225 76.95 l -38.1758 52.65 l -84.474 93.15 l -41.4248 172.53 l -38.1758 52.65 l -7.31025 -26.73 l -84.474 93.15 l - - --8.1225 76.95 m -7.31025 -26.73 l - - --25.1797 80.19 m -32.1918 0 0 32.1918 -46.6754 56.2266 -69.0413 79.3799 a - -3 tetrahedra -2 tetrahedra - - diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/main.tex b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/main.tex deleted file mode 100644 index dc265978617..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/main.tex +++ /dev/null @@ -1,9 +0,0 @@ -\ccUserChapter{3D Triangulation Data Structure\label{chapter-TDS3}} -\ccChapterAuthor{Sylvain Pion \and Monique Teillaud} - -\input{TriangulationDS_3/PkgDescription} - -\minitoc - -\input{TriangulationDS_3/TDS3} - diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/repres.gif b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/repres.gif deleted file mode 100644 index 6e8dbb54e62fa65f97deb605675c034cefaac419..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2748 zcmeHG`8yPP7e8ZSa7%V$OtNH6*M75<&;q;jG+kG>ALo%ZbZ!3V!{=T7<-f@ zS(CCGrE6yhQK4ks>3QDgd4GEUgZKP&p7Z^j&-Z*j&pF08BMnVA9Yinez|SC&NDKxe zP6J>AfB~=w911{K1W#E&ocK>|2?e41fCM-Ru!cr6W@nd1NB6tB0P2_o0I2})0MP~n z>VH`(i2xWR^01m30K!f(9RLNA36Tguq@R{#mH?0pEG&tFos|y&7C?|g*a{6{I)HNd z}J?V*$yi0$>HO^npSEb1UFR zOCmw?G;A<61Kfv0JqdtK2Ogv)S`Dz3z=L2FBZy!DEeJ#_01jAY0kk=S6)-1Q4ttq1 zJw(Hz-jRQp`T$OWKXVW`Ob12_@(3`-;g{%V3@~A)Sdry%GWOb1{Hu`aJ3N!w(a%Y)=aqk*9eiw;19 zB>+3<1%wW;0E-|(Cyx33|Koo-Aij5qxnnG#@DuR!CV>3_SlO{ARfX-b?0oVrJyk_7 z61gQ!^GvGAFH_N~-tT&HTC;B}X8%!k<%fF0T)n_r<_(wHB-WEUKEElscDeOWM>V52$DiL~ zY*}ExR^eY3BnMaKjeMFLAb*l(%g315&=nAdDd9|eU?RnpmYysb9YnC^6(RyOCLvA#Ta*Y_A|K20yYY}VdT z`q8}lJDKO^IYM{I_K>u6>btvkjR!PJwzsY(G7o3Bh)u7T02$a zcuBrvnhy;;@7yfS=N*!>w~b`O6g}YQkuQr)$jOv-NTfBEh1~ru#VckD_szXHV!>;r zl%&!qU7BaZPS1D7{7x$eZ)u;mrI?VdGHk|m z?Q@VU{?z+{E7_}4<2tSTzO;<={o@CJekFXg@d%Ur;q4oP?EjQ{_U)12ZtlTg)sP$b zmY@>bisT?yH|O=N+0?;rrJ0O7I~Qy3J$NS`ljE+fIGYpC?0l%j~k-tdR=eUzjELM*y9@KQ7T zt}aL@{h7*(M#>0EqjapI4cB|rFz8P7Z_z3D!}D~{6rTY!)L#J9<2 zh62(`LRm*cRb1Ry&Abe@;w;BC!TRG@ogWVFm!TCL!kR@T+cBMT+0!%Y7frAm`-PaQ}!b-ip_ z%a$uYuaxXyZs*NI3eT}sO%8j7|JU~Ip%yW9f@7Tz&E~|^8Sx2|l>tF<^W3NAu9}Qs zDOXPFud7&RZC2seOEb9p&IiRsVjqOh7Yy*l9XE8>O>8Xo9J>>P9Cg?KoAjorHjen^ zkhs<6WKXL=2KmP!j2Par)7tH3oV%)orUIyH4mxO$-9K$8Zy=tFVbu|6mT@{ zK|EjanOrAIfVF1X^#e-lEZ@{He}63-#yv=l?+ise%f#(u$qlo~2f=deNvbVNH?o~8 zL`YfgZ7R+SDKZL+M*fuIQ(Rp!s-#$bS-Ww8H9x+Qf{#vk?XrwaEJ1r(m7c1*t-mpk zS?HqIX1hL(_j6zG6to;|Xq&!NdL7 z_(=DDvr<~d$egc$ro4gZQ2K*94^`sosasU3e0{I?g)+EFU;mQh)HeCn^K6enZLWQM4&cJuqIhl=aG1B*tWicC0Ht)_k^jX+>+ObX|ns W_}!Yf^LN_B>-zczi=t=%?SBLHoNEyP diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/repres.pdf b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/repres.pdf deleted file mode 100644 index e1379ab361198f57c298d0b59cd64d1d92b45fe4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13463 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 Bu+RVi diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/repres.xml b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/repres.xml deleted file mode 100644 index da22a5aa593..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/repres.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - - - -vextex 0 -vertex 1 -vertex 2 -vertex 3 - --16.245 27.54 m --64.1677 51.03 l --38.1758 -8.1 l -h - - --64.1677 51.03 m --92.5965 -9.72 l --38.1758 -8.1 l - - --92.5965 -9.72 m --16.245 27.54 l - -facet 0 - --64.1677 51.03 m --30.0532 80.19 l --38.1758 -8.1 l --16.245 27.54 l --30.0532 80.19 l - -neighbor 0 -edge $(1,3)$ - -7.31028 -0.81007 m -48.7338 0 0 48.7338 -35.966 -23.2187 -42.237 25.1099 a - - --104.78 37.26 m -30.3329 0 0 30.3329 -78.6585 52.6788 -57.6698 30.78 a - - --78.7882 72.09 m --64.1677 51.03 l - - --34.1145 -31.59 m --38.1758 -8.1 l - - --111.278 -28.35 m --92.5965 -9.72 l - - -4.06125 42.93 m --16.245 27.54 l - - --29.6619 60.0906 m -60.4585 0 0 60.4585 -28.8736 120.544 15.4631 79.4406 a - - - diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/tds3_small.pdf b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/tds3_small.pdf deleted file mode 100644 index 1cdebc5f6f48971a3a701724906ade0d7e1c74ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2713 zcma)8c{r478%Kn(l(L*G^^VTiYRtSdW(E~mlF61`B8C}T)4XGhB70?s)X7pO$}$vl zj3p;awo)h|qmmNJT8jE4+aZ0gPG`INzUw;A`^WP%Q;z`TedNwcp$V4eH_% zcmNAPK0(0Fod}FIjp5G@06-k52Vg7$>1-Mcp6L`e&79^7QE7mY5h8@mqEU_@!usM} z>r$zj(w$4&7?ZK4BBBMhRYCX{If5p}O+S$x(;t>po1(gZ#kYM@Ftsb#YSZ5cReb)u z;Qx5)Rzj;{!6^DPNB+g!ihvu<CTsd zD=S%25^K^_l}l0RJQ|68`AKe2);>g!G+RoNls;q-Be1iyOq|}?{p^FX?D1!@&B3W= z#JBx~f))!y`sATW(nl^5LyTrz#I|ftPmI*Y2Rkrp+B8~SkppJJ8ABbmyMhm%UKDvAiuPI9{Kok;rPJ&SAFV-l{%}LZk+fQz3iS_odfn(BP8eS%!g%#N}@fs zwiB*A@?yi{mDVY6x!p4z@Lmp8`)xEb=(bK@d-Srq9ZWY%+I2xOd9E>3f;_KGr&1EiCNmTSmZc}X1^ zCj?rqupmfa`1a$GuC~K2F0m2u^{(za-CP2CM=Q0Enlpyz(8A8k{To#y9Ts%qG8sD;!k&u=lL52#!Cg2QML-mzjvMzHQ_9Y#{o{k0^&M5a!kc~%ozzH{Tu zV4qTY@^prcu(kQG;3lbjCFyfNix*v&G$urMQKw8;tVmJ`rd5e3s;u4>S|3dreI#_L z
Jm66%Ua}N7vo-LbEni>=Sls?Yx*zB`4Q^;8&Wur>0?Lsn#3I*7XlGgRp=-T*dPh``C1S-NPg)uUeE=)5iL3uF|B9A@xH;-=!D0}O&byH4iS0$U#Z*RbL z%27MHcPwlz4klN9#GGJJ!TahD3T@OoFJ?#MIg1W*+d0p6d%CxKq+=IO4WwjPic(yu zwLib+;rX2T{au*BQcz|?)dWZA-x>Y3o3)|_2JVGM8j$XV-CAr(PeqRib<)t z-t&L?*lheK(}3=}h2ElLrAssKmK74B@iE8g2(rMBZzykL>U^pC(8tqzV>{0Z_%;t4 zd=a@Fttkd#iO4kL!q{hOv$t|DYL_#2r3#uogABsm#X5_Pl$wof?k%4iTYfpV+!A@? zxmrGW2wP{w9M?;Y=EU*-!DOAuwhTgH28yiyfn7}08bc%RT5)EqXtq;p)mLW3x5Oy z0-&#l^Mo&CLCmi>NWkk7_3;1>)Ym0~@J!Ov1@U+Qk0n?@5uFa8BQ3o=Er?Dqrbh!Wzb|uU}HodAU_D72S3aS=ca%7nOT; z$NM7lzMt1E^d^b*rq6zq5^sO%bgZk!e{`vKhW_sEHAe4*nU90(oouHkV6J#M0uaHX39c zPsSyAGFm=xelnsloQVk%uVUPNK*-_rkz?|$By3UM?52!zA(SJNCseqvl)kAc-Udvf zCIzmf46ClMwKDkWm$y2v5+;&GwTg?{FQ*Ubyy7!59dDMs@&EbW9wYBk54Y%1$zg@) zwS(AT1$6hF(A2e&&RTBQPE{(FCRerSELI0o-ebsTT2u!tb=&XrHg$s}?e^|m>qp0? zWwj?hF}^tJ9K(8c#0@C$xItYyST|7z!tln94}J6@wQJ_LJtXp?HosPR#=RNfgWDlo zao;j)ps&1B#xMHZSUu=dEYUAls@OYx_>F(m8P#8q;wZ;p$7W`Z^rt;lq_nF#2|5!W zJx9qiqvr;DR0LYPs@92eqkQ57UhaVQ)o^$YP~^%M?u6f8 z5vfp&X!)MCs}KI44}6uiA*-|vh4}y?Fjj%o5SW9j^mc&B`4=|`-?^Gm*c3YCkNC>` zknhMu{F{Rr+yk*87N7<52_WiX0Va!fG>~=-!0Btl{w#I?Ty|NHo>b0EYphx;l( z%iIu$#p;6~jtF82AOQ>e+d$O+clKBOVJw;-0t=83*gpsGbp`kV-!S+#gKrq)4-ALX zgA-XDz@Her`OXf+8GL7l!(-v9{nHnRhgIZHjLo71(rGNjYBT8=c$@}@hjD-)Hn3W4 jSUt%MKL}VYqyzjX;8v2tVt>s8r)NMypiq14ED-+%*{6LN diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/tds3_small.png b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/tds3_small.png deleted file mode 100644 index 92a9d4d5571769d3a8aa4eb0a4ae376a7798a49c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6709 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 LNkvXXu0mjfeNP)0 diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex2.gif b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex2.gif deleted file mode 100644 index ded6b264414894b3ed466d8d36cea81161cd2803..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2237 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≪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 diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex2.xml b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex2.xml deleted file mode 100644 index 1bb642329dc..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex2.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - -48.0739 0 0 48.0739 -117.794 261.666 e - - - - -$v_0$ -$v_1$ -$v_2$ - --26.9262 268.887 m -147.708 270.405 l - - - -$\infty$ -$\infty$ -$p_0$ -$p_1$ - -138.57 292.68 m -383.284 0 0 383.284 -36.0222 -48.5299 -112.214 327.105 a - - --38.0946 290.149 m -55.7192 0 0 55.7192 -91.7888 275.264 -112.213 327.105 a - - - diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex3.gif b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex3.gif deleted file mode 100644 index a84905e512162cef85ef31e35966f2b749fab29b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3075 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 diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex3.pdf b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex3.pdf deleted file mode 100644 index 8d7f3280770643349d0f2fa4a55a31ea591a2395..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14607 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 adw=bBiNJ8OCKH4>0)(0J@u}*n(f=QbW3~ - - - - - -67.3355 225.217 m -83.5755 257.852 l - - -61.0952 192.965 m -107.951 170.069 l - - -23.1352 182.041 m --7.02484 160.713 l - -$\infty$ -$\infty$ -$\infty$ - -22.6345 181.072 m -60.5943 191.996 l -66.8343 224.248 l -22.6345 181.072 l - - - - -$p_1$ -$p_2$ -$p_0$ -$v_0$ -$v_1$ -$v_2$ -$v_3$ - -51.1524 0 0 51.1524 -98.729 221.878 e - - --102.282 189.477 m -20.4215 0 0 20.4215 -120.558 198.59 -101.992 190.084 a - - --124.619 203.653 m -34.6684 0 0 34.6684 -105.013 232.245 -84.0066 204.666 a - - --105.013 232.244 m -24.0712 0 0 24.0712 -101.042 208.503 -124.619 203.653 a - - --84.007 204.666 m -33.6269 0 0 33.6269 -117.433 200.996 -105.013 232.245 a - - --143.664 197.436 m -21.6103 0 0 21.6103 -140.084 218.748 -124.619 203.653 a - - --84.007 204.666 m -30.2533 0 0 30.2533 -57.8262 219.826 -59.0489 189.597 a - - --92.3377 256.019 m -24.3954 0 0 24.3954 -116.202 250.956 -105.027 272.641 a - - --92.3374 256.019 m -36.6504 0 0 36.6504 -68.5987 228.095 -105.013 232.245 a - - --105.026 272.641 m -71.753 0 0 71.753 -72.7761 208.544 -143.664 197.436 a - - --59.0486 189.597 m -98.0382 0 0 98.0382 -154.137 213.465 -70.4186 264.482 a - - --70.4195 264.482 m -67.9292 0 0 67.9292 -57.2788 197.836 -92.3381 256.019 a - - - - - - -109.633 180.293 m -104.199 0 0 104.199 6.0939 192.002 -75.1533 257.242 a - - --75.1533 257.241 m -272.961 0 0 272.961 183.418 344.697 -15.2519 157.513 a - - -59.8832 265.85 m -165.466 0 0 165.466 1.96907 110.85 -75.1535 257.244 a - - - diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex4.gif b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex4.gif deleted file mode 100644 index 0898bdb7198183f2c4c24fdcb9882683d749bdcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4303 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 diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex4.pdf b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3/topo-simplex4.pdf deleted file mode 100644 index aedfd34d19d454491827ccd5255d631dc2f45b84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14693 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 - - - - - --81.2454 271.418 m --106.628 208.137 l --42.6635 209.655 l --81.2454 271.418 l --28.9568 257.749 l --42.6635 209.655 l - - --106.628 208.137 m --28.9568 257.749 l - - --79.2149 322.548 m -88.1957 0 0 88.1957 -29.0183 250.031 -106.628 208.136 a - - --79.2154 322.548 m -421.773 0 0 421.773 340.434 280.277 -81.2459 271.415 a - - --28.9565 257.749 m -73.1042 0 0 73.1042 -101.91 253.057 -79.2145 322.549 a - - --42.6635 209.656 m -59.5577 0 0 59.5577 -65.8704 264.506 -79.2143 322.55 a - - - - - - -$v_0$ -$v_1$ -$v_2$ -$v_3$ -$v_4$ - -79.6817 269.393 m -54.2988 206.112 l -118.264 207.63 l -79.6817 269.393 l -131.97 255.724 l -118.264 207.63 l - - -54.2988 206.112 m -131.97 255.724 l - - -79.6817 269.393 m -79.6817 309.893 l -79.6817 309.893 l - - -131.97 255.724 m -155.83 267.874 l - - -118.264 207.63 m -144.154 171.18 l - - -54.2988 206.112 m -19.2706 183.33 l - - - - - -$p_0$ -$p_1$ -$p_2$ -$p_3$ - -74.0975 315.968 m -126.287 0 0 126.287 -6.86057 219.044 -79.2145 322.549 a - - -159.383 176.749 m -143.066 0 0 143.066 24.2582 223.75 -79.2152 322.548 a - - -153.292 274.962 m -147.512 0 0 147.512 19.4676 212.906 -79.2142 322.549 a - - -24.3472 199.024 m -81.2765 0 0 81.2765 -35.4707 254.048 -79.2147 322.549 a - -$\infty$ -$\infty$ -$\infty$ -$\infty$ - - diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Tds_cell_3.tex b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Tds_cell_3.tex deleted file mode 100644 index 08384028754..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Tds_cell_3.tex +++ /dev/null @@ -1,119 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Tds_cell_3.tex -% +------------------------------------------------------------------------+ -% | 29.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSTdscellRev}{$Id$} -\RCSdefDate{\RCSTdscellDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefConcept}[TriangulationDataStructure_3::]{Cell} - -%% \ccHtmlCrossLink{} %% add further rules for cross referencing links -%% \ccHtmlIndexC[concept]{} %% add further index entries - -\ccDefinition - -The concept \ccRefName\ stores -four \ccc{Vertex_handle}s to its four vertices and four \ccc{Cell_handle}s -to its four neighbors. The vertices are indexed 0, 1, 2, and 3 in consistent -order. The neighbor indexed $i$ lies opposite to vertex \ccc{i}. - -In degenerate dimensions, cells are used to store faces of maximal -dimension: in dimension~2, each cell represents only one -facet of index 3, and 3 edges $(0,1)$, $(1,2)$ and $(2,0)$; in -dimension~1, each cell represents one edge $(0,1)$. (See also -Section~\ref{TDS3-sec-intro}.) - -\ccTypes -\ccThree{typedef TriangulationDataStructure_3::Vertex_handle}{Facet }{} -\ccThreeToTwo -The class \ccRefName\ defines the following types. - -\ccTypedef{typedef TriangulationDataStructure_3 Triangulation_data_structure;}{} -\ccGlue -\ccTypedef{typedef TriangulationDataStructure_3::Vertex_handle Vertex_handle;}{} -\ccGlue -\ccTypedef{typedef TriangulationDataStructure_3::Cell_handle Cell_handle;}{} - -\ccCreation -\ccCreationVariable{c} %% choose variable name -\ccThree{Vertex_handle}{c.set_vertices(Vertex_handle v)xxxxxxx;}{} - -In order to obtain new cells or destruct unused cells, the user must call the -\ccc{create_cell()} and \ccc{delete_cell()} methods of the triangulation data -structure. - -\ccOperations - -\ccAccessFunctions - -\ccMethod{Vertex_handle vertex(int i) const;} -{Returns the vertex \ccc{i} of \ccVar. -\ccPrecond{$i \in \{0, 1, 2, 3\}$.}} -\ccGlue -\ccMethod{int index(Vertex_handle v) const;} -{Returns the index of vertex \ccc{v} in \ccVar. -\ccPrecond{\ccc{v} is a vertex of \ccVar}.} -\ccGlue -\ccMethod{bool has_vertex(Vertex_handle v) const;} -{Returns \ccc{true} if \ccc{v} is a vertex of \ccVar.} -\ccGlue -\ccMethod{bool has_vertex(Vertex_handle v, int & i) const;} -{Returns \ccc{true} if \ccc{v} is a vertex of \ccVar, and -computes its index \ccc{i} in \ccVar.} - -\ccMethod{Cell_handle neighbor(int i) const;} -{Returns the neighbor \ccc{i} of \ccVar. -\ccPrecond{$i \in \{0, 1, 2, 3\}$.}} -\ccGlue -\ccMethod{int index(Cell_handle n) const;} -{Returns the index corresponding to neighboring cell \ccc{n}. -\ccPrecond{\ccc{n} is a neighbor of \ccVar.}} -\ccGlue -\ccMethod{bool has_neighbor(Cell_handle n) const;} -{Returns \ccc{true} if \ccc{n} is a neighbor of \ccVar.} -\ccGlue -\ccMethod{bool has_neighbor(Cell_handle n, int & i) const;} -{Returns \ccc{true} if \ccc{n} is a neighbor of \ccVar, and -computes its index \ccc{i} in \ccVar.} - -\ccHeading{Setting} - -\ccMethod{void set_vertex(int i, Vertex_handle v);} -{Sets vertex \ccc{i} to \ccc{v}. -\ccPrecond{$i \in \{0, 1, 2, 3\}$.}} -\ccGlue -\ccMethod{void set_vertices(Vertex_handle v0, - Vertex_handle v1, - Vertex_handle v2, - Vertex_handle v3);} -{Sets the vertex pointers.} - -\ccMethod{void set_neighbor(int i, Cell_handle n);} -{Sets neighbor \ccc{i} to \ccc{n}. -\ccPrecond{$i \in \{0, 1, 2, 3\}$.}} -\ccGlue -\ccMethod{void set_neighbors(Cell_handle n0, - Cell_handle n1, - Cell_handle n2, - Cell_handle n3);} -{Sets the neighbors pointers.} - -\begin{ccDebug} -\ccHeading{Checking} -\ccThree{Vertex_handle}{c.set_vertices(v);}{} - -\ccMethod{bool is_valid(bool verbose = false, int level = 0) const;} -{User defined local validity checking function.} -\end{ccDebug} - -\ccSeeAlso - -\ccc{TriangulationDataStructure_3::Vertex}. - -\end{ccRefConcept} diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Tds_vertex_3.tex b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Tds_vertex_3.tex deleted file mode 100644 index fd7ddc8505c..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Tds_vertex_3.tex +++ /dev/null @@ -1,95 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Tds_vertex_3.tex -% +------------------------------------------------------------------------+ -% | 29.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSTdsvertexRev}{$Id$} -\RCSdefDate{\RCSTdsvertexDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefConcept}[TriangulationDataStructure_3::]{Vertex} - -%% \ccHtmlCrossLink{} %% add further rules for cross referencing links -%% \ccHtmlIndexC[concept]{} %% add further index entries - -\ccDefinition - -The concept \ccRefName\ represents the vertex class of a 3D-triangulation -data structure. It must define -the types and operations listed in this section. Some of these -requirements are of geometric nature, they are \textit{optional} -when using the triangulation data structure class alone. They become -compulsory when the triangulation data structure is used as a layer -for the geometric triangulation class. (See Section~\ref{TDS3-sec-design}.) - -\ccTypes -\ccThree{typedef TriangulationDataStructure_3::}{Facet }{} -\ccThreeToTwo -\ccNestedType{Point}{\textit{Optional for the triangulation data -structure alone.}} - -The class \ccRefName\ defines types that are the same as some of the -types defined by the triangulation data structure class -\ccc{TriangulationDataStructure_3}. - -\ccThree{typedef TriangulationDataStructure_3::Vertex_handle}{Facet }{} - -\ccTypedef{typedef TriangulationDataStructure_3 Triangulation_data_structure;}{} -\ccGlue -\ccTypedef{typedef TriangulationDataStructure_3::Vertex_handle Vertex_handle;}{} -\ccGlue -\ccTypedef{typedef TriangulationDataStructure_3::Cell_handle Cell_handle;}{} - -\ccCreation -\ccCreationVariable{v} %% choose variable name - -In order to obtain new vertices or destruct unused vertices, the user must -call the \ccc{create_vertex()} and \ccc{delete_vertex()} methods of the -triangulation data structure. - -\ccOperations -\ccThree{Vertex_handle}{v.set_point(Vertex_handle v)}{} - -\ccAccessFunctions - -\ccMethod{Cell_handle cell() const;} -{Returns a cell of the triangulation having \ccVar\ as vertex.} - -\ccMethod{Point point() const;} -{Returns the point stored in the vertex. -{\textit{Optional for the triangulation data structure alone.}}} - -\ccHeading{Setting} - -\ccMethod{void set_cell(Cell_handle c);} -{Sets the incident cell to \ccc{c}.} - -\ccMethod{void set_point(const Point & p);} -{Sets the point to \ccc{p}. {\textit{Optional for the -triangulation data structure alone.}}} - -\begin{ccDebug} -\ccHeading{Checking} - -\ccMethod{bool is_valid(bool verbose = false) const;} -{Checks the validity of the vertex. Must check that its incident cell -has this vertex. The validity of the base vertex is also checked.\\ -When \ccc{verbose} is set to \ccc{true}, messages are printed to give -a precise indication on the kind of invalidity encountered.} -\end{ccDebug} - -\ccSeeAlso - -\ccc{TriangulationDataStructure_3::Cell}. - -\end{ccRefConcept} - -% +------------------------------------------------------------------------+ -%%RefPage: end of main body, begin of footer -% EOF -% +------------------------------------------------------------------------+ - diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/TriangulationDSCellBase_3.tex b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/TriangulationDSCellBase_3.tex deleted file mode 100644 index f08fce60139..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/TriangulationDSCellBase_3.tex +++ /dev/null @@ -1,189 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: TriangulationDSCellBase_3.tex -% +------------------------------------------------------------------------+ -% | 29.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSTriangulationcbRev}{$Id$} -\RCSdefDate{\RCSTriangulationcbDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefConcept}{TriangulationDSCellBase_3} - -%% \ccHtmlCrossLink{} %% add further rules for cross referencing links -%% \ccHtmlIndexC[concept]{} %% add further index entries - -\ccDefinition - -At the base level -(see Sections~\ref{Triangulation3-sec-design} and~\ref{TDS3-sec-design}), -a cell stores handles to its four vertices and to its four neighbor cells. -The vertices and neighbors are indexed 0, 1, 2 and 3. Neighbor $i$ -lies opposite to vertex $i$. - -Since the Triangulation data structure is the class which defines the handle -types, the cell base class has to be somehow parameterized by the Triangulation -data structure. But since it is itself parameterized by the cell and vertex -base classes, there is a cycle in the definition of these classes. In order -to break the cycle, the base classes for vertex and cell which are given as -arguments for the Triangulation data structure use \ccc{void} as Triangulation -data structure parameter, and the Triangulation data structure then uses a -{\it rebind}-like mechanism (similar to the one specified in -\ccc{std::allocator}) in order to put itself as parameter to the vertex and -cell classes. The {\it rebound} base classes so obtained are the classes -which are used as base classes for the final vertex and cell classes. -More information can be found in Section~\ref{TDS3-sec-design}. - -\ccTypes -\ccThree{typedef TriangulationDataStructure_3::Vertex_handle}{}{} -\ccThreeToTwo -The concept \ccRefName\ has to provide the following types. - -\ccNestedType{ - template - struct Rebind_TDS} -{This nested template class has to define a type \ccc{Other} which is the -{\it rebound} cell, that is, the one whose \ccc{Triangulation_data_structure} -will be the actually used one. The \ccc{Other} type will be the real base -class of \ccc{Triangulation_data_structure_3::Cell}.} - -\ccTypedef{typedef TriangulationDataStructure_3 Triangulation_data_structure;}{} -\ccGlue -\ccTypedef{typedef TriangulationDataStructure_3::Vertex_handle Vertex_handle;}{} -\ccGlue -\ccTypedef{typedef TriangulationDataStructure_3::Cell_handle Cell_handle;}{} -\ccGlue -\ccTypedef{typedef TriangulationDataStructure_3::Cell_data TDS_data;}{} - -\ccCreation -\ccCreationVariable{c} %% choose variable name - -\ccConstructor{Cell_base();} -{Default constructor} -\ccGlue -\ccConstructor{Cell_base( Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3);} -{Initializes the vertices with \ccc{v0, v1, v2, v3}. Neighbors are -initialized to the default constructed handle.} -\ccGlue -\ccConstructor{Cell_base( Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3, - Cell_handle n0, Cell_handle n1, - Cell_handle n2, Cell_handle n3)} -{Initializes the vertices with \ccc{v0, v1, v2, v3} and the neighbors with -\ccc{n0, n1, n2, n3}.} - -\ccAccessFunctions -\ccThree{Vertex_handlex}{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}{} - -\ccMethod{Vertex_handle vertex(int i) const;} -{Returns the vertex \ccc{i} of \ccVar. -\ccPrecond{$i \in \{0, 1, 2, 3\}$.}} -\ccGlue -\ccMethod{int index(Vertex_handle v) const;} -{Returns the index of \ccc{v}. -\ccPrecond{\ccc{v} is a vertex of \ccVar}} -\ccGlue -\ccMethod{bool has_vertex(Vertex_handle v);} -{True iff \ccc{v} is a vertex of \ccVar.} -\ccGlue -\ccMethod{bool has_vertex(Vertex_handle v, int & i) const;} -{Returns \ccc{true} if \ccc{v} is a vertex of \ccVar, and -computes its index \ccc{i} in \ccVar.} - -\ccMethod{Cell_handle neighbor(int i) const;} -{Returns the neighbor \ccc{i} of \ccVar. -\ccPrecond{$i \in \{0, 1, 2, 3\}$.}} -\ccGlue -\ccMethod{int index(Cell_handle n) const;} -{Returns the index of cell \ccc{n} in \ccVar. -\ccPrecond{\ccc{n} is a neighbor of \ccVar.}} -\ccGlue -\ccMethod{bool has_neighbor(Cell_handle n);} -{Returns \ccc{true} if \ccc{n} is a neighbor of \ccVar.} -\ccGlue -\ccMethod{bool has_neighbor(Cell_handle n, int & i) const;} -{Returns \ccc{true} if \ccc{n} is a neighbor of \ccVar, and -computes its index \ccc{i} in \ccVar.} - -\ccHeading{Setting} - -\ccMethod{void set_vertex(int i, Vertex_handle v);} -{Sets vertex \ccc{i} to \ccc{v}. -\ccPrecond{$i \in \{0, 1, 2, 3\}$.}} -\ccGlue -\ccMethod{ void set_vertices();} -{Sets the vertices to the default constructed handle.} -\ccGlue -\ccMethod{void set_vertices( Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3);} -{Sets the vertices.} - -\ccMethod{void set_neighbor(int i, Cell_handle n);} -{Sets neighbor \ccc{i} to \ccc{n}. -\ccPrecond{$i \in \{0, 1, 2, 3\}$.}} -\ccGlue -\ccMethod{void set_neighbors();} -{Sets the neighbors to the default constructed handle.} -\ccGlue -\ccMethod{void set_neighbors(Cell_handle n0, Cell_handle n1, - Cell_handle n2, Cell_handle n3);} -{Sets the neighbors.} - -\begin{ccDebug} -\ccHeading{Checking} -\ccMethod{bool is_valid(bool verbose = false, int level = 0) const;} -{Performs any desired geometric test on a cell.\\ -When \ccc{verbose} is set to \ccc{true}, messages are printed to give -a precise indication of the kind of invalidity encountered. \ccc{level} -increases the level of testing.} -\end{ccDebug} - -\begin{ccAdvanced} - -\ccHeading{Various} - -\ccMethod{void * for_compact_container() const;}{} -\ccGlue -\ccMethod{void * & for_compact_container();}{} -{ These member functions are required by \ccc{Triangulation_data_structure_3} - because it uses \ccc{Compact_container} to store its cells. See the - documentation of \ccc{Compact_container} for the exact requirements.} - -\ccMethod{TDS_data& tds_data();}{} -\ccGlue -\ccMethod{const TDS_data& tds_data() const;}{} -{ These functions are used internally by the triangulation data structure. The user is -not encouraged to use them directly as they may change in the future.} - -\end{ccAdvanced} - -\ccHeading{I/O} - -\ccFunction{istream& operator>> (istream& is, TriangulationDSCellBase_3 & c);} -{Inputs the possible non combinatorial information given by the cell.} -\ccGlue -\ccFunction{ostream& operator<< (ostream& os, const TriangulationDSCellBase_3 & c);} -{Outputs the possible non combinatorial information given by the cell.} - -\ccHasModels - -\ccc{CGAL::Triangulation_ds_cell_base_3}\\ -\ccc{CGAL::Triangulation_cell_base_3}\\ -\ccc{CGAL::Triangulation_cell_base_with_info_3} - -\ccSeeAlso - -\ccc{TriangulationDSVertexBase_3}\\ -\ccc{TriangulationVertexBase_3}\\ -\ccc{TriangulationHierarchyVertexBase_3}\\ -\ccc{TriangulationCellBase_3} - -%% \ccExample - -%% \ccIncludeExampleCode{Triangulation3/Triangulation_cb_3_prog.C} - -\end{ccRefConcept} diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/TriangulationDSVertexBase_3.tex b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/TriangulationDSVertexBase_3.tex deleted file mode 100644 index 89956537485..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/TriangulationDSVertexBase_3.tex +++ /dev/null @@ -1,132 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: TriangulationDSVertexBase_3.tex -% +------------------------------------------------------------------------+ -% | 29.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSTriangulationvbRev}{$Id$} -\RCSdefDate{\RCSTriangulationvbDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefConcept}{TriangulationDSVertexBase_3} - -\ccDefinition - -At the bottom level of 3D-triangulations -(see Sections~\ref{Triangulation3-sec-design} and~\ref{TDS3-sec-design}), -a vertex provides access to one of its incident cells through a handle. - -Note that when you use the triangulation data structure as parameter of a -geometric triangulation, the vertex base class has additional geometric -requirements : it has to match the \ccc{TriangulationVertexBase_3} concept. - -Since the Triangulation data structure is the class which defines the handle -types, the vertex base class has to be somehow parameterized by the -Triangulation data structure. But since it is itself parameterized by the cell -and vertex base classes, there is a cycle in the definition of these classes. -In order to break the cycle, the base classes for vertex and cell which are -given as arguments for the Triangulation data structure use \ccc{void} as -Triangulation data structure parameter, and the Triangulation data structure -then uses a {\it rebind}-like mechanism (similar to the one specified in -\ccc{std::allocator}) in order to put itself as parameter to the vertex and -cell classes. The {\it rebound} base classes so obtained are the classes which -are used as base classes for the final vertex and cell classes. -More information can be found in Section~\ref{TDS3-sec-design}. - -\ccTypes -\ccThree{typedef TriangulationDataStructure_3::Vertex_handle}{}{} -\ccThreeToTwo -The class \ccRefName\ has to define the following types. - -\ccNestedType{ - template - struct Rebind_TDS} -{This nested template class has to define a type \ccc{Other} which is the -{\it rebound} vertex, that is, the one whose \ccc{Triangulation_data_structure} -will be the actually used one. The \ccc{Other} type will be the real base -class of \ccc{Triangulation_data_structure_3::Vertex}.} - -\ccTypedef{typedef TriangulationDataStructure_3 Triangulation_data_structure;}{} -\ccGlue -\ccTypedef{typedef TriangulationDataStructure_3::Vertex_handle Vertex_handle;}{} -\ccGlue -\ccTypedef{typedef TriangulationDataStructure_3::Cell_handle Cell_handle;}{} - - -\ccCreation -\ccCreationVariable{v} %% choose variable name - -\ccThree{Triangulation}{Facetxxxxxxxxxxxxxxxxxxxxxxxxx}{} - -\ccConstructor{TriangulationVertexBase_3();} -{Default constructor.} -\ccGlue -\ccConstructor{TriangulationVertexBase_3(Cell_handle c);} -{Constructs a vertex pointing to cell \ccc{c}.} - -\ccOperations - -\ccAccessFunctions - -\ccMethod{Cell_handle cell() const;} -{Returns the pointer to an incident cell} - -\ccHeading{Setting} - -\ccMethod{void set_cell(Cell_handle c);} -{Sets the incident cell.} - -\begin{ccDebug} -\ccHeading{Checking} -\ccMethod{bool is_valid(bool verbose=false, int level=0) const;} -{Performs any desired test on a vertex. Checks that the -pointer to an incident cell is not the default constructed handle.} -\end{ccDebug} - -\ccHeading{Various} - -\ccMethod{void * for_compact_container() const;}{} -\ccGlue -\ccMethod{void * & for_compact_container();}{} -{ These member functions are required by \ccc{Triangulation_data_structure_3} - because it uses \ccc{Compact_container} to store its cells. See the - documentation of \ccc{Compact_container} for the exact requirements.} - -\ccHeading{I/O} - -\ccFunction{istream& operator>> -(istream& is, TriangulationDSVertexBase_3 & v);} -{Inputs the non-combinatorial information given by the vertex.} -%\ccPrecond{The point and the other information have a corresponding -%operator \ccc{>>}. \textit{This precondition is optional for the -%triangulation data structure alone.}}} - -\ccFunction{ostream& operator<< (ostream& os, - const TriangulationDSVertexBase_3 & v);} -{Outputs the non-combinatorial information given by the vertex.} -%\ccPrecond{The point and the other information have a corresponding -%operator \ccc{<<}. \textit{This precondition is optional for the -%triangulation data structure alone.}}} - -\ccHasModels - -\ccc{CGAL::Triangulation_ds_vertex_base_3}\\ -\ccc{CGAL::Triangulation_vertex_base_3}\\ -\ccc{CGAL::Triangulation_vertex_base_with_info_3}\\ -\ccc{CGAL::Triangulation_hierarchy_vertex_base_3} - -\ccSeeAlso - -\ccc{TriangulationVertexBase_3}\\ -\ccc{TriangulationHierarchyVertexBase_3}\\ -\ccc{TriangulationDSCellBase_3}\\ -\ccc{TriangulationCellBase_3} - -%% \ccExample - -%% \ccIncludeExampleCode{Triangulation3/Triangulation_vb_prog.C} - -\end{ccRefConcept} diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/TriangulationDataStructure_3.tex b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/TriangulationDataStructure_3.tex deleted file mode 100644 index fbd6775295e..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/TriangulationDataStructure_3.tex +++ /dev/null @@ -1,736 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: TriangulationDataStructure_3.tex -% +------------------------------------------------------------------------+ -% | 27.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSTdsRev}{$Id$} -\RCSdefDate{\RCSTdsDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefConcept}{TriangulationDataStructure_3} - -%% \ccHtmlCrossLink{} %% add further rules for cross referencing links -%% \ccHtmlIndexC[concept]{} %% add further index entries - -\ccDefinition - -3D-triangulation data structures are meant to maintain the -combinatorial information for 3D-geometric triangulations. - -In \cgal, a triangulation data structure is a container of cells -($3$-faces) and vertices ($0$-faces). Following the standard -vocabulary of simplicial complexes, an $i$-face $f_i$ and a $j$-face -$f_j$ $(0 \leq j < i \leq 3)$ are said to be \textit{incident} in the -triangulation if $f_j$ is a (sub)face of $f_i$, and two $i$-faces $(0 -\leq i \leq 3)$ are said to be \textit{adjacent} if they share a -common incident (sub)face. - -Each cell gives -access to its four incident vertices and to its four adjacent -cells. Each vertex gives direct access to one of its incident cells, which is -sufficient to retrieve all the incident cells when needed. - -The four vertices of a cell are indexed with 0, 1, 2 and 3. The -neighbors of a cell are also indexed with 0, 1, 2, 3 -in such a way that the neighbor indexed by $i$ is opposite to the vertex -with the same index (see Figure~\ref{TDS3-fig-repres}). - -Edges ($1$-faces) and facets ($2$-faces) are not explicitly -represented: a facet is given by a cell and an index (the facet -\ccc{i} of a cell \ccc{c} is the facet of \ccc{c} that is opposite to -the vertex of index \ccc{i}) and an edge is given by a cell and two -indices (the edge \ccc{(i,j)} of a cell \ccc{c} is the edge -whose endpoints are the vertices of indices \ccc{i} and \ccc{j} of -\ccc{c}). - -As \cgal\ explicitly deals with all degenerate cases, a -3D-triangulation data structure in \cgal\ can handle the cases when -the dimension of the triangulation is lower than~3 -(see Section~\ref{TDS3-sec-intro}). - -Thus, a 3D-triangulation data structure can store a triangulation of a -topological sphere $S^d$ of $\R^{d+1}$, for any $d \in \{-1,0,1,2,3\}$. - -\bigskip - -The second template parameter of the basic triangulation class -(see Chapter~\ref{chapter-Triangulation3} -\lcTex{, \ccRefPage{CGAL::Triangulation_3}}) -\ccc{Triangulation_3} is a triangulation data structure class. (See -Chapter~\ref{chapter-TDS3}.) - -To ensure all the \textbf{flexibility} of the class \ccc{Triangulation_3}, a -model of a triangulation data structure must be templated by the base vertex -and the base cell classes (see~\ref{TDS3-sec-intro}): -\ccc{TriangulationDataStructure_3}. -The optional functionalities related to geometry are compulsory for -this use as a template parameter of \ccc{Triangulation_3}. - -\bigskip - -A class that satisfies the requirements for a triangulation data structure -class must provide the following types and operations. - -\ccTypes -\ccThree{typedef Triple }{Facet; }{} -\ccThreeToTwo - -\ccNestedType{Vertex}{Vertex type} -\ccGlue -\ccNestedType{Cell}{Cell type} - -\ccNestedType{size_type}{Size type (unsigned integral type)} -\ccGlue -\ccNestedType{difference_type}{Difference type (signed integral type)} - -Vertices and cells are usually manipulated via \ccc{handles}, which support -the two dereference operators \ccc{operator*} and \ccc{operator->}. - -\ccNestedType{Vertex_handle}{} -\ccGlue -\ccNestedType{Cell_handle}{} - -Requirements for \ccc{Vertex} and \ccc{Cell} are described in -\ccc{TriangulationDataStructure_3::Vertex} and -\ccc{TriangulationDataStructure_3::Cell} \lcTex{( -\ccRefPage{TriangulationDataStructure_3::Vertex} and -\ccRefPage{TriangulationDataStructure_3::Cell})}. - -\begin{ccAdvanced} -\ccNestedType{template struct Rebind_vertex} -{This nested template class allows to get the type of a triangulation -data structure that only changes the vertex type. It has to define a type -\ccc{Other} which is a {\it rebound} triangulation data structure, that is, the -one whose \ccc{TriangulationDSVertexBase_3} will be \ccc{Vb2}.} -\ccGlue -\ccNestedType{template struct Rebind_cell} -{This nested template class allows to get the type of a triangulation -data structure that only changes the cell type. It has to define a type -\ccc{Other} which is a {\it rebound} triangulation data structure, that is, the -one whose \ccc{TriangulationDSCellBase_3} will be \ccc{Cb2}.} -\end{ccAdvanced} - - -\ccTypedef{typedef Triple Edge;}{\ccc{(c,i,j)} is the -edge of cell \ccc{c} whose vertices indices are \ccc{i} and -\ccc{j}. (See Section~\ref{TDS3-sec-intro}.)} -\ccGlue -\ccTypedef{typedef std::pair Facet;}{\ccc{(c,i)} is the facet -of \ccc{c} opposite to the vertex of index \ccc{i}. (See -Section~\ref{TDS3-sec-intro}.)} - -The following iterators allow one to visit all the vertices, edges, facets -and cells of the triangulation data structure. They are all -bidirectional, non-mutable iterators. - -\ccNestedType{Cell_iterator}{} -\ccGlue -\ccNestedType{Facet_iterator}{} -\ccGlue -\ccNestedType{Edge_iterator}{} -\ccGlue -\ccNestedType{Vertex_iterator}{} - -The following circulators allow us to visit all the cells and facets -incident to a given edge. They are bidirectional and non-mutable. - -\ccNestedType{Facet_circulator}{} -\ccGlue -\ccNestedType{Cell_circulator}{} - -Iterators and circulators are convertible to the corresponding handles, thus -the user can pass them directly as arguments to the functions. - -\ccCreation -\ccCreationVariable{tds} %% choose variable name -\ccThree{TriangulationDataStructxure_3;}{tds.set_number}{} -\ccThreeToTwo - -\ccConstructor{TriangulationDataStructure_3();} -{Default constructor.} - -\ccConstructor{TriangulationDataStructure_3(const TriangulationDataStructure_3 & tds1);} -{Copy constructor. All vertices and cells are duplicated.} - -\ccMethod{TriangulationDataStructure_3& operator= (const TriangulationDataStructure_3 & tds1);} -{Assignment operator. All vertices and cells are duplicated, and the former -data structure of \ccc{tds} is deleted.} - -\ccThree{Vertex_handle_}{tds.insert_in_facet}{} - -\ccMethod{Vertex_handle -copy_tds(const TriangulationDataStructure_3 & tds1, - Vertex_handle v = Vertex_handle());} -{\ccc{tds1} is copied into \ccVar. If \ccc{v != Vertex_handle()}, -the vertex of \ccVar\ corresponding to \ccc{v} is returned, -otherwise \ccc{Vertex_handle()} is returned. -\ccPrecond{The optional argument \ccc{v} is a vertex of \ccc{tds1}.}} - -\ccMethod{void swap(TriangulationDataStructure_3 & tds1);} -{Swaps \ccVar\ and \ccc{tds1}. There is no copy of cells and vertices, -thus this method runs in constant time. This method should be preferred to -\ccVar=\ccc{tds1} or \ccVar(\ccc{tds1}) when \ccc{tds1} is deleted after -that.} -\ccGlue -\ccMethod{void clear();} -{Deletes all cells and vertices. \ccVar\ is reset as a triangulation -data structure constructed by the default constructor.} - -\ccOperations - -\ccAccessFunctions -\ccThree{size_type}{tds.insert_in_facet()xxxxxxxxxxx}{} - -\ccMethod{int dimension() const;} -{The dimension of the triangulated topological sphere.} -\ccGlue -\ccMethod{size_type number_of_vertices() const;} -{The number of vertices. Note that the triangulation data structure has one -more vertex than an associated geometric triangulation, if there is -one, since the infinite vertex is a standard vertex and is thus also -counted.} -\ccGlue -\ccMethod{size_type number_of_cells() const;} -{The number of cells. Returns 0 if \ccVar.\ccc{dimension()}$<3$.} - -\ccHeading{Non constant-time access functions} -\ccMethod{size_type number_of_facets() const;} -{The number of facets. Returns 0 if \ccVar.\ccc{dimension()}$<2$.} -\ccGlue -\ccMethod{size_type number_of_edges() const;} -{The number of edges. Returns 0 if \ccVar.\ccc{dimension()}$<1$.} - -\begin{ccAdvanced} -\ccHeading{Setting} -\ccMethod{void set_dimension(int n);} -{Sets the dimension to \ccc{n}.} -\end{ccAdvanced} - -\ccHeading{Queries} - -\ccMethod{bool is_vertex(Vertex_handle v) const;} -{Tests whether \ccc{v} is a vertex of \ccVar.} - -\ccMethod{bool is_edge(Cell_handle c, int i, int j) const;} -{Tests whether \ccc{(c,i,j)} is an edge of \ccVar. Answers \ccc{false} when -\ccc{dimension()} $<1$ . -\ccPrecond{$i,j \in \{0,1,2,3\}$}} -\ccGlue -\ccMethod{bool is_edge(Vertex_handle u, Vertex_handle v, - Cell_handle & c, int & i, int & j) const;} -{Tests whether \ccc{(u,v)} is an edge of \ccVar. If the edge is found, -it computes a cell \ccc{c} having this edge and the indices \ccc{i} -and \ccc{j} of the vertices \ccc{u} and \ccc{v}, in this order.} -\ccGlue -\ccMethod{bool is_edge(Vertex_handle u, Vertex_handle v) const;} -{Tests whether \ccc{(u,v)} is an edge of \ccVar.} - -\ccMethod{ bool is_facet(Cell_handle c, int i) const;} -{Tests whether \ccc{(c,i)} is a facet of \ccVar. Answers \ccc{false} when -\ccc{dimension()} $<2$ . -\ccPrecond{$i \in \{0,1,2,3\}$}} -\ccGlue -\ccMethod{bool is_facet(Vertex_handle u, Vertex_handle v, Vertex_handle w, - Cell_handle & c, int & i, int & j, int & k) const;} -{Tests whether \ccc{(u,v,w)} is a facet of \ccVar. If the facet is found, -it computes a cell \ccc{c} having this facet and the indices \ccc{i}, -\ccc{j} and \ccc{k} of the vertices \ccc{u}, \ccc{v} and \ccc{w}, in -this order.} - -\ccMethod{bool is_cell(Cell_handle c) const;} -{Tests whether \ccc{c} is a cell of \ccVar. Answers \ccc{false} when -\ccc{dimension()} $<3$ .} -\ccMethod{bool is_cell(Vertex_handle u, Vertex_handle v, Vertex_handle w, Vertex_handle t, - Cell_handle & c, int & i, int & j, int & k, int & l) const;} -{Tests whether \ccc{(u,v,w,t)} is a cell of \ccVar. If the cell -\ccc{c} is found, it computes the indices \ccc{i}, \ccc{j}, \ccc{k} -and \ccc{l} of the vertices \ccc{u}, \ccc{v}, \ccc{w} and \ccc{t} in -\ccc{c}, in this order.} - -There is a method \ccc{has_vertex} in the cell class. The analogous -methods for facets are defined here. - -\ccMethod{bool has_vertex(const Facet & f, Vertex_handle v, int & j) const;} -{If \ccc{v} is a vertex of \ccc{f}, then \ccc{j} is the index of -\ccc{v} in the cell \ccc{f.first}, and the method returns \ccc{true}. -\ccPrecond{\ccVar.dimension()=3}} -\ccGlue -\ccMethod{bool has_vertex(Cell_handle c, int i, Vertex_handle v, int & j) const;} -{Same for facet \ccc{(c,i)}. Computes the index \ccc{j} of \ccc{v} in -\ccc{c}.} -\ccGlue -\ccMethod{bool has_vertex(const Facet & f, Vertex_handle v) const;} -{} -\ccGlue -\ccMethod{bool has_vertex(Cell_handle c, int i, Vertex_handle v) const;} -{Same as the first two methods, but these two methods do not return the -index of the vertex.} - -The following three methods test whether two facets have the same -vertices. - -\ccMethod{bool are_equal(const Facet & f, const Facet & g) const;} -{} -\ccGlue -\ccMethod{bool are_equal(Cell_handle c, int i, Cell_handle n, int j) const;} -{} -\ccGlue -\ccMethod{bool are_equal(const Facet & f, Cell_handle n, int j) const;} -{For these three methods: \ccPrecond{\ccVar.dimension()=3}.} - -\ccHeading{Flips} - -Two kinds of flips exist for a three-dimensional triangulation. They -are reciprocal. To be flipped, an edge must be incident to three -tetrahedra. During the flip, these three tetrahedra disappear and two -tetrahedra appear. Figure~\ref{TDS3-fig-flips}(left) shows the -edge that is flipped as bold dashed, and one of its three incident -facets is shaded. On the right, the facet shared by the two new -tetrahedra is shaded. - -%Flips are possible only if the tetrahedra to be created do not already -%exist. - -\begin{figure} -\begin{ccTexOnly} -\begin{center} -\includegraphics{TriangulationDS_3/flips} -\end{center} -\end{ccTexOnly} -\caption{Flips. -\label{TDS3-fig-flips}} -\begin{ccHtmlOnly} -
-Flips -
-\end{ccHtmlOnly} -\end{figure} - -The following methods guarantee the validity of the resulting 3D -combinatorial triangulation. Moreover the flip operations do not -invalidate the vertex handles, and only invalidate the cell -handles of the affected cells. - -\textit{Flips for a 2d triangulation are not implemented yet} - -\ccMethod{bool flip(Edge e);}{} -\ccGlue -\ccMethod{bool flip(Cell_handle c, int i, int j);} -{Before flipping, these methods check that edge \ccc{e=(c,i,j)} is -flippable (which is quite expensive). They return \ccc{false} or -\ccc{true} according to this test.} - -\ccMethod{void flip_flippable(Edge e);}{} -\ccGlue -\ccMethod{void flip_flippable(Cell_handle c, int i, int j);} -{Should be preferred to the previous methods when the edge is -known to be flippable. -\ccPrecond{The edge is flippable.}} - -\ccMethod{bool flip(Facet f);}{} -\ccGlue -\ccMethod{bool flip(Cell_handle c, int i);} -{Before flipping, these methods check that facet \ccc{f=(c,i)} is -flippable (which is quite expensive). They return \ccc{false} or -\ccc{true} according to this test.} - -\ccMethod{void flip_flippable(Facet f);}{} -\ccGlue -\ccMethod{void flip_flippable(Cell_handle c, int i);} -{Should be preferred to the previous methods when the facet is -known to be flippable. -\ccPrecond{The facet is flippable.}} - -\ccHeading{Insertions} -\ccThree{Vertex_handle}{tds.insert_in_facet()xxxxx}{} - -The following modifier member functions guarantee -the combinatorial validity of the resulting triangulation. - -\ccMethod{Vertex_handle insert_in_cell(Cell_handle c);} -{Creates a new vertex, inserts it in cell \ccc{c} and returns its handle. -The cell \ccc{c} is split into four new cells, each of these cells being -formed by the new vertex and a facet of \ccc{c}. -\ccPrecond{\ccVar.\ccc{dimension()} $= 3$ and \ccc{c} is a cell of \ccVar.}} - -\ccMethod{Vertex_handle insert_in_facet(const Facet & f);} -{Creates a new vertex, inserts it in facet \ccc{f} and returns its handle. -In dimension 3, the two incident cells are split into 3 new cells; -in dimension 2, the facet is split into 3 facets. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 2$ and \ccc{f} is a -facet of \ccVar.}} - -\ccMethod{Vertex_handle insert_in_facet(Cell_handle c, int i);} -{Creates a new vertex, inserts it in facet \ccc{i} of \ccc{c} and returns its -handle. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 2$, $i \in \{0,1,2,3\}$ -in dimension~3, $i=3$ in dimension~2 and \ccc{(c,i)} is a facet of -\ccVar.}} - -\ccMethod{Vertex_handle insert_in_edge(Edge e);} -{Creates a new vertex, inserts it in edge \ccc{e} and returns its handle. -In dimension 3, all the -incident cells are split into 2 new cells; in dimension 2, the 2 -incident facets are split into 2 new facets; in dimension 1, the edge is -split into 2 new edges. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 1$ and \ccc{e} is an edge of -\ccVar.}} - -\ccMethod{Vertex_handle insert_in_edge(Cell_handle c, int i, int j);} -{Creates a new vertex, inserts it in edge $(i,j)$ of \ccc{c} and returns its -handle. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 1$. $i\neq j$, $i,j \in -\{0,1,2,3\}$ in dimension~3, $i,j \in \{0,1,2\}$ in dimension~2, $i,j -\in \{0,1\}$ in dimension~1 and \ccc{(c,i,j)} is an edge of \ccVar.}} - -\ccMethod{Vertex_handle - insert_increase_dimension(Vertex_handle star = Vertex_handle());} -{Transforms a triangulation of the sphere $S^d$ of $\R^{d+1}$ into the -triangulation of the sphere $S^{d+1}$ of $\R^{d+2}$ by adding a new vertex -\ccc{v}: -\ccc{v} is linked to all the vertices to triangulate one of the two -half-spheres of dimension $(d+1)$. Vertex \ccc{star} is used to -triangulate the second half-sphere (when there is an associated -geometric triangulation, \ccc{star} is in fact the vertex associated with -its infinite vertex). -See Figure~\ref{TDS3-fig-topo-insert_outside_affine_hull}.\\ -The numbering of the cells is such that, if \ccc{f} was a face of -maximal dimension in the initial triangulation, then \ccc{(f,v)} (in -this order) is the corresponding face in the new triangulation. -This method can be used to insert the first two vertices in an empty -triangulation.\\ -A handle to \ccc{v} is returned. -\ccPrecond{\ccVar.\ccc{dimension()} $= d < 3$. When -\ccVar.\ccc{number_of_vertices()} $>0$, $star \neq$ \ccc{Vertex_handle()} and -\ccc{star} is a vertex of \ccVar.}} - -\begin{figure}[htbp] -\begin{ccTexOnly} -\begin{center} -\includegraphics{TriangulationDS_3_ref/topo-insert_outside_affine_hull} -\end{center} -\end{ccTexOnly} -\caption{\protect\ccc{insert_increase_dimension} (1-dimensional case). -\label{TDS3-fig-topo-insert_outside_affine_hull}} -\begin{ccHtmlOnly} -
- -
-\end{ccHtmlOnly} -\end{figure} - -\ccMethod{template - Vertex_handle insert_in_hole(CellIt cell_begin, CellIt cell_end, - Cell_handle begin, int i);} -{Creates a new vertex by starring a hole. It takes an iterator range -[\ccc{cell_begin}; \ccc{cell_end}[ of \ccc{Cell_handles} which specifies a set -of connected cells (resp. facets in dimension 2) describing a hole. -(\ccc{begin}, \ccc{i}) is a facet (resp. an edge) on the boundary of the hole, -that is, \ccc{begin} belongs to the set of cells (resp. facets) previously -described, and \ccc{begin->neighbor(i)} does not. Then this function deletes -all the cells (resp. facets) describing the hole, creates a new vertex -\ccc{v}, and for each facet (resp. edge) on the boundary of the hole, creates -a new cell (resp. facet) with \ccc{v} as vertex. \ccc{v} is returned. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 2$, the set of cells (resp. facets) -is connected, and its boundary is connected.}} - -\ccMethod{template - Vertex_handle insert_in_hole(CellIt cell_begin, CellIt cell_end, - Cell_handle begin, int i, Vertex_handle newv);} -{ Same as above, except that \ccc{newv} will be used as the new vertex, which - must have been allocated previously with e.g. \ccc{create_vertex}.} - -\ccHeading{Removal} - -\ccMethod{void remove_decrease_dimension(Vertex_handle v, Vertex_handle w = v);} -{This operation is the reciprocal of \ccc{insert_increase_dimension()}. -It transforms a triangulation of the sphere $S^d$ of $\R^{d+1}$ into the -triangulation of the sphere $S^{d-1}$ of $\R^{d}$ by removing the vertex -\ccc{v}. Delete the cells incident to \ccc{w}, keep the others. -\ccPrecond{\ccVar.\ccc{dimension()} $= d \geq -1$. -\ccVar.\ccc{degree(v)} $=$ \ccc{degree(w)} $=$ \ccVar.\ccc{number_of_vertices()} $-1$.} -} - -\ccMethod{Cell_handle remove_from_maximal_dimension_simplex(Vertex_handle v);} -{Removes \ccc{v}. The incident simplices of maximal dimension incident to -\ccc{v} are replaced by a single simplex of the same dimension. This -operation is exactly the reciprocal to \ccVar.\ccc{insert_in_cell(v)} in -dimension 3, \ccVar.\ccc{insert_in_facet(v)} in dimension 2, and -\ccVar.\ccc{insert_in_edge(v)} in dimension 1. -\ccPrecond{\ccVar.\ccc{degree(v)} $=$ \ccVar.\ccc{dimension()+1}.} -} - -\newpage - -\ccHeading{Dimension Manipulation} - -The following operation, \texttt{decrease\_dimension}, is necessary when the displacement of a vertex decreases -the dimension of the triangulation. - -\ccMethod{void decrease_dimension(Cell_handle c, int i);} -{The link of a vertex $v$ is formed by the facets -disjoint from $v$ that are included in the cells incident to $v$. When the link of \ccc{v = c->vertex(i)} contains all the other vertices, \ccc{decrease\_dimension} crushes the -triangulation of the sphere $S^d$ of $\R^{d+1}$ onto the -triangulation of the sphere $S^{d-1}$ of $\R^{d}$ formed by the link of \ccc{v} -augmented with the vertex \ccc{v} itself, for $d$==2,3; this one is placed on the facet \ccc{(c, i)} -(see Fig. \ref{TDS3-dim_down}). -\ccPrecond{ The dimension must be 2 or 3. The degree of \ccc{v} must be equal to the total number of vertices of the triangulation data structure minus 1.} -} - -\begin{figure} -\begin{ccTexOnly} -\begin{center} -\includegraphics[width=1.0\textwidth]{TriangulationDS_3_ref/tds-dim_down} -\end{center} -\end{ccTexOnly} -\caption{From an $S^d$ data structure to an $S^{d-1}$ data structure (top: $d==2$, bottom: $d==3$).\label{TDS3-dim_down}} -\begin{ccHtmlOnly} -
-Lowering dimension from 3D to 2D -
-\end{ccHtmlOnly} -\end{figure} - -\begin{ccAdvanced} -\ccHeading{Other modifiers} -The following modifiers can affect the validity of the triangulation -data structure. - -\ccMethod{void reorient();} -{Changes the orientation of all cells of the triangulation data structure. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 1$.}} - -\ccMethod{Vertex_handle create_vertex(const Vertex &v = Vertex());} -{Adds a copy of the vertex \ccc{v} to the triangulation data structure.} - -\ccMethod{Vertex_handle create_vertex(Vertex_handle v);} -{Creates a vertex which is a copy of the one pointed to by \ccc{v} -and adds it to the triangulation data structure.} - -\ccMethod{Cell_handle create_cell(const Cell &c = Cell());} -{Adds a copy of the cell \ccc{c} to the triangulation data structure.} - -\ccMethod{Cell_handle create_cell(Cell_handle c);} -{Creates a cell which is a copy of the one pointed to by \ccc{c} -and adds it to the triangulation data structure.} - -\ccMethod{Cell_handle create_cell(Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3);} -{Creates a cell and adds it into the triangulation data -structure. Initializes the vertices of the cell, its neighbor handles -being initialized with the default constructed handle.} - -\ccMethod{Cell_handle create_cell( Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3, - Cell_handle n0, Cell_handle n1, - Cell_handle n2, Cell_handle n3);} -{Creates a cell, initializes its vertices and neighbors, and adds it -into the triangulation data structure.} - -\ccMethod{void delete_vertex( Vertex_handle v );} -{Removes the vertex from the triangulation data structure. -\ccPrecond{The vertex is a vertex of \ccVar.}} - -\ccMethod{void delete_cell( Cell_handle c );} -{Removes the cell from the triangulation data structure. -\ccPrecond{The cell is a cell of \ccVar.}} - -\ccMethod{template - void delete_vertices(VertexIt first, VertexIt last);} -{Calls \ccc{delete_vertex} over an iterator range of value type -\ccc{Vertex_handle}.} - -\ccMethod{template - void delete_cells(CellIt first, CellIt last);} -{Calls \ccc{delete_cell} over an iterator range of value type -\ccc{Cell_handle}.} - -\end{ccAdvanced} - -\ccHeading{Traversing the triangulation} -\ccThree{Facet_circulator}{tds.vertices_begin()()}{} - -\ccMethod{Cell_iterator cells_begin() const;} -{Returns \ccc{cells_end()} when \ccVar.\ccc{dimension()}~$<3$.} -\ccGlue -\ccMethod{Cell_iterator cells_end() const;}{} -\ccGlue -\ccMethod{Cell_iterator raw_cells_begin() const;} -{Low-level access to the cells, does not return \ccc{cells_end()} -when \ccVar.\ccc{dimension()}~$<3$.} -\ccGlue -\ccMethod{Cell_iterator raw_cells_end() const;}{} -\ccGlue -\ccMethod{Facet_iterator facets_begin() const;} -{Returns \ccc{facets_end()} when \ccVar.\ccc{dimension()}~$<2$.} -\ccGlue -\ccMethod{Facet_iterator facets_end() const;}{} -\ccGlue -\ccMethod{Edge_iterator edges_begin() const;} -{Returns \ccc{edges_end()} when \ccVar.\ccc{dimension()}~$<1$.} -\ccGlue -\ccMethod{Edge_iterator edges_end() const;}{} -\ccGlue -\ccMethod{Vertex_iterator vertices_begin() const;}{} -\ccGlue -\ccMethod{Vertex_iterator vertices_end() const;}{} - -\ccThree{Facet_circulator}{tds.inciden__cells}{} - -\ccHeading{Cell and facet circulators} -\ccThree{Facet_circulator}{tds.incident_facets(Cell_handle c, int i, int j)x}{} - -\ccMethod{Cell_circulator incident_cells(const Edge & e) const;} -{Starts at an arbitrary cell incident to \ccc{e}. -\ccPrecond{\ccVar.\ccc{dimension()}~$=3$}} -\ccGlue -\ccMethod{Cell_circulator incident_cells(Cell_handle c, int i, int j) const;} -{As above for edge \ccc{(i,j)} of \ccc{c}.} -\ccGlue -\ccMethod{Cell_circulator incident_cells(const Edge & e, Cell_handle start) const;} -{Starts at cell \ccc{start}. -\ccPrecond{\ccVar.\ccc{dimension()}~$=3$ and \ccc{start} is incident to -\ccc{e}.}} -\ccGlue -\ccMethod{Cell_circulator incident_cells(Cell_handle c, int i, int j, Cell_handle start) -const;} -{As above for edge \ccc{(i,j)} of \ccc{c}.} - -The following circulators on facets are defined only in dimension~3, -though facets are defined also in dimension~2: there are only two -facets sharing an edge in dimension~2. -\ccMethod{Facet_circulator incident_facets(Edge e) const;} -{Starts at an arbitrary facet incident to \ccc{e}. -\ccPrecond{\ccVar.\ccc{dimension()}~$=3$}} -\ccGlue -\ccMethod{Facet_circulator incident_facets(Cell_handle c, int i, int j) const;} -{As above for edge \ccc{(i,j)} of \ccc{c}.} -\ccGlue -\ccMethod{Facet_circulator incident_facets(Edge e, Facet start) const;} -{Starts at facet \ccc{start}. -\ccPrecond{\ccc{start} is incident to \ccc{e}.}} -\ccGlue -\ccMethod{Facet_circulator incident_facets(Edge e, Cell_handle start, int f) const;} -{Starts at facet of index \ccc{f} in \ccc{start}.} -\ccGlue -\ccMethod{Facet_circulator incident_facets(Cell_handle c, int i, int j, -Facet start) const;} -{As above for edge \ccc{(i,j)} of \ccc{c}.} -\ccGlue -\ccMethod{Facet_circulator incident_facets(Cell_handle c, int i, int j, -Cell_handle start, int f) const;} -{As above for edge \ccc{(i,j)} of \ccc{c} and facet \ccc{(start,f)}.} - -\ccHeading{Traversal of the incident cells, facets and edges, and the -adjacent vertices of a given vertex} - -\ccThree{void_circulator}{tds.facets_begin()toto}{} - -\ccMethod{template - OutputIterator - incident_cells(Vertex_handle v, OutputIterator cells) const;} -{Copies the \ccc{Cell_handle}s of all cells incident to \ccc{v} to the -output iterator \ccc{cells}. -Returns the resulting output iterator. -\ccPrecond{\ccVar.\ccc{dimension()} $=3$, \ccc{v} $\neq$ \ccc{Vertex_handle()}, \ccVar.\ccc{is_vertex(v)}.}} - -\ccMethod{template - OutputIterator - incident_facets(Vertex_handle v, OutputIterator facets) const;} -{Copies the \ccc{Facet}s incident to \ccc{v} to the output iterator -\ccc{facets}. -Returns the resulting output iterator. -\ccPrecond{\ccVar.\ccc{dimension()} $>1$, \ccc{v} $\neq$ \ccc{Vertex_handle()}, \ccVar.\ccc{is_vertex(v)}.}} - -\ccMethod{template - OutputIterator - incident_edges(Vertex_handle v, OutputIterator edges) const;} -{Copies all \ccc{Edge}s incident to \ccc{v} to the -output iterator \ccc{edges}. Returns the resulting output iterator. -\ccPrecond{\ccVar.\ccc{dimension()} $>0$, \ccc{v} $\neq$ \ccc{Vertex_handle()}, \ccVar.\ccc{is_vertex(v)}.}} - -\ccMethod{template - OutputIterator - adjacent_vertices(Vertex_handle v, OutputIterator vertices) const;} -{Copies the \ccc{Vertex_handle}s of all vertices adjacent to \ccc{v} to the -output iterator \ccc{vertices}. If \ccVar.\ccc{dimension()} $<0$, then do -nothing. Returns the resulting output iterator. -\ccPrecond{\ccc{v} $\neq$ \ccc{Vertex_handle()}, \ccVar.\ccc{is_vertex(v)}.}} - -\ccMethod{size_type degree(Vertex_handle v) const;} -{Returns the degree of a vertex, that is, the number of incident vertices. -\ccPrecond{\ccc{v} $\neq$ \ccc{Vertex_handle()}, \ccVar.\ccc{is_vertex(v)}.}} - -\ccHeading{Traversal between adjacent cells} -\ccThree{Vertex_handle}{mirror_vertex(Cell_handle c, int i)x}{} - -\ccMethod{int mirror_index(Cell_handle c, int i) const;} -{Returns the index of \ccc{c} in its $i^{th}$ neighbor. -\ccPrecond{$i \in \{0, 1, 2, 3\}$.}} -\ccGlue -\ccMethod{Vertex_handle mirror_vertex(Cell_handle c, int i) const;} -{Returns the vertex of the $i^{th}$ neighbor of \ccc{c} that is opposite to -\ccc{c}. -\ccPrecond{$i \in \{0, 1, 2, 3\}$.}} -\ccGlue -\ccMethod{Facet mirror_facet(Facet f) const;} -{Returns the same facet seen from the other adjacent cell.} - - -\begin{ccDebug} -\ccHeading{Checking} - -\ccMethod{bool is_valid(bool verbose = false) const;} -{Checks the combinatorial validity of the triangulation by checking -the local validity of all its cells and vertices (see functions below). -(See Section~\ref{TDS3-sec-intro}.) Moreover, the Euler relation is -tested.\\ -When \ccc{verbose} is set to \ccc{true}, messages are printed to give -a precise indication on the kind of invalidity encountered.} - -\ccMethod{bool is_valid(Vertex_handle v, bool verbose = false) const;} -{Checks the local validity of the adjacency relations of the triangulation. -It also calls the \ccc{is_valid} member function of the vertex. -When \ccc{verbose} is set to \ccc{true}, messages are printed to give -a precise indication on the kind of invalidity encountered.} - -\ccMethod{bool is_valid(Cell_handle c, bool verbose = false) const;} -{Checks the local validity of the adjacency relations of the triangulation. -It also calls the \ccc{is_valid} member function of the cell. -When \ccc{verbose} is set to \ccc{true}, messages are printed to give -a precise indication on the kind of invalidity encountered.} - -\end{ccDebug} - -\ccHeading{I/O} - -\ccFunction{istream& operator>> - (istream& is, TriangulationDataStructure_3 & tds);} -{Reads a combinatorial triangulation from \ccc{is} and assigns it to \ccc{tds}} - -\ccFunction{ostream& operator<< - (ostream& os, const TriangulationDataStructure_3 & tds);} -{Writes \ccc{tds} into the stream \ccc{os}} - -The information stored in the \ccc{iostream} is: -the dimension, the number of vertices, the number of cells, -the indices of the vertices of each cell, then the indices of the -neighbors of each cell, where the index corresponds to the preceding -list of cells. When dimension $<$ 3, the same information is stored -for faces of maximal dimension instead of cells. - -\ccHasModels - -\ccc{CGAL::Triangulation_data_structure_3} - -\ccSeeAlso - -\ccc{TriangulationDataStructure_3::Vertex}\\ -\ccc{TriangulationDataStructure_3::Cell} - -\end{ccRefConcept} diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Triangulation_data_structure_3.tex b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Triangulation_data_structure_3.tex deleted file mode 100644 index 748d00587e8..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Triangulation_data_structure_3.tex +++ /dev/null @@ -1,82 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Triangulation_data_structure_3.tex -% +------------------------------------------------------------------------+ -% | 29.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSTriangulationdatastructureRev}{$Id$} -\RCSdefDate{\RCSTriangulationdatastructureDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefClass}{Triangulation_data_structure_3} - -\ccDefinition -The class \ccc{Triangulation_data_structure_3} stores a 3D-triangulation data -structure and provides the optional -geometric functionalities to be used as a parameter for a -3D-geometric triangulation (see Chapter~\ref{chapter-Triangulation3}). - -The vertices and cells are stored in two nested containers, which are -implemented using \ccc{CGAL::Compact_container}. The class may offer some -flexibility for the choice of container in the future, in the form of -additional template parameters. - -\ccInclude{CGAL/Triangulation_data_structure_3.h} - -\ccParameters -It is parameterized by base classes for vertices and cells which have to match -the requirements for the concepts \ccc{TriangulationDSCellBase_3} and -\ccc{TriangulationDSVertexBase_3} respectively -\lcTex{(see \ccRefPage{TriangulationDSCellBase_3} -and \ccRefPage{TriangulationDSVertexBase_3})}. - -They have the default values \ccc{Triangulation_ds_vertex_base_3<>} and -\ccc{Triangulation_ds_cell_base_3<>} respectively. - -\ccIsModel \ccc{TriangulationDataStructure_3} - -\ccInheritsFrom{\ccc{CGAL::Triangulation_utils_3}} - -The class \ccc{Triangulation_utils_3} defines basic computations on -indices of vertices and neighbors of cells. - -\begin{ccAdvanced} - -\ccCreationVariable{tds} - -In addition to the interface documented in the concept, the class offers the -following types and functions. - -\ccTypes - -\ccTypedef{typedef CGAL::Compact_container Vertex_range;}{Vertex container type.} -\ccGlue -\ccTypedef{typedef CGAL::Compact_container Cell_range;}{Cell container type.} - -\ccOperations - -\ccMethod{Cell_range & cells() const;} -{Returns a reference to the container of cells.} -\ccGlue -\ccMethod{Cell_range & cells();} -{Returns a reference to the container of cells.} -\ccGlue -\ccMethod{Vertex_range & vertices() const;} -{Returns a reference to the container of vertices.} -\ccGlue -\ccMethod{Vertex_range & vertices();} -{Returns a reference to the container of vertices.} - -\end{ccAdvanced} - -\ccSeeAlso - -\ccc{CGAL::Triangulation_ds_vertex_base_3}\\ -\ccc{CGAL::Triangulation_ds_cell_base_3}\\ -\ccc{CGAL::Triangulation_vertex_base_with_info_3}\\ -\ccc{CGAL::Triangulation_cell_base_with_info_3} - -\end{ccRefClass} diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Triangulation_ds_cell_base_3.tex b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Triangulation_ds_cell_base_3.tex deleted file mode 100644 index 3d1f6d7e4af..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Triangulation_ds_cell_base_3.tex +++ /dev/null @@ -1,47 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Triangulation_cell_base_3.tex -% +------------------------------------------------------------------------+ -% | 29.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSTriangulationcellbaseRev}{$Id$} -\RCSdefDate{\RCSTriangulationcellbaseDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefClass}{Triangulation_ds_cell_base_3<>} - -\ccDefinition - -The class \ccc{Triangulation_ds_cell_base_3} is a model for the concept -\ccc{TriangulationDSCellBase_3} to be used by -\ccc{Triangulation_data_structure_3}. - -% Note : this is commented as it's not kosher to mention geometry in the TDS. -% -% It also provides a template member function \ccc{circumcenter()} which allows -% it to be used as \ccc{TriangulationCellBase} in the -% \ccc{Delaunay_triangulation_3} class when the \ccc{dual()} member function is -% called. - -\ccInclude{CGAL/Triangulation_ds_cell_base_3.h} - -\ccIsModel - -\ccc{TriangulationDSCellBase_3} - -% \ccCreationVariable{c} -% -% \ccMethod{template Traits::Point_3 circumcenter( -% const Traits>) const;} -% {Returns the circumcenter.} - -\ccSeeAlso - -\ccc{CGAL::Triangulation_cell_base_3}\\ -\ccc{CGAL::Triangulation_ds_vertex_base_3}\\ -\ccc{CGAL::Triangulation_cell_base_with_info_3} - -\end{ccRefClass} diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Triangulation_ds_vertex_base_3.tex b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Triangulation_ds_vertex_base_3.tex deleted file mode 100644 index eb5d340326e..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Triangulation_ds_vertex_base_3.tex +++ /dev/null @@ -1,44 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Triangulation_vertex_base_3.tex -% +------------------------------------------------------------------------+ -% | 29.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSTriangulationvertexbaseRev}{$Id$} -\RCSdefDate{\RCSTriangulationvertexbaseDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefClass}{Triangulation_ds_vertex_base_3<>} - -\ccDefinition - -The class \ccc{Triangulation_ds_vertex_base_3} can be used as the base vertex -for a 3D-triangulation data structure, it is a model of the concept -\ccc{TriangulationDSVertexBase_3}. - -Note that if the triangulation data structure is used as a parameter of a -geometric triangulation (Section~\ref{TDS3-sec-design} and -Chapter~\ref{chapter-Triangulation3}), then the vertex base class has to -fulfill additional geometric requirements, i.e. it has to be a model of the -concept \ccc{TriangulationVertexBase_3}. - -This base class can be used directly or can serve as a base to derive -other base classes with some additional attributes (a color for -example) tuned for a specific application. - -\ccInclude{CGAL/Triangulation_ds_vertex_base_3.h} - -\ccIsModel - -\ccc{TriangulationDSVertexBase_3} - -\ccSeeAlso - -\ccc{CGAL::Triangulation_vertex_base_3}\\ -\ccc{CGAL::Triangulation_ds_cell_base_3}\\ -\ccc{CGAL::Triangulation_vertex_base_with_info_3} - -\end{ccRefClass} diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Triangulation_utils_3.tex b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Triangulation_utils_3.tex deleted file mode 100644 index 83127e6b5dc..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/Triangulation_utils_3.tex +++ /dev/null @@ -1,61 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Triangulation_utils_3.tex -% +------------------------------------------------------------------------+ -% | 27.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSTriangulationutilsRev}{$Id$} -\RCSdefDate{\RCSTriangulationutilsDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefClass}{Triangulation_utils_3} - -\ccDefinition - -The class \ccRefName\ defines operations on the indices of vertices -and neighbors within a cell. - -\ccInclude{CGAL/Triangulation_utils_3.h} - -\ccOperations - -\ccThree{unsigned int}{ccw(unsigned int i)toto}{} - -\ccFunction{unsigned int next_around_edge(unsigned int i, - unsigned int j) const;} -{In dimension~3, index of the neighbor \ccc{n} that is next to the current cell, -when turning positively around an oriented edge whose endpoints are -indexed \ccc{i} and \ccc{j}. According to the usual numbering of -vertices and neighbors in a given cell, it is also the index of the vertex -opposite to this neighbor \ccc{n}. (see Figure~\ref{Triangulation3-fig-utils}). -\ccPrecond{\ccc{( i < 4 ) && ( j < 4 ) && ( i != j )}.}} - -\ccFunction{unsigned int ccw(unsigned int i) const;} -{Has a meaning only in dimension~2.\\ - Computes the index of the vertex that is next to the vertex numbered -\ccc{i} in counterclockwise direction. (see -Figure~\ref{Triangulation3-fig-utils}). -\ccPrecond{\ccc{i<3}.}} -\ccGlue -\ccFunction{unsigned int cw(unsigned int i) const;} -{Same for clockwise.} - -\begin{figure}[htbp] -\begin{ccTexOnly} -\begin{center} -\includegraphics{TriangulationDS_3_ref/utils} -\end{center} -\end{ccTexOnly} -\begin{ccHtmlOnly} -
-Operations on indices -
-\end{ccHtmlOnly} -\caption{Operations on indices. -\label{Triangulation3-fig-utils}} -\end{figure} - -\end{ccRefClass} diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/flips.gif b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/flips.gif deleted file mode 100644 index 60156fcadddeabf2f9761c3c8001cd349cfc059f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2783 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 HjS&9<_EG#= diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/intro.tex b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/intro.tex deleted file mode 100644 index 58046262cef..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/intro.tex +++ /dev/null @@ -1,75 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Triangulation_data_structure/intro.tex -% +------------------------------------------------------------------------+ -% | 27.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSTriangulationcellRev}{$Id$} -\RCSdefDate{\RCSTriangulationcellDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ -%\clearpage -%\section{Reference pages for 3D-Triangulation data structure} -\ccRefChapter{3D Triangulation Data Structure} -\ccChapterAuthor{Sylvain Pion \and Monique Teillaud} - -The triangulation data structure is able to represent a -triangulation of a topological sphere $S^d$ of $\R^{d+1}$, for -$d \in \{-1,0,1,2,3\}$. (See~\ref{TDS3-sec-intro}.) - -The vertex class of a 3D-triangulation data structure must define -a number of types and operations. -The requirements that are of geometric nature are required only when -the triangulation data structure is used as a layer for the geometric -triangulation classes. (See Section~\ref{TDS3-sec-design}.) - -The cell class of a triangulation data structure stores -four handles to its four vertices and four handles to its four -neighbors. The vertices are indexed 0, 1, 2, and 3 in a consistent order. -The neighbor indexed $i$ lies opposite to vertex \ccc{i}. - -In degenerate dimensions, cells are used to store faces of maximal -dimension: in dimension~2, each cell represents only one -facet of index 3, and 3 edges $(0,1)$, $(1,2)$ and $(2,0)$; in -dimension~1, each cell represents one edge $(0,1)$. (See -Section~\ref{TDS3-sec-intro}.) - - -\section{Classified Reference Pages} - -\subsection*{Concepts} - -\ccRefConceptPage{TriangulationDataStructure_3} - -\ccRefConceptPage{TriangulationDataStructure_3::Cell} \\ -\ccRefConceptPage{TriangulationDataStructure_3::Vertex} - -\ccRefConceptPage{TriangulationDSCellBase_3} \\ -\ccRefConceptPage{TriangulationDSVertexBase_3} - -\subsection*{Classes} - -\ccRefIdfierPage{CGAL::Triangulation_data_structure_3} - -This class is a model for the concept of the 3D-triangulation data -structure \ccc{TriangulationDataStructure_3}. -It is templated by base classes for vertices and cells. - -\cgal\ provides base vertex classes and base cell classes: - -\ccRefIdfierPage{CGAL::Triangulation_ds_cell_base_3<>}\\ -\ccRefIdfierPage{CGAL::Triangulation_ds_vertex_base_3<>}\\ -\ccRefIdfierPage{CGAL::Triangulation_cell_base_3}\\ -\ccRefIdfierPage{CGAL::Triangulation_vertex_base_3}\\ -\ccRefIdfierPage{CGAL::Triangulation_hierarchy_vertex_base_3} - -\subsubsection*{Helper Classes} - -\ccRefIdfierPage{CGAL::Triangulation_utils_3} - -It defines operations on the indices of vertices and neighbors within -a cell of a triangulation. - - - diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/main.tex b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/main.tex deleted file mode 100644 index 95dd17af165..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/main.tex +++ /dev/null @@ -1,19 +0,0 @@ -% +------------------------------------------------------------------------+ -% | CBP Reference Manual: main.tex -% +------------------------------------------------------------------------+ -% | Automatically generated driver file for the reference manual chapter -% | of this package. Do not edit manually, you may loose your changes. -% +------------------------------------------------------------------------+ - -\input{TriangulationDS_3_ref/intro.tex} - -\input{TriangulationDS_3_ref/TriangulationDataStructure_3.tex} -\input{TriangulationDS_3_ref/Tds_cell_3.tex} -\input{TriangulationDS_3_ref/Tds_vertex_3.tex} -\input{TriangulationDS_3_ref/TriangulationDSCellBase_3.tex} -\input{TriangulationDS_3_ref/TriangulationDSVertexBase_3.tex} -\input{TriangulationDS_3_ref/Triangulation_data_structure_3.tex} -\input{TriangulationDS_3_ref/Triangulation_ds_cell_base_3.tex} -\input{TriangulationDS_3_ref/Triangulation_ds_vertex_base_3.tex} -\input{TriangulationDS_3_ref/Triangulation_utils_3.tex} - diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/tds-dim_down.eps b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/tds-dim_down.eps deleted file mode 100644 index e7144ce252f..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/tds-dim_down.eps +++ /dev/null @@ -1,575 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%BoundingBox: 78 304 378 515 -%%HiResBoundingBox: 78.650000 304.112109 377.250000 514.150000 -%................................... -%%Creator: GPL Ghostscript 857 (epswrite) -%%CreationDate: 2010/04/26 13:46:43 -%%DocumentData: Clean7Bit -%%LanguageLevel: 2 -%%EndComments -%%BeginProlog -% This copyright applies to everything between here and the %%EndProlog: -% Copyright (C) 2007 artofcode LLC, Benicia, CA. All rights reserved. -%%BeginResource: procset GS_epswrite_2_0_1001 -/GS_epswrite_2_0_1001 80 dict dup begin -/PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch -4 index eq and{ pop pop pop}{ PageSize dup 1 -5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} -{ pop/setpagedevice where -{ pop 1 dict dup /PageSize PageSize put setpagedevice} -{ /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat -setpage}if}ifelse}ifelse}ifelse} bind def -/!{bind def}bind def/#{load def}!/N/counttomark # -/rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! -/r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! -/w/setlinewidth #/J/setlinecap # -/j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # -/m/moveto #/l/lineto #/c/rcurveto # -/p{N 2 idiv{N -2 roll rlineto}repeat}! -/P{N 0 gt{N -2 roll moveto p}if}! -/h{p closepath}!/H{P closepath}! -/lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! -/re{4 -2 roll m exch dup lx exch ly neg lx h}! -/^{3 index neg 3 index neg}! -/f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! -/q/gsave #/Q/grestore #/rf{re fill}! -/Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! -/|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! -/|{exch string readstring |=}! -/+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! -/@/currentfile #/${+ @ |}! -/B{{2 copy string{readstring pop}aload pop 4 array astore cvx -3 1 roll}repeat pop pop true}! -/Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! -/,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! -/Ic{exch Ix false 3 colorimage}! -/F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> -/CCITTFaxDecode filter}!/FX{<+ -, -1395 4661 58 64 /2O -$C --,RJ0cQF6,"1XK6;*,e2Q-Xhg^!O5QCKXpAb$)pAO`6hdjRZ#AlQZqqHI8 -gU?L]A=[RGL6]0$(ePW!8f36d'Gr4~> -, -12 w -2020.89 4825.31 491.13 0 S -2512.02 4825.31 -100 33.33 0 -66.66 f* -2512.02 4825.31 -100 33.33 0 -66.66 H -S -4 w -255 0 r6 -804.53 4472.31 637.23 646.34 S -1441.76 5118.65 641.79 -646.34 S -2083.55 4472.31 -1279.02 0 S -1287.01 4631.62 -477.93 -159.31 S -1441.76 4795.48 -632.68 -323.17 S -1605.62 4627.07 -801.09 -154.76 S -1441.76 4790.93 0 327.72 S -1441.76 4790.93 637.24 -314.07 S -1601.07 4627.07 482.48 -154.76 S -K -1823 4904 53 62 /7J -$C --,kH?HkM'*-_U)g6Lpe%+S.l(e'dJFIo[)VYX-_V" -, -1884 4904 40 45 /2U -$C -.E%bXLdAn"*BGA+kR`&+\d@V,3aU>`Zp3"7%<:k97S`pY?aoE@>?bfG>VrN!9#kZ` -, -1936 4904 40 45 /7N -$C -.De@QKH)-!_K8(,i.8HGkr+aVPLcfe&+mX:s1A0mg&&Is!C@K_,UgSE~> -, -1980 4905 51 44 /2Y -$C -4:PMup85+ps8W-!s6p!&^V0"!p7<2`@u"]IL(..DHo9d-@79<)~> -, -2041 4904 2U , -2085 4904 54 45 /0C -$C -,6C.B@-S;2QpI_jU)&Xml5l-m%nkCOs8MnEq[]q.+QR?i+0i`$_<"d3OW^q\5O0R8;d+ZDL#A7H -euU9.6'+M8~> -, -2145 4904 40 45 /3C -$C -0$OLI"@G=+K>]qA+bVs#Hm%:<=1s)i^9h[!q8KB$@u%_oqE9-LfBI8&I<\Ys8LU, -L).UZa*;sIOO-15%b(~> -, -2198 4904 2U , -3.98 w -2250.18 4906.63 31.38 0 S -2280 4904 7J , -2340 4905 39 61 /0G -$C -0H,'5C/^2ns8W-!s8W-!s8SPtQ2fR!q+flRl2U-q@6a~> -, -2384 4905 53 44 /3G -$C -0Fi%5fHiB'[K!/YBrUY-8HcC"s8W-!s8W-!s8W-!s8W-!s8T_2s53_JrAEE\^b2)&O!0fMaALF[ -R^CFV+bU\/~> -, -2444 4904 2U , -2489 4905 53 44 /0K -$C -2@[q9c)/7j9h>F3#QOi(s8W-!s8W-!s8V!Vn,E9^^C=ej\4VO<>]ms?KqQp]Jq*~> -, -2549 4904 3C , -2601 4905 0G , -2654 4904 41 45 /3K -$C -2$jBq&9+0F:5E8!&8m\V60U?):$LtiJ(ErCs8W,R9E3`&[^WB@['mC[9#Cs;X&-[@$n*f+~> -, -2698 4905 0K , -3078 4685 7D , -4 w -255 0 r6 -2470.44 4481.41 637.23 646.34 S -3107.67 5127.75 641.79 -646.34 S -20 w -255 0 r3 -3266.98 4640.72 -314.06 4.55 S -4 w -255 0 r6 -2952.92 4640.72 -477.93 -159.31 S -3266.98 4636.17 482.48 -154.76 S -K -1456.76 5104.99 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -f* -6 w -1456.76 5104.99 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -h -S -1456.76 4790.93 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -f* -1456.76 4790.93 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -h -S -819.53 4467.76 m -0 8.28 -6.71 15 -15 15 c --8.29 0 -15 -6.72 -15 -15 c -0 -8.28 6.71 -15 15 -15 c -8.29 0 15 6.72 15 15 c -f* -819.53 4467.76 m -0 8.28 -6.71 15 -15 15 c --8.29 0 -15 -6.72 -15 -15 c -0 -8.28 6.71 -15 15 -15 c -8.29 0 15 6.72 15 15 c -h -S -1302.01 4631.62 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -f* -1302.01 4631.62 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -h -S -1616.07 4627.07 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -f* -1616.07 4627.07 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -h -S -2098.55 4467.76 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -f* -2098.55 4467.76 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -h -S -2494.54 4481.41 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -f* -2494.54 4481.41 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -h -S -3127.22 5123.2 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -f* -3127.22 5123.2 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -h -S -3769.01 4481.41 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -f* -3769.01 4481.41 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -h -S -3286.53 4636.17 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -f* -3286.53 4636.17 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -h -S -3131.77 4645.27 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -f* -3131.77 4645.27 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -h -S -2967.91 4649.82 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -f* -2967.91 4649.82 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -h -S -1871 4703 43 45 /0Q -$C -.E;Q$M.<32FIT=Z]f0<-hqrp5gOHumhtsmtpV"?1n!CZ@pV6`Wh5C-rn$fL$Fgp]oR^$*OK2;~> -, -1953 4723 51 23 /3Q -$C -1BuQTrMrfqR=f?;Iat@~> -, -2046 4703 41 45 /0U -$C -2$jBq&MFWG"s"i(W,G?jL@j;+n*O<=s53hQrqlHGb'.\eG4#1]GBUlYlGHh?6OY7L<#@"~> -, -2097 4731 41 7 /3U -$C -/fM+]qc9?~> -, -2150 4710 41 49 /0Y -$C -02Qa3nEnkI_m^%9E5Sp=\7+$/h1lHW%`=%g_dUE8WBsPu+JC7l&tkp%#uFHMV$JPIJtT)OC;R3J~> -, -2194 4704 52 43 /3Y -$C -.`Y?6q(_QWl0EiJFoS?)rf_j1-NEp:s7Df\kr8XjDuZWjkCJ58@[_fGdng~> -, -2254 4703 2U , -2299 4704 2Y , -2351 4703 47 56 /1C -$C -.0P5-#Wd(ljA0k/DbjHbn,NEqa8c2>s8W-!kCZg-rm]L`s8W,d5Q~> -, -2411 4703 2U , -2456 4704 52 43 /4C -$C -49QQ''\!*UR[j`8>?dqAXejV& -, -2524 4696 30 77 /1G -$C -.d0V@9!kNH<2_9GWHqOO>ut%XV>W(IV>pSqs7ZKi^\7Zq]C+RcDg/[._maO$[sMP^C&~> -, -2568 4704 0G , -2620 4696 29 77 /4G -$C -2c+aGgc&ZrLUV0W^M_m%IG]8Bs0r%%s8W,Is8$*Np!n1j=1Pq#Uq.SuG=Kk^~> -, -1010.37 3327.85 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.29 6.72 -15 15 -15 c -8.28 0 15 6.71 15 15 c -f* -1010.37 3327.85 m -0 8.28 -6.72 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.29 6.72 -15 15 -15 c -8.28 0 15 6.71 15 15 c -h -S -1401.81 3796.67 m -0 8.28 -6.71 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.29 6.72 -15 15 -15 c -8.29 0 15 6.71 15 15 c -f* -1401.81 3796.67 m -0 8.28 -6.71 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.29 6.72 -15 15 -15 c -8.29 0 15 6.71 15 15 c -h -S -1483.74 3104.82 m -0 8.28 -6.71 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.29 6.72 -15 15 -15 c -8.29 0 15 6.71 15 15 c -f* -1483.74 3104.82 m -0 8.28 -6.71 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.29 6.72 -15 15 -15 c -8.29 0 15 6.71 15 15 c -h -S -1720.43 3587.29 m -0 8.29 -6.72 15 -15 15 c --8.29 0 -15 -6.71 -15 -15 c -0 -8.28 6.71 -15 15 -15 c -8.28 0 15 6.72 15 15 c -f* -1720.43 3587.29 m -0 8.29 -6.72 15 -15 15 c --8.29 0 -15 -6.71 -15 -15 c -0 -8.28 6.71 -15 15 -15 c -8.28 0 15 6.72 15 15 c -h -S -20 w -255 0 r3 -1391.36 3792.12 77.38 -687.3 S -[ 40 ] 0 d -995.37 3318.74 710.06 264 S -[ ] 0 d -12 w -K -2007.23 3664.64 491.13 0 S -2498.36 3664.64 -100 33.33 0 -66.67 f* -2498.36 3664.64 -100 33.33 0 -66.67 H -S -1810 3743 7J , -1870 3743 2U , -1922 3743 7N , -1967 3744 2Y , -2027 3743 2U , -2071 3743 0C , -2132 3743 3C , -2184 3743 2U , -3.98 w -2236.53 3745.96 31.38 0 S -2266 3743 7J , -2326 3744 0G , -2371 3744 3G , -2431 3743 2U , -2475 3744 0K , -2535 3743 3C , -2588 3744 0G , -2640 3743 3K , -2684 3744 0K , -1857 3543 0Q , -1939 3563 3Q , -2032 3543 0U , -2084 3571 3U , -2136 3550 0Y , -2180 3544 3Y , -2241 3543 2U , -2285 3544 2Y , -2337 3543 1C , -2398 3543 2U , -2442 3544 4C , -2510 3536 1G , -2555 3544 0G , -2607 3536 4G , -2790.07 3282.33 m -0 8.29 -6.72 15 -15 15 c --8.29 0 -15 -6.71 -15 -15 c -0 -8.28 6.71 -15 15 -15 c -8.28 0 15 6.72 15 15 c -f* -6 w -2790.07 3282.33 m -0 8.29 -6.72 15 -15 15 c --8.29 0 -15 -6.71 -15 -15 c -0 -8.28 6.71 -15 15 -15 c -8.28 0 15 6.72 15 15 c -h -S -3186.06 3295.99 m -0 8.28 -6.71 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.29 6.72 -15 15 -15 c -8.29 0 15 6.71 15 15 c -f* -3186.06 3295.99 m -0 8.28 -6.71 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.29 6.72 -15 15 -15 c -8.29 0 15 6.71 15 15 c -h -S -3263.44 3059.3 m -0 8.29 -6.72 15 -15 15 c --8.28 0 -15 -6.71 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -f* -3263.44 3059.3 m -0 8.29 -6.72 15 -15 15 c --8.28 0 -15 -6.71 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -h -S -3500.13 3541.77 m -0 8.29 -6.72 15 -15 15 c --8.28 0 -15 -6.71 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -f* -3500.13 3541.77 m -0 8.29 -6.72 15 -15 15 c --8.28 0 -15 -6.71 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.28 0 15 6.72 15 15 c -h -S -1253 3797 7D , -1281 3501 2O , -3117 3329 7D , -4 w -255 0 r6 -1385.23 4287.04 -393.06 -962.31 S -1471.07 3103.35 -76.81 1188.21 S -K -1401.81 4292.8 m -0 8.28 -6.71 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.29 0 15 6.72 15 15 c -f* -6 w -1401.81 4292.8 m -0 8.28 -6.71 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.28 6.72 -15 15 -15 c -8.29 0 15 6.72 15 15 c -h -S -4 w -255 0 r6 -3255.64 3049.13 -87.93 1196.67 S -K -3181.51 4247.28 m -0 8.28 -6.71 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.29 6.72 -15 15 -15 c -8.29 0 15 6.71 15 15 c -f* -6 w -3181.51 4247.28 m -0 8.28 -6.71 15 -15 15 c --8.28 0 -15 -6.72 -15 -15 c -0 -8.29 6.72 -15 15 -15 c -8.29 0 15 6.71 15 15 c -h -S -cleartomark end end pagesave restore - showpage -%%PageTrailer -%%Trailer -%%Pages: 1 diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/tds-dim_down.gif b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/tds-dim_down.gif deleted file mode 100644 index 4ba7983bc8e3ae7cda8c568d6842eb669c555390..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41543 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%0A=6 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 diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/tds-dim_down.png b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/tds-dim_down.png deleted file mode 100644 index 63d84f107e38438a61a582e72db246214175c8cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101732 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 diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/topo-insert_outside_affine_hull.gif b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/topo-insert_outside_affine_hull.gif deleted file mode 100644 index 823ab67901012d7d320d6c27b4f85537d6ebd046..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2752 zcmV;x3P1HnNk%w1VTS=o0e}Di00030|NkNR1OWg50RSuj0001o0Z0J=0{)DTsmtvT zqnxzbi?iOm`wxcVNS5Y_rs~SJ?hD8AOxN~}=lag~{tpZahs2`sh)gP%%%<}RjY_A~ zs`ZM^YPa03_X`e-$K-YS={|^`_I7nD%c!-#&xX9S( z_y`#(IZ0V*c>|ECxtV$C*~A$N5xV(libGnGddiAYD)ZVZyAcb3sX3b)5sP3O;A_LH ztJ^67j9NU*io1JooRh3v$vpAwLoMxyU19yRooyJ6(H$fX9%!CnO|FxEuIH}4z}`;( zE*C#y550fCmQU*mK!0Zja_Be2Ai*#Q4@yzEa0|o^_8Ov!SZ1P!{(Tm2VPtp>iN=ph zMuO;Q1SQEMD(#qDS*~RWnMG*A++p)1wy7UB8 zc;BKT^Ct0^t*KTiTH&fMSuwC($0am-Z5=SOWht-~A@l8ptqjD;ZR_CfOeO=(>BXDi zuTG%|(+LKASd7MaiMuxb@OZAue35-t-WX77+=_sYf^rDgs56e8^$7&Maj3$}3t11Y zAzA@M*Y9Y*juCsFMcdMNLx#n5r0-nAf1@@=)@1QzUor1``*OJ{>CTVqc14rACGB3j zUr!;L`y}z+L#yl5H#Yf4>#e7LKuVZ__@dmGp2x*0N(C{ddoL*tLpIBF<(6hT#(qKd)S=nRzR#N#M{#@Gx@2j;1!rx}t^ zn5ti;`CUzyxhfz-L$azFNpxMv8kWK0nw6EjHVOXfT{cQd&{_-zxB^mt*+?uF)ylRT zbSfSh;I&jdQ?0Oaw!m4l_mo;*ZL(SWWr)Rj8wI?Fs(@~F=a3_>c?s_58=L2Pp&^+P z-n#C5>Pi@Id+Z#mO2N$b#@>mw!V(yl%8>RMGQzsHY&K(-B;91<<*US)Io`>zs1UQ8 zP(}5^y0S4$v9u0~M3BrkiH8%zu! zV3vvA(-}tXvyxTs%fn;Lu(=i4mac-L*a&~kVpBzxowdQgo;}K_T&L^g%X4IxhSP96 z_+z_wON?#VlJMP*K%;AUb+W1Y~2;_=PPIz4l56ron_C;Dn=+*Go zvBQU7vfs!PUOA1ur1Qit5NKDNbjGyr*fQ#}=r@Sza5DD$Ufj;AFy=>}!f6~E3U9pS z)1m5$NT*v5?ey3q|1EQ-&09M3sC~?Q&NoYY*7DMOlI8d5%lN+B@OcmGRLR#Ee~IO4 z-!QUJ46Y}tt&eq|0HD#bS3pgTE^$3N)BX}zj;ADvJQy3`b|h%K31Toa{Hvaw#3v66 zQmBLAYa93Y;+FD7t4^c>AOen_Kk+F0k z0b3YJ_%;J#B@00mqMo$oGvm;ahfl-}9z7^Kk3^4(V+4*I1NlXuxQ~!(6xAR5he+6% z(Nro_S)UYzI5+#AOI`M@;nra*{_8jA~{9uK_VFnu&a6 z36TcL8oDHC0X(0wnwdt`L35fpwA~?HX+&ju6PfC4RsC*M$8~xJiIGIkBazcXcnZ^w z-)txK8mJyxfw7;VT;&!14~kG~(5Pr$q$U^X`A}2(^PLxp*&_MrM}>~_V*8Y*BhmRN zk6{#~vP9|4PD#>Za!@k)dJ;@y`pJR5(NY~vr$L8NnQJzXmYvh-GA$}iw9qMv;q+*J zT*|V0F_fiYx!+3dE28d1*+MdzLl9cEE z>ry^<&#cu}w*|fJc{>YP-X2h|frT%j+6FO|8}WIq-8%JY_5wTGDmc?4-3I>P-*Y(j^7hhGk9b2&vVzB9?Ve0+uV~nHr~8E;jbO zhU-sD<`9NScA`-|XZF6z*`s!}s;MnYD29vGgU$B;CX8)*HD=hdC3kSOov2++JKV~y z^^x$2W_GU_J8$EOgXP_6QKs8g;NCQE(21b5wA;i|vrzs;wiEHxogP!v>zn9S~@1CBU?({fAJ?dt+j?HrQ_x1uOt5|^VbbH=H>S=z+LI?JHEI6^xJu= zHQvV-au(hF-U_oXoEM1gE^>! zJII4Q=z~89gh42TLr8>0XoN?Igh{A`OUQ&x=!8!Qg;6MlQ%HqXXoXjZg;}VDTL^>& G0029QGk*{O diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/topo-insert_outside_affine_hull.pdf b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/topo-insert_outside_affine_hull.pdf deleted file mode 100644 index 59d4346a34fd333018643b851ebde010ba6aed32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16889 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 buer@{j`I(k>wM=t@43%^4)mZ$x&Qz>E=qv+ diff --git a/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/utils.pdf b/Triangulation_3_copy_tds/doc_tex/TriangulationDS_3_ref/utils.pdf deleted file mode 100644 index fb50d3ff6fee7d3f5e46376f2f14e67ffc29f042..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20604 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 XM - - - - - --141.856 157.46 m --174.947 77.6599 l - - --174.947 77.6599 m --126.212 129.86 l --188.786 146.06 l --174.947 77.6599 l - - --205.031 168.86 m -8.06774 0 0 8.06774 -197.811 165.26 -192.098 170.957 a - - --174.947 77.6599 m --188.786 146.06 l --131.026 99.2599 l --174.947 77.6599 l - - --188.786 146.06 m --126.212 129.86 l --131.026 99.2599 l - - --174.947 77.6599 m --126.212 129.86 l - - --174.947 77.6599 m --188.786 146.06 l - -vertex $i$ -vertex $j$ -vertex \textit{next\_around\_edge(i,j)} - -facet \textit{next\_around\_edge(i,j)} - --122.602 143.66 m --138.847 126.26 l - - --188.786 146.06 m --126.212 129.86 l --141.856 157.46 l --188.786 146.06 l - -cell \textit{next\_around\_edge(i,j)} - --139.449 171.26 m --151.482 149.66 l - - --210.446 93.2599 m --149.677 99.2599 l - -current cell -dimension 3 - -34.4326 153.26 m --2.87072 79.4599 l -81.9643 89.0599 l -34.4326 153.26 l - -vertex $i$ - -31.4243 110.06 m -8.06774 0 0 8.06774 38.6443 106.46 44.3569 112.157 a - -vertex \textit{ccw(i)} -vertex \textit{cw(i)} -dimension 2 - - diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/PkgDescription.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/PkgDescription.tex deleted file mode 100644 index 9e7b9dccc81..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/PkgDescription.tex +++ /dev/null @@ -1,24 +0,0 @@ - -\begin{ccPkgDescription}{3D Triangulations\label{Pkg:Triangulation3}} -\ccPkgHowToCiteCgal{cgal:pt-t3-10} -\ccPkgSummary{ -This package allows to build and handle -triangulations for point sets in three dimensions. -Any \cgal\ triangulation covers the convex hull of its -vertices. Triangulations are build incrementally -and can be modified by insertion, displacements or removal of vertices. -They offer point location facilities. - -The package provides plain triangulation (whose faces -depends on the insertion order of the vertices) and -Delaunay triangulations. Regular triangulations are -also provided for sets of weighted points. -Delaunay and regular -triangulations offer nearest neighbor queries -and primitives to build the dual Voronoi and power diagrams.} - -%\ccPkgDependsOn{} -\ccPkgIntroducedInCGAL{2.1} -\ccPkgLicense{\ccLicenseQPL} -\ccPkgIllustration{Triangulation_3/fig/twotets.png}{Triangulation_3/fig/Delaunay_3.jpg} -\end{ccPkgDescription} diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/Triang3.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/Triang3.tex deleted file mode 100644 index 73a9a5acb39..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/Triang3.tex +++ /dev/null @@ -1,810 +0,0 @@ -% file : doc_tex/basic/Triangulation_3/Triang3.tex -% revision : $Id$ -% -% author(s) : Monique Teillaud - -\begin{ccTexOnly} -%\vspace*{-1cm} -\begin{center} -\includegraphics[width=15cm]{Triangulation_3/triangulation3} -\end{center} -\end{ccTexOnly} -\begin{ccHtmlOnly} -3D triangulation picture -\end{ccHtmlOnly} - -The basic 3D-triangulation class of \cgal\ is primarily designed to -represent the triangulations of a set of points $A$ in $\R^3$. It is -a partition of the convex hull of {$A$} into tetrahedra whose vertices -are the points of {$A$}. Together with the unbounded cell having the -convex hull boundary as its frontier, the triangulation forms a -partition of $\R^3$. Its cells ($3$-faces) are such that two cells -either do not intersect or share a common facet ($2$-face), edge -($1$-face) or vertex ($0$-face). - -\section{Representation\label{Triangulation3-sec-intro}} - -In order to deal -only with tetrahedra, which is convenient for many applications, the -unbounded cell can be subdivided into tetrahedra by considering that -each convex hull facet is incident to an \ccc{infinite cell} having as -fourth vertex an auxiliary vertex called the \ccc{infinite vertex}. In -that way, each facet is incident to exactly two cells and special cases -at the boundary of the convex hull are simple to deal with. - -The class \ccc{Triangulation_3} of \cgal\ implements this -point of view and therefore considers the triangulation of the set -of points as a set of finite and infinite tetrahedra. Notice that the -infinite vertex has no significant coordinates and that no -geometric predicate can be applied on it. - -A triangulation is a collection of vertices and cells that are linked -together through incidence and adjacency relations. Each cell gives -access to its four incident vertices and to its four adjacent -cells. Each vertex gives access to one of its incident cells. - -The four vertices of a cell are indexed with 0, 1, 2 and 3 in positive -orientation, the positive orientation being defined by the orientation -of the underlying Euclidean space $\R^3$ (see -Figure~\ref{Triangulation3-fig-orient}). The neighbors of a cell are also -indexed with 0, 1, 2, 3 in such a way that the neighbor indexed by $i$ -is opposite to the vertex with the same index. - -\begin{figure}[htbp] -\begin{ccTexOnly} -\begin{center} -\includegraphics{Triangulation_3/orient} -\end{center} -\end{ccTexOnly} -\begin{ccHtmlOnly} -
-Orientation of a cell 
-(3-dimensional case) -
-\end{ccHtmlOnly} -\caption{Orientation of a cell (3-dimensional case). -\label{Triangulation3-fig-orient}} -\end{figure} - -As in the underlying combinatorial triangulation (see -Chapter~\ref{chapter-TDS3}), edges ($1$-faces) and facets ($2$-faces) -are not explicitly -represented: a facet is given by a cell and an index (the facet -\ccc{i} of a cell \ccc{c} is the facet of \ccc{c} that is opposite to -the vertex with index \ccc{i}) and an edge is given by a cell and two -indices (the edge \ccc{(i,j)} of a cell \ccc{c} is the edge whose -endpoints are the vertices of \ccc{c} with indices \ccc{i} and -\ccc{j}). See Figure~\ref{TDS3-fig-repres}. - -\paragraph{Degenerate Dimensions} -The class \ccc{Triangulation_3} can also deal with -triangulations whose dimension $d$ is less than~3. A triangulation of a -set of points in $\R^d$ covers the whole space $\R^d$ and consists of -cells having $d+1$ vertices: some of them are infinite, they are -obtained by linking the additional infinite vertex to each facet of -the convex hull of the points. -\begin{itemize} -\item {} \emph{dimension 2:} when a triangulation only contains -coplanar points (which is the case when there are only three points), -it consists of triangular faces. -\item {} \emph{dimension 1:} the triangulation contains only collinear -points (which is the case when there are only two points), it consists -of edges. -\item {} \emph{dimension 0:} the triangulation contains only one -finite point. -\item {} \emph{dimension -1:} this is a convention to handle the case -when the only vertex of the triangulation is the infinite one. -\end{itemize} - -The same cell class is used in all cases: triangular faces in -2D can be considered as degenerate cells, having only three vertices -(resp. neighbors) numbered $(0,1,2)$; -edges in 1D have only two vertices (resp. neighbors) numbered $0$ and $1$. - -The implicit representation of facets (resp. edges) still holds -for degenerate dimensions (\textit{i.e.} dimensions $<3$): in -dimension~2, each cell has only one facet of index 3, and 3 edges -$(0,1)$, $(1,2)$ and $(2,0)$; in dimension~1, each cell has one edge -$(0,1)$. - -\paragraph{Validity} -A triangulation of $\R^3$ is said to be \ccc{locally valid} iff - -{\bf (a)-(b)} Its underlying combinatorial graph, the triangulation -data structure, is \ccc{locally valid} -(see Section~\ref{TDS3-sec-intro} of Chapter~\ref{chapter-TDS3})\\ -{\bf (c)} Any cell has its vertices ordered according to positive -orientation. See Figure~\ref{Triangulation3-fig-orient}. - -When the triangulation is degenerated into a triangulation of -dimension~2, the geometric validity reduces to: - -{\bf (c-2D)} For any two adjacent triangles $(u,v,w_1)$ and $(u,v,w_2)$ with -common edge $(u,v)$, $w_1$ and $w_2$ lie on opposite sides of $(u,v)$ -in the plane. - -When all the points are collinear, this condition becomes: - -{\bf (c-1D)} For any two adjacent edges $(u,v)$ and $(v,w)$, $u$ and -$w$ lie on opposite sides of the common vertex $v$ on the line. - -The \ccc{is_valid()} method provided in \ccc{Triangulation_3} checks -the local validity of a given triangulation. This does not always -ensure global validity \cite{mnssssu-cgpvg-96,dlpt-ccpps-98} but it is -sufficient for practical cases. - - -\section{Delaunay Triangulation} - -The class \ccc{Delaunay_triangulation_3} represents a three-dimensional -Delaunay triangulation. - -Delaunay triangulations have the specific \textit{empty sphere property}, -that is, the circumscribing sphere of each cell of such a triangulation -does not contain any other vertex of the triangulation in its interior. -These triangulations are uniquely defined except in degenerate cases -where five points are co-spherical. Note however that the \cgal\ implementation -computes a unique triangulation even in these cases. - -This implementation is fully dynamic: it supports insertions of points, vertex removals -and displacements of points. - - -\section{Regular Triangulation\label{Triangulation3-sec-class-Regulartriangulation}} - -The class \ccc{Regular_triangulation_3} implements incremental regular -triangulations, also known as weighted Delaunay triangulations. - -Let ${S}^{(w)}$ be a set of weighted points in $\R^3$. Let -${p}^{(w)}=(p,w_p), p\in\R^3, w_p\in\R$ and -${z}^{(w)}=(z,w_z), z\in\R^3, w_z\in\R$ be two weighted points. -A weighted point -${p}^{(w)}=(p,w_p)$ can also be seen as a sphere of center $p$ and -radius $\sqrt{w_p}$. -The \textit{power product} between ${p}^{(w)}$ and ${z}^{(w)}$ is -defined as -\[\Pi({p}^{(w)},{z}^{(w)}) = {\|{p-z}\|^2-w_p-w_z}\] -where $\|{p-z}\|$ is the Euclidean distance between $p$ and $z$. - ${p}^{(w)}$ and ${z}^{(w)}$ -are said to be \textit{orthogonal} iff $\Pi{({p}^{(w)},{z}^{(w)})} -= 0$ (see Figure~\ref{Triangulation3-fig-ortho}). - -\begin{figure}[htbp] -\begin{ccTexOnly} -\begin{center} -\includegraphics{Triangulation_3/ortho} -\end{center} -\end{ccTexOnly} -\begin{ccHtmlOnly} -
-Orthogonal weighted
-points (picture in 2D) -
-\end{ccHtmlOnly} -\caption{Orthogonal weighted points (picture in 2D). -\label{Triangulation3-fig-ortho}} -\end{figure} - -Four weighted points have a unique common orthogonal weighted point -called the \textit{power sphere}. The weighted point orthogonal to -three weighted points in the plane defined by these three points is -called the \textit{power circle}. The -\textit{power segment} will denote the weighted point orthogonal to -two weighted points on the line defined by these two points. - -A sphere ${z}^{(w)}$ is said to be -\textit{regular} if $\forall {p}^{(w)}\in{S}^{(w)}, -\Pi{({p}^{(w)},{z}^{(w)})}\geq 0$. - -A triangulation of ${S}^{(w)}$ is \textit{regular} if the power spheres -of all simplices are regular. - -The regular triangulation of -${S}^{(w)}$ is in fact the projection onto $\R^3$ of the convex hull -of the four-dimensional points $(p,\|p-O\|^2-w_p),$ for -${p}^{(w)}=(p,w_p)\in{S}^{(w)}$. -Note that all points of ${S}^{(w)}$ do not -necessarily appear as vertices of the regular -triangulation. To know more about regular triangulations, see for -example \cite{es-itfwr-96}. - -When all weights are 0, power spheres are nothing more than -circumscribing spheres, and the regular triangulation is exactly the -Delaunay triangulation. - -The implementation of 3D regular triangulation supports insertions of weighted points, and vertex removals. Displacements are not supported in the current implementation. - -\section{Software Design\label{Triangulation3-sec-design}} - -The main classes \ccc{Triangulation_3}, \ccc{Delaunay_triangulation_3} and -\ccc{Regular_triangulation_3} are connected to each other by the -derivation diagram shown in Figure~\ref{t3_derivation}. This diagram -also shows another class: \ccc{Triangulation_utils_3}\lcTex{ -(\ccRefPage{CGAL::Triangulation_utils_3})}, which provides -a set of tools operating on the indices of vertices in cells. - -\begin{figure}[htbp] -\begin{ccTexOnly} -\begin{center} -\includegraphics{Triangulation_3/derivation} -\end{center} -\end{ccTexOnly} -\begin{ccHtmlOnly} -
- -
-\end{ccHtmlOnly} -\caption{Derivation diagram of the 3D triangulation classes. -\label{t3_derivation}} -\end{figure} - -The three main classes (\ccc{Triangulation_3}, \ccc{Delaunay_triangulation_3} -and \ccc{Regular_triangulation_3}) provide high-level geometric functionality -such as location of a point in the triangulation~\cite{cgal:dpt-wt-02}, insertion -and possibly removal of a point~\cite{cgal:dt-pvr3d-03}, and are responsible for the -geometric validity. They are built as layers on top of a triangulation data -structure, which stores their combinatorial structure. This separation between -the geometry and the combinatorics is reflected in the software design by the -fact that these three triangulation classes take the following template parameters : - -\begin{itemize} -\item {} the \textbf{geometric traits} class, which provides the type of points -to use as well as the elementary operations on them (predicates and -constructions). The concepts for these parameters are described in more -details in Section~\ref{Triangulation3-sec-Traits}\lcTex{ and in -\ccRefPage{TriangulationTraits_3}}. -\item {} the \textbf{triangulation data structure} class, which stores their -combinatorial structure, described in Section~\ref{TDS3-sec-design} of -Chapter~\ref{chapter-TDS3}. -\item {} the \textbf{location policy} tag, which is supported only by the Delaunay -triangulation class, described in Section~\ref{Triangulation3-sec-locpol}. -\end{itemize} - - -\subsection{The Geometric Traits Parameter\label{Triangulation3-sec-Traits}} - -The first template parameter of the triangulation class -\ccc{Triangulation_3} -is the geometric traits class, described by the concept -\ccc{TriangulationTraits_3}. It must define the types of the geometric objects -(points, segments, triangles and tetrahedra) forming the triangulation together -with a few geometric predicates on these objects: orientation in space, -orientation in case of coplanar points, order of collinear points. - -In addition to the requirements described before, the geometric traits -class of \ccc{Delaunay_triangulation_3} must define predicates to test for the -\textit{empty sphere property}. It is described by the concept -\ccc{DelaunayTriangulationTraits_3}, which refines \ccc{TriangulationTraits_3}. - -The kernels provided by \cgal: \ccc{Cartesian}, \ccc{Homogeneous}, -\ccc{Simple_cartesian}, \ccc{Simple_homogeneous} and -\ccc{Filtered_kernel} can all be used as models for the geometric traits -parameter. -They supply the user with all the functionalities described for the concepts -\ccc{TriangulationTraits_3}\lcTex{ -(\ccRefPage{TriangulationTraits_3})} and -\ccc{DelaunayTriangulationTraits_3}\lcTex{ -(\ccRefPage{DelaunayTriangulationTraits_3})}. -In addition, the predefined kernels -\ccc{Exact_predicates_inexact_constructions_kernel}\lcTex{ -(\ccRefPage{Exact_predicates_inexact_constructions_kernel})} and -\ccc{Exact_predicates_exact_constructions_kernel}\lcTex{ -(\ccRefPage{Exact_predicates_exact_constructions_kernel})} -can also be used, the latter being recommended when the dual construction is -used. - -In order to be used as the traits class for \ccc{Regular_triangulation_3}, -a class must provide functions to compute the \textit{power tests} -(see Section~\ref{Triangulation3-sec-class-Regulartriangulation}). -\ccc{Regular_triangulation_euclidean_traits_3} is a traits class - designed to be used by the class -\ccc{Regular_triangulation_3}. It provides -\ccc{Weighted_point}, a class for weighted points -needed by the regular triangulation, which derives from the three dimensional -point class \ccc{K::Point_3}. -It supplies the user with all the functionalities -described for the concept \ccc{RegularTriangulationTraits_3}\lcTex{ -(\ccRefPage{RegularTriangulationTraits_3})}. -It can be used as a traits class for -\ccc{Regular_triangulation_3}. - -Note that for regular triangulations, plugging a filtered kernel such -as \ccc{Exact_predicates_inexact_constructions_kernel} or -\ccc{Exact_predicates_exact_constructions_kernel} in -\ccc{Regular_triangulation_euclidean_traits_3} will -provide exact and efficient filtered predicates. - - -\subsection{The Triangulation Data Structure Parameter\label{Triangulation3-sec-tds}} - -The second template parameter of the main classes (\ccc{Triangulation_3}, -\ccc{Delaunay_triangulation_3} and \ccc{Regular_triangulation_3}) is a -triangulation data structure class. This class can be seen as a container for -the cells and vertices maintaining incidence and adjacency relations (see -Chapter~\ref{chapter-TDS3}). A model of this triangulation data structure is -\ccc{Triangulation_data_structure_3}\lcTex{ -(\ccRefPage{CGAL::Triangulation_data_structure_3})}, -and it is described by the \ccc{TriangulationDataStructure_3} concept -\lcTex{(\ccRefPage{TriangulationDataStructure_3})}. This model is itself -parameterized by a vertex base and a cell base classes, which gives the -possibility to customize the vertices and cells used by the triangulation data -structure, and hence by the geometric triangulation using it. Depending on the -kind of triangulation used, the requirements on the vertex and cell base -classes vary, and are expressed by various concepts, following the refinement -diagram shown in Figure~\ref{T3-concept-hierarchy}. - -\begin{figure}[htbp] -\begin{ccTexOnly} -\begin{center} -\includegraphics[width=13cm]{Triangulation_3/concept_hierarchy} -\end{center} -\end{ccTexOnly} -\begin{ccHtmlOnly} -
- -
-\end{ccHtmlOnly} -\caption{Concepts refinement hierarchy for the vertex and cell base classes -parameters. -\label{T3-concept-hierarchy}} -\end{figure} - -A default value for the triangulation data structure parameter is provided in -all the triangulation classes, so it need not be specified by the user unless -he wants to use a different triangulation data structure or a different vertex -or cell base class. - -\subsection{The Location Policy Parameter\label{Triangulation3-sec-locpol}} - -The Delaunay triangulation class supports an optional feature which maintains -an additional data structure for fast point location queries. -The fast location policy should be used when the user inserts points in a random -order or needs to do many unrelated queries. -If the user is able to give a good hint to help the point location of - its queries (and its newly inserted points), then it should prefer the default - policy. In such a case where good hints are provided, -the default policy save some memory (few percents), and is faster. -Notice that if points are not inserted one by one, but as a range, then a good hint is -automatically computed using spatial sort. - -Reading Section~\ref{Triangulation3-sec-complexity} on complexity and -performance can help making an informed choice for this parameter. - -The point location strategy can be selected with the third template argument of -\ccc{Delaunay_triangulation_3}, \ccc{LocationPolicy}, which enables a fast -point location data structure when set to \ccc{Fast_location}. By default, it -uses \ccc{Compact_location}. - -Note that you can specify the \ccc{LocationPolicy} parameter without specifying -the triangulation data structure, in case you are fine with the default there. -In this case, the \ccc{LocationPolicy} appears as a second parameter after the -geometric traits.\footnote{The mechanism used behind the scenes to allow this -syntactical convenience is called \textit{deduced parameters}.} - -The \ccc{Fast_location} policy is implemented using a hierarchy of -triangulations; it changes the behavior of functions \ccc{locate}, -\ccc{insert}, \ccc{move}, and \ccc{remove}. -As proved in~\cite{cgal:d-dh-02}, this structure has an -optimal behavior when it is built for Delaunay triangulations. - -In this setting, if you build a triangulation by iteratively inserting points, -you should try to shuffle the points beforehand, as the time complexity is -guaranteed only for a randomized order. For example, inserting points in -lexicographic order is typically much slower. Note that this shuffling is -performed internally by the constructor taking a range of points. - -Prior to \cgal\ 3.6, this functionality was available through the -\ccc{Triangulation_hierarchy_3} class, which is now deprecated. - -\subsection{Flexibility of the Design} - -In order to satisfy as many uses as possible, a design has been selected that -allows to exchange different parts to meet the users' needs, while still -re-using a maximum of the provided functionalities. We have already seen that -the main triangulation classes are parameterized by a geometric traits class -and a triangulation data structure (TDS), so that each of them can be -interchanged with alternate implementations. - -The most useful flexibility is the ability given to the user to add his own -data in the vertices and cells by providing his own vertex and cell base -classes to \ccc{Triangulation_data_structure_3}. The -Figure~\ref{T3-fig-layers} shows in more detail the flexibility that is -provided, and the place where the user can insert his own vertex and/or cell -base classes. - -\begin{figure}[htbp] -\begin{ccTexOnly} -\begin{center} -\includegraphics[width=13cm]{Triangulation_3/design} -\end{center} -\end{ccTexOnly} -\begin{ccHtmlOnly} -
-Triangulation software design -
-\end{ccHtmlOnly} -\caption{Triangulation software design. -\label{T3-fig-layers}} -\end{figure} - - -The design of the triangulation data structure gives the possibility to store -any kind of data, including handles (an entity akin to pointers) directly in -the vertex and cell base classes. - -To do so, there are three possibilities. The simplest one is to use the -class \ccc{Triangulation_vertex_base_with_info_3}, and this approach is -illustrated in a following subsection~\ref{Triangulation3-sec-examples-color}. -The most complicated one, and probably useless for almost all cases, is to -write a vertex base class from scratch, following the documented requirements. -This is mostly useless because most of the time it is enough to derive from -the models that \cgal\ provides, and add the desired features. -In this case, when the user needs to access some type that depends on the -triangulation data structure (typically handles), then he should write -something like: -\begin{ccExampleCode} -... -template < class GT, class Vb = Triangulation_vertex_base > -class My_vertex - : public Vb -{ -public: - typedef typename Vb::Point Point; - typedef typename Vb::Cell_handle Cell_handle; - - template < class TDS2 > - struct Rebind_TDS { - typedef typename Vb::template Rebind_TDS::Other Vb2; - typedef My_vertex Other; - }; - - My_vertex() {} - My_vertex(const Point&p) : Vb(p) {} - My_vertex(const Point&p, Cell_handle c) : Vb(p, c) {} -... -}; -... // The rest has not changed -\end{ccExampleCode} - -The situation is exactly similar for cell base classes. -Section~\ref{TDS3-sec-design} provides more detailed information. - - -\section{Examples\label{Triangulation3-sec-examples}} -\subsection{Basic Example} -This example shows the incremental construction of a 3D triangulation, the -location of a point and how to perform elementary operations on indices in a -cell. It uses the default parameter of the \ccc{Triangulation_3} class. - -\ccIncludeExampleCode{Triangulation_3/simple_triangulation_3.cpp} - -\subsection{Changing the Vertex Base} -The following two examples show how the user can plug his own vertex base in a -triangulation. Changing the cell base is similar. - -\subsubsection{Adding a Color\label{Triangulation3-sec-examples-color}} -When the user doesn't need to add a type in a vertex which depends on the -\ccc{TriangulationDataStructure_3} (e.g. a \ccc{Vertex_handle} or -\ccc{Cell_handle}), then he can use the -\ccc{Triangulation_vertex_base_with_info_3} class to add his own information -easily in the vertices. The example below shows how to add a \ccc{CGAL::Color} -this way. - -\ccIncludeExampleCode{Triangulation_3/color.cpp} - -\subsubsection{Adding Handles} -When the user needs to add a type in a vertex which depends on the -\ccc{TriangulationDataStructure_3} (e.g. a \ccc{Vertex_handle} or -\ccc{Cell_handle}), then he has to derive his own vertex base class, -as the following example shows. - -\ccIncludeExampleCode{Triangulation_3/adding_handles_3.cpp} - -\subsection{The Simplex Class\label{Triangulation3-sec-simplex}} -The triangulation defines a \ccc{Simplex} class that represents a -simplex (vertex, edge, facet or cell). This example demonstrates how -simplices can be stored in a set. - -\ccIncludeExampleCode{Triangulation_3/simplex.cpp} - - -\subsection{Fast Point Location for Delaunay Triangulations\label{Triangulation3-ex-fast-location}} - -\ccIncludeExampleCode{Triangulation_3/fast_location_3.cpp} - -\subsection{Finding the Cells in Conflict with a Point in a Delaunay -Triangulation} - -\ccIncludeExampleCode{Triangulation_3/find_conflicts_3.cpp} - -\subsection{Regular Triangulation} -This example shows the building of a regular triangulation. In this -triangulation, points have an associated weight, and some points can -be hidden and do not result in vertices in the triangulation. -Another difference is that a specific traits class has to be used -(at least at the moment). - -\ccIncludeExampleCode{Triangulation_3/regular_3.cpp} - -\section{Complexity and Performance\label{Triangulation3-sec-complexity}} - -In 3D, the worst case complexity of a triangulation is quadratic in the number -of points. For Delaunay triangulations, this bound is reached in cases such as -points equally distributed on two non-coplanar lines. However, the good news -is that, in many cases, the complexity of a Delaunay triangulation is linear or -close to linear in the number of points. Several -articles~\cite{d-hdvdl-89,e-dpssdt-02,geometrica-5986i,prisme-4453a,prisme-abl-03} -have proved such good complexity bounds for specific point distributions, such -as points distributed on surfaces under some conditions. - -\subsection{Running Time} - -There are several algorithms provided in this package. We will focus here on -the following ones and give practical numbers on their efficiency~: -\begin{itemize} -\item construction of a triangulation from a range of points, -\item location of a point (using the \ccc{locate} function), -\item removal of a vertex (using the \ccc{remove} function). -\end{itemize} - -We will use the following types of triangulations, using -\ccc{Exact_predicates_inexact_constructions_kernel} as geometric traits -(combined with \ccc{Regular_triangulation_euclidean_traits_3} in the weighted -case)~: -\begin{itemize} -\item \textbf{Delaunay} : \ccc{Delaunay_triangulation_3} -\item \textbf{Delaunay - Fast location} : \ccc{Delaunay_triangulation_3} with \ccc{Fast_location} -\item \textbf{Regular} : \ccc{Regular_triangulation_3} (default setting : memorize hidden points) -\item \textbf{Regular - No hidden points} : \ccc{Regular_triangulation_3} with hidden points discarded (using - \ccc{Triangulation_cell_base_3} instead of \ccc{Regular_triangulation_cell_base_3}). -\end{itemize} - -Figure~\ref{Triangulation3-fig-benchmarks} shows, for all these types of -triangulations, the times in seconds taken to build a triangulation from a -given number of points, then the average time to perform one point location in -triangulations of various sizes, and the average time to perform one vertex -removal (which is largely independent on the size of the triangulation). - -The data sets used here are points randomly distributed in the unit cube (the -coordinates are generated using the \texttt{drand48} C function). In the -weighted case, the weights are all zero, which means that there are actually no -hidden points during execution. - -The measurements have been performed using \cgal\ 3.6, using the \gnu\ \CC\ compiler -version 4.3.2, under Linux (Fedora 10 distribution), with the compilation options -\texttt{-O3 -DCGAL\_NDEBUG}. The computer used was equipped with a 64bit Intel -Xeon 3GHz processor and 32GB of RAM (a recent desktop machine as of 2009). -% Note : it's "tigre" that I used. - -\begin{figure}[htbp] -\begin{center} -\begin{tabular}{|l||r|r|r|r|} -\hline -& \textbf{Delaunay} & \textbf{Delaunay} & \textbf{Regular} & \textbf{Regular} \\ -& & \textbf{Fast location} & & \textbf{No hidden points} \\ -\hline\hline -Construction from $10^2$ points & 0.00054 & 0.000576 & 0.000948 & 0.000955 \\ -Construction from $10^3$ points & 0.00724 & 0.00748 & 0.0114 & 0.0111\\ -Construction from $10^4$ points & 0.0785 & 0.0838 & 0.122 & 0.117 \\ -Construction from $10^5$ points & 0.827 & 0.878 & 1.25 & 1.19 \\ -Construction from $10^6$ points & 8.5 & 9.07 & 12.6 & 12.2 \\ -Construction from $10^7$ points & 87.4 & 92.5 & 129 & 125 \\ -\hline -Point location in $10^2$ points & 9.93e-07 & 1.06e-06 & 7.19e-06 & 6.99e-06 \\ -Point location in $10^3$ points & 2.25e-06 & 1.93e-06 & 1.73e-05 & 1.76e-05 \\ -Point location in $10^4$ points & 4.79e-06 & 3.09e-06 & 3.96e-05 & 3.76e-05 \\ -Point location in $10^5$ points & 2.98e-05 & 6.12e-06 & 1.06e-04 & 1.06e-04 \\ -Point location in $10^6$ points & 1e-04 & 9.65e-06 & 2.7e-04 & 2.67e-04 \\ -Point location in $10^7$ points & 2.59e-04 & 1.33e-05 & 6.25e-04 & 6.25e-04 \\ -\hline -Vertex removal & 1e-04 & 1.03e-04 & 1.42e-04 & 1.38e-04 \\ -\hline -\end{tabular} -\end{center} -\caption{Running times in seconds for algorithms on 3D triangulations. -\label{Triangulation3-fig-benchmarks}} -\end{figure} - -More benchmarks comparing \cgal\ to other software can be found -in~\cite{msri52:liu-snoeyink-05}. - - -\subsection{Memory Usage} - -We give here some indication about the memory usage of the triangulations. -Those structures being intensively based on pointers, the size almost doubles -on 64bit platforms compared to 32bit. - -The size also depends on the size of the point type which is copied in the -vertices (hence on the kernel). Obviously, any user data added to vertices -and cells also affect the memory used. - -More specifically, the memory space used to store a triangulation is first -a function of the size of its \ccc{Vertex} and \ccc{Cell} types times their -numbers (and for volumic distribution, one sees about 6.7 times more cells than -vertices). However, these are stored in memory using \ccc{Compact_container}, -which allocates them in lists of blocks of growing size, and this requires some -additional overhead for bookkeeping. Moreover, memory is only released to the -system when clearing or destroying the triangulation. This can be important -for algorithms like simplifications of data sets which will produce fragmented -memory usage (doing fresh copies of the data structures are one way out in such -cases). The asymptotic memory overhead of \ccc{Compact_container} for its -internal bookkeeping is otherwise on the order of $O(\sqrt{n})$. - -Figure~\ref{Triangulation3-fig-memory} shows the number of bytes used per -points, as measured empirically using \ccc{Memory_sizer} for large triangulations -($10^6$ random points). - -\begin{figure}[htbp] -\begin{center} -\begin{tabular}{|l||r|r|r|r|} -\hline -& \textbf{Delaunay} & \textbf{Delaunay} & \textbf{Regular} & \textbf{Regular} \\ -& & \textbf{Fast location} & & \textbf{No hidden points} \\ -\hline\hline -32bit & 274 & 291 & 336 & 282 \\ -\hline -64bit & 519 & 553 & 635 & 527 \\ -\hline -\end{tabular} -\end{center} -\caption{Memory usage in bytes per point for large data sets. -\label{Triangulation3-fig-memory}} -\end{figure} - - -\subsection{Variability Depending on the Data Sets and the Kernel} - -Besides the complexity of the Delaunay triangulation that varies with the -distribution of the points, another critical aspect affects the efficiency~: -the degeneracy of the data sets. These algorithms are quite sensitive to -numerical accuracy and it is important to run them using exact predicates. - -Using a kernel with no exact predicates will quickly lead to crashes or -infinite loops once they are executed on non-random data sets. More precisely, -problems appear with data sets which contain (nearly) degenerate cases for the -\ccc{orientation} and \ccc{side_of_oriented_sphere} predicates, namely when -there are (nearly) coplanar or (nearly) cospherical points. This unfortunately -happens often in practice with data coming from various kinds of scanners or -other automatic acquisition devices. - -Using an inexact kernel such as \ccc{Simple_cartesian} would lead -to optimal performance, which is only about 30\% better than -\ccc{Exact_predicates_inexact_constructions_kernel}. The latter is strongly -recommended since it takes care about potential robustness issues. The former -can be used for benchmarking purposes mostly, or when you really know that your -data sets won't exhibit any robustness issue. - -Exact predicates take more time to compute when they hit (nearly) degenerate -cases. Depending on the data set, this can have a visible impact on the -overall performance of the algorithm or not. - -Sometimes you need exact constructions as well, so -\ccc{Exact_predicates_exact_constructions_kernel} is a must. This is the case -for example when you need the \ccc{dual} functions to be exact, or when your -input is stored in points of such a kernel for other reasons (because it is the -output of another algorithm which has this requirement, for example). This -will slow down the computations by a factor of 4 to 5 at least, and it can be -much more. - -Figure~\ref{Triangulation3-fig-kernels-and-data-sets} gives more detailed -timings about various kernels one the following data sets~: random points in a -cube, random points on the surface of an ellipsoid, points scanned on the -surface of a Buddha statue, points on a molecular surface, and points scanned -on a dryer handle. See Figure~\ref{Triangulation3-fig-data-sets} for pictures of -the last 3 objects, which respectively illustrate volumic data, surfacic data, -and data with many degenerate cases. This last data set exhibits an infinite -loop with an inexact kernel, and of course we are not sure whether what is -computed for the other data sets with this inexact kernel is a Delaunay -triangulation. General introductory information about these robustness issues -can be found in~\cite{cgta-kmpsy-08}. More benchmarks around this issue can -also be found in~\cite{cgal:dp-eegpd-03}. - -\begin{figure}[htbp] -\begin{center} -\begin{tabular}{|l||r|r|r|r|r|} -\hline - & \textbf{Random} & \textbf{Ellipsoid} & \textbf{Buddha} & \textbf{Molecule} & \textbf{Dryer} \\ - & & & & & \textbf{Handle} \\ -\#points & \textbf{100000} & \textbf{100000} & \textbf{542548} & \textbf{525296} & \textbf{49787} \\ -\hline\hline -\ccc{Simple_cartesian} & 0.69 & 0.627 & 4.21 & 3.8 & $\infty$-loop \\ -\hline -\ccc{Exact_predicates_inexact_constructions_kernel} & 0.824 & 0.749 & 4.99 & 4.64 & 1.68 \\ -\hline -\ccc{Exact_predicates_exact_constructions_kernel} & 4.59 & 3.85 & 30.1 & 26.4 & 4.57 \\ -\hline -\ccc{Simple_cartesian} & 492 & 534 & 1120 & 1030 & 75.2 \\ -\hline -\end{tabular} -\end{center} -\caption{Running times (seconds) for various kernels and data sets. -\label{Triangulation3-fig-kernels-and-data-sets}} -\end{figure} - - -\begin{figure}[htbp] -\begin{center} -\begin{ccTexOnly} -\includegraphics[width=5cm]{Triangulation_3/fig/api1_01} -\includegraphics[width=5cm]{Triangulation_3/fig/b35-1} -\includegraphics[width=5cm]{Triangulation_3/fig/HD} -\end{ccTexOnly} -\begin{ccHtmlOnly} - - -
Buddha statue -Molecule -Dryer Handle -
-\end{ccHtmlOnly} -\end{center} -\caption{Data sets used in the benchmark of Figure~\ref{Triangulation3-fig-kernels-and-data-sets}. -\label{Triangulation3-fig-data-sets}} -\end{figure} - - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\section{Design and Implementation History} - -Monique Teillaud started to work on the 3D triangulation packages in -1997, following the design of the 2D triangulation packages. The -notions of degenerate dimensions and infinite vertex were formalized -\cite{t-tdtc-99} and induced changes in the 2D triangulation -packages. The packages were first released in \cgal\ 2.1. They contained -basic functionalities on triangulations, Delaunay triangulations, -regular triangulations. - -A first version of removal of a vertex from a Delaunay triangulation -was released in \cgal\ 2.2. However, this removal became really robust -only in \cgal\ 2.3, after some research that allowed to deal with -degenerate cases quite easily \cite{cgal:dt-pvr3d-03}. Andreas Fabri -implemented this revised version of the removal, and a faster removal -algorithm for \cgal\ 3.0. - -The latter algorithm was proposed by Mariette Yvinec, who contributed -in several ways to the package, first since she was maintaining the -close 2D triangulation package and participated in many discussions, -she also wrote the traits classes for regular triangulations. - -In 2000, Sylvain Pion started working on these packages. He improved -the efficiency of triangulations in \cgal\ 2.3 and 2.4 in several ways -\cite{cgal:bdpty-tc-02}: he implemented the Delaunay hierarchy -\cite{cgal:d-dh-02} in 2.3, he improved the memory footprint in 2.4 -and 3.0, he also performed work on arithmetic filters -\cite{cgal:dp-eegpd-03} (see \ccc{Filtered_kernel}) to improve -the speed of triangulations. He changed the design in \cgal\ 3.0, -allowing users to add handles in their own vertices and cells. - -Olivier Devillers, co-author of preliminary versions of the \cgal\ 2d -triangulations, participated in many discussions, in particular about -the perturbations, and more concretely in the implementation of the -Delaunay hierarchy. - -In 2005, Christophe Delage implemented the vertex removal function for -regular triangulations, using the symbolic perturbation proposed -in~\cite{cgal:dt-pvrdr-06}, which allowed to release this -functionality in \cgal\ 3.2. - -In 2006, Nico Kruithof wrote the \ccc{Triangulation_simplex_3} class -that can store simplices of any dimension and improved the internal -organization of the code. - -As of March 2007, Christophe Delage made the iterator range insert methods and -constructors use \ccc{spatial_sort} to improve efficiency. - -In 2008, Camille Wormser added a few more iterators in -the package that were integrated in release~3.4. - -In 2009, Sylvain Pion simplified the design of the Delaunay hierarchy -so that it became the simple \ccc{Fast_location} policy in release~3.6. - -In 2010, Pedro de Castro and Olivier Devillers added the point displacement. - -The authors wish to thank Lutz Kettner for inspiring discussions about -the design of CGAL. Jean-Daniel Boissonnat is also acknowledged -\cite{bdty-tcgal-00}. diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/concept_hierarchy.fig b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/concept_hierarchy.fig deleted file mode 100644 index 80d87e64ea3..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/concept_hierarchy.fig +++ /dev/null @@ -1,33 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 - 5175 1125 8325 1125 8325 1575 5175 1575 5175 1125 -2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 - 5175 2250 8325 2250 8325 2700 5175 2700 5175 2250 -2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 - 1125 1125 4275 1125 4275 1575 1125 1575 1125 1125 -2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 - 1125 2250 4275 2250 4275 2700 1125 2700 1125 2250 -2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 2700 2250 2700 1575 -2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6750 2250 6750 1575 -2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 - 1125 3375 4275 3375 4275 3825 1125 3825 1125 3375 -2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 2700 3375 2700 2700 -4 0 0 50 0 0 12 0.0000 4 195 2640 5580 1395 TriangulationDSVertexBase_3\001 -4 0 0 50 0 0 12 0.0000 4 195 2370 5760 2565 TriangulationVertexBase_3\001 -4 0 0 50 0 0 12 0.0000 4 195 2130 1800 2520 TriangulationCellBase_3\001 -4 0 0 50 0 0 12 0.0000 4 195 2400 1665 1440 TriangulationDSCellBase_3\001 -4 0 0 50 0 0 12 0.0000 4 195 2805 1305 3645 RegularTriangulationCellBase_3\001 diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/concept_hierarchy.gif b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/concept_hierarchy.gif deleted file mode 100644 index af05591d5beaf094b178e050c5860d61a5bbefae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3788 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 SL|Pzy44#D2&@gwfK>Z(2d)>?c diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/derivation.fig b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/derivation.fig deleted file mode 100644 index a17a70708d5..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/derivation.fig +++ /dev/null @@ -1,30 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 4275 2475 4725 2025 -2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6075 2475 5625 2025 -2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 5175 1575 5175 1125 -2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 - 5400 2475 7875 2475 7875 2925 5400 2925 5400 2475 -2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 - 2475 2475 4950 2475 4950 2925 2475 2925 2475 2475 -2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 - 4050 1575 6300 1575 6300 2025 4050 2025 4050 1575 -2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 - 4050 675 6300 675 6300 1125 4050 1125 4050 675 -4 0 0 50 0 0 12 0.0000 4 195 2205 2655 2790 Delaunay_triangulation_3\001 -4 0 0 50 0 0 12 0.0000 4 195 2055 5580 2790 Regular_triangulation_3\001 -4 0 0 50 0 0 12 0.0000 4 195 1350 4500 1845 Triangulation_3\001 -4 0 0 50 0 0 12 0.0000 4 195 1800 4275 945 Triangulation_utils_3\001 diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/derivation.gif b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/derivation.gif deleted file mode 100644 index 97578f4fe52afd398f6fd511e331099eba6d127e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2605 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 diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/derivation.pdf b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/derivation.pdf deleted file mode 100644 index ec6c07f1b6f39bf949befad63067e6cf9dc38e5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5947 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 diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/design.fig b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/design.fig deleted file mode 100644 index fbfe6c68e7f..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/design.fig +++ /dev/null @@ -1,132 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -6 4320 4005 5085 4545 -4 0 0 50 0 0 12 0.0000 4 180 645 4365 4140 Optional\001 -4 0 0 50 0 0 12 0.0000 4 135 375 4500 4365 User\001 -4 0 0 50 0 0 12 0.0000 4 135 735 4320 4545 Additions\001 --6 -6 3870 2250 5490 2925 -4 0 0 50 0 0 18 0.0000 4 255 1500 3960 2835 Functionality\001 -4 0 0 50 0 0 18 0.0000 4 195 1620 3870 2475 Combinatorial\001 --6 -6 -1395 5355 495 6345 -6 -1395 5355 495 6345 -2 2 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 5 - -1350 5400 450 5400 450 6300 -1350 6300 -1350 5400 -4 0 0 50 0 0 22 0.0000 4 225 1365 -1080 5760 Geometric\001 -4 0 0 50 0 0 22 0.0000 4 225 795 -810 6165 Traits\001 --6 --6 -2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 13 - 2250 3600 2250 3150 4050 3150 4050 3600 5400 3600 5400 3150 - 7200 3150 7200 3600 7650 3600 7650 1350 900 1350 900 3600 - 2250 3600 -2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 - 1800 1350 1800 3600 -2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 13 - 7650 900 8100 900 8100 -1800 -2700 -1800 -2700 900 -1350 900 - -1350 450 450 450 450 900 900 900 900 450 7650 450 - 7650 900 -2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 240.00 480.00 - -450 5400 -450 450 -2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 - -1800 -1800 -1800 900 -2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 240.00 480.00 - 3150 4050 3150 3150 -2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 240.00 480.00 - 6300 4005 6300 3150 -2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 240.00 480.00 - 4725 1350 4725 450 -2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 240.00 480.00 - 3150 4050 3150 3150 -2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 240.00 480.00 - 6300 4050 6300 3150 -2 2 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 5 - 2250 5400 4050 5400 4050 5850 2250 5850 2250 5400 -2 2 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 5 - 5400 5400 7200 5400 7200 5850 5400 5850 5400 5400 -2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 240.00 480.00 - 3150 5400 3150 4500 -2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 240.00 480.00 - 6300 5400 6300 4500 -2 2 1 2 0 7 50 0 -1 6.000 0 0 -1 0 0 5 - 2250 4050 4050 4050 4050 4500 2250 4500 2250 4050 -2 2 1 2 0 7 50 0 -1 6.000 0 0 -1 0 0 5 - 5400 4050 7200 4050 7200 4500 5400 4500 5400 4050 -2 2 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5 - 2205 1350 4095 1350 4095 1845 2205 1845 2205 1350 -2 2 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 5 - 2250 1350 4050 1350 4050 1800 2250 1800 2250 1350 -2 2 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5 - 5355 1350 7245 1350 7245 1845 5355 1845 5355 1350 -2 2 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 5 - 5400 1350 7200 1350 7200 1800 5400 1800 5400 1350 -2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 90.00 180.00 - 3150 1350 3150 -2070 -2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 90.00 180.00 - 6300 1350 6300 -2070 -2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 4 - 1 1 1.00 240.00 480.00 - 450 6075 4500 6075 4500 5580 5400 5580 -2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 240.00 480.00 - 450 5625 2250 5625 -2 2 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 5 - -900 -1800 1125 -1800 1125 -1350 -900 -1350 -900 -1800 -3 2 1 1 0 7 50 0 -1 4.000 0 1 0 3 - 1 1 1.00 60.00 120.00 - 4185 5040 3780 4860 3285 5040 - 0.000 -1.000 0.000 -3 2 1 1 0 7 50 0 -1 4.000 0 1 0 3 - 1 1 1.00 60.00 120.00 - 5175 5040 5670 4860 6120 5040 - 0.000 -1.000 0.000 -3 2 1 1 0 7 50 0 -1 4.000 0 1 0 3 - 1 1 1.00 60.00 120.00 - 1170 5040 1215 5265 1260 5490 - 0.000 -1.000 0.000 -3 2 1 1 0 7 50 0 -1 4.000 0 1 0 3 - 1 1 1.00 60.00 120.00 - 945 4500 360 4185 -360 4230 - 0.000 -1.000 0.000 -3 2 1 1 0 7 50 0 -1 4.000 0 1 0 3 - 1 1 1.00 60.00 120.00 - 1305 4500 2025 3960 2970 3735 - 0.000 -1.000 0.000 -3 2 1 1 0 7 50 0 -1 4.000 0 1 0 3 - 1 1 1.00 60.00 120.00 - 1665 5040 2250 5130 2925 5130 - 0.000 -1.000 0.000 -4 0 0 50 0 0 20 1.5708 4 195 1740 1665 3375 Data Structure\001 -4 0 0 50 0 0 20 1.5708 4 255 1590 1260 3285 Triangulation\001 -4 0 0 50 0 0 24 1.5708 4 330 2010 -2115 540 Triangulation\001 -4 0 0 50 0 0 18 0.0000 4 195 1290 2520 5715 VertexBase\001 -4 0 0 50 0 0 18 0.0000 4 195 975 5850 5715 CellBase\001 -4 0 0 50 0 0 18 0.0000 4 195 900 2655 4365 UserVB\001 -4 0 0 50 0 0 18 0.0000 4 195 885 5895 4365 UserCB\001 -4 0 0 50 0 0 20 0.0000 4 195 780 2745 1665 Vertex\001 -4 0 0 50 0 0 20 0.0000 4 195 465 6075 1665 Cell\001 -4 0 0 50 0 0 12 0.0000 4 135 795 4230 5130 Derivation\001 -4 0 0 50 0 0 16 0.0000 4 225 930 630 4725 Template\001 -4 0 0 50 0 0 16 0.0000 4 165 1095 585 4950 Parameters\001 -4 0 0 50 0 0 18 0.0000 4 255 1500 -585 -585 Functionality\001 -4 0 0 50 0 0 18 0.0000 4 195 1200 -450 -900 Geometric\001 -4 0 0 50 0 0 14 0.0000 4 195 1530 -585 -1530 locate(), insert()...\001 -4 0 0 50 0 0 16 0.0000 4 225 585 4500 -1440 Types\001 diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/design.gif b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/design.gif deleted file mode 100644 index 268f24a37eb3b3a69e371ee9645f8fe317c57341..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 252498 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 gw&;=nmi_e4bcFv$d;U>q9|Y-ta)bZRZ~puL1k diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/design.pdf b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/design.pdf deleted file mode 100644 index 97795c9d0c0e2b87a40507e618f25000e34b3443..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5029 zcmZu#cRbbK|IZ2+S&`j4nHhK3d#_Mj7iAUh#m%_fdvWcRO-6;XGLo5(>HqS@Ew|I|mtA*(-6|o=k#kP^=%&s2FWI!4uFaX;N)tApJt5&dAMkl5A^;g; zYyYjm;u`TsaFF7D;LcVqeEVRpd#DW4Y}v3=>dhZSGw$0k!|N~*WHe$R60|uo)us^m zH99wkZ~F0LrC|TP`Mhuaky$O=v5!yYZiT6}w}-q>mlM)&p3@q`glv2mq@ZeDJgaE? zF0`sU<;)qU9OFK9i={kxjBY4(Ke@YFd%xSp@SJf1DhBe7nkaAF*UAQ-qPebmOB^^p z@Lndomb%uc!;6yAzi9ZROAxEBL!{56X%SSg6NbCU>r#_zJ}xn}HzQ};USi{s+!x)t zME=D$o`QK`-%SMkinZOO9BLJ9%R$g~+NI6a6rsDXt1x6u;5ubCQ#CuPIWp1ZdgsAo zzlLUaX$86Uy27@%z12YOSPgJ9gPFQXq7SKAq#rj)Sbw&Y`Ci#jXtXi*yR(6{?B!?5 zD}ycL?gjl#iIsv|3$j1dF79K#K5>~l^vKDetEk3qT#BNASrChzHMM(RE)&EhbAy&@ z8ksa!J#d%k4|7`!j|(`p(}M;sYhG>~-0Z_ap|>HmS(B#_xPUWIedQJ7W((JfC&9}5 zEV1d--N>~7`Byk>5Q8a7GSn>C%V;&?$%$3 z0NX-bvHIRihTtr3(2qr@AoSW^Tj8)ElL3hRw#(h!C!svf+ORPzCiSmW?sfbH8S5#X zWVki8ht=xUMD)as!Z^BQl+FPANy9_*VQO0ytVVHkrft~`_2!J zX4xqBB6`(&k=i)_5SjC>Xv(F2!qJ%0lF2X3tEb?NZuz}yMvT!?37HSs7i(TXf zG#fnEPD%N1BTfy`JE)EXF)lL9uAWRyTTFg6lE5R3WLJs$m>?dvyn((rd{o=)IuX6vI9-qsZ?>_Z9IoS6u(w}B>dhIdz5 z()|3LrYq`eg%;V{(#AHzlSIoD`_vUT#alVR`U{85+0IYYmm!XWriqA2Q3GN~s*8f< z3#~la9ye6^ck3bCrG&48TolMO`lQYRiA7~hKM{B5OR)6Ni4r}{1fA5jTAT!8Z1pzc@D`tI%7A_wI+; z4wVcZa}9QHf=OkxxvSSo&E%N=hqt{^z%4Qj71~khBHv7|{kbYJbu6xwkLO$mxw_R@j%f3Qvpjs` z(*2Ufpz|(NrZdW`*rB`l8bRvYM)$6 z8fK!gK;4L2VVg3>V5@l=$?XMB=wuC2I@aYOAAC*JFTcDMv8eY&I7C?tYT*(5njzA- z(JkE39A#s$Ow|NgQ04zzJ;rZ}1HTTl5_2BVIgm+7PTj?i8dBU~2@*g)P}knQqtXCG zqhNs=V{-N9olR#rl>IorsmEFJhsvQ5dB*GlxuxbEG4E?8+h~Xk3gY$h3jS`kjT+d^ z4MhdedHTVCS}{S&7>dz>)ifK}mQcD;%sDc%=N?LFi?yy&1w!j|+s@<6;y@IW!985k zMI1+UbJ+G!O4K#|o`Dw`%BsCpF_YTColXO$3>6);Xy)zm&oCd~qT>WgAvo zJOcbzMz9YtbVUiZza6Gb+O(g>BBT{^6?D$W>^0(fc9g8&ziNt+zT}$3J<;j;IyT*1-<{vZ z{OlFIrDu0K9m|o^9b4~M-{AHcLawTHPp4e;3oNWeHr^NwP)kzjrxCGBk{ME2f7>^S zYHn|d;Z)Ajw6cYClXs@xJg+BP72dI7(~)dqXh}#**A+P9NA6W{0nd4HV#C2VIAswe z;sdhGchy=EixC^sx#3I~MTx!7Zfma&+b^g5uEUpnJicHHC%|sq4kkp6*W4uQFFs3% zvkb4uf44roV03zbf<*(kGoE-lG~7Zwz~a5Ef-DU;<9rK@{u&46{MnH}cZ$@l>%tk^ ztS)_MT5t6M*yju&x8q}`i-FGdC;j!vDj1VC3p26#71Q*6;rNwW^6!D&7XwtQw=(O} z%bzZm^|j8%v1^_E8X8I-0rq!{WtbCX9x{%wZRZ#5l%T3BWM+}CSbW2vofTEM6i<6g z>yzF4{d_S zajP|xuE%F*t>~fiG&q(vvx_1c%tlYm&y<{>;Ko314ci#i-p#t+VDX$AUd9iBG48V$ zn3Rkc#VE8PC#CPaWN7%*RP00-1lyyojOk^(USi%@p0>j5bGgPwBtz$lBH6p!a-5Vo zO3+N(U0!8# z|C9!XWl>F|Egr68}@@wHDC7y zDAvOgz9ddv6*C`lHM>uv>O~8j*|?nh%2!q}4=E6fx6Q5|hOnA7^BXJa0s4FD=~)pY z>c`dUyC%|$S19HS(6>L(8MZjhaT%Q$xp?lo;_09;XRW@Dr?yvHi&ITUbP>$qEXoKa zHFEc1Uejht2usnbF1R9w8{pA1<|<8d?k%)CYTistzqMS3Gy+H2YPz(}X8a3kY) zQ09g6A&9hYsJky?Hk-jq#+!o@{QVcsUSfs$l2_j>Jl2gmPScv;E6tvwoO{-xUf*t} zpXIUM*ll6Hdna|^HO}e-(@aXqpz>FDX(gBY$kNINuFwZd?VaF-MEdq_FP1ks#f?s{ z@%CQcc(#m~KMx1nKQH&PA&7G&DlpgenH7J@)_$W9Xk<0R7{KCZ*SFjzvte(sYU;W> z(uJxp?Du&HX^@P3BorT&qCbI4G75o)VoW8Qxr@15Rap&rQ_@a`4HbrQo_}GQTCs}y zboMowOp2i8T8!A`SCKxJao@C=r@A}%Xv5l$+@M|G!E7coV3DC_uOrvKaz_Yo~zeXoFOQd)(5)` zOLL`g+&h=T@r3CKTLPWHFlWDrk^Bn120~6NOQ+7l-8l)tw6#`L9)-Ao5oB{Je* zvo@@$(RR#^t$(^FEZS(^%Uo-iO~_a2t5M*L64=THHVP0PJ?}80zjgI<+%RVmmlpK^ zVoBuY?Nb7^pt4at%`f8ea(RvU8D)L@b9d5-k(G%Qy8W?(O`Jcxr#LzTqs zg?1rAkROV(pDbmQjrDntvmEY^7sg(WYNwrTF;Y%S?urNwcrznCnH$6cJxrL3S^yL^ zIjF*;b43Ha4tLhJHx@QN(DcL}u#mlH%#@gU+pcy%8Ngsj0q(iJs3Th zUrpi$69vAJYKb((RKgHHX`s(!G$RxjA`gs(wEDuyEGZYcmr(BnISA=JRzn87f zNzm^-848;DQZ7wUaa<|7V!i}F+!{UD=cf9xD|b+O>Ltnp`Frvu{X3eLk7nefUnzN* zH0U=b{b!O!_<5qhCic!KurUgWw%5cE0BZ=zEGsV!$VfqLK_nv<<$(vJj%IBT7>>eW zys?fb9BB$S!D1ZEPonc~mMCtZ9!!9km{eK)a)G5^#*Wy~j@z_$T_SAca3+`JmhYX%bb#8}CA5;yg)qb<(wu zJDPOTY(&ib+HjAeDfz#7FxkKKq@|#wJ^gnKX(^e1_~NnlXg3s=bfX4<&Cvd&S5^uD!!a1r kOLTO|0I-3F69)M2n~THSWAQ&bC@rf11qll3T+{{qA3@`vz5oCK diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/Delaunay_3.jpg b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/Delaunay_3.jpg deleted file mode 100644 index ac2b4fc3ae404e7023807ee4d9f609c35eccd964..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123194 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≺`b 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 diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/HD.gif b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/HD.gif deleted file mode 100644 index 20b718446c3ec3311b9702cb5b02e451490b4f6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41917 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
Dh; - - _test_cls_delaunay_3( Dh() ); - - return 0; -} diff --git a/Triangulation_3_copy_tds/test/Triangulation_3/test_regular_3.cpp b/Triangulation_3_copy_tds/test/Triangulation_3/test_regular_3.cpp deleted file mode 100644 index 2554466bbd5..00000000000 --- a/Triangulation_3_copy_tds/test/Triangulation_3/test_regular_3.cpp +++ /dev/null @@ -1,441 +0,0 @@ -// Copyright (c) 1998 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Monique Teillaud (Monique.Teillaud@sophia.inria.fr) -// : Mariette Yvinec (Mariette.Yvinec@sophia.inria.fr) - -#include -#include - -#include -#include -#include - -#include -#include - -bool del=true; - -typedef CGAL::Exact_predicates_inexact_constructions_kernel FK; -typedef CGAL::Regular_triangulation_euclidean_traits_3 traits; - -// Explicit instantiation of the whole class : -template class CGAL::Regular_triangulation_3; - -int main() -{ - std::cout << " with CGAL::Regular_triangulation_euclidean_traits_3: " - << std::endl; - - typedef CGAL::Regular_triangulation_3 Cls; - - // _test_cls_regular_3( Cls() ); - typedef traits::Bare_point Point; - typedef traits::Weighted_point Weighted_point; - - typedef Cls::Vertex_handle Vertex_handle; - typedef Cls::Cell_handle Cell_handle; - typedef Cls::Facet Facet; - typedef Cls::Edge Edge; - - typedef std::list list_point; - typedef Cls::Finite_cells_iterator Finite_cells_iterator; - - // temporary version - - int n, m; - int count = 0; - - // For dimension 0, we need to check that the point of highest weight is the - // one that finally ends up in the vertex. - std::cout << " test dimension 0 " << std::endl; - Cls T0; - T0.insert(Weighted_point( Point (0,0,0), 0) ); - T0.insert(Weighted_point( Point (0,0,0), 1) ); - T0.insert(Weighted_point( Point (0,0,0), -1) ); - assert(T0.dimension() == 0); - assert(T0.number_of_vertices() == 1); - assert(T0.finite_vertices_begin()->point().weight() == 1); - - std::cout << " test dimension 1 " << std::endl; - Cls T1; - std::cout << " number of inserted points : " ; - Weighted_point p[5]; - for ( m=0; m<5; m++) { - if ( (m%2)== 0 ) - p[m] = Weighted_point( Point( 2*m,0,0 ), 2 ); - else - p[m] = Weighted_point( Point( -2*m+1,0,0 ), 2 ); - T1.insert( p[m] ); - count++; - if (count <10) - std::cout << count << '\b' ; - else - if (count < 100) - std::cout << count << '\b' << '\b' ; - else - std::cout << count << '\b' << '\b' << '\b' ; - std::cout.flush(); - } - assert( T1.is_valid() ); - std::cout << std::endl << " number of vertices : " - << T1.number_of_vertices() << std::endl; - - std::cout << " number of inserted points : " ; - Weighted_point q[5]; - for ( m=0; m<5; m++) { - if ( (m%2)== 0 ) - q[m] = Weighted_point( Point( 2*m+1,0,0 ), 5 ); - else - q[m] = Weighted_point( Point( -2*m+1,0,0 ), 5 ); - T1.insert( q[m] ); - count++; - if (count <10) - std::cout << count << '\b' ; - else - if (count < 100) - std::cout << count << '\b' << '\b' ; - else - std::cout << count << '\b' << '\b' << '\b' ; - std::cout.flush(); - } - assert( T1.is_valid() ); - std::cout << std::endl << " number of vertices : " - << T1.number_of_vertices() << std::endl; - - std::cout << " number of inserted points : " ; - Weighted_point r[10]; - for ( m=0; m<10; m++) { - if ( (m%2)== 0 ) - r[m] = Weighted_point( Point( m,0,0 ), 1 ); - else - r[m] = Weighted_point( Point( -m,0,0 ), 1 ); - T1.insert( r[m] ); - count++; - if (count <10) - std::cout << count << '\b' ; - else - if (count < 100) - std::cout << count << '\b' << '\b' ; - else - std::cout << count << '\b' << '\b' << '\b' ; - std::cout.flush(); - } - assert( T1.is_valid() ); - std::cout << std::endl << " number of vertices : " - << T1.number_of_vertices() << std::endl; - assert( T1.dimension()==1 ); - - // The following is distilled from a bug report by Wulue Zhao - // (zhao.88@osu.edu), a student of Tamal Dey. - Point pt0(0,0,0); - Point pt1( 1,0,0), pt2(2,0,0), pt3(3,0,0); - Point pt4(-1,0,0), pt5(-2,0,0), pt6(-3,0,0); - - Weighted_point wp0(pt0,10.0); - Weighted_point wp1(pt1,0.0), wp2(pt2,0.0), wp3(pt3,0.0); - Weighted_point wp4(pt4,0.0), wp5(pt5,0.0), wp6(pt6,0.0); - - Cls T11; - - T11.insert(wp0); - T11.insert(wp1); - T11.insert(wp2); - T11.insert(wp3); - T11.insert(wp4); - T11.insert(wp5); - T11.insert(wp6); - - assert(T11.is_valid()); - - // And another distilled bug report from the same guy. - { - Point p1(-0.07, 0.04, 0.04); - Point p2(0.09, 0.04, 0.04); - Point p3(0.09, -0.05, 0.04); - Point p4(0.05, -0.05, 0.04); - Point p5(0.05, 0.0, 0.04); - Point p6(-0.07, 0.0, 0.04); - Point p7(-0.07, 0.04, -0.04); - Point p8(0.09, 0.04, -0.04); - Point p9(0.09, -0.05, -0.04); - Point p10(0.05, -0.05, -0.04); - Point p11(0.05, 0.0, -0.04); - Point p12(-0.07, 0.0, -0.04); - - Weighted_point wp1(p1,0); - Weighted_point wp2(p2,0); - Weighted_point wp3(p3,0); - Weighted_point wp4(p4,0); - Weighted_point wp5(p5,0); - Weighted_point wp6(p6,0); - Weighted_point wp7(p7,0); - Weighted_point wp8(p8,0); - Weighted_point wp9(p9,0); - Weighted_point wp10(p10,0); - Weighted_point wp11(p11,0); - Weighted_point wp12(p12,0); - Weighted_point wp13(p3,0.3); // wp13 has the same coordinates with wp3 - - Cls T111; - - T111.insert(wp1); - T111.insert(wp2); - T111.insert(wp3); - T111.insert(wp13); // it doesnot work inserting wp13 here - T111.insert(wp4); - T111.insert(wp5); - T111.insert(wp6); - T111.insert(wp7); - T111.insert(wp8); - T111.insert(wp9); - T111.insert(wp10); - T111.insert(wp11); - T111.insert(wp12); - - assert(T111.is_valid()); - } - - std::cout << " test dimension 2 " << std::endl; - std::cout << " number of inserted points : " ; - Cls T2; - - count = 0 ; - int px=1, py=1; - int qx=-1, qy=2; - Weighted_point s[400]; - for (m=0; m<10; m++) - for (n=0; n<10; n++) { - s[m+20*n] = Weighted_point( Point(m*px+n*qx, m*py+n*qy, 0), 1 ); - T2.insert( s[m+20*n] ); - count++; - if (count <10) - std::cout << count << '\b' ; - else - if (count < 100) - std::cout << count << '\b' << '\b' ; - else - std::cout << count << '\b' << '\b' << '\b' ; - std::cout.flush(); - } - for (m=10; m<20; m++) - for (n=0; n<10; n++) { - s[m+20*n] = Weighted_point( Point(m*px+n*qx, m*py+n*qy, 0), -1 ); - T2.insert( s[m+20*n] ); - count++; - if (count <10) - std::cout << count << '\b' ; - else - if (count < 100) - std::cout << count << '\b' << '\b' ; - else - std::cout << count << '\b' << '\b' << '\b' ; - std::cout.flush(); - } - for (m=0; m<10; m++) - for (n=10; n<20; n++) { - s[m+20*n] = Weighted_point( Point(m*px+n*qx, m*py+n*qy, 0), -2 ); - T2.insert( s[m+20*n] ); - count++; - if (count <10) - std::cout << count << '\b' ; - else - if (count < 100) - std::cout << count << '\b' << '\b' ; - else - std::cout << count << '\b' << '\b' << '\b' ; - std::cout.flush(); - } - for (m=10; m<20; m++) - for (n=10; n<20; n++) { - s[m+20*n] = Weighted_point( Point(m*px+n*qx, m*py+n*qy, 0), 5 ); - T2.insert( s[m+20*n] ); - count++; - if (count <10) - std::cout << count << '\b' ; - else - if (count < 100) - std::cout << count << '\b' << '\b' ; - else - std::cout << count << '\b' << '\b' << '\b' ; - std::cout.flush(); - } - - std::cout << std::endl << " number of vertices : " - << T2.number_of_vertices() << std::endl; - assert( T2.dimension()==2 ); - assert( T2.is_valid() ); - - // dimension 3 - std::cout << " test dimension 3" << std::endl; - Cls T; - - list_point lp; - int a, b, d; - for (a=0;a!=10;a++) - // for (b=0;b!=10;b++) - for (b=0;b!=5;b++) - // for (d=0;d!=10;d++) - for (d=0;d!=5;d++) - lp.push_back(Weighted_point( Point(a*b-d*a + (a-b)*10 +a , - a-b+d +5*b, - a*a-d*d+b), - a*b-a*d) ); - list_point::iterator it; - count = 0 ; - std::cout << " number of inserted points : " ; - for (it=lp.begin(); it!=lp.end(); ++it){ - count++; - T.insert(*it); - if (count <10) - std::cout << count << '\b' ; - else - if (count < 100) - std::cout << count << '\b' << '\b' ; - else - if (count < 1000) - std::cout << count << '\b' << '\b' << '\b' ; - else - std::cout << count << std::endl; - std::cout.flush(); - } - std::cout << std::endl; - - std::cout << " number of vertices : " - << T.number_of_vertices() << std::endl; - assert(T.is_valid()); - assert(T.dimension()==3); - - T.clear(); - std::cout << " test iterator range insert" << std::endl; - T.insert (lp.begin(), lp.end()); - - std::cout << " number of vertices : " - << T.number_of_vertices() << std::endl; - assert(T.is_valid()); - assert(T.dimension()==3); - - - //test nearest_power_vertex - std::cout << " test nearest_power_vertex " << std::endl; - Point pp1(0.0, 0.0, 0.0); - Point pp2(1.0, 0.0, 0.0); - Point pp3(0.0, 1.0, 0.0); - Point pp4(0.0, 0.0, 1.0); - Point pp5(1.0, 1.0, 0.0); - Point pp6(0.0, 1.0, 1.0); - Point pp7(1.0, 0.0, 1.0); - Point pp8(1.0, 1.0, 1.0); - - Weighted_point wpp1(pp1, 1.0); - Weighted_point wpp2(pp2, 2.0); - Weighted_point wpp3(pp3, 1.0); - Weighted_point wpp4(pp4, 4.0); - Weighted_point wpp5(pp5, 1.0); - Weighted_point wpp6(pp6, 1.0); - Weighted_point wpp7(pp7, 1.0); - Weighted_point wpp8(pp8, 8.0); - - Cls T3; - - T3.insert(wpp1); - Vertex_handle v2 = T3.insert(wpp2); - assert( T3.nearest_power_vertex(Point(0.5,0.5,0.5)) == v2); - - T3.insert(wpp3); - Vertex_handle v4 = T3.insert(wpp4); - assert( T3.nearest_power_vertex(Point(0.5,0.5,0.5)) == v4); - - T3.insert(wpp5); - T3.insert(wpp6); - T3.insert(wpp7); - // Avoid inserting the same point twice, now that hidden points are handled, - // insert (existing_point) returns Vertex_handle(). - // T3.insert(wpp8); - Vertex_handle v8 = T3.insert(wpp8); - Point query(0.5,0.5,0.5); - assert(T3.nearest_power_vertex(query) == v8); - assert(T3.nearest_power_vertex(Weighted_point(query,1.0)) == v8 ); - assert(T3.nearest_power_vertex_in_cell(query ,v8->cell()) == v8); - - // test dual - std::cout << " test dual member functions" << std::endl; - Finite_cells_iterator fcit = T3.finite_cells_begin(); - for( ; fcit != T3.finite_cells_end(); ++fcit) { - Point cc = T3.dual(fcit); - Vertex_handle ncc = T3.nearest_power_vertex(cc); - assert(fcit->has_vertex(ncc)); - } - - // test Gabriel - std::cout << " test is_Gabriel " << std::endl; - Point q0(0.,0.,0.); - Point q1(2.,0.,0.); - Point q2(0.,2.,0.); - Point q3(0.,0.,2.); - - Weighted_point wq0(q0,0.); - Weighted_point wq1(q1,0.); - Weighted_point wq2(q2,0.); - Weighted_point wq3(q3,0.); - Weighted_point wq01(q0,2.); - - Cls T4; - Vertex_handle v0 = T4.insert(wq0); - Vertex_handle v1 = T4.insert(wq1); - v2 = T4.insert(wq2); - Vertex_handle v3 = T4.insert(wq3); - Cell_handle c; - int i,j,k,l; - assert(T4.is_facet(v0,v1,v2,c,j,k,l)); - i = 6 - (j+k+l); - Facet f = std::make_pair(c,i); - assert(T4.is_Gabriel(c,i)); - assert(T4.is_Gabriel(f)); - assert(T4.is_facet(v1,v2,v3,c,j,k,l)); - i = 6 - (j+k+l); - assert(!T4.is_Gabriel(c,i)); - assert(T4.is_edge(v0,v1,c,i,j)); - assert(T4.is_Gabriel(c,i,j)); - Edge e = make_triple(c,i,j); - assert(T4.is_Gabriel(e)); - assert(T4.is_edge(v2,v3,c,i,j)); - assert(T4.is_Gabriel(c,i,j)); - - Vertex_handle v01 = T4.insert(wq01); - (void) v01; // kill warning - assert(T4.is_edge(v2,v3,c,i,j)); - assert(!T4.is_Gabriel(c,i,j)); - - Weighted_point wwq0(q0,0.); - Weighted_point wwq1(q1,0.); - Weighted_point wwq2(q2,0.); - Weighted_point wwq3(q3,5.); - Cls T5; - v0 = T5.insert(wwq0); - v1 = T5.insert(wwq1); - v2 = T5.insert(wwq2); - v3 = T5.insert(wwq3); - assert(T5.nearest_power_vertex(v3->point().point()) == v3); - assert(T5.nearest_power_vertex(v0->point().point()) == v3); - assert(T5.is_Gabriel(v3)); - assert(!T5.is_Gabriel(v0)); - - std::cout << " quit " << std::endl; - return 0; -} - diff --git a/Triangulation_3_copy_tds/test/Triangulation_3/test_regular_as_delaunay_3.cpp b/Triangulation_3_copy_tds/test/Triangulation_3/test_regular_as_delaunay_3.cpp deleted file mode 100644 index a553cbece05..00000000000 --- a/Triangulation_3_copy_tds/test/Triangulation_3/test_regular_as_delaunay_3.cpp +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) 2004 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Sylvain Pion - -#include -#include - - -bool del=true; - -#include -#include - -typedef CGAL::Regular_triangulation_euclidean_traits_3 Traits; - -int main() -{ - typedef CGAL::Regular_triangulation_3 Cls; - - _test_cls_delaunay_3( Cls() ); - - return 0; -} - -// MipsPro prefers this after the other instantiations... -// Explicit instantiation of the whole class : -template class CGAL::Regular_triangulation_3; diff --git a/Triangulation_3_copy_tds/test/Triangulation_3/test_regular_remove_3.cpp b/Triangulation_3_copy_tds/test/Triangulation_3/test_regular_remove_3.cpp deleted file mode 100644 index d62157e2aec..00000000000 --- a/Triangulation_3_copy_tds/test/Triangulation_3/test_regular_remove_3.cpp +++ /dev/null @@ -1,387 +0,0 @@ -// Copyright (c) 1998 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Christophe Delage (Christophe.Delage@sophia.inria.fr) - -#include -#include - -#include -#include -#include -//#include -#include - -#include -#include - -#include -//#include - -typedef CGAL::Exact_predicates_inexact_constructions_kernel FK; -typedef CGAL::Regular_triangulation_euclidean_traits_3 bare_traits; - -int degeneracy_counter = 0; - -// This traits class counts the number of times a power_test has returned 0. -// This gives a rough idea of how degenerate a data set is. -struct traits : public bare_traits -{ - struct Power_test_3 : public bare_traits::Power_test_3 - { - typedef bare_traits::Power_test_3 P3; - Oriented_side operator() (const Weighted_point &p0, - const Weighted_point &p) const - { - Oriented_side result = P3::operator()(p0, p); - if (result == 0) ++degeneracy_counter; - return result; - } - Oriented_side operator() (const Weighted_point &p0, - const Weighted_point &p1, - const Weighted_point &p) const - { - Oriented_side result = P3::operator()(p0, p1, p); - if (result == 0) ++degeneracy_counter; - return result; - } - Oriented_side operator() (const Weighted_point &p0, - const Weighted_point &p1, - const Weighted_point &p2, - const Weighted_point &p) const - { - Oriented_side result = P3::operator()(p0, p1, p2, p); - if (result == 0) ++degeneracy_counter; - return result; - } - Oriented_side operator() (const Weighted_point &p0, - const Weighted_point &p1, - const Weighted_point &p2, - const Weighted_point &p3, - const Weighted_point &p) const - { - Oriented_side result = P3::operator()(p0, p1, p2, p3, p); - if (result == 0) ++degeneracy_counter; - return result; - } - }; - - Power_test_3 power_test_3_object() const - { return Power_test_3(); } -}; - - -// Explicit instantiation of the whole class : -template class CGAL::Regular_triangulation_3; - - -typedef CGAL::Regular_triangulation_3 Cls; - -typedef traits::Bare_point Point; -typedef traits::Weighted_point Weighted_point; - -typedef Cls::Vertex_handle Vertex_handle; - -// We don't want to use compare_xyz because it thinks two weighted points -// located at the same place with different weights are identical. -struct less_xyzw -{ - bool operator() (const Weighted_point &p, - const Weighted_point &q) const - { - if (p.x() < q.x()) return true; if (p.x() > q.x()) return false; - if (p.y() < q.y()) return true; if (p.y() > q.y()) return false; - if (p.z() < q.z()) return true; if (p.z() > q.z()) return false; - if (p.weight() < q.weight()) return true; - return false; - } -}; - -typedef std::set point_set; -typedef point_set::iterator set_iterator; - -// Base class for a weighted point generator. -class point_iterator -{ - Weighted_point _wp; - int _i; -public: - point_iterator (int i = 0) : _i (i) {} - - void operator++ () { --_i; } - const Weighted_point &operator* () const { return _wp; } - bool operator== (const point_iterator &i) const { return _i == i._i; } - bool operator!= (const point_iterator &i) const { return ! (*this == i); } - -protected: - void set_point (int x, int y, int z, int w) - { - _wp = Weighted_point (Point (x, y, z), w); - } -}; - -static boost::minstd_rand randgen; - -// point_iterator_x generates points randomly on a grid (thus making lots of -// degenerate cases), staying in dimension x. -struct point_iterator_0 : public point_iterator -{ - point_iterator_0 () {} - point_iterator_0 (int i) : point_iterator(i + 1) { ++*this; } - - void operator++ () - { - int w = randgen() % 10; - set_point (0, 0, 0, w); - point_iterator::operator++(); - } -}; - -struct point_iterator_1 : public point_iterator -{ - point_iterator_1 () {} - point_iterator_1 (int i) : point_iterator(i + 1) { ++*this; } - - void operator++ () - { - int x = randgen() % 10; - int w = randgen() % 10; - set_point (x, 0, 0, w); - point_iterator::operator++(); - } -}; - -struct point_iterator_2 : public point_iterator -{ - point_iterator_2 () {} - point_iterator_2 (int i) : point_iterator(i + 1) { ++*this; } - - void operator++ () - { - int x = randgen() % 10; - int y = randgen() % 10; - int w = randgen() % 10; - set_point (x, y, 0, w); - point_iterator::operator++(); - } -}; - -struct point_iterator_3 : public point_iterator -{ - point_iterator_3 () {} - point_iterator_3 (int i) : point_iterator(i + 1) { ++*this; } - - void operator++ () - { - int x = randgen() % 10; - int y = randgen() % 10; - int z = randgen() % 10; - int w = randgen() % 10; - set_point (x, y, z, w); - point_iterator::operator++(); - } -}; - -class point_reader -{ - std::istream *in; - Weighted_point wp; - int nb; -public: - point_reader () : in (0), wp(), nb(0) {} - point_reader (std::istream &is) : in(&is) - { - if (*in >> nb) { - ++nb; - ++*this; - } else - nb = 0; - } - point_reader &operator++ () - { - if (nb > 0) { - --nb; - if (nb > 0) *in >> wp; - } - return *this; - } - bool operator== (const point_reader& p) const { return nb == p.nb; } - bool operator!= (const point_reader& p) const { return nb != p.nb; } - const Weighted_point &operator*() const { return wp; } -}; - -// Inserts number points in the triangulation and the multiset, using PI as the -// point generator. -template < class PI > -void insert (Cls &T, point_set &points, int number) -{ - int i = 1; - for (PI pi (number), pend; pi != pend; ++pi, ++i) { - points.insert (*pi); - T.insert (*pi); - std::cout << "\r number of inserted points: " << i << std::flush; - } - std::cout << std::endl; - assert(T.is_valid()); - std::cout << " number of vertices: " << T.number_of_vertices() - << std::endl; - - std::cout << " number of degeneracies: " << degeneracy_counter << std::endl; - degeneracy_counter = 0; -} - -// Removes number points from T, and removes each one from points also. -// Checks that each point of T that is removed exists in points. -void remove (Cls &T, point_set &points, int number) -{ - for (int i = 1; !points.empty(); ++i) - { - number--; - assert(T.number_of_vertices() != 0); - Vertex_handle v = T.finite_vertices_begin(); - set_iterator pos = points.find (v->point()); - assert(pos != points.end()); - T.remove (v); - points.erase (pos); - std::cout << "\r number of removed points: " << i << std::flush; - } - std::cout << std::endl; - - assert(number >= 0); - assert(T.number_of_vertices() == 0); - assert(T.is_valid()); - assert(points.empty()); - std::cout << " number of degeneracies: " << degeneracy_counter << std::endl; - degeneracy_counter = 0; -} - -// Adds p which is supposed to increase the dimension of T from dim to dim+1, -// then removes it. -void dim_jump (Cls &T, const Point &p, int dim) -{ - assert(T.dimension() == dim); - - Vertex_handle v = T.insert (Weighted_point (p, 0)); - assert(T.is_valid()); - assert(v != Vertex_handle()); - assert(T.dimension() == dim + 1); - - T.remove (v); - assert(T.is_valid()); - assert(T.dimension() == dim); -} - - -bool test_case (std::istream &is) -{ - point_reader pi (is), pend; - if (pi == pend) return false; - - point_set points; - Cls T; - int number = 0; - - do { - ++number; - points.insert (*pi); - T.insert (*pi); - } while (++pi != pend); - assert(T.is_valid()); - - for (int i = 0; !points.empty(); ++i) { - assert(T.number_of_vertices() != 0); - Vertex_handle v = T.finite_vertices_begin(); - set_iterator pos = points.find (v->point()); - assert(pos != points.end()); - T.remove (v); - points.erase(pos); - } - assert(T.number_of_vertices() == 0); - assert(points.empty()); - - return true; -} - -int main(int argc, char **argv) -{ - std::cout << " with CGAL::Regular_triangulation_euclidean_traits_3: " - << std::endl; - - // Test various data sets that crashed the code at some point in the past. - // File format is: - // number of points of first data set - // point - // ... - // number of points of second data set - // point - // ... - { - std::ifstream fin ("data/regular_remove_3"); - assert(fin); - std:: cout << " test `data/regular_remove_3'" << std::endl; - while (test_case (fin)) - // semicolon - ; - } - - // Hardcoded seeds so that the test-suite is deterministic. - boost::int32_t seed0 = 42, seed1 = 43, seed2 = 42, seed3 = 42; - - // You can also pass seeds on the command line. - if (argc > 1) std::sscanf (argv[1], "%d", &seed0); - if (argc > 2) std::sscanf (argv[2], "%d", &seed1); - if (argc > 3) std::sscanf (argv[3], "%d", &seed2); - if (argc > 4) std::sscanf (argv[4], "%d", &seed3); - - Cls T; - point_set points; - - degeneracy_counter = 0; - - std::cout << " test dimension 0" << std::endl; - randgen.seed(seed0); - - insert (T, points, 10); - dim_jump (T, Point (0, 0, 1), 0); - remove (T, points, 10); - - std::cout << " test dimension 1" << std::endl; - randgen.seed(seed1); - - insert (T, points, 20); - dim_jump (T, Point (0, 0, 1), 1); - remove (T, points, 20); - - std::cout << " test dimension 2" << std::endl; - randgen.seed(seed2); - - insert (T, points, 100); - dim_jump (T, Point (0, 0, 1), 2); - remove (T, points, 100); - - std::cout << " test dimension 3" << std::endl; - randgen.seed(seed3); - - insert (T, points, 500); - assert(T.dimension() == 3); - remove (T, points, 500); - - std::cout << " quit" << std::endl; - - return 0; -} - diff --git a/Triangulation_3_copy_tds/test/Triangulation_3/test_regular_traits_3.cpp b/Triangulation_3_copy_tds/test/Triangulation_3/test_regular_traits_3.cpp deleted file mode 100644 index ae80fcafce0..00000000000 --- a/Triangulation_3_copy_tds/test/Triangulation_3/test_regular_traits_3.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) 1998 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// $Date$ -// -// -// Author(s) : Mariette Yvinec - -#include -#include -#include - -#include - -//needs exact constructions as well to test the traits class - -typedef CGAL::Exact_predicates_exact_constructions_kernel K; - -// Explicit instantiation of the whole class : -template class CGAL::Regular_triangulation_euclidean_traits_3; - -int main() -{ - typedef CGAL::Regular_triangulation_euclidean_traits_3 Traits; - _test_cls_regular_euclidean_traits_3(Traits() ); -} diff --git a/Triangulation_3_copy_tds/test/Triangulation_3/test_simplex_3.cpp b/Triangulation_3_copy_tds/test/Triangulation_3/test_simplex_3.cpp deleted file mode 100644 index e7128fedcd7..00000000000 --- a/Triangulation_3_copy_tds/test/Triangulation_3/test_simplex_3.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) 1998 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Nico Kruithof - -//#define CGAL_TRIANGULATION_DONT_USE_SHORT_NAMES - -#include - -bool del = false; - -#include -#include - -// Explicit instantiation of the whole class : -template class CGAL::Triangulation_3; - -int main() -{ - typedef CGAL::Triangulation_3 Cls3; - - _test_cls_triangulation_simplex_3( Cls3() ); - - return 0; -} diff --git a/Triangulation_3_copy_tds/test/Triangulation_3/test_static_filters.cpp b/Triangulation_3_copy_tds/test/Triangulation_3/test_static_filters.cpp deleted file mode 100644 index 9ed41961da7..00000000000 --- a/Triangulation_3_copy_tds/test/Triangulation_3/test_static_filters.cpp +++ /dev/null @@ -1,250 +0,0 @@ -#define CGAL_PROFILE -#undef CGAL_NO_STATIC_FILTERS - - -#include -#include -#include -#include -#include -#include -#include - -typedef CGAL::Simple_cartesian Double_kernel; -typedef CGAL::Simple_cartesian > Exact_kernel; -typedef CGAL::Filtered_kernel FK_with_SF; -typedef CGAL::Filtered_kernel FK_without_SF; - -typedef CGAL::Regular_triangulation_euclidean_traits_3 Exact_traits; -typedef CGAL::Regular_triangulation_euclidean_traits_3 FTr_without_SF; -typedef CGAL::Regular_triangulation_euclidean_traits_3 FTr_with_SF; -typedef std::pair NT_pair; - -template < class K1, class K2, class Cmp = CGAL::dont_check_equal > -class Regular_traits_checker : public CGAL::Kernel_checker -{ -public: - - typedef CGAL::Comparison_result Comparison_result; - typedef CGAL::Oriented_side Oriented_side; - - typedef K1 Kernel1; - typedef K2 Kernel2; - typedef Cmp Comparator; - - // Kernel objects are defined as pairs, with primitives run in parallel. -#define CGAL_kc_pair(X) typedef std::pair X; - - CGAL_kc_pair(Weighted_point_3) - -#undef CGAL_kc_pair - -#define CGAL_Kernel_pred(X, Y) \ - typedef CGAL::Primitive_checker X; \ - X Y() const { return X(this->k1.Y(), this->k2.Y(), this->cmp); } - -#define CGAL_Kernel_cons(Y,Z) CGAL_Kernel_pred(Y,Z) - -public: - - CGAL_Kernel_pred(Compare_weighted_squared_radius_3,compare_weighted_squared_radius_3_object) - CGAL_Kernel_pred(Power_test_3,power_test_3_object) -}; - - -typedef Regular_traits_checker< FTr_with_SF, - FTr_without_SF> K3; - -typedef K3::Weighted_point_3 Weighted_point_3; - - -CGAL::Random *r; - -double rand_base() -{ - return r->get_double(0, 1); -} - -// Random double almost in [0;1]. -double my_rand() -{ - // Ensure 53 random bits, not 48. - return rand_base() + rand_base()/1024; -} - -// Random point in unit cube. -Weighted_point_3 my_rand_wp3() -{ - double x = my_rand(), y = my_rand(), z = my_rand(), r=my_rand(); - return Weighted_point_3( FTr_with_SF::Weighted_point_3(FTr_with_SF::Bare_point(x, y, z),r) , FTr_without_SF::Weighted_point_3(FTr_without_SF::Bare_point(x, y, z),r) ); -} - -// Perturbation with given maximum relative epsilon. -void perturb(Weighted_point_3 &p, double rel_eps) -{ - double x = p.first.x()*(1+rand_base()*rel_eps); - double y = p.first.y()*(1+rand_base()*rel_eps); - double z = p.first.z()*(1+rand_base()*rel_eps); - double r= p.first.weight()*(1+rand_base()*rel_eps); - p=Weighted_point_3( FTr_with_SF::Weighted_point_3(FTr_with_SF::Bare_point(x, y, z),r) , FTr_without_SF::Weighted_point_3(FTr_without_SF::Bare_point(x, y, z),r) ); -} - -void toto (int){} - -void test_compare_weighted_squared_radius_3(){ - Weighted_point_3 p=my_rand_wp3(); - Weighted_point_3 q=my_rand_wp3(); - Weighted_point_3 r=my_rand_wp3(); - Weighted_point_3 s=my_rand_wp3(); - double alpha=my_rand(); - - - //test with random points + random alpha - K3().compare_weighted_squared_radius_3_object()(p,q,r,s,NT_pair(alpha,alpha)); - K3().compare_weighted_squared_radius_3_object()(p,q,r, NT_pair(alpha,alpha)); - K3().compare_weighted_squared_radius_3_object()(p,q, NT_pair(alpha,alpha)); - K3().compare_weighted_squared_radius_3_object()(p, NT_pair(alpha,alpha)); - - CGAL::Weighted_converter_3,FTr_with_SF,Exact_traits > convert_to_exact; - Exact_traits::Weighted_point_3 p_e=convert_to_exact(p.first); - Exact_traits::Weighted_point_3 q_e=convert_to_exact(q.first); - Exact_traits::Weighted_point_3 r_e=convert_to_exact(r.first); - Exact_traits::Weighted_point_3 s_e=convert_to_exact(s.first); - - Exact_traits::Compute_squared_radius_smallest_orthogonal_sphere_3 radius=Exact_traits().compute_squared_radius_smallest_orthogonal_sphere_3_object(); - double alpha_pqrs=CGAL::to_double( radius(p_e,q_e,r_e,s_e) ); - double alpha_pqr =CGAL::to_double( radius(p_e,q_e,r_e) ); - double alpha_pq =CGAL::to_double( radius(p_e,q_e) ); - double alpha_p = - p.first.weight(); - - //test with random points + alpha limit - K3().compare_weighted_squared_radius_3_object()(p,q,r,s,NT_pair(alpha_pqrs,alpha_pqrs)); - K3().compare_weighted_squared_radius_3_object()(p,q,r, NT_pair(alpha_pqr,alpha_pqr)); - K3().compare_weighted_squared_radius_3_object()(p,q, NT_pair(alpha_pq,alpha_pq)); - K3().compare_weighted_squared_radius_3_object()(p, NT_pair(alpha_p,alpha_p)); - //test correct result - assert( K3().compare_weighted_squared_radius_3_object()(p,q,r,s,NT_pair(alpha_pqrs-0.1,alpha_pqrs-0.1)) ==CGAL::POSITIVE ); - assert( K3().compare_weighted_squared_radius_3_object()(p,q,r, NT_pair(alpha_pqr-0.1,alpha_pqr-0.1)) ==CGAL::POSITIVE ); - assert( K3().compare_weighted_squared_radius_3_object()(p,q, NT_pair(alpha_pq-0.1,alpha_pq-0.1)) ==CGAL::POSITIVE ); - assert( K3().compare_weighted_squared_radius_3_object()(p, NT_pair(alpha_p-0.1,alpha_p-0.1)) ==CGAL::POSITIVE ); - - // Then with some perturbation on coordinates and weight. - perturb(p, 1.0/(1<<25)/(1<<20)); // 2^-45 - - K3().compare_weighted_squared_radius_3_object()(p,q,r,s,NT_pair(alpha_pqrs,alpha_pqrs)); - K3().compare_weighted_squared_radius_3_object()(p,q,r, NT_pair(alpha_pqr,alpha_pqr)); - K3().compare_weighted_squared_radius_3_object()(p,q, NT_pair(alpha_pq,alpha_pq)); - K3().compare_weighted_squared_radius_3_object()(p, NT_pair(alpha_p,alpha_p)); - -} - -void test_power_test_3(){ - - CGAL::Weighted_converter_3,Exact_traits,FTr_with_SF > convert_to_double; - CGAL::Weighted_converter_3,Exact_traits,FTr_without_SF > convert_to_double_noSF; - CGAL::Weighted_converter_3,FTr_without_SF,Exact_traits > convert_to_exact; - - Weighted_point_3 p=my_rand_wp3(); - Weighted_point_3 q=my_rand_wp3(); - Weighted_point_3 r=my_rand_wp3(); - Weighted_point_3 s=my_rand_wp3(); - Weighted_point_3 query_pt=my_rand_wp3(); - - //test with random points - K3().power_test_3_object()(p,q,r,s,query_pt); - K3().power_test_3_object()(p,q,r,query_pt); - K3().power_test_3_object()(p,q,query_pt); - K3().power_test_3_object()(p,query_pt); - - //test in degenerate case - Exact_traits::Weighted_point_3::Point origin(0,0,0); - Exact_traits::Weighted_point_3 p_e=convert_to_exact(p.second); - Exact_traits::Weighted_point_3 q_e=convert_to_exact(q.second); - Exact_traits::Weighted_point_3 r_e=convert_to_exact(r.second); - Exact_traits::Weighted_point_3 s_e=convert_to_exact(s.second); - - Exact_traits::Weighted_point_3 tmp=Exact_traits::Weighted_point_3( - origin, - CGAL::squared_distance(origin,Exact_traits().construct_weighted_circumcenter_3_object()(p_e,q_e,r_e,s_e))- - Exact_traits().compute_squared_radius_smallest_orthogonal_sphere_3_object()(p_e,q_e,r_e,s_e) - ); - assert(Exact_traits().power_test_3_object()(p_e,q_e,r_e,s_e,tmp)==CGAL::ON_ORIENTED_BOUNDARY); - - Weighted_point_3 ortho_pqrs( convert_to_double(tmp),convert_to_double_noSF(tmp) ); - tmp=Exact_traits::Weighted_point_3( - Exact_traits().construct_weighted_circumcenter_3_object()(p_e,q_e,r_e), - -Exact_traits().compute_squared_radius_smallest_orthogonal_sphere_3_object()(p_e,q_e,r_e) - ); - assert(Exact_traits().power_test_3_object()(p_e,q_e,r_e,tmp)==CGAL::ON_ORIENTED_BOUNDARY); - Weighted_point_3 ortho_pqr( convert_to_double(tmp),convert_to_double_noSF(tmp) ); - tmp=Exact_traits::Weighted_point_3( - Exact_traits().construct_weighted_circumcenter_3_object()(p_e,q_e), - -Exact_traits().compute_squared_radius_smallest_orthogonal_sphere_3_object()(p_e,q_e) - ); - assert(Exact_traits().power_test_3_object()(p_e,q_e,tmp)==CGAL::ON_ORIENTED_BOUNDARY); - Weighted_point_3 ortho_pq( convert_to_double(tmp),convert_to_double_noSF(tmp) ); - - - K3().power_test_3_object()(p,q,r,s,ortho_pqrs); - K3().power_test_3_object()(p,q,r ,ortho_pqr); - K3().power_test_3_object()(p,q ,ortho_pq); - // Then with some perturbation on coordinates and weight. - perturb(p, 1.0/(1<<25)/(1<<20)); // 2^-45 - - K3().power_test_3_object()(p,q,r,s,ortho_pqrs); - K3().power_test_3_object()(p,q,r ,ortho_pqr); - K3().power_test_3_object()(p,q ,ortho_pq); -} - - -int main(int argc, char **argv) -{ - assert(! Exact_traits::Has_filtered_predicates); - assert( FTr_with_SF::Has_filtered_predicates); - assert( FTr_without_SF::Has_filtered_predicates); - - - assert(! FTr_without_SF::Has_static_filters); - assert( FTr_with_SF::Has_static_filters); - - - - int loops = (argc < 2) ? 2000 : std::atoi(argv[1]); - int seed = (argc < 3) ? CGAL::default_random.get_int(0, 1<<30) - : std::atoi(argv[2]); - - std::cout << "Initializing random generator with seed = " << seed - << std::endl - << "#loops = " << loops << " (can be changed on the command line)" - << std::endl; - - CGAL::Random rnd(seed); - r = &rnd; - - std::cout.precision(20); - std::cerr.precision(20); - - std::cout << "ulp(1) = " << CGAL::internal::Static_filter_error::ulp() << std::endl; - - std::cout << "Testing Compare_weighted_squared_radius_3" << std::endl; - for(int i=0; i -#include - -bool del = false; - -#include -#include -#include - -// Explicit instantiation of the whole class : -template class CGAL::Triangulation_3; - -int main() -{ - typedef CGAL::Triangulation_3 Cls3; - - _test_cls_triangulation_3( Cls3() ); - - // Test operator== between triangulations of different Tds types. - - typedef CGAL::Triangulation_3 > > Cls3_2; - - assert(Cls3() == Cls3_2()); - std::cout << "done" << std::endl; - return 0; -} diff --git a/Triangulation_3_copy_tds/test/Triangulation_3/test_triangulation_tds.cpp b/Triangulation_3_copy_tds/test/Triangulation_3/test_triangulation_tds.cpp deleted file mode 100644 index 13cd5d6b8a1..00000000000 --- a/Triangulation_3_copy_tds/test/Triangulation_3/test_triangulation_tds.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) 1998 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Francois Rebufat - -#include - -#include - -typedef CGAL::Triangulation_data_structure_3<> Tds; - -// Explicit instantiation : -template class CGAL::Triangulation_data_structure_3<>; - -int main() -{ - _test_cls_tds_3(Tds()); - return 0; -}
pEpO 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 AIRF3v diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/HD.pdf b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/HD.pdf deleted file mode 100644 index 10283b2cf275d758303ec2e7b42a3cd9bcc65371..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20585 zcmeHv2UHZ$xTj@yU9T$XK0$7Bs9=XXmS)uii$`E0m(T_7C}W(Ns34m zBuW$z13@JJYDQ;t-rTu!@4xT;xBi-1tLUl|_dYwHI&5}bMP)uAei$ix`}>$&QaDr) zinYOzN=pl9qFf!k9HF9M2|_>_?d*l}fC?x(TYI4tQMOn+l&mbNraqXuC)V7KnrDuwmy&bgPI9~)uQ5X zC`?$wf>Z#3^#Xx}3WBXXP_AB35gZ0!G0GF`?O}`Z1aZ^#z}o7gyvzhZ?4bf`F5qwq zU{57KFBSd6&Jw@$G1jrcplrRMLbw?aq#()y3RqV!a8yqyZmAB7zQKr_=9i^|3gCc* z9zy8}70^K2c|y%daX27IEui2C-XK&$zX1vk`)v%NU&r`1go3q~wKLY?`&i#l(L#Ay z+krJuAzX(afe`z7fZs4870}Vuf(psXewzu0;4jb$AjC*<-4H*3fkXFutvIRp&$YPM zZ?C;>&3584)mP&rR3V1%{<`A8flMk=6+LOVEmLE$1G z_UF-Fp1LRx1+0r3))hx5anf&WCZMQ*{DsH9Gog@}gqX0b>^C+!7(Vy_9Fqrm1qIjv z;DvWE3Mc@_NRN^qJ#vhkjQlvoG0IbHr%zE)ojMC;re%Zii;0Tx3kyri>nlsjXv+!< ztJ&+ z2M8z$PcRF~6P?tvCT4M`5)O^aAz?jV{g@ij`-x4&#v|+q>8aCaXlU6vIJvlaU~o|} zaS2HUMI~hwRW)^eq=BK4v5Bdz9m?Lp5smTm^7ird^A8BWd?n)Qwd;}b35iL`w^CBm za`W;F3X6(MN^5HC>KpDh-fL=o^7L6-dq-ziU;n`1(CgumH*cqBX6NP?-YqVDUR_(? z__FzRYa53b9sv0TE%5Ij;zbGKg-<{LAt1)#g@^BpL!6R;kXeZ6guEWHwfjjH;ZPE) z^Km)VkB_j5AU;vsc=VE#^}hw zG?a|OG#Whkp<%FgB8eO6d!&)oX%eyNrasn6h}8{&t?jx4;F0|SFq7y!(6X@9e*oa! zJ^-Q-3j%S$!n?s8%}R)olHi`fqJ4qH6GEP%_HY zsCVO=3R7(7P>ZDB!%w>vc+D5)AIq=K{8C#I-+g;J+KayOH4_NUyqbC08yx^5mCq&r zWy?72#42aw>iM1)HoHe}{SE-fs7rNQx7=oLZIswVM)O|d@IS$w7dIpBtxQm|E}KEF zrkR}9dxc8x-2Z-cz$2D{6x6lzmh$1`l=8jsg+5@Wcq4a4?ZI_!h9Q`P4{4GZVfMrZUVXoe&#Q1E{mPXWAn_imZj`~0 z!v!1-DE|{v{uNX+p07`B`zBHM)0cpKQyWmH$>^U^em zJ$)7RCR%4B_)d~%UniO{%O=i|m^V<1p-Z8(J{+qu?WB*ZxC6l)$+F&uNp ztV$vAcQU3ldYMl0e5q9cz#zEr_hm_^LfMQv%Hxuf?gTJ@d(d-rA263%LV z{@3gvI`LF`O2GfByOaG$tSnkI+4wQtZN}8?m=}l+Gg|_v1TmTw%H*!8+Ik@?O)JOr zJkfl6rEJj}{6t0_H+wUAjfAW{wFl{CPU#aKIt{y<(Fu}d2aS6{uBP<`LGd{Tsd4N&i z(IM41>8e6Qe5SnY+FCb)!%R(csJr?$UL%1ZvAEowc_-tZMk$ek+|rRr1)pqQ!do;# z32S8D+tDg;OamJT2EqRZ`cRX<=q4?EI$;vBGYt63Ej*O;KJzB)#@Vwqu}t;P7iqRs zv@5=T>CqnKtLqz6t~Jkhazhdi3la&t53F~7T-M_radhgKDStSlE2@oAzeCwYfyvNT z@{E^^R5z`I=0@_o0+m=Po?~t#0HXZst5J{^vraDUNJa1r%8L;dla<(_yyICA#xG~B2Wa2HDip0+J(@XU@Lt~? zxMYyPvZ|$fqT9j4{;o@|j31TBJ6&>bzx0`$yiCZAgAbo`oM9mHE$uimxl1Sr|-yr&D4P_N1A<*Lu12r zdOq?mQu;SVNxU48>g>_<+HfbKglXh?7hNq7PX`%9Rg4OVrty zS7H_y85Y|?7Xc^Ou+fX?mKWnj5~{Tfru8Jc84q2~avMA%H<(p`pbRZ;JvI+Xn$M{k z#MZsvi+?*~xOAVI^EGkQCy9!qA<{Kk)>Tg^P5IOj?!zBoJv2}FPwK^VVz(C0um^51 zs9>#Ho6O9b13MIl`tqwYmjc|=nG|{yEEN!s-DPTT-Az+9k2-ZTGG0b}TfbT1K6}&M zqOD-dt9N?M`7>rTu7zm4Q+m{~H+`|3$bTm1%VJ;C138nb0R!0{w@lmM=NwX2;+-=s z19k@7%#v8|QUOpmy=eU(VJz+hEqY2CjyTqv0ku`YC63U7pyS(i{VD{?YWb=&mgVmO zrt6hf`k&K3HwWL~Ev~Zrtj6jN&8HoUVI2gU({#JsAzd2LqF0`lrr$RNonQnXU~DU7q2LfUi|>jmCNuxRgu*0<`mm+e8e~)a*2;ANn%+KDq8VUpD`)m zRM&K^%P4t_>4PIrY-()JMtZ}%3komuQR$gNL7h=7uc4+Scs-%(IAI1Vm(6w?lAbqr@uOUDH|c8FOrhtZC&~3AJqzwWUtdgOX6arZ^;h&{V)s z)D!YXFSzoQ_1ZErq`mO~Fl?>nud2Mtpv@bwsLC%D7iYflwW~5{+4ve)VIKCT*_koC zXObx(FQ4Od(R)zjcSo-lkImZq4C{3dW3sh~<*oUq3b|*JF4M*FR<-H@`S*{d?u-j< zwD;Ygh=iM+ewp?3&Q@lplD}nE`Q+k@7Kg@QzTmk8`a+R}cITZ7uMLX)`X&%3_D{OH z$@!(CIO#tR1bQ#)+-?k%+T}k0QU~=kBODj5sgYf0bLou>CH_pcohMq62QE`64yOOR z+rVk>4sh4y>I(Us%f+{eVaD#SR>)&6>W;_h8Tp*;Ra4RtypkIqDG_4I&6SseH*Tx! zd!ab*>hUn$z#xB6V>h42U>jS+Zb^?D4sKhz)mjv0Lb1mD_q{P6`d zPUR_lN2hk@0GOh$ESeFw=|cBzbsqpSYy<+X;UymzzrJP)Dz;cUafE-t-`J}M2m+?O zRxIn41av(Y8RYIPKkxY5<-w}DbgdvG8o#)c^OaFmuhNSiuKmt|;CD>E2f!t>-Jf1~ z2jAsR`Kx@<&N~3k?X>KyPQLx=#qy5QX-Jn`jW^Ra@%RBSnS20{{`|HPz}3iTaxAM@ zo-^f(7+2&Gd&d+&j%Tzs_!iBq2X9>_b>rRS(`;uWb>m(W*feU0+Fghyt(h~X3?o@l zi+aZ#+|*h}H5G1hsyng00DXQmHqcPhJ}f;1J)M1}rV%cfAL0%2Ju^s1`&fxaLN=ax>r`Xk1xX;Jawun5H& zU+9|d-4{F#XBOy@+9F+<=uo}a(D0#>7tM(!JFRu}t_%{T@s<7zDwupC_^Ty^QXYe}*XcvY)U--o|V8mu#Ry`@X~w5En+lM0%7WPCAvou$6z zEzto`9J7D!0C-<=i8jj7=z`bjn;=K9`%r7DFdP6RVtb0gtHcKYO6|uNizKR$nIAhB z9{`u>_H*U7AO}EAWm_ch=e2Wu7g^m=f@!0Me)$YTjQ1Ca=V#qt4XrAbl=9pjHG*EK zHEqzj_hh=VSG5}<$Twi`aE<)k=5I(VC==%fp#jwezSNqd*h z)if@?uU|>BLmaJ@#iPXG z`Zj4suyWyMe5qNa=Dk^)iZeZ!o4K+nFg&e+;3mxd8<`IRY45)aj0}CX3B(Mg&?Km& zf9}aC4_prFP!?IVpo*JiJOC`~)%_G8V*!I4EIN2R&k84$?)lz`pY!Y>L_%V;DQ2BY zD&>^Z(M>u0=SN?PHZuaOA2PG_hCMR}hYfEvhJCjzKm3w9?L0uO9RPeQZDT&e?Ggt- z%Z-?vvU>I9*@3fmO#UNpCH5B)pc%Dgs<0>xEzqgiZJD|R+C2lBe^&)lj!{;r#FAaT zK-hJ1IZWcEu;2R1P?nZd)MOjA(WujjVCkqJS=YS`-A(S53!n>yTkl`p>womjEAZ4O zcR~5~m2rxX$Z9B=_nwGpV)P9bVaW*PGbrm=m7MHjL@%{39{|T6Zx21Iou!sDZC%am z`{3ko)|7+wY_so$jrJCzdT2rtCL+Rl^r3RU;ag{VLuYIliL}9>3`w!AfPN|0s7GWh z;@n{f@DyYLV{l0eL7ve6DGcD|cFe{ZX&h7F;sBhnQhx+C=OqKH@?VkjP+)A&=OgQo ztD$Nu@+$_YT8aJo3RNVnX-@k1v+K}VJA<1%8x^8&#u8@NRpcJO4{Ev9U-+c8oPru* zrgXuBy96)0oJN70EZ^?9A4_s|ZnTr|q{9WO^h8!@TJy0Sx{R6__5?}O@J>S1==MCHKg*r3v`z@Sm-;Sn)g@s2jM^TLin z;%Pb`|K75dm+o=t`qA?-rcRv)fK>?`6bHK>#Nb~D%Ju$;10rCRPebq{GyyxQP7>WL z&G47*p*=;eN$gaHwyy6%6#jBl>7L1b_5Jn>&&zLW+m1Nz&C@gWW4F5Ho%f7ZD{nkI z)i$FXcZ)rnMHdee`nYG8AmOVKrwb>rNl&Y3ztQ}`;=wbkyBDJjr70qat1Aec1u@-G zeb*bZFm>d5h8^7|*Z0klq2dLFB^?EYDWI2-Tp|drZRr%a6jIkfF!@1#&~pQeZiIlI zp*emeS1zvZG^iN38gZO3^S!PTY>8+jWC!kH{HcFwWmdEJJO`n z23lGN-`cs^aR4lPuNd*wpP6@wr{K|k97CMhK6IO94wLw*EQi2=n`A7vssfu|)7sgj z3OoWlTGU4(9E-F*H8pLA_YZH=_DWp?-ANp)>f#x|?j*l>(%%s`eRLctG%WWqqeWN# zqv29UQD?DL+oiP{O`(3YZr%fi2Acc1;;6`yWXY~PQ$~Q2`@UeUkfr>^Y=T68oe<&|!t%2BXqc`5 zMhzD$C#LJN6FjCisIOu<$DQ|_5S(wOqLawU1|!a&CaPea8uG$+8>@6|Bgr1dyyP*! zOO#Rp^{Wc9YRm(5$HYUPVrGC z>baeYROf0us>DuZP6+yy{J1u!@z9{nc=QX$FpKB&sZU8Jz{c16#`?~zx@(Q=-735_ z9l~gqcJob&Iq9{BT7pch?z$3NXoh>mvlmG(s6YvIXiBTb)NI8vPD4K}j$GaPsNXTm zJzuJRNdbA;TlB7w#Uu7BHAP_*x&%A^m@jA-WKh@PfSK21Rv z6+vyo1}fSR1JNybal_~N(T4{>P*ig;-^$h=&zyeCmVI^Nr?@fl_I?jxie3N2OR$^V zAF-TU!KprAG_3hYb_HbnKiy^^-ORu3c_NOw}giboa;N=04KAzz$HqaJccZyc=$WU|=Ou1s=L zMGafl<6ZPF#p_ecBs5Ij(KVAE^i6PQ>!+k&$>h~(_1!mk-@t##dITP)B&1%? zIcM&Mcbiq{H#HV8nuvb^H9^?VZ&;zgr zA%0ir-mD*ey0>NOtj`91<86ODAUfiKiw=k`@5Db*a@Zm#g&0|Xmk)4eydtr zuw;ha3{Cm)?4o{o29L9dlHKNffr+rE$+UWsUBLwyLE|iKl2!UpfEuE_C5adBqS~1L zlg&~M4xvTF5ux=0>st!5`cGyJ;FmU_m)1iX7}IG>uXam|I^w@vvKT3b1oVd^@ZAQQ zOUVbO2Jl3e#E@nsp65<{$b&PYJwb-z$4K|40SU0wLi=b(ysbRglQhj&kTq4)+s~L` zz%*J!iz7`7kn)CQqD3@0La5VHx>a>xZPNV!U#MR4bljUfpBbu0G)?IPXGdUC7m#O% zsU9)Zxa)RuI`@f8*=IW}X$cX;goa@5$Am_&i)@y@++yp;W4}n|ke25*GSgQOx1E42 z3QpWk%O?(=qRF%%Qu66~=C%~hKm@T}vk9hMT)zC(X}=bE05n+b$oP8UeDHJBu*rlK zUGLROrumJ@>vCFOcX{Rz;hO;!T|tA%utdnNR#!FCIacES7)#ed6YZUwDda)_ zB1I1=U;2UURu_pBv({MlWBaM&K-6k6P5&2_E?H+WSFAr%lnFf zLmm$x0%Zd?IAu4~Ec1;DF7RLHK_*b2las;7v-9F**9<)8kWEUDN0#yN;^o%Z!ytaoCh2 zsF>#Sh%(a7$-(SzrwKda4dA1*`)j!HJk`?swKym$06BoMu3riE3O_-MBX&NvAK;9% zmPXVI#ZUp4KkFq-B*jpl%;XNaQrmsLyIZ1%8qz?-9TGLdk!{~u;L{Gi5;LH$sa#CE z!#X>C6?2Dm%JzZa5hiH^G?O$bn`d8{>fTk;>=Q;keWmK-7!|mwVd;4(tB9)$gTX7e z_IoVm+*-(TVwFm?jW)GE=QgOE&AEQ&00^ac*<7lF^TlGR7PjCT+!W*9@s!cc*C@7Z zM7AQEk@W(}T^`rHgDqoj6pv?>_!U*HkB@A7IKwoW{G!zr+zPr_GX^hSmCUzJOgq&CIDES z3rMmoU#8_7ie5rJjg??VS!OA`bAKt9$tz*DnvJSj|FnUWk%j}NCy-^F4-hZ8m)1jG znaC{J#n&dQr=mdBWT>8MS=*-*kinKuxDgO%S;9N8G!S7*jvy-S8f2-5o`vWT})!|=v%AlHBW zd7}+oe*9?znl?2Ap$=Jzv{3g+*JvfOqB9+=EExu{OxV|%{WB(St-O`FL_S`jnz>iF zzQ?q10Far3+ZZpx{<10KPH67*Jjr^yF;l$|y;V5`Y9Ya5pV()E+`*i1wcRwyn6{K|C=m`= zsys7RX+mTyP>BB z)Gz^CpuXmAd{-~t93Ov&^6a!mw}2ZN|` zSBZ06z{4CtOXK=X%|k&KcY=2oo?~CjIxK!XKTfM)z&^KkiSP|qZk_O7jg?5RhXh_B zfXv+-%bCi=BkwPqQn6IgULDXq{?3kol6j2u9*VV^Nf+a%0pfvr2yQL?4T*sT-WO(BSyvoLfK6@WIl799^*Imo2 zpQIVlp~kd+!KRmK-Cz->D(wMP@jF9)m?S0!$12)t4a1oPcx?PJo-u@1i6c1@lR;ZM zod9Y@3NEBstk?{y*P3SjT`B7qpHhsEps|s1FD9+xX$GrS-zO=ZLZ5=Qw_^Q*onBT_# z5&ywXbcQ1I3*&y#Cx$ib6HA7x3Jsm3e6!)3@!P>Q4<~z8Asz`AKoUTI<%J^uo#y8> zSDEe$N%@d=`R$tMe}44Qh$pjRb@3zfPF0QOM1fv7ec)Ry4z$LM#>1>jS3q8>|I56@ zdT))qxty&$O0*0(*5@}K{s9u5*HIT z5I&ake_8$gc>sxz8|TM>qAxiTnBUMLc{BDQzVl%>cjxHfk%haia5?X^!rW!dI_l zO_I1ho);drabF{|X$w^5W4ry>dnC$w)r{Sr_oqD|nAqUMtEV$4z70<$c)+vk5*Mf2 zX0G>4Gs%);CavZ^G89TR#ifV9Qze>?a@ToApi7{H&PP6V*Q=Ti;jLF3^E9NtKwCMb zk6%|*$y1(w4D+I>9+8sifr+Iq#N_b~tTn!OlJw_!b*(Vr4qREKTNW)*8ol9&H<4|h zGtp#4?x!83tooszz_DEQSXnx3B7A@%Sktyrf$~=FJF%wO$wrIhrN?#|O#+vQJ>SbH zyQjY{T9i~uj=_uU;%lyc(D_^fLc_W3HT&7H!X>A+A$sBsJn{^$xt;|~MY$t-Rnc`Ht~ql$Wyrqq1*EHat1MHYj64BFg%_)OD0e=OX*347 z+RPjP3@Evq<`t}^Jh|#Fpoh+#3I<_6kNscXkz&rv&ii`aaaEBWw$Qa0ngK3T+#p-gnsPx>2kx^IcE+vHN;z(DxSuRMQ*4vZJ5z!Pi1~cSu-LWY!u`w7JWpuQynj;U9HY=<3ar*$!i*tyhT3Z1 zN>q##^?Slh*q-dF3T4VYn4By!ou5ufBXS*m-VZM#NRb`vk>|s_d9M44E{-t;?!g*o z(y;o$QkkTJL`#7NO{h*NEE%5<3Q%d)WtOzoEY&A0v0XJ}gJ=o@gL{PfDQoBP)ANt* z4!Jz}gxPJED8GG|Eza<=LF%WYv|X9b^W_%L+l0wc-Ov?NHi%sUM_F@!#MYrD^q|IB z!Yb-_nKYjgB`>;nZ8}d_c(I@Ow^@%pAxlIr&BANhN^bw1Bfmli#Nq5 zRCbR}RN^AOw2@7#h=#LQocRcelnS9!)EK8Leu%N%RrR+g$ zBhs_BxLy&-1$pjTQ3)GuYiP2lydNeh_+F*B%%|Tj@?-tcGjKZPyZ5v@#=;~^-pg-P z676U-_s&0^@gl6If8N`?PdvO$Zy$QwFn)%>yP`NoOZv?(1f5E!`|^mhLN6F8?sgQyP^Fvd5Av?Wc7~ zhHCpm16K3hfN5P8dGhc~eQ%#c{!#e;u|@yZg<`$EfYl&(vvp8U{s|EYWmIN&&hA|- zySx?TJ1^INDVVewxuNLL?in8z8g`#f|qR=n(|V^Kv6Bl-1Vms(!WgGVs_ z`Ns?epO+0ibEi${NXoA_=5XRwkCDypkp84wsL4v%?_Xx(yA176*50sPEom+c`FB>{$Q^?$_Y3vh_zP@kgY8!iuJ~*bh z;>HnQypLu9ZK;e!_Ptg3b_7qi+J?5b!4Hl5rE^}Jeshlbbapo*t6sXv&ljpXSUZm< zz-@|6M9;OWKjejj``J{6haBQ0K~~~!ys4EwUC-a6XKb|U((^!_CMH;n=w4aprqIHo zsbu<|e}x=@Bgg(b%q=Hq7%>svE7hrujn=rYSvk~AuaqalFN!w>)mTj^wr-#EDT~?Q zeJ`WBJmx^}nOXT4J^}I+#ZzTr|~#wvW4^}{o_VVV64Y;t8; zPpJ61S<7kHgI`a8kr=N6Xm0*&i_h+bAq(0&zD zS2c-!sJKjE=;+SFjR6A&`w`c=djmPXO2SaRd-R zEH6U~Wy$3D1|QVwa@MEJ>qPw*S3#-Q6>h)TH7xvI`77`X8Jkz6KSgZqQZe z4PI;vjW`>kJrkxXqfA7s?HlCu%E=IC@c-%J7{IpRslM*>qlG;|QKKz<%UgSxIsK+B z_)!|-2_HZ002dzfeF^a7xi_q+;&lRe=HXQ{$e9s;s`~YW$lZ!bwun|CvC4ilkYYJ8 z%bC^WycqWhGr#BbytX0YGYrupJ<|Jl8aB7w*Y%YC$B(QZv(i++e8h9v*H7%x8W!)l ztG=lFi8r+YyS~$^?Cx;@ylg_Qte0obodE4zDI1T(!#Op*?oDzB<~#vC@GP2pdU)C_ z{Qj1|%wy_d3}lZX1~cnjos#&a=W8z@wu|Q)`_)E5x51S?UYTH>xxxJ_*Pc^hIR!y* zM~Or9ZSd$w?@hCfyuZZ81~U3{4Qi5S3U6)(yZhd3mx<^b`O<K3Xw}@v(D0W9FwP+vOAW&J02L*rGDL2 zztq?`RwVl8gQ6hKR9T zb?*4*^pvT;9cC=isYJ&@eIJH|xvz?@ZSiYiuETgFF3q8`PQE(;*0v6S*vVZU>vDAM z=v9q(fDA-je~X^>I&;pguRBt9Un*5h+hZTzt8ALhPc9ft%&~YB{`iBCd1YmD#gQ2v z`8{`asF&=K10c?{UvBc&0iaxuHIkXSac%z7_A}Zl(bfCdxPgS07-zxCh&r3Ux&SvI!$LWggkDj0=fT6^n#c<_%W zq%c6wNUo-yY3tJ;RCD2%dvqQ>6{!*x7iMs+W4%mx>BMtqn-t!YyB6dEUkq~&0NK-4 zn{zF#nN6~}E8yWgvcQxM$XY(J#uUXC;bidZnc#OvEDWsu)LYHSCH>~3@}%ECk=TkD zqlL9k8kQo)yG@{k{zMDJ4o6RN4x*x)KJ4 zDSx~vafe&LpA4f)8P4kBCO4w{d>}ko4p~N>eyh6O-K|f>`~Jh;8)D)HQ{-L8-e$a@ z*f9_epzXimTXQc*Nq@gDeBU2D_c+DYva7}PMmM-es%4h|l!@!bO%y2oEvqr}+>!$T zEq?$=e>ea>ov_;Hh*{y1TgaH)#|K6DX|ES!SJ7%qx)8y*1!4p-!!C#LE8~`VkUIp@Gb?r~jQS0oeQ*14Or#VC74}j0G;Gd?y zk^RL$E@|&s7f;rgM5eWuAHje20uT92JN|^rY5Di1!Mr;+5)I^j0{5r+`NKz$`$n6m zxk`h7L_P24=`DzBN_Ovj;MW5`zx@QT%FpxvyOPbkXMR)$3Zp{dM*Yv3p8=i=r9Cij8*xj4Ie zO8Uug9(IugpK-+koY2E2UQRNc##*{iFD%yC3GD?H=9l0X;u8`%3$^#Kc0u`KJ)EFI z{Gy!TkREpSk_a%#(JupnZ!(;YUS4jJ0s_9izWlx-{8$eM0U-$q2?0T20byZ2umzu| zzpIzEAD^oyD>&aFAZX)XySaMuAHu|Mi**q|8w&{W3krOnND)NG1MTL8#=1gr6I{<`0OO$VsLwV5tO))#P^xpet__&slWuLEy_cNQ$<%3s^WONt0f3Q3rP_<^kyz=*UW>^m-NM2cU zuEXR?TGkF|TPJgFX@TE2kQTr#^$(c-M{(EE`g81ETyRWj?WUzAsfe}pb^#MPsVV+N zlK%&(WM}&;m~P%4&WBuWXDfhmM&Tgx1PLVs!f9tKX^-`Au?Bh4+Re=wZEKBVRRNHp zIAx{5N-wmRGfMVQX5^i{etB?4<77b6+1k}XhSQG^Or~V*?d-(~(nVE~ALZtWBMFWG z&S=?R9u9j7{5IMjkms-nluD3N0>8?Qjc(7pKPliy{^NEg#r- zvE=$AspJL|gyHxfTymTQa4AaS1Vurxe^__e8SBCIJBa{$A#rpA z%fC~E``0vQejX@$QbDMYFey&s{Bl7>;cyW+)E@f1Ohf`qX@Rq(LSjgwQ8I=wL!eifQy>LK6^lsA3O@-E~6}5EV5bAPQ#7@UtGn)gVqM+c5B~Cf{(thn&voX^lbLhw`<`>nb-mxOJ2^EeI;M0p zcozJ)8~_k&kO4B8Od$glj7-A-I+tt>3?pM)vOP}b;$*fznd^^n{mITkvTF?HD#To4 z$aoBf$B@R!pSfiZqybD_6P|leKZJk-0ulG}L6IBvZuwZ?63#bdnmI$nMo zuY8Oze9WzU!Cm+QU-SZB`X^rVr@u8;e)M1aQD}{?z6k5T#Av_7Z2lr{{vvMqlGgqu zZTFY#yz7!q!Qgq}?*>_*chQ2I1`DM|WFDov5Suyfu{lu5`SH5U|{Gz$>W$T?U z)&czg9K6rg4X_U0bU2>6v~)owzMyhhWo>C)Wd&Zg7EhLE;K|j?SJbU2uU)9D!~H5M zS1l~Bj8`sOT3fo>p9%#1-^2g6mw?T*YPnjYZD`!ow0XfF7j zt9$Rh{raBXzWxIP2M--S^3Bn2zx&=WICSjziIYE^I(_Esx$_tPV;mkC9UGsxc*b!#?4!|@7%q2|H01>A3grXJoV&2;L{hsPWZMaWThzzmny_Ns0zg&sTnEh z;u!u*04`Ij`Zw8miuH8LjoucTM|RtLn#4P`o#)A3Yc|MI+x`9&MfyuBE^T*%a*kAl zS8Q(cRy^n)_8iEt_lV;12U+8n>^vlD?qqglDnsU+z*Vq(w#MtS_Jo&8#>kjQSi;eV zXKp9j^E0|rHjikjouP`xe)*W)HJ!_J@UjgN&i$9${F>6<<0A*I7Vy8`>&+XfXe#Y? z#M>`jJ~0^XRP^`XmumWw?fr6(>hJez(_^IAAoi+7nzY?LzRG-RP?EF*&)Cj+qU%j= z4VwS3VME!B)SVkrIAwXadXSxd1*eFXZ=1BuUXiZpe~l+L+j|FA8!h4rszcDyJE|7X z0lD4kZ0yComhy3$y-(T(ZcW+x+hZDT_ZkrX?5O*gB5q)>j$oopnJZH^YtshvFd6Q? z*brajJ$Q*lQu9a-spQB?hO!2PMKVyY`A_^SJ z+4Yxf{AEm%V`0iYm#E8S{QRi@_nEt=SDGly^l#to^2QeFZ!K_Ktv4|+$!P15_-N3~i0yQReZ5gpm zz-wl+7YZUTq3)MVV_HSsrN`>La2~wx);^YoQLS!R#7q>lFqoOxWFf~x2ZV44Y_e~+ zPh}+tA>KLwfc=1B*zuYk;Uqp27|EJf*eG`W$27uW{+gEYp6i}tUOcxZ3#b-Ot6q)S z=ZKiM?MrjTHOB2jlbkAOMSIYen zkh@F#kQlLnO)jc)?MEK^5{cVidgZ_AD@ZUY;SPSyIqx*vHC zlQFBW5f!lOQJu6uFm?**UHGkWr30ZaZOEx$e&pE3a1{u3def%msbq6e&jeS&F8xSN z{>50yigmamV}3UNbbt}BH38=_KYzSU{@pG3$`mu8|@d1zG%zq;yaJ-tex0tqt&`;7t5p8p47iy(KogG;k2 ziuYbr{nN3F>@)d|5o^Q8 z`b}KOzm0Q}US9upUCL#d&iEB+=;EA1(@(nW@;0|Gfm^@UO|lXV9#+~jD z%LAhDd(H+G%8wS)YPzo!1*B$4nnfh7LS0{H-?2V-$_qc--B*RvD+Nty(vX80l z9vXudkfp~i7*hD&rS8vz4k9w8#_Q8W7eJ-h9~5wWKLI3PY?#b8CIdQxj8@AKTm_L(lsGJT0oIY3DL*tFA?FXJe zbWbuO+J-`P$O0USXtoJa=^#%Nfb@T0dB{a}ub-=O3wwH^&uk*pcX-Q%rO8QHNJ_J^ zo)iZGZ_89)UOunq3V1t@ZE<2I2w;xrzn!UEal`sc`L5>%_}6KhXYSI$`j0bmc0+)V z@%*|fOkZ2Xe*3Dd(r&69>nD5YPtmnSgQ)aJu z>?Dh*bgvSvjc>ih+%S>SeqDrOhTgG|b_#QB(>(JB)elFGHw0Jrxa}#2gnWlPK12^S z_E3;_oZ(iy7hYExD%o^=E9y`83*!h*?Ib2amGdG^|=oR#)t^KSeaU zasE;MeRz1bir{u03M=m8iK!$5_^6hCBElWGN04y+r zs4<;l1Bl=XIZ~c2rpqo>-EY%1P`>=5d^iA3Q@8R~lN-}RRm1WF|88a&feut8g18PR z{HjYA?MhcOj}9T;xl`2a0*D?mc*jOefZS*!g`}_diak!xwx|UBacyvT&x5Gdh462q z;ux1=LF4XWIzWJ5Hct22_^L!8**NL{wjZ7Odpb=g&wCLhC1&q zJC;rg?iT$hm8%{0U_YPwAp`W%gEsuVsk;JRk{m@UD5(@?SK#1(tAJ~(YW)H#vPG4j zQW)X-&D7`=m~BuYpRPgphVczP>;0G9xKVub2RiJ}{d5Hw9s7knadaT1o{lR4-oXv1 z!#2qA!pDZeOMOX<{lLL3W5CPr^oGP}4QpLpH}4wo@15je42!xFxnO%TTK5!Qy^6{= zLekp+Ta@c(2vr!+`IfAYDnzVz=#~R)`Mji1h%SPHL?N7fS1mVIKc4{2{doix1o}6 zqVnd*(Rn6xk5+TY0N=}pn1%%q;pFz#fu7^PPqfxW4=(Eioh(qO!7J3{m&Ah}ho71%?+xkz(0O>|LLtr8f<2s?TVzE3eot{VgG;MH004tb&^Ie#f03eC%5i(U zS$~h~4g~GKiR4<)N>kKF0dhN+@0$I(|;Kv|G zCTbo(<={w2HJ-)gBGN)U@OmhXB3DNX;xfXKZK$eCAL%Ba#}R@4W~j0puIg>}(BjG; zwr>N$U;})>4=vV{dK2+1%bX#3HTg19MA%0Iu!EW6qKka~Jo3I+ktq+4$AcCrw~f8f zZ4-lGqJkVgT4W;iK4+)t?S@QS+Ut>d0#d384is(JD}dZ_$jJ<*GU08WvlwC|%Sc-0 z=oWgPO99}>%bs~6($DYHg%lcsZ;UnBm54%x1h~)opA>kwD#2f$EyXIJK+H8CCshO6 z3h#4gDB&d+BgzPp=G1hFR8(gW06rL;WI`4b=$|^+_B4fW!4Ho4w6`p~+t_fq!SSoh z4!#!q(gR5)CY1Ix`&wy}P#0BX@yHb*3709p#O|!kr7Ne6(u%+p(Il*Nb+Bn_4a46qH9b)@p(<6-DhoK&uF^TCjpo}{_DeSu=H zNdIEFl27wOzaQUa&;xm4=mK3BEJ3~)DJ}xYMLv&bC{mb`mYUHS802q;Bc>;t=|@wtA{z?GrdrhYm-f*}iLc>wy4Oq`Nf{;eHAw3a62-^5k(Qv{FyX zR2_hZ0f8Kjmv9C3#YN_gQ=YWoD@cwZcGpw>ZYA_2X0xjbPBF3<0Fgyz*k3nSVTjEz z9|U<|h|;;53&)!i8Ql!O1&y z^L41%+c!`LdW+C`I>h<#(H8{ZAwLrT)Ft1H&KK>tUdBCem&!4M3v(b}0`k{EK?aD{ z1yR!>FSByHZm*+x+qo@SAC>4(s5DFjSr(BpbVonVwBuNIU1>zr%+L}IF(nx~qyrrR zh%bTybdW#i||Ai0a((J~soZS617#hjU6X3g!VWINx52!$nJcLRMh>~wQvBmjdy>q7eC%1m;ki7*LTs{J{G6Vn=)`k97cj|=+c=D@=GU8dz6MNM7<<-wRNTYHs zk)B4wf}c+xnu24oGvAFCKo zJG##Mb3rmG6m_g)gft-67oYdQt9p&v_ro4h1RQN}|NX7D@)#a}<6MLio{TYtt~ z?&@IyPPQcF=&EK7dT8{*lXJF zr#l;E&UX#hNJ_aEycUY!tok)u1oVO8iGg6$eUg|$kxb9@+=(%tB3z9{w+!lOfcp}UIJxPIv ze8{c<^lqwAdnM=VNhEzyj!+fEt7PP1U5abAjygzvWkqA+`JCrW(pwi9=K9SExZx;e z`aQ@ab_ELHIHEE^q(nC1-4*4j@)CXxcV{WAf9qZzMBe!~=qLaKjcfjSD}NWkb(lnj za?lAwzUKLEeQoP*3H*MTvBDd^^;z=tj$M|DH(l)65~a`R)NMG3L@ihk&l)UhttwgZ z&gI#X@^o{o*Z}wEUcB4IWt(w#ImlH)E&a{87UpmL3CSj;#0=RI;KeDsz_r&Nsm_KH zqX|ZEmgTU^jT4W@BE8F5vr6HFRg`YeU0#+z@@c%WWi0s)@9}$w`BN@riK5{I{0#^T z0PpJ!d-%sVjN}?fRRn3CG4t3HTgiS<|kHg=h@ctgRK+}M;eBSbPpsy0jz{Bsi7c~g; z1T7F>35v~i+n%ZuzOrS?r=c0x@gy^n4+JXf{C;l#=?Djrn7ra~I9vda{zLZK#im|_ zUZ*M+)}cj)`(F*Cspp679OgWp!|J_t??ByoC*t_koSqC3oL!0R_R0trI)s@<12DAQ zM9MbY{n-fM@`z>U12Woje#^ZPr*@92gClTQD5vaN2}(}v3p+F)dW)7}q;g9@vB_}| znys)PAs<}Eywhe1;3w6PHvoDX#sgwV*#!DX4M$so8rl;syaau4YvvC<_pPlh4n1zn z8FhR7S>$lRp8e|e={Vg4U+~>F6M*T#4aJadBIH0GxZ7z~VCFp(l~kY$m84v` z=lpYEhQKLScTHg?6{(P@?Y5Do$-}Q*e(H0PTU@TIw@X&&!f-hA9{JNFYnN4px=6H% zhw@LLPF|#Cn6*qIRblQ+M5J>_q=)!hbq{0HBphylLI~Kx4Eqda9sg^@I0Uvr)r zVqOIWngddSvDG2AnFXu6ylxa2qo!&|gX#oIM~ut>4=CU#FGn_splM$V5TYzh4u!NQ zkQl_F$Uw3^F=K%Vor{z5?7Gjt_nAYW=Xk7|_&WnxkcS@RSb$x_vicO#G82i=b>#{A za|iF=_a~KM$j;NhPvVgLbO`#F%j+$q95ebfk|RBokZyrLt#B5Y4O?}PBL)fty49^RV5Rkuif`D5-m#Y0Um9BqcbtbaN72EvQ?5k`t*hUC_hDwR-# z#Y3#>Ok>!3TYLkIQ1pKeu)!On!ON;G%&-@+%LnnqiBF9p&NR5s}%4tw^g{CGk64;;%+c312&fj4I=>Iqd}{nz_j z2GRUf)br`a*aNAb4OofKc4?PZrDr?v^V-`R4pcTobdJf!#%{}cStoA8?*>j^zW?eo z#W`SRTG66)TlO3|bLGKrMeBGH&*`$-RtYOiV}EPx<@?;|h6cVv`z>vF|LdEYn_=&W zp`5q(Yg-gkgX*VY-sHr@h`i??R^H*{k8|<|BDg*;HXil%i}t(JCL4=8R{QhRRFN>L z;EeKqZ$nzU-zA)XKf3{;q>HQ0ooN#GO>A?GUAN%_cy|joym(B->r1xE{N3am>dLL+ zBt=`abFKF!t9DxJXE94B4!W>|)&n`G+ErGm z6Z%NCuT{gI4V#%x;RV3XhBU_+C1;il)+TmePtF`6E)PpGxIViRoD-U(2cL`|jUFqg zkxp!J3MzUgzg$6S@yWe1yzwSpo`;+_#q_h&H*_jawLqN zE=l{QcE^s(<~-q+9CAqHO2<_5+w)4%b0sS!y(I7iV8EJ8_4EuF%?F!I)@f$a$yj z4inW?9kdxhjM`?|(y0k&OXp;wVEKc7C;PHBHENs6=3y|{~Lh#r6HvK#Ap4s+D{_Ko0%_UU=nR)0~i2egUGg1`~(j zRCce9{X~1aH6i_910ofyky{mV`ta%xcjhyw^gjdaM<{Ol4I|8X-uoVK76-Az9cFto z5$siPck@CKFgQx*UBfjS!+gFBEX!Ac?m-#6xQP_dCPg=`z7zk4R9x*U)bE_ZrEf^l&zL)LyMR&%GjF&VDK0tOnFB|Kf9F zxDxgTxrjGPZ|ccm<>qF|mTRxJkeW!G7`DQf0ACB$A*OI=(IyNnT7NHka#ce*~6ARzlT zJ>tAZgt+76WbSdwc~h?NA!&0!cqy5ogSbCp4RzF&hc~doCQ{P>=)=)Pq8pr3 z0$IScpmdX8%;uHZ&XH6B4pHPIf*})9l`AOS_L6E}eL_QS`<0f8AE}(Nm1*x+Zj*3I z6}rz67di0O6;x{+TBQhN+e_KK;Q=efl9uwi90@BZXV{{wwF9{WxCU1y9Pmt>yaT7pZ19S)uL!3q>3^o|5Up!H>)WFR_V%7QA zi49br)ejl{%_N4%7CR%fmS)GOC6p0-+27$io{JVG3LNbRn6bV~rd%tyTNeT+5Z@HB zAd5(%$_%oDTp`(~Nqo%D7k#xEJsg|@(gve8?aW&S4Oz!19;$^8J*6$XtTe01e>XZaqb`P8D#auDkE#g z(c#?FbLT`g;^><;9_=5anDiClYI8am4Xys!- zK^uB#Q>NLBhqv@~=OQV6Yi(O*#8+J3J_!pS-|xJ(1v$KKsuD_5JM`)BB8o|^V=3}h~HD#tqHVSB^Zvsiqn?vv8&o5*E%1?m-y(v zOPgh=XB3D)N~fH?MKC*j33y3fJz`fT5EpEzpQgnNK;{vvrBJ%=@$c>5NAWP&_q7rB z2h>=0Ul%W7gq(;qvb)WYX8~^=#i>lF7S%IUS*ObjMn6se+)$S{)<{|fWwsOb1BcD1 zz${j+Gow!g+ON!IBg~OC>W|kwBFh$Di5(ih3FhZ2-cC5^H$vrjOSh_u! zUH?__%CXb^7DwGSe97HcV%CqV7uneMkp6@u)A>PaR+9*EJ~M%^1R7^-iZ)Njewo(M z@T=fi`4!Qn_O&(c16vdJPP<2|yMuHZ>U!M2J!8btaHrCvKur^M)W5b3ZTzx%n3_QV z|CzBIjZzK71?Os(J=B6M<50sBr%}hFaR}#{are*;Xx<#!gpkT3xja1kB;tKNy+8$_ zhT-Py@Pu38Vya?di);m;VYf-h_@u%SxRYo$i8g0yt&bFXS<)jjv^fU?G)62Np zf-EqQQs=<))X?HLpa-z=$u3O^jy!%Q{jY*VjKRng&sT55-#FT(D&crDB0BN4f-7Yh zoTgl~A0(GlZbzpPaGtS9F1hG}nZ9;h`HhAqQLFp+*`jo4mk?t{G1(6Oi(h z$}|DGWf$m=`Twe)zt9lWt|le56*>HB7oG!$>aqc0WO*Oxp>%UIq^7Bm2{DN-LE>fp zv?-*nmkk|+cf7E>g*P0$6!qAQPzaqSNia8P42a_aV!landKa9DhN#}caf!5( zo9bQ|QQGP`l|Xj0Cz6Fn3YBmQhUVa;Dt(Yfx#&-GW(t8;7%;~~I9v{WsRh$Hm;et7 z0MaM0`Urpk;5E5`~592B!IJCAoKMk!KBL~6{%eLm0U&2(sSHuB_+w|I9r@UkmiawQY9Kv zJ1<@i3k+)jP~dI?JuoM0H#Yhdza~U~a6r?aR+NEWVjVWi8fZU_2pT zdI}gxP z9zNTinrQH@(xX&Oo%6?H7wu9f9r*N=bt54cRXb9P&ec0*sZ#!~BmTWb-eDwX>S0ek z?U7+Yj8}W#T7KXZk~#ee^~UBc+bOoT(*yO;kfS|e$(alIwyDuv0}^RWbGJGe9Sq+X zQYr2}*SKQB-mRhsf>%K&SNmSmI~|RX1-BG^u638{U_a4zMyYlB_Sl9RD(tqXkGT0bw|-@q*nn;yX7IcDA}NA4!NXb%H%0 zC|=-iX7~*{WfP4$JrY{KNruB|rLN3dh(BQ!2=G(&;bH^y`EdXHH!#u)hXJH%cM&Wl z6fq`93;6NPaK52>_of8H7@C2@0ZKSk2Y3*)cd7US9qE9YT-p<yWGe3q+I&b0(wG&uE?htPQ`*QV?;aU?y`n?r!MCRie$AEyLS ze$CgpXiTJCURYa{d|%=`)`Tr7BVZmgV)pc3@6XxkW0Sd%XR3>I|iyY6S5S zc-`bJ?ebk8RDQxVU5$7Pkh)jOTob_2L7Ekajs48sZL*SKmuiB9k1zQFaVz7Yl8Z&( z-btMN2U*felE6@!Zzrp)K<7Gt2wiGGOt*#aQ+HQ;`{ z&9(=b$TJ#ceLf^TZO_3YuC*YOZ^`~DP-J0M3mPY+ARkXkP;L&ckvz#3zXH?!BpH90 zOU8|U%r?fU9)vKFW{Wspa*zXn&Hxw~NwcpwdHIcRCYYwi>1!GmrQ4%RtyAF4bA9Mk zjFDu-mM4Lu13D-#hPU>JYrF{xHspZWaDs8L$N>fHQHx@~sF3b1fNBrKO<%$MD;A(~ zIin05FEY4Ho>Jx*Bl!NLB?3~%J=hTwtl0|sch%1yjFg$dh@OOtL>#52DC1sqDnWC5 ziaGnBGF4RAwTpcgXlRp6ah&zL`q&IO^LY1Hw z0Y$6Q7?E>ALOb%~?Dn2>nM3d2)8ft#>sAoO0#T+PZ5sSGWATKTEG?(o#gWe^qLIHN z4wn%^zecE9az!5zTyx>lYg4!Cdxw)q5DrUp?kN$_&8d*M8lT~<{V^8w+8wXmu5PrN zbh_z>%ujxU(OxVPDag}a<;^)pbz7>bdyg>p+(53&z{DvrL+;Y{Ir*v4kER*iFuCYF zlM|R><*NW2B|PitkC${;7)x)@P`M~FtwyDC`i%98NObHIPiSHQ{wzSNbu%DY_X11q93;%33mlRjsX1XXIp#cZF|o} za&_g=XnNkU#qmO~7rmgTt}%Y(APIQDh(C})Y%D87-Yb#PCC>APkXQkF_Js#l-Stho zb*k|3HkYy~(9>u&4)*(NWRGQJS~6Os%6M&Zo2RQ6w2fh-HqJaf*v zPxB``XDCCVYdv!w%kUe=(EmC{Tpldx6o*6^c(492ecpq-%!gSET(9UrRW01=I1vHj z;E3OQQ{{9FK^$%f|NSp}%}h1JfN0inu|O9gRW;y2;ZO6bT7 z&|e`rbOKJ6B?S#%R~P{&IUF!~+`e|DZ`-ob4e6i_`b{t6$EpJyGlyXUr*-RWSqn6x z6S*#kry*c*%7Jeq$+P>|i}c66i6f&cVDr^qFD*eP+TmH4wJ*%L+=6%shy)QFGYmWF z&;HM(%R}nar*j;?yoPtF8oK$iqs$YW(4UjcTWEt?khlLy6oxO z_~~O0T&XjX?9Zq2qy-Q&sp83r+z^e#~C+I(w4SqDSGE}gk z!hS$(eLs5kP52cNnqd6TOw?C_vu%F5hys2Rflr+A^hX`y*AuRYN8$z0@*D7_3q_Qt zK6$fXVV*dAydcdC&i`4uyw7#$fNR0Zx3KT?xIwr$`^B<)u;>gNU`TznUGT?YBw&&} zcnJ~jM(3Dh-@8}>OmIQz$pjqAm@)dzufmpHaGU{>$e*N68@sMpVwT(kq^Zz3rT>yq zZM;EdKNj)g2`gI;FjbB5V9d^(t%rY+oqa0QUbGrauxO}a&6l)WHS`x{A@3|cx)Tr)v~N>e@k~mRDx#pxqmbXPfjNM)!^&^kt1WGBBMeB{XN|sF(;1%S$eE2Gc}`Q zS9@w!YG#%!JXMh?ONf={6y~OjQ&OegeDAcP#VKNG!t(!5)^?a07oU(Jj!%!tP-H7o z#hf^4%&l7<(V9Pp;xa+Up7ll%LroP%lMYT4AY zzD=!udEa?&KKd*PWyBuI9hQtI>H=h2uI$S^d-9K;FNItys4Y)n@zOWA?#`~<(u%uh zBQevV@WLG~OM8Qux3z8u(+=c+N@=a2oPCwG>Ae$KK=h1ZfrN6D$$y58*+oSw8totEdgdp$81XE-0OF>U@nMOC z>X0e3W(#JVZXV^Y-IfvRj6+HZb=9DJ#Ktj0B?kFRo;ElI#MDSI2|HTm-6E_Xt8;r~ zdVyv9_B6B0s}0xGC1m_6PMb%sdD7b)`P-q{Zr)RA>@*QSt@*~cfOz?|%R{pii=+=X zupiZhI<3yQ_Srqhr>@~n;CJ`lA)KYkK?FnvR?#oNL$0Ry;H@KMuVU4(74WnGByXd< zfn6XHzoLtCW5-UcU^U71woF;>S3h|cc4dL0jTolq(ci!-PwkmR#*T@=|DJn)LEONK zIV4-SDX(B^8_n5B$dEwpl+*6M^js5({#5AAeAmc>NSk~Zl>Gn2T3RYz=Cy_ zR7__%zqhDG@uXm7-jW&-Oz&J+PjbNmAriGy2h&63edU-BCO*Qx_(&yX#BA7d^@Qvi zWeuaZxnJ7zxAMp9HjE{()V{P@sJ5oRDcRj~fBpGSsN))5nq$r4`f+Yh=CGFGFE>Co zw_XfM*;Spx4zCutMI*oX(-l&>=X=9fbQ{t}v$>;C(w$S>^rpem5y4ATb!CWUwRufb z-`mIEGOwB+eQ(%KrTTWMTky)vm&4ibnRtMF7?xH;j!RSx5!F1DbE)28)n8}r)>$;m z~d-{`#{?Fp*?o*um~-xr{xN?F5FW4 zxZ^)#&2ryunZ6#cu|&2>ND>s+YybXxJ3SX`5LSz6ihGY)YqdI4@SsEbrNpFjQyLeH zN6o>1WFJ-5-%XjanM+97Wjsx!3e>9T{dZ=X8vHg4(-(>~j>nB?;I$c4v8tYo8`Swr zcaU>+BkWI+XBImN^5UbxyxJ*lN_L||S&*AKZPMWvWj`y&{4l-5#S)?k^79*1~*hQw3-oRds8V z2{ApZ($?c&m1~kQaSpH!(U*9NXYeHIf-wq@tLPV)U5XyA*~~YYNpWPikY*q}a+xnR z_udHSxS=6)C7D+8336DchwO8Cl*nyID;l7B*HgXphTP1kQ&zud%sdT;elk*(3N*y8 zp1hCd^C~Uspyx>=63vy6sA`6lv7WogNizPaQRl49>RU>Ku!5^s9lsrSPMsX4)K0eJ zr&P4Z2GDlH)>a;7ipqFdZyOMPZ^k+Tm2zR`QPp;y(HQ31eRSR3Z|FcZ4#yNo{?kn~ z0EvgQ6T0d<6ZGAD`W;EIsnB*YcQcPXTo$GJ-o8kw^;We|qD~p@_v&y@Zib5Vs+lno zP&~Q!d8tS;!sx_F{Bw9;DsP0g1QWWi{VgY*y>Rsna&po}1sEn*yIj#VNIa)V$Bsek zH)T94wb(#;J?x9DBj367t6*O;=-o62^*AmfO+UkaKT&jf3!b7UrM?_S+a?g)l}DPt z{(y;G_pQcBtBR%liM{UMe8egjO65RWUG5{dhj&;iVag`441qkwlpOAB&LO>uy~K+` zbdKEJ(4`f!Ki}xw2%{lJkbc^8L=izt&UTb;egY*>o&-Y3I5h5xbE{1Cx_pw|8X6z;T3??j7!76Rsi+5 z<$+D8<;S!`#4r;5K)66ovEQgVBdGZM(d!c|Qnc!f&oelPUewE|GB=S;qhyf)qUGb5 zw&$67|ATk7WqL24ei8rjbhE^k9|C8G*V#Y(d?m=m%NueEBGVnOva&5!HWqpIMkrzS zThz#K|KXkt9YYIHe2RJDi#kWZGy&4Sfwx`!NgQzj_;2s*NRWOAfU)EF6})tPtZo=} z)+SKS)ouGWi@BrO!D_;I7fjC z{=0FG{WW6czR~fLR^p`Flpe00%6TPIpqm54po=_}bxyx0*uKX$>8EoQsrX)>o|WOZ zuMFF8m1>tJJ~`@>s>79ahTkq79q1(StK7wWe3+beXvS&I?{JH@->v`D7`6mI_URdp zu6aIPZzH?B=pT8WV1w5hyLqJ;bF3g4{hQ7qyBx#oqzyT$P4*}CpWohOuRQtf7VZi>>_I@=jI#MFaQBg@wSdYA)enBD0;SY?|cN(rT$*zk5t7BD%pz{s0p z`aedr5+|iMpoAbQ3*gVbg}C%XVgcl@RD=U?kO->30Rsng!&>oN98*UAli~aHkw!t>)xcg)q!ek&@)246W;g1Q;BloTJ9c)V4XH zN@&g$?1RJcM))@BEWCksRiZ_D(gFiICmby>qaBd9`d!4{9wb}@(cZW>i6Bqh?|lpO zhzE=Gh!qWsHb?SqQ>9h>ZP=@HXa*<pS4Ex-#+{sUj3D)}c?e=v+}`fH)FVGel*K`NzB@O62p1 zqlg3hT0p;>1^#*{SU`1~9(RcXkfq+`Dn6Pi3iT1885W>Vhot7XJ&WF1ltblJ&a^p@ z@4C{qZ4{*IfkXisO)#Acq4zvE9NW}rz|@vVsU8-pSl%WlzpDK0LbOszsxYG^qKE(m zsX`F)Sm3)?3;QVH^?oIR2FMeWeo;bR0=TrlLMj3h2!|5TyJINO$>=6pMOny1Q$#zp zPBVB)+cOc)eLT*+k<@q<+0hKj05l7St$3rbe_e>kgE_f-ZHr@s363_o+yUTRe-YU? z-+0n9(QMnVj6zt&JqKMcZkm&_xlQ>QbhTIkDX=j*UTi`9S|D#Dyg;1Z-3LqyrBLe~ zDB}jD0GQDbvv+GRw6}$_3W|D^8fFkcO>DZ7Qi)~UG5^EEx5{YrwA{Ae$z3sgjCF` zsmY;$;ix7KT8;0$^|{CENp8ZGT%gx^0KHY~T&PM|VqwzqX1eAR5{qk;6>Q@gk__cc+`_ODr6EAYtF>KG z1ZM4}zbvrj@n?q33DyKG7W&Mb-mIKOlt@g_zE;-_!;S(2iimQFa$qRU#m6M&{%Y4@2nIgb9zF=1H3GtCZrvuJYXEdthVrpP zE)!Au(Us2aCA<@fVTRJ3FSkB2s{b@N1=J&179?3|>zq##o1k31VxYcFU0TbHft(2+ zObI57JQN0N7L)a;V`wC7lnK|Ba8%42K;Iq6Ed5Tl1;WoLW2 zEtkR8K1JGC>YZBG&}kLN$Kqd??Y94oQ=tyEvgh%6_TY%;55$@%IlM^#`^%va(>})t zslO81+ZePc?7O|fAb(4wSa1JH?(Qf6JXNs5>Phh2ya|Jx#y)n_?zP;F7&{DwGd??=4ba-I%pz{aUu4*t+iIhL}&$@H^*;V@JMdsfYr*3yvMWv9(DsylFJhi2%J!v%eFeksaucXSS=K`X>u$?gtn?iH%hz(qbd2LS=;tNrbU| zez@lD1TxbI1_M3*#v;mU;YK0cbqL@n%XkjfFA=m#z#Vvefny(Lf^Od+MTsD*O!9p0 z=tVi;wvqyl*#7Sy%BTh0FGOC|S@j6eK@a|WK=GLCHLl3WdV(xHj#UrDX6l_IC(#N~ zWFgSlnop{>G!&ZAh*Fdl4RcLN^p})AIZ`)5{gylpU&^-iHNjQ^+erj=48=zoA%?Em zgV;MdiFn8nPhzw&j_#)N{n^6#H$9+DV)zg6y;O(uRA(^#8F#~$l0nt5Bh{cA84Fu?n? z5)QPGnzlCYZb5R*)mBC1#=kVSZZy@xiI@n_G(n>{Wc94#ED%)(Z~<^j4FnI%L}SRp z3f~J|q*UF&YR@{GcmA0X!0u4l-kVkK!FKqB;1udN-c znzNiN0B$0drX!MRoV#2OII18gVo$1^UqGe^1$O0h;L1LISeY z11}zudmRq>oVn~Bi35D_?o+xNlspD!U9Er_c*R-Kv!1ITc?`$G=dQWsBidB(S71^w?Q<#QWdgS^ zzBQf=XUbu#e>@NK`jA)I8cCI@;5$*5V+8;M&;F#NT{uo7TL9mG2a9n3=`*6cH|S1f zJq(3p>mwC1JC^>qBPmi3Vsb6V47%#{UZ$^CkhT`;IXiQ>!gZj=phTji>mRhZojw?( zJGTDJL0=UlbUvjlgi=b$suL(7LO--Ov_aW?1JaElmuh8!p>v`PG??gyEl`5UHCp`e z#!+~7G9q$739An!(1?}bnE9*yLYS=pF#(j;RKNTs{Pt;zg9g5M7y4uE23zG~ip4$D zj1{*+(c7OknW5FEehM~0$iaQY4KRU#g=Xi^);w~FWA=kR0Z&CwP;0jD(hBIT92krM z98K_eIy6b2YJ6Dy-*8@;k;QjF>_qg!wCMm3`Hv1Y;H3iS_x~+hG;u#}Jh>4_2;`Cg3H#U^FYHYgdl;q+N7zHfFjO3^VTw2! zhJc6~5EKTN2(36St6qTbEycT;-N0oHLTg-GGV2boN(b2yjJ|` zecV-y;K`G~1q%4j=D$)}AUc<->cw9l?6_um>h^<>7C3hc(CI=pjlZv?_l1c+-4i3H z^C_t_n{)O1^6mhSRe%vDal!y+uCBm@{Lg11f*`-XYcM@disv?JUDe^B&>J2g5aCYN zvyeL%uf$W9t7|h9B)v7vNaf53vdM@0n0@z{2@3p&9Nsu=oBV6b&kx@RU>*CM%0pzl zK=FH*J(&SAV!g(8X7q34B|!Y9H;0B=t<@VdE(9%}Xa$%ufQo@GeMVmiBw6{^%Sr-I zJQ-h=zvI`7OJq9v_M|KkNh~EfjWOzJ)Tw*tj6^@}RPHxJ62m5K@Ay18aeD2yYKc1v zuIsZ-xq^6MY<@~bdP5&D zojvr4m7L738KV1qJU@%^k^y=&H{ZLL{maX(H7;`c^=sV8sG4|4B1#i{nR0%08=RD<5BN$FI_21C9 zngvD3(4evRQuiF87Hdh*pAn4Q8!Zmy|9M$fMc@asPI08ip;%M_9?!N+V~mLZi%ft(_JY=>=}b z`&w3pe5TgKbTe;d-pPeryaS!2CTdytM~sl)FCQQE+kEoFs6TH39YeyYyfKE*bf(jv zhtWe>Y1B-J9uv`3Yn)jz9cqx2N)Khu8O`jaMbD~-$=R?aR7Nv%kEa-YCslirw-R{z zo1deg^J;g66c$9#NlfOSllh0fUu>!t3kqgx4GSb)*Nj(eeP64;`AjK~X75R;gpHP~ zd1T8L(Fg@IU3NR=H_z+81mh{;njawl{82^#r%R|Gt%-o><&m6P{bfSS(2y8}*P7xz zC9Ya*<026$dV!Bcqf}>H$0ggWk&3~d3JjogCos^NCXsQs1#@|!$hLz!i!aR`Z?2}N zKCZiFaGiS*X2lPdj#BQ4B*#b=^^z*G;}~~Bcct#A-WFBlo0oPVy?!rk&Z|)v(lIv_ zsUIig!7JkBJ}N!hC)p1ZJ}pkIWmWX~{_mVxq_06eiD#9TpGx(I6T3x1fGv=jG4`Fl z=*zGDznzjcEuEn3+|6D5BYW@nD)54A z11@HpQ#r7ax2f*tx$X~V;(pAP(8JiNyBZzX>E-cW4m!`21d^dxO+0Uzm5x=Vmpt%zuxhzKAGn8O;$w5I@OPs9qwozr7Rh$5JhS!pdV6gFjf~UBpd=LZk(SUFtJ+v*!SV;|N?im#ekE{ou1ENt>Ap zh5d%;%N5+V?-!&QndF=Pb&b`Tn|_1yI$GB`V1&KPrHkU*?oxoEs0Za@t3Xrnq$;QoK*~P zr#(8ms8%H-yDN|yTYaM2mV42+%BqkVMM=^3;9|Wy6};m;?_`5V)_EI9+IxJ zLuw3NhW+vyq(BlEa%>;=TlKDY$v>XwaT$Y>%pTS66OlYxGO0PJz^Fq4G8WX(g&(iM zNl8`ADJkNs_tbg9o+3v|d=Tkfl@yQ}lBuqLq%vC-puto_c1|j2%r4(E zQ`j9IzW8{Oz85}f(leiHt(KD7HH6QVN(deLmE0(SmyGREJo}^AjjaMr7R1^a$|{C3 zafxd|CN<`G6)i$~u4pAioIDvt+aRwt{uJ*L{96WHMnRHax$77Uy4=Cvju=l6$dQCm zqfX;C2gFj#Mq$4~g`_xRnXsRF+HOyjyoGGH!>5mDi43><#i@x#Y`v@$6~j2DQb(XU zwR>IQ&Pety@+(WbW`&~mG3IDsD}LYWw%0LiO6lB_^#fgsT{izTH|pEZ9?#3IaS~T< z7CV4O*VKb{%Ja5Ksnx%~t2OU*Bi1G(4u(>PdRuH^bhP=l|Lx)G?T8i0k-Nxqe&awa zW%D6d3>c?yS*FgLr{(Ps^>!5Onp4@{t^`=e#jw*>r4}NS!cJ ze?6BH>~0?XUx|;^f>h_ldpcHZ<O-=7w zYrd<8OMD;8t#b$H?Z&n!Shk&antf2f>f3HKb4=S@9{X6QaZ8%sIA)-I_!;C3)@#;0%%Y+C7l57 zZ53BjQ`xoq^%0z~0^Rs-Nc$i5P5MS@b$?4LY3o(z#Um~XP;XSJ#V~K89!HJW>#R^X zqegcEQfl@0Xz3(65PYw`A!@%nN_1hzQN8PnEC`im0ltPU@9idxQ!YleH4Zb*O9hUF zGden^VElv_@^~O8x9l0wy?vo(=(38k!U4Qz5dbl4yn-S+;$Pf|Hxu+oyUiCI{5PwY zId^i&oQZp?CEF4h3Rmq2P3qmF*jvY4y<|be>(g0(RvXF0Fm3Igw8U66{j0;VNbv&l z4QPu+%BZVS53{c+V&ZDlkOJstCWtFd$0)yE|Hkj`6u~X0rQzx9NASmx2wN?{8EbOr17sWz6K6vzb3e)a7V6DtVrTp-2Ih5XOFD0F^jiL z??59$7|=6!C`H0r1(Wj7L?KT5^fM6pcf}Gu);H6jX*$O{oxNOn0V=yGIKyo(QDfv z7sB}%l(IMtJkG-o&x2+)MVXb}*ACl22}QATf5vA)fr_+7)v#6`adj`LkPyI;riOB1 zA93Y;YpuExjt{k65W=|D?~8&t1GMx<27yQ!rOtG#H&FJ8;GqJ!DtfROFf_E^Ik7ve zc}Y-@&;3z=rLaktk@|Z%Y(ppj0bQjYSptc+hgt1Wo2pr-5CVwf8WKftS))_v3wW*i ze`P^7;3V6KJ*7aDhvDYol%GKRlt$o}?dWZu z;ZdvDI1%Ke+U>f}ji7eP-wTCmiZC%CRD_i#+D3^;`D)WTZqa8i@5NvxFYlA>KXU7r zkju=g)rQTYNF{vb0jUU;ovN3umXiu(B-dOF*R$-8ZA?LJgTvr;8{oNN>sYCwm1t>b zk|aoO`XJB1Lt@9$5WEyL8;x^8fseDgY1>u+DVkMnPoaJRci( zzF_6E(Gn>>Lky5u|2}5`j=8+h06X6k%h&Jh@5NtV;Pr=qlzf0WPjpuRFV8_ed%k%Skyn z@W%sARnTIkYhKM%9(uzW;0OIjC|~=k)Cp``o2$L247m7#z$dWsk9ylE@@$a<7Js8w z2so>>?m&Te1HgHARG@?ae{l|PUyT@iqvBz#hW%f|{}K7|RDr$_Y&!abbp(lBM>cz3)RqRfX|lXuqKy4`{Oyl;PoQ zER`50g#x)YJ>h~#HL>`{iNo)=b0jHH7V&x=_>BO|YihIA?W@xKCM*xXLOMNfmyheTk!E-GaWfb{N zX0H13swSYs`+yXDdTHxTW@|FxRI!%V%6eH=D(UBB=aec4`(hMw>E!x&@tc`I{Ylc| z_V&1VfARpN-6a!H*51r_9oZ&=09W$E5jKh`xt8$JvfMZn9 zw1@ZX#aLRV-pZ1qEuMxO459nJu(v0xZ2AE6Eli6bt&x(_3aKkANZHErC5Lj zj*)y5H5Y10E?~57vre)uk+jJ)|X;*4I2kw72*=I|zdSXW10 ziF+N9O(j8%d49w~l$A>&d0rz1 zC`Ky-bu49okBawx8gx|`zl7mLC6tU67A%f3^&V8i*`PF0;-?ha-#b-w*k)j!=691b z?`^&kHD9jUB38p|E^rOL>~#FdAJ}z9QZ}xCcz9r*qdy9U)J|lSfF8<`J)>;gnJIq@ zYK)zAWnk6R)M+^|+3WI~W*@hzH|52~1k5n1$~H)o0yQsx0yfn?6HE~|9lXRziD4Zy zNp4M9^6PK6MGOY-b6y$-r^pKTU8^K_TzQk33%_=?UznU9#1 zs*bsvk$uZ$TCO2_U?3+SbUw@Um)t(XAthlg{~*4*nt!B~OnOTu*BXE`tg@#)dL4uv zANQS2?9Tn|9Q?lH24#^4HcyX`?dwG@cjt*Fn0B-r z&g7E(3jt=(v<)`tbC+O*Q90Y!RGfiVYR=;xn^57t9gUwQ+eenK<)~^#CD#8aB@ecY zU#==2`?#|yZ{1&3g#rKWTqc8a3*n0+&hnTYWgnc~XG?b_0`BslTMYUR31H8S-!Uy- zE{F2CEb`6=w{`(cq(KKa$O1-h7H&*Pk!5SIQ&A+}Lki>$XN<$~ybX2l`dkKnF>U=_? zJ5ugsK4HZj3Rgf}HF2L;+aW7G8wtTt1uQ}JzG{F?xdyXuwI@IM+>JdM;T~uu%>8FE zCa7X}^1R{A%kHexG4R|wPT)V!B2a#WmEj40?^oH=r~d|)WCQxWL>fZmX*$-*;T=Vw z?W@<7?}!_-$sKrU2gMFDz_ERniesMArl?0SjmsvE9vH2Z%_J9#d_Co3a2`zSQP zxX+tV!XzL0@-3=+KIBhwu44NrzeueV?xg=3uVr-OXcIcR`K;Rna|>j^ghQolHVR0L zRqn{S%X}I*YWT)lFE7K)HVjllcJ~J6T+-tVaLswo8vh+P%QFT4O!dw5DN~CB1DY;n zT-SRgQb~)0w+~0Ll)*+4`y?f_tFZV_w+VAJQ^9X`lt@EQ4(E=lh(M)%xFw@`Q zJr|pp(bgK@m3G}cec8#vX786ZOFas0z01vgg!jGfOBT7Db6U?|^c210495{XJ5U3GxzqlC)CKqcp=X(Dn6Dc2r#i=IR|??dKC0T3;Uk=I;?@sG5osFNKUj8`c*_E2|t9})U>=V)}Nn_K;puDU5Q@{$tRWy&D+x7 z6&l#1{GtcX8y{Wc8+mTMf@K2m4u(a;cW5I}*I?ApE}UivYg+Wv%6|Xl){htdl33Tz zPLvEsv^j(?#p)U0ExLtV-)b{EdtBFi=b7uzhO!S^h5Buf-G(PRRTz)M2JZKV?oAG*>F7 zk=QxOh_+!;*VrPsgu{u{^FUt6bfz?StM!6Z-D!3UYFRbU=d~Ez(~M>P61Fb~mkZB7 zW8RI9sKN0`Sc^s$>it5hU4;#)A99cG5RYv4H#))8naKHO!&3zSkXV&R^UE z(e78(F#VokF?u{K9yW-98pn`PPIkn4541u+<4beK!m>_YnA_3$Uj9hZ`Dwv=^SPew zkF&xZqAa!urnpn9y(IcOR(dNDJKZHca-h&wCf}vwA=DQLj-SGTr*}T8$B<%@^E<`Z z)vik2q^<7YPRv)ZRR3f9&?xo7HT6gvVNxvEwezb?pv&{+2^m5{d{m^#jQDVVd}-dI zOz#!>3Djuu-0JR?FALTA42u~?yl$5fP)#1_5VZ``H|32|{D;qt=-8{9aOgDQO6Eh24BT4NZxu4R@HY4bjY5e;z!B$`A%Omq};`5`O1 zOvf1Umn~p+ns{2+G`P#NRR5PPtM2X+jtH+}!;K$eVx=4o<59y=Z<9Z?81vGOAF1wS zQ=xDz;ul3Rmk~`N-e#0KGma?t{sz7go;Jd@R=s*(H67<7qa7{`%1 z2j5}Ja%_}!m2lEd`WKUSw~C=c;D6}Ds+if>f&m+eM=a z%&*M7@>dggQ^lgAhCON!Y3I>|5!d~XPv+S#w)6B7)RnZchElp%Nt82(jEiq+4@ASu zs+0{jEt6WCFNZUG&|1fsOr7Mu5%y(iZI@rywtV3EoG-oBRnn!KItLhE64x&E=8^M( z&?fh0c9=QOrN?*Nu>rA(GY!K5sLyqidXFa$t1W4jIYXHEdY=DTAKDOsyjWJ{G%SWK z2ocC!W-ZPrSpJC(IR0{-juwn;38*-%y;&J#2c6=@_l@X(zF+H>)KxE~0D4(6@B6VY z%;m_FfFYFR)>5gvLd7@i#uLgpUE1kV!@&j-l(cY1EBx)AE0+yw8l)tya{yu=J>?&BEn|Hn)#S zt&oq;oA$&x`w~x-;|SYMlxU&Z%S?%SJaXhEk@S+FyIgd9--09ML(Lj}xvIv_=eIyF@5y9!=dQs`of2wE&z zEAm(KTwkO+-1@8?(v0Yn)8)J5EWMdh^>g zLe2_HvdxdpRmMZOE}cB`rISF!v96FUj_^RGm0IHHJ^pBdqqyV=o4p3!(=%eUs8rMz zhxuGenc%Y@O6oZMT{;;KFE)+!KQP|B#FiDzyqE(($u2WO+3k1VTg|^lPom%^*QBVw zr{0Zh{!>RMY$QcXqaOXr1p*cQdW~G|y|sBHN6l(Rgt(G<|5#v=IUKB?3Ay!U>SjLX z|BGkn9d7d+RehKWH4~kO)Z-RLb%Mkit$ZXB>Zt$8^;+2Z;=0~I+{({rK~nkpjtAx z+9XR2J`rYW*|9Syvx_hOG zk|rV*Nk~OpU%U>RrHERCZOOzNdMbM(E||4A?fCkolRM&Jqe<&+1WQ7J^JQ#j)ZLFu z^~M7~TwuDb>TVfe*aDn!hkUWfrF7_Y3v~Q}x0}?8M{w;RSa)z4wjv$;UuVR#jzUS+ zqls6%AV;h;Sq`uIR1@(Ue?USg>q(!o;Vf18S{zZUfmdTocWZ$-lTXDH+{2GHDN#7g zbd-WNC>ZmBXs4~wMV1gzAl@ZGhS4ks$Y?XW)Ibe=Owh7^S6**qD?2)^7u&g>> zY!!0P?2ZC*R|W1@(D$M>G2F;BE_|{k$4MIRPVkqHf;JlehJlThqv)MdyFpnT8!6^t z_Q5?+pa@(%Wr;4yO{yLFZo_XO>mo%9wy4zsW4yveyOK6>Afc$;kz{7J(BSNjak3cMYN_y1mH2NYjOf4 z*lmac!zj^K^<8rWWG=IENYbgt(KQIGO#-wHK@RSvJ`y6XIJ(M-=9*pRJ2-|4KZIM@ zl1F4IXts*9csw#!Ult^@%6<)Er91DSv|uUpI*HXJwhOzTES5uGK1OPwr6NUB01Ug$ zfr*OM?kKQtF92_%8NLD|B?JxuiWEU{Re=e2b?|QQ_4@#sZpyi^2t+7Ri!-i6j~XqW zw2r(WI%#n31CD~H?qara#85b!WJf5zA_4b!LiSwptD$58y8IoF`z~pSP0WCbR#yxgbti=c6&5V$thmjZd5SE+0W}r9qt~7$d{; zxm42%z*t2nezJef3nILa5sf!_IRNz@Ag_hi;AS%Ny`LpGTT0uX%-}UceP^>_8*(%X z_sO9)Ax(tBp87j0nNh0wJb4-5En@V)4-WKkI}N!S;`D|RqV0NpgcvwhnB*%1F6H8^ zf|e*eDXXH>}BO#`^g8^cpdu72b5qqjIcDkLK62EgC^{1PsLBRZ56Dz^a!AoSR?mECbEJ zz92=D5CM(eX1(kbt)pDK8*A=CD0fW8eDX zyJH$icOLpx|B$8q+8D%rHUV0#4(3YxPck7dN!6a7iXu>slpM0FN1+4za!stS-zvO$h#>%HHa1Y^W%Nr2=rNd>{qdISlE%76=jJGwUm{r64Sj6}bCH9gTvMS2 zq=|q0mZ9e?g8!)maPn8C8dfC)pe3cW#jN6wVw#-_#0{)pKa%;M$PXuTXlK|vG54e= z_F)<{34`s@Y1&#A(Hj2_9(R}2j8Wn|i4mjK@Rk=4gJVkkpdE=qh50!8mKDs^r5bdz zRS>57Da=LBSqZs{@G3fl7YtTmq`ySa0n96FgUP9zLxF#vzW7_v3PQKPX22O=m&k2y zuB{L%=pr?=TrMI7ru=0XK6_P8=hc;eki-`fvBPBqTV@lr%e@1qSr3 z-O+B{Gk8UT?jjj$`ljolzzLGz3VB5aAw$)DIr&HMOE~PNiCn3I{x(?pZ#KM2cFjUc zjJpf|L2!)_(H9S_@hZ|$oF0S9vV{FAie+Y;Hl6J6ZaPs8wuXU8T4`nq3&squ{xwMO zI5tw!EPtQsF9KGI!RE`io~Z#819)nZ?p@NJLGcVTI2b3&VkGb1py*A+U}v_R5dV@m$g;aYpNY$^nhPyCr#d18Y0q)Fm5AQ6(o5Ou`#k zFUHoE+60*H-QZ3Li9#Wk)b!cbyN^Y^K54WxF-a5YIa5s&a^YOmFcKZs=T;{p?#W7_ zjfQ}saiQ3;fCarK+@zFNNC9Z-#OjDvhTz|jgzPw(#&uzz)j}GOm!Ct(Sj3OtBi}b& z%N`9Xyqxx+>--jb@N^Q<;rT;r75L5zP8E@6`EVJZk~Jt^Auf)S!*OEb46c1(aEzR2 zC<7x<&tPG7P>ua+HL2((jD6Ty}goGmv1M`kjMG^nSaj3_lTI^AKXM z-{@=vhxOj1#ovg>VL{(LbvQ|k;OKgKK;N2sep-A;?eRkFP?P>ok;y7p7Fk^MqZlVG z@mA-=D70e{l99^Z2Ro+X!!K;opRI<`%H|7bw(mT$wsGJes93tMVE&&`>p#JV^h1SP z-BvyM@s|YB`+q$W(Dyq|Gs%Z*Y=ufvy$p)JK#GyvK^4`fZQOoRY>d>D zWhqGr63`&}H44q^!KWrvvmy?sq3?qO?EVo%@2Y6z~Lhypf6Da!YYN+@n zPY%aODx5k%?(JLMSwJudnfx8Qt!YVs99$}f!!H4)k4Zc(VEK&n<7Tj&eMnUb`KrsF zXD5k25qh|wuk>cS?DC7XUW}Y&hR09=-YR| z*9545TWVIek+hoT#}x#x_ToEmlf~D)y27@FF?ed?5`0EP^5nU|%~xDZ*nD{zS7(4s zyDFlEO2HfyuKV*{bKn!Q4B$)dxt%1(+na~U;2hP~Ri&5HWldXui8n`y6Q(08k_{8N zx*=zw`E)>C28M7WudK#j?~v2t5} z+P3+})S^sbec3(T1deB4L{hewvLEpWj336s?+KuVvL8N{oaSgcS_lTq@kW(SkfdSW z4AhF@wtbEWC^Dqtm+zi^OiBiH$=3>jobK~PV-HhJa z#>9^gdigzLo-dgOp$4x!h0Pv=!ofj(Pbfzp`uOr}bJ?iC`kr9#;D;`m;KkgiaCY{- zXG`bGP8QmBruhIe6;o?O#smReK19 z`n}L+pzNjlivfD};hsrcJI$ezn+`{}*f<8KD#cY3ZB8lYKWfBTHw|4pJ1UG4UbNYp zMjel6WQeZmZi=2gKw*q+|DoMSGAkomhcjFRIpQI;b#<*iFASGbb*TlaMdb!f-pao8ZmXg2kQ&17C?aItSQ+;&GrkUn7D+cxAWtov$Xx~R3jF|Td8GHM3LK%XO@&k^^_0vppdQR6k ze2*($vB&?T#Y}Zs#c{xox3==0_jSC|^rHj*KdzE4ZO)%70L$gkm4Qsh9Xkvmm zG6}@Wmt|HOCfE#D7bj_C{9Iw!z?e%cS^_acP3h3VAnj?;#qZn3FnvM0dW_;E(@3@b zM8i-HlI%A~kh7RmPxbp4{mhdvl*H4*M3&<9-D9JF%B4&@aX^(W2 z`N{Xan|{=SiU{ehS=3Z&JARZu)sC0*YN#x(Vwft3xbY65eZ-NWt7~S6TbC6w#`N55 zD$}@;$V{a!0uU3Uk8%=6sgcs*8eMB8K1*g-LAb&H7&C1f7dVG9YXq|4HF{4(;C1$HFjxCUvb5G7m!~)mk)>W?0L*N41k-?JzJ&L{mk41bSgQu4}LVo@0_7 zC>0{k-=wwrVQf}RP%M@)ruCT8xZX)1{T^J6=j}nVW2YFw*?+ zt_yN;$cHUdw;6aG-8QvSJ5A9vjVd5#v0#&pOBeapz@UkeOQcoQYx!b;UMdw}N|m32 zB~_OCnc6n>!=7R#LFb*^+;_`0Eh*OTDaq7X#jPTj->r3fb{mR}jN;Z4EX-QuqyXs- zngr7^T)`tnh@)vjq}pIPmx%jv^m=jkE!P~aLXG9c3wzs>I`f>IiC%5^OOgl7l@Uc8{GM9UER`^oeTE6}$$bCD)8Dt6>+18B%~o zo7JfRX*nb0l4!j8uMaWDRbT5y0h+;pESa{9Mlu)%q?(M|mT8<6)$_ zwtN;~O8{L=@?_!0Mi=KHgc|rW;NK*Nj&=`|^TgHq{U@}{)P&DjNHd*kNx~MS4O5F; zI61V765mcX^hvH=QeR0{bw~{Ve0+MdP;XC+MCOpv0+^JFwId^{*$NSC`%VnmMbNTm z{10wcgjV56d$%jEYA~TCTp+Hx?kTr2(iUHhDW3QDZmlw!dSN%^@SIG|ePI6V5$Vwt z<=rYtW8s(@jFa&VkH}hFMMFDd3PxC0xiBvCkkgel4DZgGb9q+ewhVyrb5xD>;FvbI zBAr}})I<$>X_<&B$yTZGsvLe*y%FutVn67zi-2-^Yb9%Qbq%F_2J(}fIkq%NFN-=% z@=zjmYZ7)dnDWg(-@$z`8oLq@zL%5VEMXS3RvvE`c^JYolq*y~ zZ)iu2%#*0~Z}FvLwG&o|QvFAI_?wXVcU>S5z<~=8E|Q z?vWIIthGZ5nC=e5b5ai`>T*;&2HAb6O}%k(p9_z?TtkFJm@p*U&d2YRB906GWuaKm z!ar|mN04e8DcP7Vx%B3Z^G^M8WzI^M1v)>y+F-H=%3<=}niD7w2K6cJlhpAn36!^^ z(kiWz#-59(vHPWI``_mN$M{EnfP70mmBTmKpdl~@jrfsVpO>eU{o7v?JU{;I;0ivg z^&UYfM)fK^$;YoBmwhI2G*Ze2>;k&{HY-w_uXFeA&UU#HauH2x_uL2ZE2AA3R;rhz ziZr}Lt4JfO6|qswfu7x2_B z5voA_q5NViSSViolcWTfQ}J5v31LXG`hUIpUZIV=k-}wCUM6S7aE(o~agZ#$`7Clc z9*RY>nPHio8uAgjnadd{TLyU$Y@ipew(9&C6{w}D-t8OVOr%CMn)Il%V_38+sRtaVdMBChO4g4#TcyTsAmjg)xh|KeKs z)8CG6o0`uoogh1~cHKmosbeth9FXYXx=Kvk4RC~9a8LbinHFMM=-5 z#H&hzB}7Lq4Vom!5MZ5QGwtcHK%_cGWgDR(1SqI`)kI8cbo>RlqH(wVCR`u~4#iuA zJj%Drg8VSxrUrBwiB*rd{Z&T_=4P&rhxflIaPH!zqofal((^4)=X}*+dDZ#7`X3~l zdocgQ)A<4wRIq{WsDzfKM(uBg5>?P%4%9}#rc@wL6q6!{v@N&!3Vc?_=XD~j^7jBs z&cM`bjipUno>;TbF=8aq5p>I&(`5HFs_&u_^c92SnpJfIpHL|*nWZjQ!&V}mK#ebC z!Fghv<*3W~`?gqo@cw3#%E)a$8(MZ3Qa)Y)bU-N3GBIr!(mM>{7i8*LcVDD>)h0Mj zVH}Kt&|PTX(d>96G@-}onpWrcp4is6oey}RuYvJ-vw40VCOZf^#D_3XTOGvqBl$#Tu zp10?h1j#;*oF`2TIm#>*nr5is6x3&$sk@&EIchphjLp2&t6W;q((UM8blHMZ>?v|^ zk{DbVgga$bNh)~p^)U-qd@W)CpMGK7nuC1gQK1UkcC@W`lYX(S&$jE8_J{F*d%C*@ z{1mQDe3cT!iS=?UFAKLB<$~$id$k#`jaF3TOtL!~jqkIW79Gj04DgVKt}Z#Wx&#g= z109jv5&NTWg!;bCz^!`dQYM@(heIWi^D-kbwqg#yrw|S$C?WGn_nu>YTi@tZUMzL7 z^NEl!1Tw%*P7tVg_Dp2IwNDTiv{PCwD{CDux8aaFO;7{#9U<$g7_^r4=Lo+mtx~I1}H`0WrDBt!rk!0{YlB$OWOaNMSKTa`n%QYy?hsE$$L9 zTK9@VKYuMdUmktI(>zE9xX7!29>kr}hID(7L#T3bht4G)oI5W*poBKRN!d5*a&f@$ zd^u==dmhpg@b3nWC^YUFU72E(%sryr1+6F5WQdTv1H{V5<=(SoWGW0?XIY>otlt7ZS(2JR8hUFeeb5-cWwRG`bjECM4M`P3W z!eQL`;7kEgNg@v$F~FGtPrg6HE?7V7%oNuVF`T2K^V2Kw)ii0T@(tvOf^M>7$IB2~ z4hf&@`D)9HB*H0#eh($_z)k%Wgp?5qPh}O~!a%CRAi3v))o*7a$lolH1eYLV zyT9qCeF*8#OgGUi!?<9OjGQfBj^nKb-3p9k&(nZ!k}_ktaE_cb*Sar}tL-3y-&K%Z zZk~BIot(MDqx9nv2N^M1bHwW~`HmE-IJUaPKeoARy~aJqN9yx#*=pZp{k#P%Oxorl zcKVsP=NEo;NNcVTw(U1{ssgh~mopKPturjf ze>(Ykiez$fXUO^5kcDQGUGx&ljQ-iqA~O<2WJeXW|ld@of>Tp3aL?nLd9=wJl-n z&4gdVK(3ldQ3E_e+i2GL(?7Qq-#zLfBKV1n{7{IQLTk&uaYxS2xDGaY0Q#-aTPvWW z7bu+dbXJ1xD%%yk1$Cw1tzn?D{BGI5B(~JliU9JyEDcsIbF^~Uz1ReEKA*WU4TcKz zLzONA$4$>Xg*;R;Uva44%NBp{n|aF!P7HX($GxlR7C(u|LOJNgp$d_80tHao5R-5o zut$Ig4*<>=yK_4j!|JZq&VcgWPiaz4Q8={G#yb|Z=)7baD`6yZw=is{BP9%>95y3B z?#*k3uDt~cwz;&0>r2S5FOUUCuRd-b2K7%8=me=;0C_NAH2u79PrD8QdA60Td0#L{+n%_`ikM*LotfkS`%>Sd2>jlJ?24i5nlIghFv)g|0&dj8<&c)u)V44$0H zXTaWS$V0QO;ZgFB99Lo1uFyXMR9GfMziKHCs3$&wJe35_w7u624+C7fmfF5Mw{2fK zV2uJ+2r*4Sk?=FF3KWaGpE6}WMH{osxEbzAd7L-UQbP6<7K|g8T>Z@pe}s7|LS6Oc z^e4op3r3fSvU6{+eU*$DB{7J5QeFvv)M?O~+<0@K_0`e#oN&0LAqLM&mQq5Nh~wVO z60JeHJ$f~RgSc}c;h(=UG2jS4#_I%7au+rvPPr&t_Omt`_Sdv)M`3hlM-XLao3IbsHA(n_zuBx8I{L)Qr|)J zk@)>2*?U`Km-OMpm3HFV1f5t3oF#dnRpQr8e_i|-MA7CamRntwz|dLaaXJ6G9(Yp) z4hg{Dd0>I%9}TBo+M+fWl2-j=i%+7$_kY|jDGOIrf47T^h_QSe=jp;jFB1382i|FhGfe!GsZ5BEhHIB2-PS=Q8SFS zXe=R8L&%aEqHtIDAfn|CsnBwdrD(lJtGc`OozL%_-}ij~fB$uz^S;h?p0DTY@$kXL z&~_ldq|_6GUz%yl>7IvdCjloCjF*GQt9ndX@D_pUk3XQJR$uiPurp~&$?}6P1B$ZS zy=_vgFX(4+m7i%;4+Gk#Iiy&DWPJiD_a6R2X!jyRrU9zB;H?t4=9!JgGajEL?s%!a z_mC29PYb`mTwB$};B@Kg$LV@O3n-(EP={wq0RgsnjK$DG;<6Dn)f)kCp`!a zKJxh|6(vVGD=RtgA$z7k>Rz=<@7Mj_Vh=(bCT|6Mu!zWDW;~QA8Yze{id4uXanoZ} zV)J?G-#?phS{8hH8-c3wr#lA+YhS0Cz*X>Ov3kSyWjO{kX_@CHfKdy{gW3x0talfA zfhIkOE61faop9y9gpU(2wj``V2x8wFHh(nm41f-y8q;I;1%-r#IJmgDopPhPQQSP; z=x$zq-lk+tYdZ(Ny+f0Oxx_7M=iH@rK+xTDwYTru#`XSz!T*PBdsWxa+S$!-8`ag# z*^fZ=F7vMRpi+J5^?vi)f?^|f1_x~O_tw)dEvNZBsPowo7#tiJ67bE(ne4l7m~p0w zUUZ7&QIL3|nK50V?Q844hF=0ts5H_hjF3z2C32SWU&tOk%@dVIK^?o=KXHl`?Xne( zbB)mo1V*;rUTbNIMxvs_Az)f>!d5?cEY86*ZRI3EB}FXOzHpnT=T~A=ZauoY$|SIf zqP?i&DQ^=}^bI}jHLc5kMvA6cr+HmeG>y5Gi`OkERx${~X!`XF7Dn_^i2kF);1+}`&Ks){>4on(d8s77xF-=u2-3fTfOWhYsVBN1BYt&xy87N z60fZ%0kBE7h*y9qrUx%_rAw8Jy_)3%Xo$skvsaV<_75AylrO&52#`lgozP#l+@d|b zMB)|I>AX2vp)XTy)Lb0aR0WTsR9xQkX{yo2R`U)4VVv_gJA11FqI1}!Dh(w~eQsN2 zRy8Sq+NzO?wY?#H@jtNbVsVe6aOkj`O?L!=fyKMy4R%qu3EpOS`q5NmqdM#J-XUbx ztluXuQ)~M566`LfB>9v2nD_U|t%zv%orGn^E89}_+c>>)M6{}{ZCJEYNn&gJ>pDGW z2{^$45iqB`o3Sx;Mj_xN1B#cHU2yZ0mB!C(awZ1Ql_FN%6yxUCfitdJY~C<-M^U4D zSda&GlJ1i@#g((P?~#pg`9*rI+e$6q*-^*IV~Y9$<9C;OpLB4f_sl6G31Qe~x)VK{ zIjnoK_w6g)l1FfW-l%XCw;DaOgWTyM>1Y#H<#M#WbG|J&)wfkSKPy= z<~wdn(^aQY(d8o;-8gbCF5o06)!H!X7NzLGX0+Hg|0Egd`K{V<<*Dx_Y2my@>OT)D z8z^V2^yYC~9?E!#gld}_pqCnDRgNQ zAXDjF^9TA%MgMgkOL{YLZAI34oRWtn3mIv0R?T7v>pXi?iugbqEYEhSI_UPSrHut4 z^l(FCs`0Ewcjd^lLv*Q~jt3bvE@I$;?wU$8;n;V3D|ceq;eY~vbc$P0?3aV3n+25A?p zn?ag%N6>%<@1xZAVsJK4^oQ~dIi%@0N3jJA5vd%N!ogQC zTEaij5^0$pWWhw-+SdJQLntx@Qfj840~w4N%?b~#FHEI&V~(`sW|zTI2);Z}VXU0s zaT$5!+&?mG3fQDIzIjfe^)HNXee$<0(azxS0SN_M{LleqMk- zi{q*^3t?Hd!qNYQ(nUhpiMTh2_i92@orh2nv!xUz3Fgc&?7U7 z5KmX&4o;MN%39@X={@H+hCN8KtPO>b*(7vuA_aRe)Iw`-nY5e;KwD5CPm;DYlb962*_@iEF)M%ueBTGw#&524~dG!)o4%NRy(k5 z*yUv#S3j81$(Q|L<|SE*lWoLGYLBwn04xn4DhLgj^x31r0_c*|NKIS8z7 zsVnmV(;c7JrF6&Uh3KRFS-$iSofBvslPg7eS+Ie19tsl7CM+9wP zB;F?+Dc3T&5tK>cmp}Ha>G1+<6;Cn|AKo7z>+!B?#mgSwvI^=yry-u)-^-XeuROy>`YV=hp|J1c;#s+gFPVU55gYMRl&2!nk&;XoFn&0g(Hm3J$Q;__ zdW3_r2_?!UZkG*I$9=M!BXL*ZJwj^M$+S%O|QzxQ`I8GQYpmC%PkUF?i1F!c1&XTU*pa9b{ zW^CxTJ;#GRuKcqv-~5<-RVsV(+zzvlY6p7_IU{um<3}X2Pk4mcL4nZC&EUYO5c#rD znYb%?g40`&Ojs?PEgHv_iVbB0p8;!#)lkWQsQ#%kP(D2>LU>%G zz&)E%|NM7%;_NvIu|^Dx<$W11x-_YOm+4owM}0;TDc=fRf8j~% zTiZv*|Ey5u8_(O=*+zQocarXRRjNU4W^tnE;s9CTKLA|6xv@9@ElLr9n5fLGYyNMl zF$PS?n!L^OEBNamn1=$1k_IU=N16rv*5}BtM`6Wjzx&cYVz`N{2&EBw6Ovxu1Cp`Ikqe53Pl`+#H^SWRs$vPk{G)+Flbjs z{HT(GW>De#I|l|vU}xaC_b0p-$(jm)83b-Yo5ptK42TSzFak1=fHW)CK_6PqU>_Sg z)I0-X$NdNQNZ6yv3W>n^n)KQ`={srwG^u2FO}ez;kcC*@N@QuxhAouC?L>G7{`MvT z)qxKWbi-PbmeXyxcO2dVI9S`VBx#465HKbu6cS5K*U~^fP<=S7t}va6DwY)kM1lWQ zFmx{gVl8@2u6dG3X_`XdzwbcRo%BbAr5D@MlMcej|PYZKuVd)`^ZQqvTF}dj;k^vQWV6A(RE@^PB%q`xLJ5zWs*vAArz29L~!k;0tk z38Cp*velTuAMl1wi*D@-u${2bYF#09JovwFh6B;e51?YTpbEbSDqRjVBiH|wmXQWB z#cf&I-UTZ597Uc)xfD2+7N^gK7FQj~f`qL$XDz)U0tFXXuzGK(q=S}~_*ch@@y=@wvbe~rb zFP(jw9jDJ+Nh19;k0e0|Kbzh(n6<0&tr5s?P4CX0>Agnn9s_64BLT&Wxdm@mu< zJIwWZo4&UsYez!XlQtmUBtw>Gsmr7D#p;i?gxRv;Dp7_rzym8(94FDh4+|pAy!|QQ z%aqMq$@B4OE*Q^&8QeaHhR#H8tZ|JY8@pTtS#Xujg~XMRDmzk{IvGMG`YAIT71>}A z3}VHAEaOo9^%7uby?Fh6zfVE^MJ@*5NNAequt+DN>PfvoXGxpxG*#n*S!-a5%p)tG z(+C|vDohOM@ro)O+YbyBy_je?h0aJa&K&lJP+@+iBD~ifWm9p*t|M$M95hXBd|4ZD zvGr*6#cJ1$xz=dq45u?$zmEV2QJ!sRIx`_X8N<{UZ~H;#sa0*>qC|QI)DhEg+|RgL ziZf4yG@g_S13-OVMBvk|pPo4otM+MO`a)8u#1OXJ?>5sNWiN!Y18h#x9VfM8zm{Bn z`z>uC1k|1EfPQAhuLCGDoHE!8bqf9|0+y3PL2~vfuRfRsR3v~GzFA5%do%*+-Qgpr z8Hi`2*syZM-EzsqLDnBvE0LB;F+&aGdU8-;UBaRHnobnE-LnY5^72)f`Qd1VMjlK@ zZ1sHueYS<0;-D{wy?#NU?YE9!)*x}Ua{g(om|L6R2}^Ksw9w1M+jdx+4i?UTGC-`4)l>_fev#=(~h#9cx64xs$H%t#cTx$Oul>q zShrqbDgY19xwiCN8YtJBK-$48;6Qq8g<8(Jgq$E5AS5{y^txP1%$TpuIY9(Y)HZvo z4km;Fh@*gnt)^26=t{`60<)n4>M6GLmdb01zHSn_t_>3|=mhiTfWkKsLq}OC2|>1w z>rHHUUIWOpK4`V4%mJ7FAGq)ZyvPXnps2Is8i9rtpk&J6Z@ zw`a+m@<3nQ#0Rz?9%%Vv{}>OK(+O# z7$Z(>KX=NmT7h>5D<1K+@5Fj`;&C~r{6PIVVB{#^(Kb?bw?Q=Da5jY_#{`2iT~p;{ z=O^2&$tvY%@NF+?S+s@zelEucYsHdhG9XV8rg$4&PfRYkPi|)Yd&M+P}9i z?0cGu0Bje6S1@C}Zyx~U&fl-@PH&6>Vmc^JY)J8LCyja*uF$$3#WU=~%vlhgw@)Q{ z*nsJM>y|fDeMYkB8S+RB*zfFL5e>_>vzM&I2 z{UZDUO0vT}dDqT7Mw1Cj6qvZ$7y6nW<6XkP3tvcyj-mMwv+GazNxiB@r^@ z+KTT{(24Yr2Sqw>dp9C#T30Rs#wUQ+M;|ZA0Kaz*itf$>leaDvWqBRpCJuIb4PGf} zn?AXkr8Wze6ei`|+{^g@8W(#R?McKk)7dDA_tdcF0%BxJXL(4$ZxR`YL!yEbbohvZ ze=q;iNe|unSNwlhHhlh?PkgeYaQ?OLO9PFJnX{$Py+<1*rM`nDHKFMtg|&s=B|biY z9C_PV6+}Aod$6`UoEUaAjD3H%n`F(q#Mk^Zg32 z4!d57IQXTrA*G?=*`0>DI}KSU>aEXRM+>jd8aAE%qqE`P%9+FU)g|@z$2y;Q{b}F; z=?E_CFsrokH$?SPv#FJk`6O(SRr64KOqSQd*dJ&mgv^=DtrSJ`Pv(D-5xWc^HI}Is zqm@`%-5LpGe7&;2t5iZ$xO3u3$@-I>hyM~g1Lqz*I`VNYYj^$UZ6$eSPiqceDGl|j zjEO7z7yLZD9Ayj48N^=yuHpU$@))x`G?8Sp7sLZln3vDUeTZo2NEHKaYMdIGrlgX^ zr=ATq$C`Ca-VG$RKRVnnr84j7xMcFzqS1q;!E>D5hM=Rq@qaMv)!StFc$8-m!(0Is zMM<}U4qocU^t29Nu7*w?jy>hqNm0+KavB8dr`V|Xv1dE2ZoN|}9lUyM!nEOf?Tu-Z z%kR22&ULQ8NOyf6c%TQW?1m#^KXg5+IdGKwz#;}o3J@yHUfyhMnt9lo9JYmZDYG1- z&p%pa#`mt1yxUd|6z448ef+o6?GL^W4tK2_dQrX8^9g%D*D3N|-_7)=v*}Ia&!5*O zj5cGepEUV*DsRb+m5#pxw>(ZhCeR1ijW@V{wCvL36PyWdMvI4f*f)H!)aY8#) zbGdzM_SIuceBXwyO@mj;p6y;)a@zgvYZ&MHM0#viGEJzAxvzTswbj7YBiRd*2W%i) z1FSrJh;}6;+>Z1938=zM)?{DKu0C<^lh3^)xL%_?2Z~<@&u{z%Kt7fA_207JA1bf? zx3a;xEUBXXy&Cb?M&06H{hPt z=+zY0e?9d`=@fQc#i-*k5A%>3(m9;Ow7IcA+2iS=(98FNJ(ACU|qX_Jb_!ItZ7>ZRy09} zVm?{Xh7ZD(kFF{pmK7A^=xM#&UYjo?TzXY+)$KI;%*>%UdiJA3OHISp!L-Eq$wn8tGI8k?#Tfa8FiXze^$M$^L2XdQIRmnSf9vr|W;u&UOX_TjIw(hB@ z=Zkpif=3z6^z1?MT2qHK{(~(gk^O}VNg)bUUCW#XKE0~tS!@W&?<84)%Jdm#_hP;b z(HY%ol&W(_qKHitlU^@*+UT}+hsRFeF0M4zyb$bdtzV*aJ*2~Hua1WjE1;52^!J(y zR}2ugh_-CAX=Lt{IZ{AS(g@I2B?L&EW5>SrDY<9Mm~`Xq+Sk36g?jg8z2nL~tnUcnp69wluqu;9mD1udmSlpcPe!uB?}`~R zCe30U*SR1#|! zq*V9trjW`<3OMeBkj(CULTX_5dBs5c=zRGv8ys|~!eezSE}qIp667py3!q^AHZhH9 z_na~kYkH~f9!fQn&2jBfZ;1mvH~FS?kL3nZU>~X{m7*NX8d<2E-__Gc7io*2Qog}F6Gl3X~AxdFSZ+?#jBmFFwPaPc0>F()|%s*qO6n94pr zwLoQ0BGrQ!6Q_+-j!c|7uN3TsKcKYFcwuf(yP^1PwM{dVhUq`cfMxAx$zGedPI0ps zo7=G*R{{eVa`iEu6n4A(#(p{IL1k^Heq{+MByH48x_Tn=D-TZDO2j`2z50^* z3bSZ@?Q6*dx|{ArHww_o+wl3dLRSik>qa)Hz5YW=HRaOUs7f@u+oNG8YiLv@j7c3O zL@-j_mGJ(YZyvKwMO^&U*?A?|h;p?M?9w`;4`;_Z2g}(lQv$k#Lf#NUg?@(mfak@! z3Q-^WAN|mwCzgXr_H)#C|9EYsp=_M1XwlCWC-?1{AYE0(J7dd7u5C_1UDcjCemc*3 z{^+$i9OLXOZbX1$H%T$Tsga~~*2F@jpw^dvE7$La=kYD=jlJ;h?g_>_tSL{Xyjp*R z80~O+Q--AC^hSTHA)AeI6v<)zL>gL>i11*w;@sT+JoWb?wM`;6N>V1pdCenzL>#$b z*3J+7Y3VkP4eXU0t$v2#W8Noub&9glQd`%3-WUXSZoFWkUYZoh3F5gc&P!@7m|^+% zP~F2-fwVh|HuqY&qC#&if~nmk8&4iob6R#ctMzin3Brt$D?QOeRP^z9T+L;{E z?xIrB)22_C^U2LE0F?FY7m8?J6PGsR%e#s#s*j(c%3ibWROeeoT*aJxm53W5oH4<8 zioxs>rbOo&kK~i^=X<9f)Kx&@iH+CSY@4wJd34$Zfe9EC^kx`N4I%S5?qa! zQOEq+a+O{yBlXU{(PO@m(4|=w9bd`E<5VHs%qSsf-aT8*x+UT{(xvoL^0BvpPrZ+f zOA>KIq*-Din(O%&-fUauuk4krh7+JH#n=8#N=HzB?y1K)Bv@CFALK)B*~u5x-&j}) zIk48EBBn?gzM;4&%DPPCYk>`+*iW~7i{4?-Dc96L zl8s0Vj^d`8>&EL{iN5iSe&OaBKUx|(LB;DtgJdUyYozZ*ImcBuvZWd6TKx~=j*SkMi1h!hi~xG(5Cnh>@;;u z`}^+49UV6CMB5Dyxi>@OwU^(tZT|!JtA41jbrG~0R`Yy9_)r#{c(W^)?BhcziXat|$AD>wy$%Y}IwGiHtlw>zEI*oMmPqZ1>k^g%lJMIhI7P1T%+ z^_ewq)ZG;P$oIkpUtupiB6LOCntr&h^nHhJzGsfl_w-O&c7UC!Lb-WUWlnW0I_6Wx z06pIfa*LcYPt@CDOLF|R@hIz(HT=TE+K8-hikFucwsoB$^R6KKFO-Lpwwn2{wX?uH zkFrId=;#Qj>94}}Vp#hE9HNUhAK|(%VY(jLLcurNUTJ7WIp+3}UGkYxPt(j8oM!7WVO;g<}O2Cv&lD|5H$t0&RL zvtqYWCb9VIb+{pH3lpETh$grKh)ddprOdLWHs_0wOCs~Z2^7Cm`V|> zsa}Z=n&4abidCcI8SRbEF6{7!w*w4D-P;yVT$u`pnmToxaa=miqkx?y_f4jZT&nS7 zGfdX+XXR$+=hbSNr!5OX7Wp9TyO?t4cF(x#jX0x@tn+U7lZ80UrHV2sO z8S!Y2F$vdmh+nEepC)X5qj{g~nnYEd6e2z^dB2}hjajJZLLg{tZ2c-M?@bR@fFn~2 zdOwA)*6dUll_!UrX_BDOHCM}F*H_fzyf$vCXBi1eSV;_wjb?0V!O~fQ(S&%-&nlA) z*N3NNlNMQfwcTr4@Eh)g+I&QLR(Sj)tHHbT<`F)6M`DUSG*`=^!R4< zR$(qYYeF8|uFeKiyz4yMn-X|2v@G^_8;RbBq&kBt!ZvU9T?thevFqMOCrR`3Z~d(v9^C zQ7767{>*a6OS&@)ERn>OsqDv!!mj&dlT zT2kgU#s}c#eomZsu2T;jmU$hRS=y$LN^onL#)dAd`1oi)$Hg_~5;Uixuv>KeDJ?Tf zT8VCPxQbM{Ceqh6(vG);@FNZTrzGP!twj8};O2&>j5DtXBoGj{=`<754etwPLqscn zqW)%x1OP6Wwux@=2F1dh$;K~OZ%e$`v^Owcn)$Bj%pR-LWm$y3rQM(YVElBCT)1kb zY-stj$)W3$~;XRt*^7^_)ryvyus*FN`F z+_1q86D>_J(w}+e?s8>2zS3gA+iVzKDL41H1BFqcq#vFCsw&>1v=NF@p6RH)oOZid zQ5HibbPPE!O*DM$XbVAXdNW4#aQKENvo4h`hL3myed-RUf{kd zy#71F@(5l5rKRO~T7FO^zukfYT!@-D6|5^L2t9!Q2L8hIx|V}>J1h<<`#Lj=O}mTd zgMzqk&REK5$pSn9BX z)X@;BD3MX#2y(X|($~YDps)Hu)$+?)`+r+V-i!@ID0krCAodO3dQ{-6I|7A(lCc+1 zBj}&2$8>#-IB^Y+oS#IH1c>8vJ{evl~mMN zQWB&!r$;JfQfeQ`D2X9;rBf<_A%%R8jAs9_I|5mJC`vgm(ue7ij!$iAZZP(_+FFcN z_oVBGT}iW5An*Vr`{w+K;bv0WP=4u6Wsm=613XxP?^7#%1_@8vqjaAc9HiMFI1$(P z+DQ74)W1ii4j;11%auxIN`apT6L?bpE+VU9?8B3ha?iW=FB(K)TIR9{cc0PU_IO{E z&hI_QiMX>}V&f88c^TgyJI~gY6MHU@ zc+eUd%8tuG+DA@W_7O%UCA=u+wLZc`B-8$QCDOOrl8~pp|H4Rk_T?Fe#xT9Al;w)0 z^|BQ_QTJk^iBMN}#!No#=03lB4GgGI==JV(;;HDixB^X&4!)r7R-jE}vrpt)hw-I& zD?)m5S`Tvj>o{+zi4X&;9XkwrGOWJH-%#r$tvzaIm3L^|b#{*DNn;2oMDdy-R`-#~ zTPFBpQ1LhUUZ3B?THKx0>(Gr<>!m5^gQ2MdA9`tBSKTQH3vS$7Zo8|lOSv+c5R1HA zU|D`}@aeBO`Jg{f$Jig*irhH(=@zlFOC_{rr9`&IJ&69syYZU*3iZlYAB)T}nePY< z1wP;v@bD`ZP^RosB175~U1MgOf)!qx3p+2He;lxI+-tk9jv(=ZtAUq4MV>xFs0p{_&();QySp2ynV}C^;FN5~bq$4}G6j@n zKcxje>bno#NL4bRXj+M7tXkQ#G4NMIHMg8POdV^_nr2c-gIZA6bDth%nJ4n6qjXP@ z+z3z7ty-H>8fB2@&S$xz|0rvlcH13Ya)ML-!ASv4gj~OZ%7C;o57MdXKf3MSXPoZ+ zCtM}2j26S0N#Dp1(k*ut^xhMDcTDY4tY`?1YuQKb3VxQX)Y*0WUDxxDmg&--z0~QJ zZiHXjv{=R3-9A6zo2wxo=;y(z0?4A9wm9P`Ct)w~pY=Yc1;r2nyIfNt81icWFTc#G zrP2w?KqtpdVhIjwo7i zwGoBie5I%=00ROyKllWEe=%mQEf>0`??8bziw;|ep(p(*_YDmOntlIUSM8#^-60`r zIxTXtcU*WMB_k0W-yMiP(z@eF>!vb-JG*v5MfPu&{GOH5ZRS@x5;8C4dizI1HX_&! z0qbqx;46XDBfVaWaZd-#myF(nPXj`3uw{O4HgzSzS3ua8~8TF$K_1#?hSm5gj zw{7JSA!Y!obGku&-N#lch9*o&Z3juY!u&Y zc+o5GQbr7A*BZYmCC!?98KyI7v1X)83^Y+y8j@NZhsKk=nOz&Aqo$wSGVQq3I0YJn3q> z$pr_N?`$AU*$!D;1`lm)^2vKWdIWaxM`Uv35nC9R)*)CP(*Os3MtIALK!@`;H5qW! z@V@?qn?)b9e~p;iQ92VFEw%|>&mDqai-sev9#7<63OZCHG=5*Zy)Hh`V1oSeY*kL< z(|t<4j+M<`-b>)|oj;Ka30^@!mu|F?5aL{38l6}tZP}!1@Xp=O!lmypF*Tf?t@jFAP23UlL(u`UR7J?bCMh^?!`{UPoQc zGzFll81&VJjKvNlcNoRniC9Cc0Kew`jfn|{v)6SlEtY7Y(PV3DJL}EX_Aa(|R2OGA zy0@>7PoR&#kGmf|z$>Kw6xGei-oat3LrY#^p^debv7Wv*;lQ>3ziX?ms;sG{W^C-_ zVntRX5#)$^x27M>JpR96+sB&=?aVKeZC-CCFId}{Z?^k~>qNF{9e1HR)BS5b=za-x z%)wxNA4N$K*022&@?MpZ=ciY!wV2T&In7&pH!j&WNoWX|z;)i#5*>rZXr}C%=xMoE zLyrCFlREOaRMigif<2{EpdD(JgxeW+L9tBJ?!cG+mDnOV&#gsfLw0dqm3rkxHsvv| zd=<_8auMaxeywwMIzF}JHBKJ7$04xF-uL?D7k^}4Z5f;!2|g9*y!!f_>uG6D6N)_~fTK)Uxk;Ycc#ZS>D zsK&Ef&e;xkk9f*k_}oXdFPs_t@89*$?^d>K@bAd|dAqm|#x()jx8+K02;6;bHXdhj zKhO&!^4`n^1ima=@OOcF#;W#i%^3y%qnJfq1kO#pd=cl@mdKU+O~M!B|0%_fo-odC zTPkzd*_%S1~s4j~Upg4)yEC?_Nt&)`7H~FtJ9wBO(?Vt?xSgM(>W6t64LU+03Wyx=!*U7ibL{Fm;tXcyaBJKlz?WwVBmont2d>)Iy0>*{~q m@$T}CZ*SjS5&nN*TSD^tZrO2z&i6g{ZQs4W`T_v~TmKJVFRsG? diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/api1_01.pdf b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/api1_01.pdf deleted file mode 100644 index e7fa1329b867daf95b488f9abf73f6157c372342..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23817 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 diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/b35-1.pdf b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/b35-1.pdf deleted file mode 100644 index 94f0d4ccd5872acc52fbe41c242aa24da535e09b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62955 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 diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/twotets.png b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/fig/twotets.png deleted file mode 100644 index ecb754e1aed9b6a2626641865931fbd2e9a1b4db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24251 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

gGbawXgC@%(82Cx}(|9`2xt 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 - -\ccDefinition - -The class \ccc{Delaunay_triangulation_3} represents a three-dimensional -Delaunay triangulation. - -\ccInclude{CGAL/Delaunay_triangulation_3.h} - -\ccParameters - -The first template argument must be a model of the -\ccc{DelaunayTriangulationTraits_3} concept. - -The second template argument must be a model of the -\ccc{TriangulationDataStructure_3} concept. -It has the default value \ccc{Triangulation_data_structure_3, Triangulation_cell_base_3 >}. - -The third template argument is a tag which must be a \ccc{Location_policy} : -either \ccc{Fast_location} or \ccc{Compact_location}. -\ccc{Fast_location} offers faster ($O(\log n)$ time) point -location, which can be beneficial when performing point locations or random -point insertions (with no good location hint) in large data sets. -It is currently implemented using an additional triangulation -hierarchy data structure~\cite{cgal:d-dh-02}. -The default is \ccc{Compact_location}, which saves memory (3-5\%) by avoiding the need for this -separate data structure, and point location is then performed roughly in -$O(n^{1/3})$ time. -Note that this argument can also come in second position, which can be useful when -the default value for the \ccc{TriangulationDataStructure_3} parameter is -satisfactory (this is using so-called deduced parameters). -Note that this argument replaces the functionality -provided before \cgal\ 3.6 by \ccc{Triangulation_hierarchy_3}. -An example of use can be found in the user -manual~\ref{Triangulation3-ex-fast-location}. - - -\ccInheritsFrom{\ccc{Triangulation_3}} - -\ccTypes - -\ccThree{typedef DelaunayTriangulationTraits_3::Object_3 Object;}{} -\ccThreeToTwo - -\ccTypedef{typedef LocationPolicy Location_policy;}{} - -In addition to those inherited, the following types are defined, for use by the -construction of the Voronoi diagram: - -\ccTypedef{typedef DelaunayTriangulationTraits_3::Line_3 Line;}{} -\ccGlue -\ccTypedef{typedef DelaunayTriangulationTraits_3::Ray_3 Ray;}{} -\ccGlue -\ccTypedef{typedef DelaunayTriangulationTraits_3::Plane_3 Plane;}{} -\ccGlue -\ccTypedef{typedef DelaunayTriangulationTraits_3::Object_3 Object;}{} - -\ccCreation -\ccCreationVariable{dt} -\ccThree{OutputIterator}{dt.remove(Point p)toto}{} - -\ccConstructor{Delaunay_triangulation_3 -(const DelaunayTriangulationTraits_3& traits = DelaunayTriangulationTraits_3())} -{Creates an empty Delaunay triangulation, possibly specifying a traits class -\ccc{traits}.} - -\ccConstructor{Delaunay_triangulation_3 (const Delaunay_triangulation_3 & dt1)} -{Copy constructor.} - -\ccConstructor{template < class InputIterator > - Delaunay_triangulation_3 (InputIterator first, InputIterator last, - const DelaunayTriangulationTraits_3& traits = DelaunayTriangulationTraits_3())} -{Equivalent to constructing an empty triangulation with the optional -traits class argument and calling \ccc{insert(first,last)}.} - -\ccOperations - -\ccHeading{Insertion} - -The following methods overload the corresponding methods of -triangulations to ensure the empty sphere property of Delaunay -triangulations. - -In the degenerate case when there are co-spherical points, the Delaunay -triangulation is known not to be uniquely defined. In this case, \cgal\ -chooses a particular Delaunay triangulation using a symbolic perturbation -scheme~\cite{cgal:dt-pvr3d-03}. - -\ccThree{OutputIterator}{dt.remove()}{} - -\ccMethod{Vertex_handle insert(const Point & p, - Cell_handle start = Cell_handle() );} -{Inserts point \ccc{p} in the triangulation and returns the corresponding - vertex. Similar to the insertion in a triangulation, but ensures in -addition the empty sphere property of all the created faces. -The optional argument \ccc{start} is used as a starting place for the search.} - -\ccMethod{Vertex_handle insert(const Point & p, Vertex_handle hint);} -{ Same as above but uses \ccc{hint} as a starting place for the search. } - -\ccMethod{Vertex_handle insert(const Point & p, Locate_type lt, - Cell_handle loc, int li, int lj);} -{Inserts point \ccc{p} in the triangulation and returns the corresponding - vertex. Similar to the above \ccc{insert()} function, but takes as additional - parameter the return values of a previous location query. See description of - \ccc{Triangulation_3::locate()}.} - -The following method allows one to insert several points. It returns the -number of inserted points. - -\ccMethod{template < class InputIterator > - std::ptrdiff_t - insert(InputIterator first, InputIterator last);} -{Inserts the points in the iterator range $\left[\right.$\ccc{first}, -\ccc{last}$\left.\right)$. Returns the number of inserted points. -Note that this function is not guaranteed to insert the points -following the order of \ccc{InputIterator}, as \ccc{spatial_sort} -is used to improve efficiency. -\ccPrecond{The \ccc{value_type} of \ccc{first} and \ccc{last} is -\ccc{Point}.}} - -\ccHeading{Displacement} - -\ccMethod{Vertex_handle move_if_no_collision(Vertex_handle v, const Point & p);} -{ if there is not already another vertex placed on \ccc{p}, -the triangulation is modified such that the new position of vertex \ccc{v} -is \ccc{p}, and \ccc{v} is returned. Otherwise, the triangulation is not -modified and the vertex at point \ccc{p} is returned. -\ccPrecond Vertex \ccc{v} must be finite.} - -\ccMethod{Vertex_handle move(Vertex_handle v, const Point & p);} -{same as above if there is no collision. Otherwise, \ccc{v} -is deleted and the vertex placed on \ccc{p} is returned. - \ccPrecond Vertex \ccc{v} must be finite.} - -\ccHeading{Removal} - -When a vertex \ccc{v} is removed from a triangulation, all the cells -incident to \ccc{v} must be removed, and the polyhedral region -consisting of all the tetrahedra that are incident to \ccc{v} must be -re-triangulated. -So, the problem reduces to triangulating a polyhedral -region, while preserving its boundary, or to compute a -\textit{constrained} triangulation. This is known to be sometimes -impossible: the Sch\"onhardt polyhedron cannot be triangulated -\cite{cgal:s-cgehd-98}. - -However, when dealing with Delaunay triangulations, the case of such -polyhedra that cannot be re-triangulated cannot happen, so \cgal\ -proposes a vertex removal. - -\ccMethod{void remove(Vertex_handle v);} -{Removes the vertex \ccc{v} from the triangulation. -\ccPrecond{\ccc{v} is a finite vertex of the triangulation.}} - -\ccMethod{template < typename InputIterator > - int remove(InputIterator first, InputIterator beyond);} -{Removes the vertices specified by the iterator range [\ccStyle{first, beyond}) -of value type \ccc{Vertex_handle}. -\ccc{remove()} is called over each element of the range. -The number of vertices removed is returned. -\ccPrecond{(i) all vertices of the range are finite vertices of the triangulation; and (ii) no vertices are repeated in the range.}} - -\ccMethod{template < typename InputIterator > - int remove_cluster(InputIterator first, InputIterator beyond);} -{This function has exactly the same result and the same preconditions as \ccc{remove(first, beyond)}. -The difference is in the implementation and efficiency. This version does not re-triangulate the hole after each -point removal but only after removing all vertices. This is more efficient if (and only if) the removed points -are organized in a small number of connected components of the Delaunay triangulation.} - -If, due to some point removals, the size of the Delaunay triangulation decreases drastically, it might be interesting to defragment the -\ccc{CGAL::Compact_container} (used by the \ccc{Triangulation_data_structure_3}). - -\ccHeading{Queries} - -\ccMethod{Bounded_side - side_of_sphere(Cell_handle c, const Point & p) const;} -{Returns a value indicating on which side of the circumscribed sphere -of \ccc{c} the point \ccc{p} lies. More precisely, it returns:\\ -- \ccc{ON_BOUNDED_SIDE} if \ccc{p} is inside the sphere. For an infinite -cell this means that \ccc{p} lies strictly either in the half space -limited by its finite facet and not containing any other point of the -triangulation, or in the interior of the disk circumscribing the -\textit{finite} facet. \\ -- \ccc{ON_BOUNDARY} if p on the boundary of the sphere. For an infinite -cell this means that \ccc{p} lies on the circle circumscribing -the \textit{finite} facet.\\ -- \ccc{ON_UNBOUNDED_SIDE} if \ccc{p} lies outside the sphere. For an -infinite cell this means that \ccc{p} does not satisfy either of the -two previous conditions. -\ccPrecond{\ccVar.\ccc{dimension()} $=3$.}} -\ccMethod{Bounded_side - side_of_circle(const Facet & f, const Point & p) const;} -{Returns a value indicating on which side of the circumscribed circle -of \ccc{f} the point \ccc{p} lies. More precisely, it returns:\\ -- in dimension~3:\\ --- For a finite facet, \ccc{ON_BOUNDARY} if \ccc{p} lies -on the circle, \ccc{ON_UNBOUNDED_SIDE} when it lies in the exterior of -the disk, \ccc{ON_BOUNDED_SIDE} when it lies in its interior.\\ --- For an infinite facet, it considers the plane defined by the finite -facet of the same cell, and does the same as in dimension~2 in this -plane.\\ -- in dimension~2:\\ --- For a finite facet, \ccc{ON_BOUNDARY} if \ccc{p} lies -on the circle, \ccc{ON_UNBOUNDED_SIDE} when it lies in the exterior of -the disk, \ccc{ON_BOUNDED_SIDE} when it lies in its interior.\\ --- For an infinite facet, \ccc{ON_BOUNDARY} if the -point lies on the finite edge of \ccc{f} (endpoints included), -\ccc{ON_BOUNDED_SIDE} for a point in the open half plane defined -by \ccc{f} and not containing any other point of the triangulation, -\ccc{ON_UNBOUNDED_SIDE} elsewhere. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 2$ and in dimension 3, -\ccc{p} is coplanar with \ccc{f}.}} - -\ccMethod{Bounded_side - side_of_circle(Cell_handle c, int i, const Point & p);} -{Same as the previous method for facet \ccc{i} of cell \ccc{c}.} - -\ccMethod{Vertex_handle nearest_vertex(Point p, - Cell_handle c = Cell_handle());} -{Returns any nearest vertex to the point \ccc{p}, or the default constructed -handle if the triangulation is empty. The optional argument \ccc{c} is a hint -specifying where to start the search. -\ccPrecond{\ccc{c} is a cell of \ccVar.} -} - -\ccMethod{Vertex_handle nearest_vertex_in_cell(Point p, - Cell_handle c);} -{Returns the vertex of the cell \ccc{c} that is -nearest to $p$. -} - -A point \ccc{p} is said to be in conflict with a cell \ccc{c} in dimension 3 -(resp. a facet \ccc{f} in dimension 2) iff \ccVar.\ccc{side_of_sphere(c, p)} -(resp. \ccVar.\ccc{side_of_circle(f, p)}) returns \ccc{ON_BOUNDED_SIDE}. -The set of cells (resp. facets in dimension 2) which are in conflict with -\ccc{p} is connected, and it forms a hole. - -\ccMethod{template - std::pair - find_conflicts(Point p, Cell_handle c, - OutputIteratorBoundaryFacets bfit, - OutputIteratorCells cit);} -{Computes the conflict hole induced by \ccc{p}. The starting cell -(resp. facet) \ccc{c} must be in conflict. Then this function returns -respectively in the output iterators:\\ --- \ccc{cit}: the cells (resp. facets) in conflict.\\ --- \ccc{bfit}: the facets (resp. edges) on the boundary, that is, the facets -(resp. edges) \ccc{(t, i)} where the cell (resp. facet) \ccc{t} is in -conflict, but \ccc{t->neighbor(i)} is not.\\ -This function can be used in conjunction with \ccc{insert_in_hole()} in order -to decide the insertion of a point after seeing which elements of the -triangulation are affected. -Returns the pair composed of the resulting output iterators. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 2$, and \ccc{c} is in conflict -with \ccc{p}.} -} - -\ccMethod{template - Triple - find_conflicts(Point p, Cell_handle c, - OutputIteratorBoundaryFacets bfit, - OutputIteratorCells cit, - OutputIteratorInternalFacets ifit);} -{Same as the other \ccc{find_conflicts()} function, except that it also -computes the internal facets, i.e. the facets common to two cells which -are in conflict with \ccc{p}. -Then this function returns respectively in the output iterators:\\ --- \ccc{cit}: the cells (resp. facets) in conflict.\\ --- \ccc{bfit}: the facets (resp. edges) on the boundary, that is, the facets -(resp. edges) \ccc{(t, i)} where the cell (resp. facet) \ccc{t} is in -conflict, but \ccc{t->neighbor(i)} is not.\\ --- \ccc{ifit}: the facets (resp. edges) inside the hole, that is, delimiting -two cells (resp facets) in conflict.\\ -Returns the \ccc{Triple} composed of the resulting output iterators. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 2$, and \ccc{c} is in conflict -with \ccc{p}.} -} - -\begin{ccDeprecated} -\ccMethod{template - OutputIterator - vertices_in_conflict(Point p, Cell_handle c, - OutputIterator res);} -{This function is renamed \ccc{vertices_on_conflict_zone_boundary} since CGAL-3.8.} -\end{ccDeprecated} -\ccMethod{template - OutputIterator - vertices_on_conflict_zone_boundary(Point p, Cell_handle c, - OutputIterator res);} -{Similar to \ccc{find_conflicts()}, but reports the vertices which are on the -boundary of the conflict hole of \ccc{p}, in the output iterator \ccc{res}. -Returns the resulting output iterator. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 2$, and \ccc{c} is in conflict -with \ccc{p}.} -} - -A face (cell, facet or edge) is said to be a Gabriel face iff -its smallest circumscribing sphere do not enclose -any vertex of the triangulation. Any Gabriel face belongs to the -Delaunay triangulation, but the reciprocal is not true. -The following member functions test the Gabriel property of -Delaunay faces. -\ccMethod{bool is_Gabriel(Cell_handle c, int i);}{} -\ccGlue -\ccMethod{bool is_Gabriel(Cell_handle c, int i, int j);}{} -\ccGlue -\ccMethod{bool is_Gabriel(const Facet& f);}{} -\ccGlue -\ccMethod{bool is_Gabriel(const Edge& e);} {} - - -\ccHeading{Voronoi diagram} -\ccIndexMainItem{Voronoi diagram} -\cgal\ offers several functionalities to display the Voronoi diagram of -a set of points in 3D. - -Note that the user should use a kernel with exact constructions in order -to guarantee the computation of the Voronoi diagram (as opposed to computing -the triangulation only, which requires only exact predicates). - -\ccMethod{Point dual(Cell_handle c) const;} -{Returns the circumcenter of the four vertices of c. -\ccPrecond{\ccVar.\ccc{dimension()}$=3$ and \ccc{c} is not infinite.}} - -\ccMethod{Object dual(Facet f) const;} -{Returns the dual of facet \ccc{f}, which is \\ -in dimension 3: either a segment, if the two cells incident to \ccc{f} -are finite, or a ray, if one of them is infinite;\\ -in dimension 2: a point. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 2$ and \ccc{f} is not infinite.}} - -\ccMethod{Object dual(Cell_handle c, int i) const;} -{same as the previous method for facet \ccc{(c,i)}.} - -\ccMethod{Line dual_support(Cell_handle c, int i) const;} -{returns the line supporting the dual of the facet. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 2$ and \ccc{f} is not infinite.}} - -\ccMethod{template Stream & draw_dual(Stream & os);} -{Sends the set of duals to all the facets of \ccVar\ into \ccc{os}.} - - -\begin{ccDebug} -\ccHeading{Checking} -\ccMethod{bool - is_valid(bool verbose = false) const;} -{Checks the combinatorial validity of the triangulation and the -validity of its geometric embedding (see -Section~\ref{Triangulation3-sec-intro}). Also checks that all the -circumscribing spheres (resp. circles in dimension~2) of cells -(resp. facets in dimension~2) are empty.\\ When \ccc{verbose} is set to -true, messages describing the first invalidity encountered are -printed.} - -\ccMethod{bool - is_valid(Cell_handle c, bool verbose = false) const;} -{Checks the combinatorial and geometric validity of the cell (see -Section~\ref{Triangulation3-sec-intro}). Also checks that the -circumscribing sphere (resp. circle in dimension~2) of cells -(resp. facet in dimension~2) is empty.\\ - When \ccc{verbose} is set to -true, messages are printed to give -a precise indication of the kind of invalidity encountered.} - -These methods are mainly a debugging help for the users of advanced features. -\end{ccDebug} - -\ccSeeAlso - -\ccc{CGAL::Regular_triangulation_3} - -\end{ccRefClass} diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/RegularCellBase_3.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/RegularCellBase_3.tex deleted file mode 100644 index bae65f3d8f9..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/RegularCellBase_3.tex +++ /dev/null @@ -1,89 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: RegularCellBase_3.tex -% +------------------------------------------------------------------------+ -% | 12.04.2000 Author -% | Package: Package -% | -\RCSdef{\RCSRegularcellbaseRev}{$Id$} -\RCSdefDate{\RCSRegularcellbaseDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefConcept}{RegularTriangulationCellBase_3} - -%% \ccHtmlCrossLink{} %% add further rules for cross referencing links -%% \ccHtmlIndexC[concept]{} %% add further index entries - -\ccDefinition - -The regular triangulation of a set of weighted points does not -necessarily -have one vertex for each of the input points. Some of the input -weighted points have no cell in the dual power diagrams -and therefore do not correspond to a vertex of the regular -triangulation. -Those weighted points are said to be {\it hidden} points. -A point which is hidden at a given time may appear later as a vertex of -the regular triangulation upon removal on some other weighted point. -Therefore, hidden points have to be stored somewhere. -The regular triangulation stores those hidden points -in its cells. - -A hidden point can appear as vertex of the triangulation -only when the -three dimensional cell where its point component is located -(the cell which hides it) -is removed. Therefore we decided to store -in each cell of a regular triangulation -the list of hidden points that are located in the face. -Thus points hidden by a face are easily reinserted in the triangulation -when the face is removed. - -The base cell of a regular triangulation -has to be a model -of the concept \ccRefName, which refines -the concept \ccc{TriangulationCellBase_3} by adding -in the cell a container to store hidden points. - -\ccRefines -\ccc{TriangulationCellBase_3} - -\ccTypes -\ccNestedType{Point} -{Must be the same as the point type \ccc{TriangulationTraits_3::Point_3} -defined by the geometric traits class of the triangulation.} - -\ccTypes -\ccNestedType{Point_iterator} -{Iterator of value type Point} - - -\ccCreationVariable{rcb} %% choose variable name - - -\ccHeading{Access Functions} -\ccMethod{Point_iterator hidden_points_begin();} -{Returns an iterator pointing to the first hidden point.} - -\ccMethod{Point_iterator hidden_points_end();} -{Returns a past-the-end iterator.} - -\ccHeading{Setting} -\ccMethod{void hide_point(const Point & p);} -{Adds \ccc{p} to the set of hidden points of the cell.} - -\ccHasModels -\ccc{CGAL::Regular_triangulation_cell_base_3} - -\ccSeeAlso -\ccc{TriangulationCellBase_3} - -\end{ccRefConcept} - -% +------------------------------------------------------------------------+ -%%RefPage: end of main body, begin of footer -% EOF -% +------------------------------------------------------------------------+ - diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/RegularTriangulationTraits_3.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/RegularTriangulationTraits_3.tex deleted file mode 100644 index eab9b4165a5..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/RegularTriangulationTraits_3.tex +++ /dev/null @@ -1,198 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Triangulation_Traits_3.tex -% +------------------------------------------------------------------------+ -% | 27.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSTriangulationTraitsRev}{$Id$} -\RCSdefDate{\RCSTriangulationTraitsDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefConcept}{RegularTriangulationTraits_3} - -\ccDefinition -The concept \ccRefName\ is the first template parameter of the class -\ccc{Regular_triangulation_3}. It defines the geometric objects (points, -segments...) forming the triangulation together with a few geometric -predicates and constructions on these objects. - -\ccRefines \ccc{TriangulationTraits_3} - -In addition to the requirements described for the traits class of -\ccc{Triangulation_3}, the geometric traits class of -\ccc{Regular_triangulation_3} must fulfill the following requirements. -%It must provide definitions for the \textit{power tests}. - - -\ccTypes -\ccTwo{DelaunayTriangulationTraits_3::Object_3_xxxxx}{} - -\ccNestedType{Line_3}{The line type.} -\ccGlue -\ccNestedType{Object_3}{The object type.} -\ccGlue -\ccNestedType{Plane_3}{The plane type.} -\ccGlue -\ccNestedType{Ray_3}{The ray type.} - - - - -We use here the same notation as in -Section~\ref{Triangulation3-sec-class-Regulartriangulation}. -To simplify notation, $p$ will often denote in the sequel either the -point $p\in\R^3$ or the weighted point ${p}^{(w)}=(p,w_p)$. - -\ccTwo{RegularTriangulationTraits_3::Weighted_point_3xx}{} -\ccNestedType{Weighted_point_3}{The weighted point type.} - -\ccTwo{Regular}{} -\ccNestedType{Power_test_3} -{A predicate object which must provide the following function operators: -% -\\ -\\ -\ccc{Oriented_side operator()( Weighted_point_3 p, - Weighted_point_3 q, - Weighted_point_3 r, - Weighted_point_3 s, - Weighted_point_3 t)},\\ -which performs the following:\\ -Let ${z(p,q,r,s)}^{(w)}$ be the power sphere of the weighted points -$(p,q,r,s)$. Returns \\ -\ccc{ON_ORIENTED_BOUNDARY} if \ccc{t} is orthogonal to -${z(p,q,r,s)}^{(w)}$,\\ -\ccc{ON_NEGATIVE_SIDE} if \ccc{t} lies outside the oriented sphere of -center $z(p,q,r,s)$ and radius $\sqrt{ w_{z(p,q,r,s)}^2 + w_t^2 }$ -(which is equivalent to $\Pi({t}^{(w)},{z(p,q,r,s)}^{(w)} >0$)),\\ -\ccc{ON_POSITIVE_SIDE} if \ccc{t} lies inside this oriented sphere. -\ccPrecond{\ccc{p, q, r, s} are not coplanar.} -% -Note that with this definition, if all the points have a weight equal -to 0, then -\ccc{power_test_3(p,q,r,s,t)} = \ccc{side_of_oriented_sphere(p,q,r,s,t)}. -% -% -\\ -\\ -\ccc{Oriented_side operator()( Weighted_point_3 p, - Weighted_point_3 q, - Weighted_point_3 r, - Weighted_point_3 t)},\\ -which has an -definition analogous to the previous method, for coplanar points, -with the power circle ${z(p,q,r)}^{(w)}$. -\ccPrecond{\ccc{p, q, r} are not collinear and \ccc{p, q, r, t} are -coplanar.} -% -If all the points have a weight equal to 0, then -\ccc{power_test_3(p,q,r,t)} = \ccc{side_of_oriented_circle(p,q,r,t)}. -% -\\ -\\ -\ccc{Oriented_side operator()( Weighted_point_3 p, - Weighted_point_3 q, - Weighted_point_3 t)},\\ -which is the same for collinear points, where ${z(p,q)}^{(w)}$ is the -power segment of \ccc{p} and \ccc{q}. -\ccPrecond{\ccc{p} and \ccc{q} have different Bare\_points, and -\ccc{p, q, t} are collinear.} -% -If all points have a weight equal to 0, then -\ccc{power_test_3(p,q,t)} gives the same answer as the kernel predicate -\ccc{s(p,q).has_on(t)} would give, where \ccc{s(p,q)} denotes the -segment with endpoints \ccc{p} and \ccc{q}. -% -\\ -\\ -\ccc{Oriented_side operator()( Weighted_point_3 p, Weighted_point_3 q)},\\ -which is the same for equal points, that is when \ccc{p} and \ccc{q} -have equal coordinates, then it returns the comparison of the weights -(\ccc{ON_POSITIVE_SIDE} when \ccc{q} is heavier than \ccc{p}). -\ccPrecond{\ccc{p} and \ccc{q} have equal Bare\_points.} -} - -The following predicate is required if a call to -\ccc{nearest_power_vertex} -or \ccc{nearest_power_vertex_in_cell} is issued: - -\ccNestedType{Compare_power_distance_3} -{A predicate object that must provide the function operator\\ -\ccc{Comparison_result operator()(Point_3 p, Weighted_point_3 q, -Weighted_point_3 r)},\\ -which compares the power distance between \ccc{p} and \ccc{q} -to the power distance -between \ccc{p} and \ccc{r}.} - -In addition, only when the dual operations are used, the traits class -must provide the following constructor objects: - -\ccTwo{DelaunayTriangulationTraits_3}{} -\ccNestedType{Construct_weighted_circumcenter_3} -{A constructor type. The operator() constructs the bare point - which is the center of the smallest orthogonal sphere to the input -weighted points. \\ -\ccc{Bare_point operator() ( Weighted_point_3 p, - Weighted_point_3 q, - Weighted_point_3 r, - Weighted_point_3 s);} -} -\ccGlue -\ccNestedType{Construct_object_3} -{A constructor object that must provide the function operators\\ -\ccc{Object_3 operator()(Point_3 p)},\\ -\ccc{Object_3 operator()(Segment_3 s)} and\\ -\ccc{Object_3 operator()(Ray_3 r)}\\ -that construct an object respectively from a point, a segment and a ray.} -\ccGlue -\ccNestedType{Construct_perpendicular_line_3} -{A constructor object that must provide the function operator\\ -\ccc{Line_3 operator()(Plane_3 pl, Point_3 p)},\\ -which constructs the line perpendicular to \ccc{pl} passing through \ccc{p}.} -\ccGlue -\ccNestedType{Construct_plane_3} -{A constructor object that must provide the function operator\\ -\ccc{Plane_3 operator()(Point_3 p, Point_3 q, Point_3 r)},\\ -which constructs the plane passing through \ccc{p}, \ccc{q} and \ccc{r}. -\ccPrecond{\ccc{p}, \ccc{q} and \ccc{r} are non collinear.}} -\ccGlue -\ccNestedType{Construct_ray_3} -{A constructor object that must provide the function operator\\ -\ccc{Ray_3 operator()(Point_3 p, Line_3 l)},\\ -which constructs the ray starting at \ccc{p} with direction given by \ccc{l}.} - - - - - -\ccOperations - -The following function gives access to the predicate object: -\ccThree{coplanar_side_of_bounded}{gt.xxxxxxxxx(Point p0, Point p1)x}{} -\ccCreationVariable{traits} %% choose variable name - -\ccMethod{Power_test_3 power_test_3_object();}{} - -The following functions must be provided only if the member functions - of \ccc{Regular_triangulation_3} returning elements of the dual diagram -are called: - -\ccMethod{Construct_weighted_circumcenter_3 construct_weighted_circumcenter_3_object();}{} -\ccGlue -\ccMethod{Construct_object_3 construct_object_3_object();}{} -\ccGlue -\ccMethod{Construct_perpendicular_line_3 construct_perpendicular_line_object();}{} -\ccGlue -\ccMethod{Construct_plane_3 construct_plane_3_object();}{} -\ccGlue -\ccMethod{Construct_ray_3 construct_ray_3_object();}{} - -\ccHasModels - -\ccc{CGAL::Regular_triangulation_euclidean_traits_3}\\ - - -\end{ccRefConcept} diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Regular_triangulation_3.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Regular_triangulation_3.tex deleted file mode 100644 index 0ae9b2d4942..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Regular_triangulation_3.tex +++ /dev/null @@ -1,426 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Regular_triangulation_3.tex -% +------------------------------------------------------------------------+ -% | 27.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSRegulartriangulationRev}{$Id$} -\RCSdefDate{\RCSRegulartriangulationDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefClass}{Regular_triangulation_3} - -\ccDefinition - Let ${S}^{(w)}$ be a set of weighted points in $\R^3$. Let -${p}^{(w)}=(p,w_p), p\in\R^3, w_p\in\R$ and -${z}^{(w)}=(z,w_z), z\in\R^3, w_z\in\R$ be two weighted points. -A weighted point -${p}^{(w)}=(p,w_p)$ can also be seen as a sphere of center $p$ and -radius $\sqrt{w_p}$. -The \textit{power product} (or \textit{power distance} ) -between ${p}^{(w)}$ and ${z}^{(w)}$ is -defined as -\[\Pi({p}^{(w)},{z}^{(w)}) = {\|{p-z}\|^2-w_p-w_z}\] -where $\|{p-z}\|$ is the Euclidean distance between $p$ and $z$. - ${p}^{(w)}$ and ${z}^{(w)}$ -are said to be \textit{orthogonal} if $\Pi{({p}^{(w)}-{z}^{(w)})} -= 0$ (see Figure~\ref{Triangulation3-fig-ortho}). - -Four weighted points have a unique common orthogonal weighted point called -the \textit{power sphere}. A sphere ${z}^{(w)}$ is said to be -\textit{regular} if $\forall {p}^{(w)}\in{S}^{(w)}, -\Pi{({p}^{(w)}-{z}^{(w)})}\geq 0$. - -A triangulation of ${S}^{(w)}$ is \textit{regular} if the power spheres -of all simplices are regular. - -\ccInclude{CGAL/Regular_triangulation_3.h} - -\ccParameters - -The first template argument must be a model of the -\ccc{RegularTriangulationTraits_3} concept. - -The second template argument must be a model of the -\ccc{TriangulationDataStructure_3} concept. -It has the default value \ccc{Triangulation_data_structure_3, Regular_triangulation_cell_base_3 >}. - - -\ccInheritsFrom{\ccc{Triangulation_3}} - -\ccTypes -\ccThree{typedef RegularTriangulationTraits_3::Weighted_point_3}{Weighted_point}{} - -\ccTypedef{typedef RegularTriangulationTraits_3::Bare_point Bare_point;} -{The type for points -\ccc{p} of weighted points ${p}^{(w)}=(p,w_p)$} -\ccGlue -\ccTypedef{typedef RegularTriangulationTraits_3::Weighted_point_3 Weighted_point;}{} - -\ccCreation -\ccCreationVariable{rt} - - -\ccThree{Regular_triangulation_3} -{rt( RegularTriangulationTraits_3 traits );xxx}{} - -\ccConstructor{Regular_triangulation_3 -(const RegularTriangulationTraits_3 & traits = RegularTriangulationTraits_3())} -{Creates an empty regular triangulation, possibly specifying a traits class -\ccc{traits}.} - -\ccConstructor{Regular_triangulation_3 -(const Regular_triangulation_3 & rt1)} {Copy constructor.} - -\ccConstructor{template < class InputIterator > - Regular_triangulation_3 (InputIterator first, InputIterator last, - const RegularTriangulationTraits_3& traits = RegularTriangulationTraits_3())} -{Equivalent to constructing an empty triangulation with the optional -traits class argument and calling \ccc{insert(first,last)}.} - -\ccOperations - - -\ccHeading{Insertion} -\ccThree{OutputIterator}{dt.insertxx}{} - -The following methods, which already exist in \ccc{Triangulation_3}, are -overloaded to ensure the property that all power spheres are regular. - -\ccMethod{Vertex_handle insert(const Weighted_point & p, - Cell_handle start = Cell_handle() );} -{Inserts weighted point \ccc{p} in the triangulation. The optional -argument \ccc{start} is used as a starting place for the search.\\ -If this insertion creates a vertex, this vertex is returned.\\ -If \ccc{p} coincides with an existing vertex and has a greater weight, -then the existing weighted point becomes hidden (see -\ccc{RegularTriangulationCellBase_3}) and \ccc{p} replaces it as vertex -of the triangulation.\\ -If \ccc{p} coincides with an already existing vertex (both point and -weights being equal), then this vertex is returned and the triangulation -remains unchanged.\\ -Otherwise if \ccc{p} does not appear as a vertex of the triangulation, -then it is stored as a hidden point and this method returns the default -constructed handle.} - -\ccMethod{Vertex_handle insert(const Weighted_point & p, Vertex_handle hint);} -{ Same as above but uses \ccc{hint} as a starting place for the search. } - -\ccMethod{Vertex_handle insert(const Weighted_point & p, Locate_type lt, - Cell_handle loc, int li, int lj);} -{Inserts weighted point \ccc{p} in the triangulation and returns the corresponding - vertex. Similar to the above \ccc{insert()} function, but takes as additional - parameter the return values of a previous location query. See description of - \ccc{Triangulation_3::locate()}.} - -The following method allows one to insert several points. - -\ccMethod{template < class InputIterator > - std::ptrdiff_t - insert(InputIterator first, InputIterator last);} -{Inserts the weighted points in the range $\left[\right.$\ccc{first}, -\ccc{last}$\left.\right)$. -Note that this function is not guaranteed to insert the points -following the order of \ccc{InputIterator}. -It returns the difference of the number of vertices between after and -before the insertions (it may be negative due to hidden points). -\ccPrecond{The \ccc{value_type} of \ccc{first} and \ccc{last} is -\ccc{Weighted_point}.}} - -The following methods, which already exist in \ccc{Triangulation_3}, are -overloaded to ensure that hidden points are well created and maintained. - -\ccMethod{template - Vertex_handle insert_in_hole(Weighted_point p, CellIt cell_begin, CellIt cell_end, - Cell_handle begin, int i);} -{Creates a new vertex by starring a hole. It takes an iterator range -[\ccc{cell_begin}; \ccc{cell_end}[ of \ccc{Cell_handle}s which specifies -a hole: a set of connected cells (resp. facets in dimension 2) which is -star-shaped wrt \ccc{p}. -(\ccc{begin}, \ccc{i}) is a facet (resp. an edge) on the boundary of the hole, -that is, \ccc{begin} belongs to the set of cells (resp. facets) previously -described, and \ccc{begin->neighbor(i)} does not. Then this function deletes -all the cells (resp. facets) describing the hole, creates a new vertex -\ccc{v}, and for each facet (resp. edge) on the boundary of the hole, creates -a new cell (resp. facet) with \ccc{v} as vertex. Then \ccc{v->set_point(p)} -is called and \ccc{v} is returned.\\ -If the hole contains interior vertices, each of them is hidden by the insertion -of \ccc{p} and is stored in the new cell which contains it. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 2$, the set of cells (resp. facets in -dimension 2) is connected, not empty, its boundary is connected, and \ccc{p} -lies inside the hole, which is star-shaped wrt \ccc{p}}.} - -\ccMethod{template - Vertex_handle insert_in_hole(Weighted_point p, CellIt cell_begin, CellIt cell_end, - Cell_handle begin, int i, Vertex_handle newv);} -{ Same as above, except that \ccc{newv} will be used as the new vertex, which - must have been allocated previously with e.g. \ccc{create_vertex}.} - - -\ccHeading{Removal} - -\ccMethod{void remove(Vertex_handle v);} -{Removes the vertex \ccc{v} from the triangulation.} - -\ccHeading{Queries} -\ccThree{OutputIterator}{rt.side of powerxx}{} - -Let us remark that -\[\Pi({p}^{(w)}-{z}^{(w)}) > 0\] -is equivalent to\\ -\centerline{\ccc{p} lies outside the sphere with center \ccc{z} and radius -$\sqrt{w_p^2+w_z^2}$.}\\ -This remark helps provide an intuition about the following predicates. - -\begin{figure}[htbp] -\begin{ccTexOnly} -\begin{center} -\includegraphics{Triangulation_3_ref/sidedim2} -\end{center} -\end{ccTexOnly} -\caption{side\_of\_power\_circle. -\label{Triangulation3-fig-sidedim2}} -\begin{ccHtmlOnly} -

-side_of_power_circle -
-\end{ccHtmlOnly} -\end{figure} - -\ccMethod{Bounded_side - side_of_power_sphere(Cell_handle c, const Weighted_point & p) const;} -{Returns the position of the weighted point $p$ with respect to the -power sphere of \ccc{c}. More precisely, it returns:\\ -- \ccc{ON_BOUNDED_SIDE} if $\Pi({p}^{(w)}-{z(c)}^{(w)})<0$ where -${z(c)}^{(w)}$ is the power sphere of \ccc{c}. For an -infinite cell this means either that \ccc{p} lies strictly in the half -space limited by its finite facet and not containing any other point -of the triangulation, or that the angle -between \ccc{p} and the power circle of the \textit{finite} facet of \ccc{c} -is greater than $\pi/2$. \\ -- \ccc{ON_BOUNDARY} if p is orthogonal to the power sphere of \ccc{c} -i.e. $\Pi({p}^{(w)}-{z(c)}^{(w)})=0$. For an infinite cell this means -that \ccc{p} is orthogonal to the power circle of its \textit{finite} facet.\\ -- \ccc{ON_UNBOUNDED_SIDE} if $\Pi({p}^{(w)}-{z(c)}^{(w)})>0$ -i.e. the angle between the weighted point \ccc{p} and the power sphere -of \ccc{c} is less than $\pi/2$ or if these two spheres do not -intersect. For an -infinite cell this means that \ccc{p} does not satisfy either of the -two previous conditions. -\ccPrecond{\ccVar.\ccc{dimension()} $=3$.}} - -\ccMethod{Bounded_side - side_of_power_circle(const Facet & f, - const Weighted_point & p) const;} -{Returns the position of the point \ccc{p} with respect to the -power circle of \ccc{f}. More precisely, it returns:\\ ---- in dimension~3:\\ --- For a finite facet,\\ -\ccc{ON_BOUNDARY} if \ccc{p} is orthogonal to the power circle in the -plane of the facet,\\ -\ccc{ON_UNBOUNDED_SIDE} when their angle is less than $\pi/2$,\\ -\ccc{ON_BOUNDED_SIDE} when it is greater than $\pi/2$ (see -Figure~\ref{Triangulation3-fig-sidedim2}).\\ --- For an infinite facet, it considers the plane defined by the finite -facet of the cell \ccc{f.first}, and does the same as in -dimension~2 in this plane.\\ ---- in dimension~2:\\ --- For a finite facet,\\ -\ccc{ON_BOUNDARY} if \ccc{p} is orthogonal to the circle,\\ -\ccc{ON_UNBOUNDED_SIDE} when the angle between \ccc{p} and the -power circle of \ccc{f} is less than $\pi/2$, -\ccc{ON_BOUNDED_SIDE} when it is greater than $\pi/2$.\\ --- For an infinite facet,\\ -\ccc{ON_BOUNDED_SIDE} for a point in the open half plane defined by -\ccc{f} and not containing any other point of the triangulation,\\ -\ccc{ON_UNBOUNDED_SIDE} in the other open half plane.\\ -If the point \ccc{p} is collinear with the finite edge \ccc{e} of -\ccc{f}, it returns:\\ -\ccc{ON_BOUNDED_SIDE} if $\Pi({p}^{(w)}-{z(e)}^{(w)})<0$, where -${z(e)}^{(w)}$ is the power segment of \ccc{e} in the line supporting -\ccc{e},\\ -\ccc{ON_BOUNDARY} if $\Pi({p}^{(w)}-{z(e)}^{(w)})=0$,\\ -\ccc{ON_UNBOUNDED_SIDE} if $\Pi({p}^{(w)}-{z(e)}^{(w)})>0$ . -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 2$.}} - -\ccMethod{Bounded_side - side_of_power_circle(Cell_handle c, int i, - const Weighted_point & p) const;} -{Same as the previous method for facet \ccc{i} of cell \ccc{c}.} - -\ccMethod{Bounded_side - side_of_power_segment(Cell_handle c, const Weighted_point & p) -const;} -{In dimension~1, returns\\ -\ccc{ON_BOUNDED_SIDE} if $\Pi({p}^{(w)}-{z(c)}^{(w)})<0$, where -${z(c)}^{(w)}$ is the power segment of the edge represented by -\ccc{c},\\ -\ccc{ON_BOUNDARY} if $\Pi({p}^{(w)}-{z(c)}^{(w)})=0$,\\ -\ccc{ON_UNBOUNDED_SIDE} if $\Pi({p}^{(w)}-{z(c)}^{(w)})>0$ . -\ccPrecond{\ccVar.\ccc{dimension()} $= 1$.}} - -\ccMethod{Vertex_handle nearest_power_vertex(Weighted_point p, - Cell_handle c = Cell_handle());} -{Returns the vertex of the triangulation which is nearest to $p$ -with respect to the power distance. This means that the power -of the query point \ccc{p} with respect to the weighted point in -the returned vertex is smaller than the power of \ccc{p} - with respect to the weighted point -in any other vertex. Ties are broken arbitrarily. -The default constructed -handle is returned if the triangulation is empty. -The optional argument \ccc{c} is a hint -specifying where to start the search. -\ccPrecond{\ccc{c} is a cell of \ccVar.} -} - - -\ccMethod{Vertex_handle nearest_power_vertex_in_cell(Weighted_point p, - Cell_handle c);} -{Returns the vertex of the cell \ccc{c} -that is nearest to $p$ -with respect to the power distance. -} - -A weighted point \ccc{p} is said to be in conflict -with a cell \ccc{c} in dimension 3 -(resp. with a facet \ccc{f} in dimension 2) -if it has a negative power distance -to the power sphere of \ccc{c} -(resp. to the power circle of \ccc{f}). -The set of cells (resp. facets in dimension 2) which are in conflict with -\ccc{p} is connected. - -\ccMethod{template - Triple - find_conflicts(const Weighted_point p, Cell_handle c, - OutputIteratorBoundaryFacets bfit, - OutputIteratorCells cit, - OutputIteratorInternalFacets ifit);} -{ Compute the conflicts with \ccc{p}. - The starting cell -(resp. facet) \ccc{c} must be in conflict with \ccc{p}. -Then this function returns -respectively in the output iterators:\\ --- \ccc{cit}: the cells (resp. facets) in conflict with \ccc{p}.\\ --- \ccc{bfit}: the facets (resp. edges) on the boundary of the -conflict zone, that is, the facets -(resp. edges) \ccc{(t, i)} where the cell (resp. facet) \ccc{t} is in -conflict, but \ccc{t->neighbor(i)} is not.\\ --- \ccc{ifit}: the facets (resp. edges) inside the conflict zone, -that facets incident to two cells (resp facets) in conflict.\\ -Returns the \ccc{Triple} composed of the resulting output iterators. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 2$, and \ccc{c} is in conflict -with \ccc{p}.} -} - -\begin{ccDeprecated} -\ccMethod{template - OutputIterator - vertices_in_conflict(Weighted_point p, Cell_handle c, - OutputIterator res);} -{This function is renamed \ccc{vertices_on_conflict_zone_boundary} since CGAL-3.8.} -\end{ccDeprecated} -\ccMethod{template - OutputIterator - vertices_on_conflict_zone_boundary(Weighted_point p, Cell_handle c, - OutputIterator res);} -{Similar to \ccc{find_conflicts()}, but reports the vertices which are on the -boundary of the conflict zone of \ccc{p}, in the output iterator \ccc{res}. -Returns the resulting output iterator. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 2$, and \ccc{c} is a cell containing - \ccc{p}.} -} - -\ccMethod{template - OutputIterator - vertices_inside_conflict_zone(Weighted_point p, Cell_handle c, - OutputIterator res);} -{Similar to \ccc{find_conflicts()}, but reports the vertices which are in - the interior of the conflict zone of \ccc{p}, in the output iterator - \ccc{res}. The vertices that are on the boundary of the conflict zone are - not reported. -Returns the resulting output iterator. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 2$, and \ccc{c} is a cell containing - \ccc{p}.} -} - -In the weighted setting, a face (cell, facet, edge or vertex) -is said to be a Gabriel face iff -the smallest sphere orthogonal to the weighted -points associated to its vertices, -has a positive power product with the weighted point -of any other vertex of the triangulation. -Any weighted Gabriel face belongs to the -regular triangulation, but the reciprocal is not true. -The following member functions test the Gabriel property of the -faces of the regular triangulation. -\ccMethod{bool is_Gabriel(Cell_handle c, int i);}{} -\ccGlue -\ccMethod{bool is_Gabriel(Cell_handle c, int i, int j);}{} -\ccGlue -\ccMethod{bool is_Gabriel(const Facet& f);}{} -\ccGlue -\ccMethod{bool is_Gabriel(const Edge& e);} {} -\ccGlue -\ccMethod{bool is_Gabriel(Vertex_handle v);}{} - - -\ccHeading{Power diagram} -\ccIndexMainItem{Power diagram} -\cgal\ offers several functionalities to display the Power diagram of -a set of points in 3D. - -Note that the user should use a kernel with exact constructions in order -to guarantee the computation of the Voronoi diagram (as opposed to computing -the triangulation only, which requires only exact predicates). - -\ccMethod{Weighted_point dual(Cell_handle c) const;} -{Returns the weighted circumcenter of the four vertices of c. -\ccPrecond{\ccVar.\ccc{dimension()}$=3$ and \ccc{c} is not infinite.}} - -\ccMethod{Object dual(Facet f) const;} -{Returns the dual of facet \ccc{f}, which is \\ -in dimension 3: either a segment, if the two cells incident to \ccc{f} -are finite, or a ray, if one of them is infinite;\\ -in dimension 2: a point. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 2$ and \ccc{f} is not infinite.}} - -\ccMethod{Object dual(Cell_handle c, int i) const;} -{same as the previous method for facet \ccc{(c,i)}.} - -\ccMethod{template Stream & draw_dual(Stream & os);} -{Sends the set of duals to all the facets of \ccVar\ into \ccc{os}.} - - -\begin{ccDebug} -\ccHeading{Checking} -\ccMethod{bool - is_valid(bool verbose = false) const;} -{Checks the combinatorial validity of the triangulation and the -validity of its geometric embedding (see -Section~\ref{Triangulation3-sec-intro}). Also checks that all the -power spheres (resp. power circles in dimension~2, power segments in -dimension~1) of cells (resp. facets in dimension~2, edges in -dimension~1) are regular. When \ccc{verbose} -is set to true, messages describing the first invalidity encountered -are printed.\\ This method is mainly a debugging help for the users of -advanced features. -} - -\end{ccDebug} - -%\ccSeeAlso - -%% \ccExample - -%% \ccIncludeExampleCode{Triangulation3/Regular_triangulation_3_prog.cpp} - -\end{ccRefClass} diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Regular_triangulation_cell_base_3.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Regular_triangulation_cell_base_3.tex deleted file mode 100644 index 3c2cbafa987..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Regular_triangulation_cell_base_3.tex +++ /dev/null @@ -1,55 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Regular_triangulation_face_base_2.tex -% +------------------------------------------------------------------------+ -% | 12.04.2000 Author -% | Package: Package -% | -\RCSdef{\RCSRegulartriangulationcellbaseRev}{$Id$} -\RCSdefDate{\RCSRegulartriangulationcellbaseDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefClass}{Regular_triangulation_cell_base_3} %% add template arg's if necessary - -%% \ccHtmlCrossLink{} %% add further rules for cross referencing links -%% \ccHtmlIndexC[class]{} %% add further index entries - -\ccDefinition -The class \ccRefName\ is a model of the concept -\ccc{RegularTriangulationCellBase_3}. It is the default face base class -of regular triangulations. - -\ccInclude{CGAL/Regular_triangulation_cell_base_3.h} - - -\ccParameters -The template parameters \ccc{Traits} has to be a model -of \ccc{RegularTriangulationTraits_3}. - -The template parameter \ccc{Cb} has to be a model -of \ccc{TriangulationCellBase_3}. By default, this parameter is -instantiated by -\ccc{CGAL::Triangulation_cell_base_3}. - - -\ccIsModel -\ccc{RegularTriangulationCellBase_3} - -\ccInheritsFrom -\ccc{Cb} - -\ccSeeAlso -\ccc{RegularTriangulationCellBase_3} \\ -\ccc{RegularTriangulationTraits_3} \\ -\ccc{CGAL::Regular_triangulation_3} - - -\end{ccRefClass} - -% +------------------------------------------------------------------------+ -%%RefPage: end of main body, begin of footer -% EOF -% +------------------------------------------------------------------------+ - diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Regular_triangulation_euclidean_traits_3.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Regular_triangulation_euclidean_traits_3.tex deleted file mode 100644 index ae012b1f475..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Regular_triangulation_euclidean_traits_3.tex +++ /dev/null @@ -1,273 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Regular_triangulation_euclidean_traits_3.tex -% +------------------------------------------------------------------------+ -% | 27.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSRegulartriangulationeuclideantraitsRev}{$Id$} -\RCSdefDate{\RCSRegulartriangulationeuclideantraitsDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefClass}{Regular_triangulation_euclidean_traits_3} %% add template arg's if necessary - -%% \ccHtmlCrossLink{} %% add further rules for cross referencing links -%% \ccHtmlIndexC[class]{} %% add further index entries - -\ccDefinition - -The class \ccRefName\ is designed as a default traits class for the -class \ccc{Regular_triangulation_3}. -It provides \ccc{Weighted_point_3}, a class for weighted points, which derives -from the three dimensional point class \ccc{K::Point_3}. - -The first argument \ccc{K} must be a model of the \ccc{Kernel} concept. - -The second argument \ccc{Weight} of the class -\ccc{Regular_triangulation_euclidean_traits_3} is in fact -optional: if is it not provided, \ccc{K::RT} will be used. - -The class is a model of the concept \ccc{RegularTriangulationTraits_3} -but it also contains predicates and constructors on weighted points -that are not required in the -concept \ccc{RegularTriangulationTraits_3}. - -Note that filtered predicates are automatically used if the -boolean \ccc{Has_filtered_predicates} in the kernel provided as template parameter -of that class is set to \ccc{true}. - -% Note that this template class is specialized for -% \ccc{CGAL::Exact_predicates_inexact_constructions_kernel}, so that it is as if -% \ccc{Regular_triangulation_filtered_traits_3} was used, i.e. you get -% filtered predicates automatically. - - - - -\ccInclude{CGAL/Regular_triangulation_euclidean_traits_3.h} - -\ccIsModel -\ccc{RegularTriangulationTraits_3} - -\ccInheritsFrom{\ccc{K}} - -\ccTypes -\ccThree{typedef Weighted_point }{Weighted_point_3;}{} - -\ccTypedef{typedef K::Point_3 Bare_point;} -{The type for point $p$ of a weighted point ${p}^{(w)}=(p,w_p)$.} -\ccGlue -\ccTypedef{typedef Weighted_point -Weighted_point_3;} -{The type for weighted points.} - -\ccHeading{Types for predicate functors} -\ccTwo{Regular}{} -\ccNestedType{Power_test_3} -{A predicate type for power test. Belongs to the -\ccc{RegularTriangulationTraits_3} concept.} - -\ccNestedType{Compare_power_distance_3} -{A predicate type to compare power distance. Belongs to the -\ccc{RegularTriangulationTraits_3} concept.} - - -\ccNestedType{Compare_weighted_squared_radius_3} -{A predicate type. The operator() takes weighted point(s) as arguments, -together with one weight. It compares the weight of the smallest sphere -orthogonal to the weighted points with the input weight.\\ -\ccc{Comparison_result operator()( Weighted_point_3 p, - Weighted_point_3 q, - Weighted_point_3 r, - Weighted_point_3 s, - FT w) ;} \\ -\ccc{Comparison_result operator()( Weighted_point_3 p, - Weighted_point_3 q, - Weighted_point_3 r, - FT w) ;} \\ -\ccc{Comparison_result operator()( Weighted_point_3 p, - Weighted_point_3 q, - FT w) ;} \\ -\ccc{Comparison_result operator()( Weighted_point_3 p, - FT w) ;} \\ -} - - -\ccNestedType{In_smallest_orthogonal_sphere_3} -{A predicate type. The operator() takes weighted points as arguments - and returns the sign of the power distance of the last one -with respect to the smallest sphere orthogonal to the others. \\ -\ccc{Sign operator()( Weighted_point_3 p, - Weighted_point_3 q, - Weighted_point_3 r, - Weighted_point_3 s, - Weighted_point_3 t) ;} \\ -\ccc{Sign operator()( Weighted_point_3 p, - Weighted_point_3 q, - Weighted_point_3 r, - Weighted_point_3 s) ;} \\ -\ccc{Sign operator()( Weighted_point_3 p, - Weighted_point_3 q, - Weighted_point_3 r) ;} \\ -\ccc{Sign operator()( Weighted_point_3 p, - Weighted_point_3 q) ;} \\ -} - - -\ccNestedType{Side_of_bounded_orthogonal_sphere_3} -{A predicate type. The operator() is similar to the operator() of -\ccc{In_smallest_orthogonal_sphere_3} -except that the returned type is not a \ccc{Sign} -but belongs to the enum \ccc{Bounded_side} -(A \ccc{NEGATIVE}, \ccc{ZERO} and \ccc{POSITIVE}) - corresponding respectively to -\ccc{ON_BOUNDED_SIDE}, \ccc{ON_BOUNDARY} and \ccc{ON_UNBOUNDED_SIDE})). - \\ -\ccc{Bounded_side operator() ( Weighted_point_3 p, - Weighted_point_3 q, - Weighted_point_3 r, - Weighted_point_3 s, - Weighted_point_3 t) ; } \\ -\ccc{Bounded_side operator() ( Weighted_point_3 p, - Weighted_point_3 q, - Weighted_point_3 r, - Weighted_point_3 s) ; } \\ -\ccc{Bounded_side operator() ( Weighted_point_3 p, - Weighted_point_3 q, - Weighted_point_3 r) ; } -} - - -\ccNestedType{Does_simplex_intersect_dual_support_3} -{A predicate type. The operator() -takes weighted points as arguments, -considers the subspace of points with equal power distance -with respect to its arguments -and the intersection of this subspace with the affine hull of the bare -points associated to the arguments. -The operator() returns \ccc{ON_BOUNDED_SIDE}, -\ccc{ON_BOUNDARY} or \ccc{ON_UNBOUNDED_SIDE} -according to the position of this intersection -with respect to the simplex formed by the bare -points. -This predicate is useful for flow computations. \\ -\ccc{Bounded_side operator()( Weighted_point_3 p, - Weighted_point_3 q, - Weighted_point_3 r, - Weighted_point_3 s) ; } \\ -\ccc{Bounded_side operator()( Weighted_point_3 p, - Weighted_point_3 q, - Weighted_point_3 r) ; }\\ -\ccc{Bounded_side operator()( Weighted_point_3 p, - Weighted_point_3 q) ; } -} - -\ccHeading{Types for constructor functors} - -\ccNestedType{Construct_weighted_circumcenter_3} -{A constructor type. The operator() constructs the bare point - which is the center of the smallest orthogonal sphere to the input -weighted points. \\ -\ccc{Bare_point operator() ( Weighted_point_3 p, - Weighted_point_3 q, - Weighted_point_3 r, - Weighted_point_3 s);} \\ -\ccc{Bare_point operator() ( Weighted_point_3 p, - Weighted_point_3 q, - Weighted_point_3 r);} \\ -\ccc{Bare_point operator() ( Weighted_point_3 p, - Weighted_point_3 q);} -} - - - -\ccNestedType{Compute_power_product_3} -{A functor type. The operator() computes the power distance between its -arguments. \\ -\ccc{FT operator() ( Weighted_point_3 p, - Weighted_point_3 q) ; } -} - - -\ccNestedType{Compute_squared_radius_smallest_orthogonal_sphere_3} -{A functor type. The operator() computes the squared radius of the -smallest sphere orthogonal to the argument(s). -\\ -\ccc{FT operator() ( Weighted_point_3 p, - Weighted_point_3 q, - Weighted_point_3 r, - Weighted_point_3 s);} \\ -\ccc{FT operator() ( Weighted_point_3 p, - Weighted_point_3 q, - Weighted_point_3 r);} \\ -\ccc{FT operator() ( Weighted_point_3 p, - Weighted_point_3 q);} \\ -\ccc{FT operator() ( Weighted_point_3 p);} \\ -} - -\ccNestedType{Compute_critical_squared_radius_3} -{A functor type. The operator() takes weighted points as arguments -and computes the squared radius -of the sphere centered in the last point and orthogonal -to the other weighted points. The last argument is a weighted point -but its weight does not matter. -This construction is ad hoc for pumping slivers. -For robustness issue, a predicate to compare critical squared radii -for a given last point should be needed. \\ -\ccc{FT operator() ( Weighted_point_3 p, - Weighted_point_3 q, - Weighted_point_3 r, - Weighted_point_3 s, - Weighted_point_3 t);} -} - - - - - -\ccOperations -The following functions give access to the predicate and constructor -functors. -\ccCreationVariable{traits} - -\ccThree{Does_simplex_intersect_dual_support_3} -{does_simplex_intersect_dual_support_3_object()}{} -\ccMethod{Power_test_3 power_test_3_object();}{} -\ccGlue -\ccMethod{Compare_power_distance_3 -compare_power_distance_3_object();}{} -\ccGlue -\ccMethod{Compare_weighted_squared_radius_3 -compare_weighted_squared_radius_3_object();}{} -\ccGlue -\ccMethod{In_smallest_orthogonal_sphere_3 - in_smallest_orthogonal_sphere_3_object();}{} -\ccGlue -\ccMethod{Side_of_bounded_orthogonal_sphere_3 - side_of_bounded_orthogonal_sphere_3_object();}{} -\ccGlue -\ccMethod{Does_simplex_intersect_dual_support_3 - does_simplex_intersect_dual_support_3_object();}{} -\ccGlue -\ccMethod{Construct_weighted_circumcenter_3 - construct_weighted_circumcenter_3_object();}{} -\ccGlue -\ccMethod{Compute_power_product_3 - compute_power_product_3_object() ;}{} -\ccGlue -\ccMethod{Compute_squared_radius_smallest_orthogonal_sphere_3 - compute_squared_radius_smallest_orthogonal_sphere_3_object() ;}{} -\ccGlue -\ccMethod{Compute_critical_squared_radius_3 - compute_critical_squared_radius_3_object();}{} - - -%% \ccExample - -%% \ccIncludeExampleCode{Triangulation3/Regular_triangulation_euclidean_traits_3_prog.cpp} - - - -\end{ccRefClass} diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Regular_triangulation_filtered_traits_3.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Regular_triangulation_filtered_traits_3.tex deleted file mode 100644 index 8cb29f8e78f..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Regular_triangulation_filtered_traits_3.tex +++ /dev/null @@ -1,46 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Regular_triangulation_filtered_traits_3.tex -% +------------------------------------------------------------------------+ -% | September 2004 Sylvain Pion -% | Package: Triangulation_3 -% | -\RCSdef{\RCSRegulartriangulationfilteredtraitsRev}{$Id$} -\RCSdefDate{\RCSRegulartriangulationfilteredtraitsDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefClass}{Regular_triangulation_filtered_traits_3} - -\begin{ccDeprecated} - -{\em Note} : this class is deprecated since \cgal\ 3.6. -The class \ccc{CGAL::Regular_triangulation_euclidean_traits_3} should be used instead. -Filtered predicates are automatically used if the boolean \ccc{Has_filtered_predicates} -in the kernel provided as template parameter of that class is set to \ccc{true}. - -\ccDefinition - -The class \ccRefName\ is designed as a traits class for the -class \ccc{Regular_triangulation_3}. -Its difference with \ccc{Regular_triangulation_euclidean_traits_3} is that it -provides filtered predicates which are meant to be fast and exact. - -The first argument \ccc{FK} must be a model of the \ccc{Kernel} concept, and -it is also restricted to be a instance of the \ccc{Filtered_kernel} template. - -\ccInclude{CGAL/Regular_triangulation_filtered_traits_3.h} - -\ccIsModel -\ccc{RegularTriangulationTraits_3} - -\ccInheritsFrom{\ccc{Regular_triangulation_euclidean_traits_3}} - -\ccSeeAlso - -\ccc{CGAL::Regular_triangulation_euclidean_traits_3}. - -\end{ccDeprecated} - -\end{ccRefClass} diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/TriangulationCellBase_3.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/TriangulationCellBase_3.tex deleted file mode 100644 index 702c64b16f7..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/TriangulationCellBase_3.tex +++ /dev/null @@ -1,49 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: TriangulationCellBase_3.tex -% +------------------------------------------------------------------------+ -% | 29.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSTriangulationcbRev}{$Id$} -\RCSdefDate{\RCSTriangulationcbDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefConcept}{TriangulationCellBase_3} - -\ccDefinition - -The cell base required by the basic triangulation does not need to store any -geometric information, so only the requirements of the triangulation data -structure apply. - -However, for the Delaunay triangulation, the ability to store the circumcenter -is provided (for optimization reasons), hence an additional requirement only -in this case, and only when the dual functions are called. - -\ccRefines \ccc{TriangulationDSCellBase_3} - -\ccCreationVariable{c} - -\ccMethod{const DelaunayTriangulationTraits_3::Point_3& circumcenter( - const DelaunayTriangulationTraits_3> = DelaunayTriangulationTraits_3()) const;} -{Returns the circumcenter.} - - -\ccHasModels - -\ccc{CGAL::Triangulation_cell_base_3}\\ -\ccc{CGAL::Triangulation_cell_base_with_info_3}\\ -\ccc{CGAL::Triangulation_cell_base_with_circumcenter_3} - -\ccSeeAlso - -\ccc{TriangulationVertexBase_3} - -%% \ccExample - -%% \ccIncludeExampleCode{Triangulation3/Triangulation_cb_3_prog.cpp} - -\end{ccRefConcept} diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/TriangulationHierarchyVertexBase_3.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/TriangulationHierarchyVertexBase_3.tex deleted file mode 100644 index 72b311a6673..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/TriangulationHierarchyVertexBase_3.tex +++ /dev/null @@ -1,55 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: TriangulationHierarchyVertexBase_3.tex -% +------------------------------------------------------------------------+ -% | -\RCSdef{\RCSTriangulationvbRev}{$Id$} -\RCSdefDate{\RCSTriangulationvbDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - -\begin{ccRefConcept}{TriangulationHierarchyVertexBase_3} - -\begin{ccDeprecated} - -{\em Note} : this concept is deprecated since \cgal\ 3.6, as the only class using -it, \ccc{Triangulation_hierarchy_3} has been deprecated as well. - -\ccDefinition - -The vertex base used by \ccc{Triangulation_hierarchy_3} must provide -access to two vertex handles for linking between the levels of the hierarchy. - -\ccRefines{\ccc{TriangulationVertexBase_3}} - -\ccCreationVariable{v} - -\ccAccessFunctions -\ccThree{Triangulatixon}{Facetxxxxxxxxxxxxx}{} -\ccTagFullDeclarations - -\ccMethod{Vertex_handle up() const;} -{Returns the \ccc{Vertex_handle} pointing to the level above.} -\ccGlue -\ccMethod{Vertex_handle down() const;} -{Returns the \ccc{Vertex_handle} pointing to the level below.} - -\ccHeading{Setting} -\ccThree{void}{Facetxxxxxxxxxxxxxxxxxxxxxxx}{} - -\ccMethod{void set_up(Vertex_handle v);} -{Sets the \ccc{Vertex_handle} pointing to the level above to \ccc{v}.} -\ccGlue -\ccMethod{void set_down(Vertex_handle v);} -{Sets the \ccc{Vertex_handle} pointing to the level below to \ccc{v}.} - -\ccHasModels - -\ccc{CGAL::Triangulation_hierarchy_vertex_base_3} - -%% \ccExample -%% \ccIncludeExampleCode{Triangulation3/Triangulation_vb_prog.cpp} - -\end{ccDeprecated} - -\end{ccRefConcept} diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/TriangulationTraits_3.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/TriangulationTraits_3.tex deleted file mode 100644 index 1f61a21c88d..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/TriangulationTraits_3.tex +++ /dev/null @@ -1,113 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Triangulation_Traits_3.tex -% +------------------------------------------------------------------------+ -% | 27.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSTriangulationTraitsRev}{$Id$} -\RCSdefDate{\RCSTriangulationTraitsDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefConcept}{TriangulationTraits_3} - -\ccDefinition -The concept \ccRefName\ is the first template parameter of the class -\ccc{Triangulation_3}. It defines the geometric objects (points, segments, -triangles and tetrahedra) forming the triangulation together with a few -geometric predicates and constructions on these objects : lexicographical -comparison, orientation in case of coplanar points and orientation in space. - -\ccTypes -\ccTwo{TriangulationTraits_3::Tetrahedron_3xx}{} - -\ccNestedType{Point_3} -{The point type. It must be \ccc{DefaultConstructible}, -\ccc{CopyConstructible} and \ccc{Assignable}.} -\ccGlue -\ccNestedType{Segment_3} {The segment type.} -\ccGlue -\ccNestedType{Tetrahedron_3} {The tetrahedron type.} -\ccGlue -\ccNestedType{Triangle_3} {The triangle type.} - -\ccTwo{TriangulationTraits_3}{} - -\ccNestedType{Construct_segment_3} -{A constructor object that must provide the function operator\\ -\ccc{Segment_3 operator()(Point_3 p, Point_3 q)},\\ -which constructs a segment from two points.} -\ccGlue -\ccNestedType{Construct_triangle_3} -{A constructor object that must provide the function operator\\ -\ccc{Triangle_3 operator()(Point_3 p, Point_3 q, Point_3 r )},\\ -which constructs a triangle from three points.} -\ccGlue -\ccNestedType{Construct_tetrahedron_3} -{A constructor object that must provide the function operator\\ -\ccc{Tetrahedron_3 operator()(Point_3 p, Point_3 q, Point_3 r, Point_3 s)},\\ -which constructs a tetrahedron from four points.} - -\ccNestedType{Compare_xyz_3} -{A predicate object that must provide the function operator\\ -\ccc{Comparison_result operator()(Point p, Point q)},\\ -which returns \ccc{EQUAL} if the two points are equal. Otherwise it must -return a consistent order for any two points chosen in a same line.} -\ccGlue -\ccNestedType{Coplanar_orientation_3} -{A predicate object that must provide the function operator\\ -\ccc{Orientation operator()(Point p, Point q, Point r)},\\ -which returns \ccc{COLLINEAR} if the points are collinear. Otherwise it must -return a consistent orientation for any three points chosen in a same plane. -} -\ccGlue -\ccNestedType{Orientation_3} -{A predicate object that must provide the function operator\\ -\ccc{Orientation operator()(Point p, Point q, Point r, Point s)},\\ -which returns POSITIVE, if \ccc{s} lies on the positive side of the oriented -plane \ccc{h} defined by \ccc{p}, \ccc{q}, and \ccc{r}, returns NEGATIVE if -\ccc{s} lies on the negative side of \ccc{h}, and returns COPLANAR if \ccc{s} -lies on \ccc{h}.} - -\ccCreation -\ccCreationVariable{traits} -\ccThree{Triangulation_traits_3xxx();}{Triangulation_traits_3 & tr}{} -\ccThreeToTwo - -\ccConstructor{Triangulation_traits_3();}{Default constructor.} -\ccGlue -\ccConstructor{Triangulation_traits_3(const Triangulation_traits_3 & tr);} -{Copy constructor.} - -\ccOperations - -The following functions give access to the predicate and construction objects: - -\ccThree{coplanar_side_of_bounded_circle_3xxx}{gt.xxxxxxxxx(Point p0, Point p1)x}{} - -\ccMethod{Construct_tetrahedron_3 construct_tetrahedron_3_object();}{} -\ccGlue -\ccMethod{Construct_triangle_3 construct_triangle_3_object();}{} -\ccGlue -\ccMethod{Construct_segment_3 construct_segment_3_object();}{} - -\ccMethod{Compare_xyz_3 compare_xyz_3_object();}{} -\ccGlue -\ccMethod{Coplanar_orientation_3 coplanar_orientation_3_object();}{} -\ccGlue -\ccMethod{Orientation_3 orientation_3_object();}{} - - -\ccHasModels - -\ccc{CGAL::Exact_predicates_inexact_constructions_kernel} (recommended)\\ -\ccc{CGAL::Exact_predicates_exact_constructions_kernel}\\ -\ccc{CGAL::Filtered_kernel}\\ -\ccc{CGAL::Cartesian}\\ -\ccc{CGAL::Simple_cartesian}\\ -\ccc{CGAL::Homogeneous}\\ -\ccc{CGAL::Simple_homogeneous} - -\end{ccRefConcept} diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/TriangulationVertexBase_3.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/TriangulationVertexBase_3.tex deleted file mode 100644 index 125134f2728..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/TriangulationVertexBase_3.tex +++ /dev/null @@ -1,85 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: TriangulationVertexBase_3.tex -% +------------------------------------------------------------------------+ -% | 29.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSTriangulationvbRev}{$Id$} -\RCSdefDate{\RCSTriangulationvbDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefConcept}{TriangulationVertexBase_3} - -%% \ccHtmlCrossLink{} %% add further rules for cross referencing links -%% \ccHtmlIndexC[concept]{} %% add further index entries - -\ccDefinition - -The vertex base used by the geometric triangulation must store a point. -So we list here the additional requirements compared to a vertex base usable -for the triangulation data structure. - -\ccRefines{\ccc{TriangulationDSVertexBase_3}} - -\ccTypes -\ccNestedType{Point} -{Must be the same as the point type \ccc{TriangulationTraits_3::Point_3} -defined by the geometric traits class of the triangulation.} - -\ccCreation -\ccCreationVariable{v} %% choose variable name - -\ccThree{Triangulation}{Facetxxxxxxxxxxxxxxxxxxxxxxxxx}{} - -\ccConstructor{TriangulationVertexBase_3(const Point & p);} -{Constructs a vertex whose geometric embedding is point \ccc{p}.} -\ccGlue -\ccConstructor{TriangulationVertexBase_3(const Point & p, Cell_handle c);} -{Constructs a vertex embedding the point \ccc{p} and pointing to cell \ccc{c}.} - -\ccAccessFunctions -\ccThree{Triangulation}{Facetxxxxxxxxxxxxxxxxxxxxx}{} - -\ccMethod{Point point() const;} -{Returns the point.} - -\ccHeading{Setting} - -\ccMethod{void set_point(Point p);} -{Sets the point.} - -\ccHeading{I/O} - -\ccFunction{istream& operator>> -(istream& is, TriangulationVertexBase_3 & v);} -{Inputs the non-combinatorial information given by the vertex: -the point and other possible information.} -%\ccPrecond{The point and the other information have a corresponding -%operator \ccc{>>}. \textit{This precondition is optional for the -%triangulation data structure alone.}}} - -\ccFunction{ostream& operator<< (ostream& os, - const TriangulationVertexBase_3 & v);} -{Outputs the non-combinatorial information given by the vertex: the -point and other possible information.} -%\ccPrecond{The point and the other information have a corresponding -%operator \ccc{<<}. \textit{This precondition is optional for the -%triangulation data structure alone.}}} - -\ccHasModels - -\ccc{CGAL::Triangulation_vertex_base_3}\\ -\ccc{CGAL::Triangulation_vertex_base_with_info_3} - -\ccSeeAlso - -\ccc{TriangulationCellBase_3} - -%% \ccExample - -%% \ccIncludeExampleCode{Triangulation3/Triangulation_vb_prog.cpp} - -\end{ccRefConcept} diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_3.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_3.tex deleted file mode 100644 index 3a8cf725478..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_3.tex +++ /dev/null @@ -1,1052 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Triangulation_3.tex -% +------------------------------------------------------------------------+ -% | 27.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSTriangulationRev}{$Id$} -\RCSdefDate{\RCSTriangulationDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefClass}{Triangulation_3} - -\ccDefinition - -The class \ccc{Triangulation_3} represents a 3-dimensional tetrahedralization -of points. - -\ccInclude{CGAL/Triangulation_3.h} - -\ccParameters - -The first template argument must be a model of the -\ccc{TriangulationTraits_3} concept. - -The second template argument must be a model of the -\ccc{TriangulationDataStructure_3} concept. -It has the default value \ccc{Triangulation_data_structure_3< -Triangulation_vertex_base_3,Triangulation_cell_base_3 >}. - -\ccInheritsFrom{\ccc{Triangulation_utils_3}} - -\ccTypes -The class \ccc{Triangulation_3} defines the following types: -\ccThree{typedef TriangulationTraits_3::Tetrahedron Tetraxxx;} -{Tetrahedronxxxxx}{} -\ccThreeToTwo - -\ccTypedef{typedef TriangulationDataStructure_3 Triangulation_data_structure;}{} -\ccGlue -\ccTypedef{typedef TriangulationTraits_3 Geom_traits;}{} - -\ccTypedef{typedef TriangulationTraits_3::Point_3 Point;}{} -\ccGlue -\ccTypedef{typedef TriangulationTraits_3::Segment_3 Segment;}{} -\ccGlue -\ccTypedef{typedef TriangulationTraits_3::Triangle_3 Triangle;}{} -\ccGlue -\ccTypedef{typedef TriangulationTraits_3::Tetrahedron_3 Tetrahedron;}{} - -Only vertices ($0$-faces) and cells ($3$-faces) are stored. Edges -($1$-faces) and facets ($2$-faces) are not explicitly represented and -thus there are no corresponding classes (see -Section~\ref{Triangulation3-sec-intro}). - -\ccTypedef{typedef TriangulationDataStructure_3::Vertex Vertex;}{} -\ccGlue -\ccTypedef{typedef TriangulationDataStructure_3::Cell Cell;}{} -\ccGlue -\ccTypedef{typedef TriangulationDataStructure_3::Facet Facet;}{} -\ccGlue -\ccTypedef{typedef TriangulationDataStructure_3::Edge Edge;}{} - -The vertices and faces of the triangulations are accessed through -\ccc{handles}, \ccc{iterators} and \ccc{circulators}. -A handle is a model of the \ccc{Handle} concept, and supports the two -dereference operators \ccc{operator*} and \ccc{operator->}. -A circulator is a model of the concept \ccc{Circulator}. -Iterators and circulators are bidirectional and non-mutable. -The edges and facets of the triangulation can also be visited through -iterators and circulators which are bidirectional and non-mutable. - -Iterators and circulators are convertible to the corresponding handles, thus -the user can pass them directly as arguments to the functions. - -\ccTypedef{typedef TriangulationDataStructure_3::Vertex_handle Vertex_handle;} -{handle to a vertex} -\ccGlue -\ccTypedef{typedef TriangulationDataStructure_3::Cell_handle Cell_handle;} -{handle to a cell} - -\ccTypedef{typedef Triangulation_simplex_3 Simplex;} -{Reference to a simplex (vertex, edge, facet or cell) of the triangulation} - -\ccTypedef{typedef TriangulationDataStructure_3::size_type size_type;} -{Size type (an unsigned integral type)} -\ccGlue -\ccTypedef{typedef TriangulationDataStructure_3::difference_type difference_type;} -{Difference type (a signed integral type)} - -\ccThree{typedef TriangulationTraits_3::Tetrahedron Tetraxxxx;} -{Tetrahedronxxxxxxx}{} -\ccThreeToTwo - -\ccTypedef{typedef TriangulationDataStructure_3::Cell_iterator All_cells_iterator;} -{iterator over cells} -\ccGlue -\ccTypedef{typedef TriangulationDataStructure_3::Facet_iterator All_facets_iterator;} -{iterator over facets} -\ccGlue -\ccTypedef{typedef TriangulationDataStructure_3::Edge_iterator All_edges_iterator;} -{iterator over edges} -\ccGlue -\ccTypedef{typedef TriangulationDataStructure_3::Vertex_iterator All_vertices_iterator;} -{iterator over vertices} - -\ccThree{typedef TriangulationTraits_3::Tetrahedron ;} -{Tetrahedron}{} -\ccThreeToTwo - -\ccNestedType{Finite_cells_iterator}{iterator over finite cells} -\ccGlue -\ccNestedType{Finite_facets_iterator}{iterator over finite facets} -\ccGlue -\ccNestedType{Finite_edges_iterator}{iterator over finite edges} -\ccGlue -\ccNestedType{Finite_vertices_iterator}{iterator over finite vertices} -\ccGlue -\ccNestedType{Point_iterator}{iterator over the points corresponding to the -finite vertices of the triangulation.} - -\ccThree{typedef TriangulationTraits_3::Tetrahedron Tetrahedro;}{T}{} -\ccThreeToTwo - -\ccTypedef{typedef TriangulationDataStructure_3::Cell_circulator Cell_circulator;} -{circulator over all cells incident to a given edge} -\ccGlue -\ccTypedef{typedef TriangulationDataStructure_3::Facet_circulator Facet_circulator;} -{circulator over all facets incident to a given edge} - -The triangulation class also defines the following enum type to specify -which case occurs when locating a point in the triangulation. - -\ccEnum{enum Locate_type {VERTEX=0, EDGE, FACET, CELL, OUTSIDE_CONVEX_HULL, -OUTSIDE_AFFINE_HULL};} -{} - - -\ccCreation -\ccCreationVariable{t} %% choose variable name - -\ccThree{Triangulation_3<>}{Facetxxx }{} -\ccThreeToTwo - -\ccConstructor{Triangulation_3 -(const TriangulationTraits_3 & traits = TriangulationTraits_3());} -{Introduces a triangulation \ccVar\ having only one vertex which is the -infinite vertex.} - -\ccConstructor{Triangulation_3 (const Triangulation_3 & tr);} -{Copy constructor. All vertices and faces are duplicated.} - -\ccConstructor{template < class InputIterator> - Triangulation_3 (InputIterator first, InputIterator last, - const TriangulationTraits_3 & traits = TriangulationTraits_3() );} -{Equivalent to constructing an empty triangulation with the optional -traits class argument and calling \ccc{insert(first,last)}.} - -\ccHeading{Assignment} - -\ccMethod{Triangulation_3 & operator=(const Triangulation_3 & tr);} -{The triangulation \ccc{tr} is duplicated, and modifying the copy after the -duplication does not modify the original. The previous triangulation held -by \ccVar\ is deleted.} - -\ccMethod{void swap(Triangulation_3 & tr);} -{The triangulations \ccc{tr} and \ccVar\ are swapped. -\ccVar.\ccc{swap(tr)} should be preferred to \ccVar\ = \ccc{tr} or to -\ccc{t(tr)} if \ccc{tr} is deleted after that. Indeed, there is no -copy of cells and vertices, thus this method runs in constant time.} - -\ccMethod{void clear();} -{Deletes all finite vertices and all cells of \ccVar.} - -\ccFunction{template < class GT, class Tds1, class Tds2 > - bool operator==(const Triangulation_3 & t1, - const Triangulation_3 & t2);} -{Equality operator. Returns true iff there exist a bijection between the -vertices of \ccc{t1} and those of \ccc{t2} and a bijection between the cells of -\ccc{t1} and those of \ccc{t2}, which preserve the geometry of the -triangulation, that is, the points of each corresponding pair of vertices are -equal, and the tetrahedra corresponding to each pair of cells are equal (up to -a permutation of their vertices).} -\ccGlue -\ccFunction{template < class GT, class Tds1, class Tds2 > - bool operator!=(const Triangulation_3 & t1, - const Triangulation_3 & t2);} -{The opposite of \ccc{operator==}.} - -\ccAccessFunctions -\ccThree{TriangulationDataStructure_3&}{number_of_finite_edges}{} - -\ccMethod{const TriangulationTraits_3 & geom_traits() const;} -{Returns a const reference to the geometric traits object.} -\ccGlue -\ccMethod{const TriangulationDataStructure_3 & tds() const;} -{Returns a const reference to the triangulation data structure.} - -\begin{ccAdvanced} -\ccHeading{Non const access} -The responsibility of keeping a valid triangulation belongs to the user -when using advanced operations allowing a direct manipulation of the \ccc{tds}. - -\ccMethod{TriangulationDataStructure_3 & tds();} -{Returns a reference to the triangulation data structure.} - -This method is mainly a help for users implementing their own triangulation -algorithms. - -\end{ccAdvanced} - -\ccThree{Triangulationx}{number_of_finite_edges}{} - -\ccMethod{int dimension() const;} -{Returns the dimension of the affine hull.} -\ccGlue -\ccMethod{size_type number_of_vertices() const;} -{Returns the number of finite vertices.} -\ccGlue -\ccMethod{size_type number_of_cells() const;} -{Returns the number of cells or 0 if \ccVar.\ccc{dimension()}$<3$.} - -\ccMethod{Vertex_handle infinite_vertex();} -{Returns the infinite vertex.} -\ccGlue -\ccMethod{Cell_handle infinite_cell() const;} -{Returns a cell incident to the infinite vertex.} - -\ccHeading{Non-constant-time access functions} - -As previously said, the triangulation is a collection of cells that -are either infinite or represent a finite tetrahedra, where an -infinite cell is a -cell incident to the infinite vertex. Similarly we call -an edge (resp. facet) \ccc{infinite} if it is incident to the infinite vertex. - -\ccThree{size_type}{t.number_of_finite_edges()toto}{} -\ccMethod{size_type number_of_facets() const;} -{The number of facets. Returns 0 if \ccVar.\ccc{dimension()}$<2$.} -\ccGlue -\ccMethod{size_type number_of_edges() const;} -{The number of edges. Returns 0 if \ccVar.\ccc{dimension()}$<1$.} - -\ccMethod{size_type number_of_finite_cells() const;} -{The number of finite cells. Returns 0 if \ccVar.\ccc{dimension()}$<3$.} -\ccGlue -\ccMethod{size_type number_of_finite_facets() const;} -{The number of finite facets. Returns 0 if \ccVar.\ccc{dimension()}$<2$.} -\ccGlue -\ccMethod{size_type number_of_finite_edges() const;} -{The number of finite edges. Returns 0 if \ccVar.\ccc{dimension()}$<1$.} - -\ccHeading{Geometric access functions} -\ccThree{Tetrahedron}{t.tetrahedron()}{} - -\ccMethod{Tetrahedron tetrahedron(Cell_handle c) const;} -{Returns the tetrahedron formed by the four vertices of \ccc{c}. -\ccPrecond{\ccVar.\ccc{dimension()} $=3$ and the cell is finite.}} -\ccGlue -\ccMethod{Triangle triangle(Cell_handle c, int i) const;} -{Returns the triangle formed by the three vertices of facet -\ccc{(c,i)}. The triangle is oriented so that its normal points to the -inside of cell \ccc{c}. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 2$ and $i \in \{0,1,2,3\}$ -in dimension~3, $i = 3$ in dimension~2, and the facet is finite.}} -\ccGlue -\ccMethod{Triangle triangle(const Facet & f) const;} -{Same as the previous method for facet \ccc{f}. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 2$ and the facet is finite.}} -\ccGlue -\ccMethod{Segment segment(const Edge & e) const;} -{Returns the line segment formed by the vertices of \ccc{e}. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 1$ and \ccc{e} is finite.}} -\ccGlue -\ccMethod{Segment segment(Cell_handle c, int i, int j) const;} -{Same as the previous method for edge \ccc{(c,i,j)}. -\ccPrecond{As above and $i\neq j$. Moreover $i,j \in \{0,1,2,3\}$ in -dimension~3, $i,j \in \{0,1,2\}$ in dimension~2, $i,j \in \{0,1\}$ in -dimension~1, and the edge is finite.}} -\ccGlue -\ccMethod{const Point & point(Cell_handle c, int i) const;} -{Returns the point given by vertex \ccc{i} of cell \ccc{c}. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 0$ and $i \in \{0,1,2,3\}$ -in dimension~3, $i \in \{0,1,2\}$ in dimension~2, $i \in \{0,1\}$ in -dimension~1, $i = 0$ in dimension~0, and the vertex is finite.}} -\ccGlue -\ccMethod{const Point & point(Vertex_handle v) const;} -{Same as the previous method for vertex \ccc{v}. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 0$ and the vertex is finite.}} - -\ccHeading{Tests for Finite and Infinite Vertices and Faces} - -\ccMethod{bool is_infinite(Vertex_handle v) const;} -{\ccc{true}, iff vertex \ccc{v} is the infinite vertex.} -\ccGlue -\ccMethod{bool is_infinite(Cell_handle c) const;} -{\ccc{true}, iff \ccc{c} is incident to the infinite vertex. -\ccPrecond{\ccVar.\ccc{dimension()} $=3$.}} -\ccGlue -\ccMethod{bool is_infinite(Cell_handle c, int i) const;} -{\ccc{true}, iff the facet \ccc{i} of cell \ccc{c} is incident to the -infinite vertex. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 2$ and $i\in\{0,1,2,3\}$ in -dimension~3, $i=3$ in dimension~2.}} -\ccGlue -\ccMethod{bool is_infinite(const Facet & f) const;} -{\ccc{true} iff facet \ccc{f} is incident to the infinite vertex. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 2$.}} -\ccGlue -\ccMethod{bool is_infinite(Cell_handle c, int i, int j) const;} -{\ccc{true}, iff the edge \ccc{(i,j)} of cell \ccc{c} is incident to -the infinite vertex. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 1$ and $i\neq j$. Moreover -$i,j \in \{0,1,2,3\}$ in dimension~3, $i,j \in \{0,1,2\}$ in dimension -2, $i,j \in \{0,1\}$ in dimension~1.}} -\ccGlue -\ccMethod{bool is_infinite(const Edge & e) const;} -{\ccc{true} iff edge \ccc{e} is incident to the infinite vertex. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 1$.}} - -\ccHeading{Queries} - -\ccMethod{bool is_vertex(const Point & p, Vertex_handle & v) const;} -{Tests whether \ccc{p} is a vertex of \ccVar\ by locating \ccc{p} in -the triangulation. If \ccc{p} is found, the associated vertex \ccc{v} -is given.} -\ccGlue -\ccMethod{bool is_vertex(Vertex_handle v) const;} -{Tests whether \ccc{v} is a vertex of \ccVar.} - -\ccMethod{bool is_edge(Vertex_handle u, Vertex_handle v, - Cell_handle & c, int & i, int & j) const;} -{Tests whether \ccc{(u,v)} is an edge of \ccVar. If the edge is found, -it gives a cell \ccc{c} having this edge and the indices \ccc{i} -and \ccc{j} of the vertices \ccc{u} and \ccc{v} in \ccc{c}, in this order. -\ccPrecond{\ccc{u} and \ccc{v} are vertices of \ccVar.}} - -\ccMethod{bool is_facet(Vertex_handle u, Vertex_handle v, Vertex_handle w, - Cell_handle & c, int & i, int & j, int & k) const;} -{Tests whether \ccc{(u,v,w)} is a facet of \ccVar. If the facet is found, -it computes a cell \ccc{c} having this facet and the indices \ccc{i}, -\ccc{j} and \ccc{k} of the vertices \ccc{u}, \ccc{v} and \ccc{w} in \ccc{c}, -in this order. -\ccPrecond{\ccc{u}, \ccc{v} and \ccc{w} are vertices of \ccVar.}} - -\ccMethod{bool is_cell(Cell_handle c) const;} -{Tests whether \ccc{c} is a cell of \ccVar.} -\ccGlue -\ccMethod{bool is_cell(Vertex_handle u, Vertex_handle v, - Vertex_handle w, Vertex_handle x, - Cell_handle & c, - int & i, int & j, int & k, int & l) const;} -{Tests whether \ccc{(u,v,w,x)} is a cell of \ccVar. -If the cell \ccc{c} is found, the method -computes the indices \ccc{i}, \ccc{j}, \ccc{k} and \ccc{l} of the -vertices \ccc{u}, \ccc{v}, \ccc{w} and \ccc{x} in \ccc{c}, in this -order. -\ccPrecond{\ccc{u}, \ccc{v}, \ccc{w} and \ccc{x} are vertices of \ccVar.}} -\ccGlue -\ccMethod{bool is_cell(Vertex_handle u, Vertex_handle v, - Vertex_handle w, Vertex_handle x, - Cell_handle & c) const;} -{Tests whether \ccc{(u,v,w,x)} is a cell of \ccVar\ and computes -this cell \ccc{c}. -\ccPrecond{\ccc{u}, \ccc{v}, \ccc{w} and \ccc{x} are vertices of \ccVar.}} - -There is a method \ccc{has_vertex} in the cell class. The analogous -methods for facets are defined here. - -\ccMethod{bool has_vertex(const Facet & f, Vertex_handle v, int & j) const;} -{If \ccc{v} is a vertex of \ccc{f}, then \ccc{j} is the index of -\ccc{v} in the cell \ccc{f.first}, and the method returns \ccc{true}. -\ccPrecond{\ccVar.dimension()=3}} -\ccGlue -\ccMethod{bool has_vertex(Cell_handle c, int i, - Vertex_handle v, int & j) const;} -{Same for facet \ccc{(c,i)}. Computes the index \ccc{j} of \ccc{v} in -\ccc{c}.} -\ccGlue -\ccMethod{bool has_vertex(const Facet & f, Vertex_handle v) const;} -{} -\ccGlue -\ccMethod{bool has_vertex(Cell_handle c, int i, Vertex_handle v) const;} -{Same as the first two methods, but these two methods do not return the -index of the vertex.} - -The following three methods test whether two facets have the same -vertices. - -\ccMethod{bool are_equal(Cell_handle c, int i, Cell_handle n, int j) const;} -{} -\ccGlue -\ccMethod{bool are_equal(const Facet & f, const Facet & g) const;} -{} -\ccGlue -\ccMethod{bool are_equal(const Facet & f, Cell_handle n, int j) const;} -{For these three methods: \ccPrecond{\ccVar.dimension()=3}.} - - -\ccHeading{Point location} -\ccThree{Vertex_handle}{t.locate()toto}{} - -The class \ccClassTemplateName\ provides two functions to locate -a given point with respect to a triangulation. It provides -also functions to test if a given point is inside a finite face -or not. Note that the class \ccc{Delaunay_triangulation_3} also -provides a \ccc{nearest_vertex()} function. - -\ccMethod{Cell_handle - locate(const Point & query, Cell_handle start = Cell_handle()) const;} -{ -%\ccPrecond{\ccVar.\ccc{dimension()} $= 3$ (otherwise there is no -%cell yet).}\\ -If the point \ccc{query} lies inside the convex hull of the points, the cell -that contains the query in its interior is returned. If \ccc{query} lies on a -facet, an edge or on a vertex, one of the cells having \ccc{query} on -its boundary is returned.\\ -If the point \ccc{query} lies outside the convex hull of the points, -an infinite cell with vertices $\{ p, q, r, \infty\}$ is returned such that -the tetrahedron $( p, q, r, query )$ is positively oriented -(the rest of the triangulation lies on the other side of facet -$( p, q, r )$). \\ -Note that locate works even in degenerate dimensions: in dimension 2 -(resp. 1, 0) the \ccc{Cell_handle} returned is the one that represents -the facet (resp. edge, vertex) containing the query point. \\ -The optional argument \ccc{start} is used as a starting place for the search. -} - -\ccMethod{Cell_handle - locate(const Point & query, Vertex_handle hint) const;} -{ Same as above but uses \ccc{hint} as the starting place for the search. } - -\ccMethod{Cell_handle - locate(const Point & query, Locate_type & lt, - int & li, int & lj, Cell_handle start = Cell_handle() ) const;} -{If \ccc{query} lies inside the affine hull of the points, the $k$-face -(finite or infinite) that contains \ccc{query} in its interior is -returned, by means of the cell returned together with \ccc{lt}, which -is set to the locate type of the query (\ccc{VERTEX, EDGE, FACET, -CELL}, or \ccc{OUTSIDE_CONVEX_HULL} if the cell is infinite and \ccc{query} -lies strictly in it) and two indices \ccc{li} and \ccc{lj} that -specify the $k$-face of the cell containing \ccc{query}.\\ -If the $k$-face is a cell, \ccc{li} and \ccc{lj} have no -meaning; if it is a facet (resp. vertex), \ccc{li} gives the index of -the facet (resp. vertex) and \ccc{lj} has no meaning; if it is and -edge, \ccc{li} and \ccc{lj} give the indices of its vertices.\\ -%If the point \ccc{query} lies outside the convex hull of the points, but -%in their affine hull, then \ccc{lt} is set to \ccc{OUTSIDE_CONVEX_HULL}, -%and a $k$-face separating the triangulation from \ccc{query} is -%specified by the cell containing \ccc{query}, which is returned, and -%indices as previously.\\ -If the point \ccc{query} lies outside the affine hull of the points, -which can happen in case of degenerate dimensions, \ccc{lt} is set to -\ccc{OUTSIDE_AFFINE_HULL}, and the cell returned has no meaning. -As a particular case, if there is no finite vertex yet in the -triangulation, \ccc{lt} is set to \ccc{OUTSIDE_AFFINE_HULL} and -\textit{locate} returns the default constructed handle. \\ -The optional argument \ccc{start} is used as a starting place for the search. -} - -\ccMethod{Cell_handle - locate(const Point & query, Locate_type & lt, - int & li, int & lj, Vertex_handle hint) const;} -{ Same as above but uses \ccc{hint} as the starting place for the search. } - -\ccMethod{Bounded_side - side_of_cell(const Point & p, - Cell_handle c, - Locate_type & lt, int & li, int & lj) const;} -{Returns a value indicating on which side of the oriented boundary -of \ccc{c} the point \ccc{p} lies. More precisely, it returns:\\ -- \ccc{ON_BOUNDED_SIDE} if \ccc{p} is inside the cell. For an infinite -cell this means that \ccc{p} lies strictly in the half space limited by -its finite facet and not containing any other point of the triangulation. \\ -- \ccc{ON_BOUNDARY} if p on the boundary of the cell. For an infinite -cell this means that \ccc{p} lies on the \textit{finite} facet. Then -\ccc{lt} together with \ccc{li} and \ccc{lj} give the precise location -on the boundary. (See the descriptions of the \textit{locate} methods.)\\ -- \ccc{ON_UNBOUNDED_SIDE} if \ccc{p} lies outside the cell. For an -infinite cell this means that \ccc{p} does not satisfy either of the -two previous conditions. -\ccPrecond{\ccVar.\ccc{dimension()} $=3$}} - -\ccMethod{Bounded_side - side_of_facet(const Point & p, - const Facet & f, - Locate_type & lt, int & li, int & lj) const;} -{Returns a value indicating on which side of the oriented boundary -of \ccc{f} the point \ccc{p} lies:\\ -- \ccc{ON_BOUNDED_SIDE} if \ccc{p} is inside the facet. For an -infinite facet this means that \ccc{p} lies strictly in the half plane -limited by its finite edge and not containing any other point of the -triangulation . \\ -- \ccc{ON_BOUNDARY} if \ccc{p} is on the boundary of the facet. -For an infinite facet this means that \ccc{p} lies on the finite -edge. \ccc{lt}, \ccc{li} and \ccc{lj} give the precise location of -\ccc{p} on the boundary of the facet. \ccc{li} and \ccc{lj} refer to -indices in the degenerate cell \ccc{c} representing \ccc{f}.\\ -- \ccc{ON_UNBOUNDED_SIDE} if \ccc{p} lies outside the facet. For -an infinite facet this means that \ccc{p} does not satisfy either of -the two previous conditions. \\ -\ccPrecond{\ccVar.\ccc{dimension()} $=2$ and \ccc{p} lies in the -plane containing the triangulation. \ccc{f.second} $=3$ (in dimension~2 -there is only one facet per cell).}} -\ccGlue -\ccMethod{Bounded_side - side_of_facet(const Point & p, - Cell_handle c, - Locate_type & lt, int & li, int & lj) const;} -{Same as the previous method for the facet \ccc{(c,3)}.} - -\ccMethod{Bounded_side - side_of_edge(const Point & p, - const Edge & e, - Locate_type & lt, int & li) const;} -{Returns a value indicating on which side of the oriented boundary -of \ccc{e} the point \ccc{p} lies:\\ -- \ccc{ON_BOUNDED_SIDE} if \ccc{p} is inside the edge. For an -infinite edge this means that \ccc{p} lies in the half line defined by -the vertex and not containing any other point of the triangulation.\\ -- \ccc{ON_BOUNDARY} if \ccc{p} equals one of the vertices, -\ccc{li} give the index of the vertex in the cell storing \ccc{e}\\ -- \ccc{ON_UNBOUNDED_SIDE} if \ccc{p} lies outside the edge. For -an infinite edge this means that \ccc{p} lies on the other half line, -which contains the other points of the triangulation. -\ccPrecond{\ccVar.\ccc{dimension()} $=1$ and \ccc{p} is collinear -with the points of the triangulation. \ccc{e.second} $=0$ and -\ccc{e.third} $=1$ (in dimension~1 there is only one edge per cell).}} -\ccGlue -\ccMethod{Bounded_side - side_of_edge(const Point & p, - Cell_handle c, - Locate_type & lt, int & li) const;} -{Same as the previous method for edge $(c,0,1)$.} - -\ccHeading{Flips} - -Two kinds of flips exist for a three-dimensional triangulation. They -are reciprocal. To be flipped, an edge must be incident to three -tetrahedra. During the flip, these three tetrahedra disappear and two -tetrahedra appear. Figure~\ref{Triangulation3-fig-flips}(left) shows the -edge that is flipped as bold dashed, and one of its three incident -facets is shaded. On the right, the facet shared by the two new -tetrahedra is shaded. - -Flips are possible only under the following conditions:\\ -- the edge or facet to be flipped is not on the boundary of the convex -hull of the triangulation \\ -- the five points involved are in convex position. - -\begin{figure} -\begin{ccTexOnly} -\begin{center} -\includegraphics{Triangulation_3_ref/flips} -\end{center} -\end{ccTexOnly} -\caption{Flips. -\label{Triangulation3-fig-flips}} -\begin{ccHtmlOnly} -
-Flips -
-\end{ccHtmlOnly} -\end{figure} - -The following methods guarantee the validity of the resulting 3D -triangulation. - -\textit{Flips for a 2d triangulation are not implemented yet} - -\ccMethod{bool flip(Edge e);}{} -\ccGlue -\ccMethod{bool flip(Cell_handle c, int i, int j);} -{Before flipping, these methods check that edge \ccc{e=(c,i,j)} is -flippable (which is quite expensive). They return \ccc{false} or -\ccc{true} according to this test.} - -\ccMethod{void flip_flippable(Edge e);}{} -\ccGlue -\ccMethod{void flip_flippable(Cell_handle c, int i, int j);} -{Should be preferred to the previous methods when the edge is -known to be flippable. -\ccPrecond{The edge is flippable.}} - -\ccMethod{bool flip(Facet f);}{} -\ccGlue -\ccMethod{bool flip(Cell_handle c, int i);} -{Before flipping, these methods check that facet \ccc{f=(c,i)} is -flippable (which is quite expensive). They return \ccc{false} or -\ccc{true} according to this test.} - -\ccMethod{void flip_flippable(Facet f);}{} -\ccGlue -\ccMethod{void flip_flippable(Cell_handle c, int i);} -{Should be preferred to the previous methods when the facet is -known to be flippable. -\ccPrecond{The facet is flippable.}} - -\ccHeading{Insertions} - -The following operations are guaranteed to lead to a valid triangulation -when they are applied on a valid triangulation. - -\ccMethod{Vertex_handle insert(const Point & p, - Cell_handle start = Cell_handle() );} -{Inserts point \ccc{p} in the triangulation and returns the corresponding - vertex.\\ -If point \ccc{p} coincides with an already existing vertex, this -vertex is returned and the triangulation remains unchanged.\\ -If point \ccc{p} lies in the convex hull of the points, it is added -naturally: if it lies inside a cell, the cell is split into four -cells, if it lies on a facet, the two incident cells are split into -three cells, if it lies on an edge, all the cells incident to this -edge are split into two cells.\\ -If point \ccc{p} is strictly outside the convex hull but in the affine -hull, \ccc{p} is linked to all visible points on the convex hull to -form the new triangulation. See -Figure~\ref{Triangulation3-fig-insert_outside_convex_hull}.\\ -If point \ccc{p} is outside the affine hull of the points, \ccc{p} is -linked to all the points, and the dimension of the triangulation is -incremented. All the points now belong to the boundary of the convex -hull, so, the infinite vertex is linked to all the points to -triangulate the new infinite face. See -Figure~\ref{Triangulation3-fig-insert_outside_affine_hull}. -The optional argument \ccc{start} is used as a starting place for the search.} - -\ccMethod{Vertex_handle insert(const Point & p, Vertex_handle hint);} -{ Same as above but uses \ccc{hint} as the starting place for the search. } - -\ccMethod{Vertex_handle insert(const Point & p, Locate_type lt, - Cell_handle loc, int li, int lj);} -{Inserts point \ccc{p} in the triangulation and returns the corresponding - vertex. Similar to the above \ccc{insert()} function, but takes as additional - parameter the return values of a previous location query. See description of - \textit{locate()} above.} - -\ccMethod{template < class InputIterator > - std::ptrdiff_t - insert(InputIterator first, InputIterator last);} -{Inserts the points in the range $\left[\right.$\ccc{first}, -\ccc{last}$\left.\right)$. Returns the number of inserted points. -Note that this function is not guaranteed to insert the points -following the order of \ccc{InputIterator}. -\ccPrecond{The \ccc{value_type} of \ccc{first} and \ccc{last} is -\ccc{Point}.}} - -The previous methods are sufficient to build a whole triangulation. We -also provide some other methods that can be used instead of -\ccc{insert(p)} when the place where the new point \ccc{p} must be inserted -is already known. They are also guaranteed to lead to a valid -triangulation when they are applied on a valid triangulation. - -\ccMethod{Vertex_handle insert_in_cell(const Point & p, Cell_handle c);} -{Inserts point \ccc{p} in cell \ccc{c}. Cell \ccc{c} is split into 4 -tetrahedra. -\ccPrecond{\ccVar.\ccc{dimension()} $=3$ and \ccc{p} lies strictly -inside cell \ccc{c}.}} - -\ccMethod{Vertex_handle insert_in_facet(const Point & p, const Facet & f);} -{Inserts point \ccc{p} in facet \ccc{f}. In dimension~3, the 2 -neighboring cells are split into 3 tetrahedra; in dimension~2, the facet -is split into 3 triangles. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 2$ and \ccc{p} lies strictly -inside face \ccc{f}.}} -\ccGlue -\ccMethod{Vertex_handle insert_in_facet(const Point & p, - Cell_handle c, int i);} -{As above, insertion in facet \ccc{(c,i)}. -\ccPrecond{As above and $i \in \{0,1,2,3\}$ in dimension~3, $i = 3$ in -dimension~2.}} - -\ccMethod{Vertex_handle insert_in_edge(const Point & p, const Edge & e);} -{Inserts \ccc{p} in edge \ccc{e}. In dimension~3, -all the cells having this edge are split into 2 tetrahedra; in -dimension~2, the 2 neighboring facets are split into 2 triangles; in -dimension~1, the edge is split into 2 edges. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 1$ and \ccc{p} lies on edge -\ccc{e}.}} -\ccGlue -\ccMethod{Vertex_handle insert_in_edge(Point p, Cell_handle c, int i, int j);} -{As above, inserts \ccc{p} in edge $(\ccc{i}, \ccc{j})$ of \ccc{c}. -\ccPrecond{As above and $i\neq j$. Moreover $i,j \in \{0,1,2,3\}$ in -dimension~3, $i,j \in \{0,1,2\}$ in dimension~2, $i,j \in \{0,1\}$ in -dimension~1.}} - -\ccMethod{Vertex_handle insert_outside_convex_hull(const Point & p, - Cell_handle c);} -% int li, int lj=0);} -{%The cell \ccc{c}, together with \ccc{li} and possibly \ccc{lj}, give a -%separator (facet, edge or vertex, depending on the dimension) for -%\ccc{p} from the triangulation (see the description of method -%\ccc{locate()} for more details on the way the separator is represented).\\ -The cell \ccc{c} must be an infinite cell containing \ccc{p}.\\ -Links \ccc{p} to all points in the triangulation that are visible from -\ccc{p}. Updates consequently the infinite faces. See -Figure~\ref{Triangulation3-fig-insert_outside_convex_hull}. -\ccPrecond{\ccVar.\ccc{dimension()} $>0$, \ccc{c}, and the $k$-face -represented by \ccc{c} is infinite and contains \ccVar.}} - -\begin{figure}[htbp] -\begin{ccTexOnly} -\begin{center} -\includegraphics{Triangulation_3/insert_outside_convex_hull} -\end{center} -\end{ccTexOnly} -\caption{\protect\ccc{insert_outside_convex_hull} (2-dimensional case). -\label{Triangulation3-fig-insert_outside_convex_hull}} -\begin{ccHtmlOnly} -
- -
-\end{ccHtmlOnly} -\end{figure} - -\ccMethod{Vertex_handle insert_outside_affine_hull(const Point & p);} -{\ccc{p} is linked to all the points, and the infinite vertex is linked -to all the points (including \ccc{p}) to triangulate the new infinite -face, so that all the points now belong to the boundary of the convex -hull. See Figure~\ref{Triangulation3-fig-insert_outside_affine_hull}.\\ -This method can be used to insert the first point in an empty -triangulation. -\ccPrecond{\ccVar.\ccc{dimension()} $<3$ and \ccc{p} lies outside the -affine hull of the points.}} - -\begin{figure}[htbp] -\begin{ccTexOnly} -\begin{center} -\includegraphics{Triangulation_3/insert_outside_affine_hull} -\end{center} -\end{ccTexOnly} -\caption{\protect\ccc{insert_outside_affine_hull} (2-dimensional case). -\label{Triangulation3-fig-insert_outside_affine_hull}} -\begin{ccHtmlOnly} -
- -
-\end{ccHtmlOnly} -\end{figure} - -\ccMethod{template - Vertex_handle insert_in_hole(Point p, CellIt cell_begin, CellIt cell_end, - Cell_handle begin, int i);} -{Creates a new vertex by starring a hole. It takes an iterator range -[\ccc{cell_begin}; \ccc{cell_end}[ of \ccc{Cell_handle}s which specifies -a hole: a set of connected cells (resp. facets in dimension 2) which is -star-shaped wrt \ccc{p}. -(\ccc{begin}, \ccc{i}) is a facet (resp. an edge) on the boundary of the hole, -that is, \ccc{begin} belongs to the set of cells (resp. facets) previously -described, and \ccc{begin->neighbor(i)} does not. Then this function deletes -all the cells (resp. facets) describing the hole, creates a new vertex -\ccc{v}, and for each facet (resp. edge) on the boundary of the hole, creates -a new cell (resp. facet) with \ccc{v} as vertex. Then \ccc{v->set_point(p)} -is called and \ccc{v} is returned.\\ -This operation is equivalent to calling -\ccStyle{tds().insert_in_hole(cell_begin, cell_end, begin, i); -v->set_point(p)}. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 2$, the set of cells (resp. facets in -dimension 2) is connected, its boundary is connected, and \ccc{p} lies inside -the hole, which is star-shaped wrt \ccc{p}}.} - -\ccMethod{template - Vertex_handle insert_in_hole(Point p, CellIt cell_begin, CellIt cell_end, - Cell_handle begin, int i, Vertex_handle newv);} -{ Same as above, except that \ccc{newv} will be used as the new vertex, which - must have been allocated previously with e.g. \ccc{create_vertex}.} - -\ccHeading{Traversal of the Triangulation} - -The triangulation class provides several iterators and circulators -that allow one to traverse it (completely or partially). - -\ccHeading{Cell, Face, Edge and Vertex Iterators} -\ccThree{Finite_vertices_iterator}{t.finite_vertices_begin()x}{} - -The following iterators allow the user to visit cells, -facets, edges and vertices of the -triangulation. These iterators are non-mutable, bidirectional and -their value types are respectively \ccc{Cell}, \ccc{Facet}, \ccc{Edge} -and \ccc{Vertex}. They are all invalidated by any change in the -triangulation. - -\ccMethod{Finite_vertices_iterator finite_vertices_begin() const;} -{Starts at an arbitrary finite vertex. Then \ccc{++} and \ccc{--} will -iterate over finite vertices. Returns \ccc{finite_vertices_end()} when -\ccVar.\ccc{number_of_vertices()} $=0$.} -\ccGlue -\ccMethod{Finite_vertices_iterator finite_vertices_end() const;} -{Past-the-end iterator} -\ccGlue -\ccMethod{Finite_edges_iterator finite_edges_begin() const;} -{Starts at an arbitrary finite edge. Then \ccc{++} and \ccc{--} will -iterate over finite edges. Returns \ccc{finite_edges_end()} when -\ccVar.\ccc{dimension()} $<1$.} -\ccGlue -\ccMethod{Finite_edges_iterator finite_edges_end() const;} -{Past-the-end iterator} -\ccGlue -\ccMethod{Finite_facets_iterator finite_facets_begin() const;} -{Starts at an arbitrary finite facet. Then \ccc{++} and \ccc{--} will -iterate over finite facets. Returns \ccc{finite_facets_end()} when -\ccVar.\ccc{dimension()} $<2$.} -\ccGlue -\ccMethod{Finite_facets_iterator finite_facets_end() const;} -{Past-the-end iterator} -\ccGlue -\ccMethod{Finite_cells_iterator finite_cells_begin() const;} -{Starts at an arbitrary finite cell. Then \ccc{++} and \ccc{--} will -iterate over finite cells. Returns \ccc{finite_cells_end()} when -\ccVar.\ccc{dimension()} $<3$.} -\ccGlue -\ccMethod{Finite_cells_iterator finite_cells_end() const;} -{Past-the-end iterator} - -\ccMethod{All_vertices_iterator all_vertices_begin() const;} -{Starts at an arbitrary vertex. Iterates over all vertices (even the infinite -one). Returns \ccc{vertices_end()} when -\ccVar.\ccc{number_of_vertices()} $=0$.} -\ccGlue -\ccMethod{All_vertices_iterator all_vertices_end() const;} -{Past-the-end iterator} -\ccGlue -\ccMethod{All_edges_iterator all_edges_begin() const;} -{Starts at an arbitrary edge. Iterates over all edges (even infinite -ones). Returns \ccc{edges_end()} when \ccVar.\ccc{dimension()} $<1$.} -\ccGlue -\ccMethod{All_edges_iterator all_edges_end() const;} -{Past-the-end iterator} -\ccGlue -\ccMethod{All_facets_iterator all_facets_begin() const;} -{Starts at an arbitrary facet. Iterates over all facets (even infinite -ones). Returns \ccc{facets_end()} when -\ccVar.\ccc{dimension()} $<2$.} -\ccGlue -\ccMethod{All_facets_iterator all_facets_end() const;} -{Past-the-end iterator} -\ccGlue -\ccMethod{All_cells_iterator all_cells_begin() const;} -{Starts at an arbitrary cell. Iterates over all cells (even infinite -ones). Returns \ccc{cells_end()} when -\ccVar.\ccc{dimension()} $<3$.} -\ccGlue -\ccMethod{All_cells_iterator all_cells_end() const;} -{Past-the-end iterator} - -\ccMethod{Point_iterator points_begin() const;} -{Iterates over the points of the triangulation.} -\ccGlue -\ccMethod{Point_iterator points_end() const;} -{Past-the-end iterator} - -\ccHeading{Cell and Facet Circulators} -\ccThree{Facet_circulator}{t.incident_facets(Edge e)x}{} - -The following circulators respectively visit all cells or all facets -incident to a given edge. They are non-mutable and bidirectional. They -are invalidated by any modification of one of the cells traversed. - -\ccMethod{Cell_circulator incident_cells(Edge e) const;} -{Starts at an arbitrary cell incident to \ccc{e}. -\ccPrecond{\ccVar.\ccc{dimension()} $=3$.}} -\ccGlue -\ccMethod{Cell_circulator incident_cells(Cell_handle c, int i, int j) const;} -{As above for edge \ccc{(i,j)} of \ccc{c}.} -\ccGlue -\ccMethod{Cell_circulator incident_cells(Edge e, Cell_handle start) const;} -{Starts at cell \ccc{start}. -\ccPrecond{\ccVar.\ccc{dimension()} $=3$ and \ccc{start} is incident to -\ccc{e}.}} -\ccGlue -\ccMethod{Cell_circulator incident_cells(Cell_handle c, int i, int j, -Cell_handle start) const;} -{As above for edge \ccc{(i,j)} of \ccc{c}.} - -The following circulators on facets are defined only in dimension~3, -though facets are defined also in dimension~2: there are only two -facets sharing an edge in dimension~2. - -\ccMethod{Facet_circulator incident_facets(Edge e) const;} -{Starts at an arbitrary facet incident to \ccc{e}. -\ccPrecond{\ccVar.\ccc{dimension()}~$=3$}} -\ccGlue -\ccMethod{Facet_circulator incident_facets(Cell_handle c, int i, int j) const;} -{As above for edge \ccc{(i,j)} of \ccc{c}.} -\ccGlue -\ccMethod{Facet_circulator incident_facets(Edge e, Facet start) const;} -{Starts at facet \ccc{start}. -\ccPrecond{\ccc{start} is incident to \ccc{e}.}} -\ccGlue -\ccMethod{Facet_circulator incident_facets(Edge e, Cell_handle start, int f) -const;} -{Starts at facet of index \ccc{f} in \ccc{start}.} -\ccGlue -\ccMethod{Facet_circulator incident_facets(Cell_handle c, int i, int j, -Facet start) const;} -{As above for edge \ccc{(i,j)} of \ccc{c}.} -\ccGlue -\ccMethod{Facet_circulator incident_facets(Cell_handle c, int i, int j, -Cell_handle start, int f) const;} -{As above for edge \ccc{(i,j)} of \ccc{c} and facet \ccc{(start,f)}.} - - -\ccHeading{Traversal of the incident cells, facets and edges, and the adjacent -vertices of a given vertex} -\ccThree{OutputIterator}{t.incident_cells()}{} - -\ccMethod{template - OutputIterator - incident_cells(Vertex_handle v, OutputIterator cells) const;} -{Copies the \ccc{Cell_handle}s of all cells incident to \ccc{v} to the output -iterator \ccc{cells}. -Returns the resulting output iterator. -\ccPrecond{\ccVar.\ccc{dimension()} $=3$, \ccc{v} $\neq$ \ccc{Vertex_handle()}, \ccVar.\ccc{is_vertex(v)}.}} - -\ccMethod{template - OutputIterator - finite_incident_cells(Vertex_handle v, OutputIterator cells) const;} -{Copies the \ccc{Cell_handle}s of all finite cells incident to \ccc{v} to the output -iterator \ccc{cells}. -Returns the resulting output iterator. -\ccPrecond{\ccVar.\ccc{dimension()} $=3$, \ccc{v} $\neq$ \ccc{Vertex_handle()}, \ccVar.\ccc{is_vertex(v)}.}} - -\ccMethod{template - OutputIterator - incident_facets(Vertex_handle v, OutputIterator facets) const;} -{Copies all \ccc{Facet}s incident to \ccc{v} to the output iterator -\ccc{facets}. -Returns the resulting output iterator. -\ccPrecond{\ccVar.\ccc{dimension()} $>1$, \ccc{v} $\neq$ \ccc{Vertex_handle()}, \ccVar.\ccc{is_vertex(v)}.}} - -\ccMethod{template - OutputIterator - finite_incident_facets(Vertex_handle v, OutputIterator facets) const;} -{Copies all finite \ccc{Facet}s incident to \ccc{v} to the output iterator -\ccc{facets}. -Returns the resulting output iterator. -\ccPrecond{\ccVar.\ccc{dimension()} $>1$, \ccc{v} $\neq$ \ccc{Vertex_handle()}, \ccVar.\ccc{is_vertex(v)}.}} - -\ccMethod{template - OutputIterator - incident_edges(Vertex_handle v, OutputIterator edges) const;} -{Copies all \ccc{Edge}s incident to \ccc{v} to the -output iterator \ccc{edges}. Returns the resulting output iterator. -\ccPrecond{\ccVar.\ccc{dimension()} $>0$, \ccc{v} $\neq$ \ccc{Vertex_handle()}, \ccVar.\ccc{is_vertex(v)}.}} - -\ccMethod{template - OutputIterator - finite_incident_edges(Vertex_handle v, OutputIterator edges) const;} -{Copies all finite \ccc{Edge}s incident to \ccc{v} to the -output iterator \ccc{edges}. Returns the resulting output iterator. -\ccPrecond{\ccVar.\ccc{dimension()} $>0$, \ccc{v} $\neq$ \ccc{Vertex_handle()}, \ccVar.\ccc{is_vertex(v)}.}} - -\ccMethod{template - OutputIterator - adjacent_vertices(Vertex_handle v, OutputIterator vertices) const;} -{Copies the \ccc{Vertex_handle}s of all vertices adjacent to \ccc{v} to the -output iterator \ccc{vertices}. If \ccVar.\ccc{dimension()} $<0$, then do -nothing. Returns the resulting output iterator. -\ccPrecond{\ccc{v} $\neq$ \ccc{Vertex_handle()}, \ccVar.\ccc{is_vertex(v)}.}} - -\ccMethod{template - OutputIterator - finite_adjacent_vertices(Vertex_handle v, OutputIterator vertices) const;} -{Copies the \ccc{Vertex_handle}s of all finite vertices adjacent to \ccc{v} to the -output iterator \ccc{vertices}. If \ccVar.\ccc{dimension()} $<0$, then do -nothing. Returns the resulting output iterator. -\ccPrecond{\ccc{v} $\neq$ \ccc{Vertex_handle()}, \ccVar.\ccc{is_vertex(v)}.}} - -\ccMethod{size_type degree(Vertex_handle v) const;} -{Returns the degree of a vertex, that is, the number of incident vertices. -The infinite vertex is counted. -\ccPrecond{\ccc{v} $\neq$ \ccc{Vertex_handle()}, \ccVar.\ccc{is_vertex(v)}.}} - -\ccHeading{Traversal between adjacent cells} -\ccThree{Vertex_handle}{mirror_vertex(Cell_handle c, int i)x}{} - -\ccMethod{int mirror_index(Cell_handle c, int i) const;} -{Returns the index of \ccc{c} in its $i^{th}$ neighbor. -\ccPrecond{$i \in \{0, 1, 2, 3\}$.}} -\ccGlue -\ccMethod{Vertex_handle mirror_vertex(Cell_handle c, int i) const;} -{Returns the vertex of the $i^{th}$ neighbor of \ccc{c} that is opposite to -\ccc{c}. -\ccPrecond{$i \in \{0, 1, 2, 3\}$.}} -\ccGlue -\ccMethod{Facet mirror_facet(Facet f) const;} -{Returns the same facet seen from the other adjacent cell.} - -\begin{ccDebug} -\ccHeading{Checking} -The responsibility of keeping a valid triangulation belongs to the user -when using advanced operations allowing a direct manipulation of cells -and vertices. We provide the user with the following methods to help -debugging. - -\ccMethod{bool - is_valid(bool verbose = false) const;} -{Checks the combinatorial validity of the triangulation. Checks also the -validity of its geometric embedding (see -Section~\ref{Triangulation3-sec-intro}).\\ When \ccc{verbose} is set to true, -messages describing the first invalidity encountered are printed.} - -\ccMethod{bool - is_valid(Cell_handle c, bool verbose = false) const;} -{Checks the combinatorial validity of the cell by calling the -\ccc{is_valid} method of the \ccc{TriangulationDataStructure_3} cell class. Also checks the -geometric validity of \ccc{c}, if \ccc{c} is finite. (See -Section~\pageref{Triangulation3-sec-intro}.)\\ -When \ccc{verbose} is set to \ccc{true}, messages are printed to give -a precise indication of the kind of invalidity encountered.} -\end{ccDebug} - -\ccHeading{I/O} - -\cgal\ provides an interface to Geomview for a 3D-triangulation, -see Chapter~\ref{ChapterGeomview} on \ccc{Geomview_stream}. -\ccInclude{CGAL/IO/Triangulation_geomview_ostream_3.h} - -\ccFunction{istream& operator>> (istream& is, Triangulation_3 &t);} -{Reads the underlying combinatorial triangulation from \ccc{is} by -calling the corresponding input operator of the triangulation data -structure class (note that the infinite vertex is numbered 0), and the -non-combinatorial information by calling the corresponding input -operators of the vertex and the cell classes (such as point -coordinates), which are provided by overloading the stream operators -of the vertex and cell types. Assigns the resulting triangulation to -\ccc{t}.} - -\ccFunction{ostream& operator<< (ostream& os, const Triangulation_3 &t);} -{Writes the triangulation \ccc{t} into \ccc{os}.} - -The information in the \ccc{iostream} is: the dimension, the number of -finite vertices, the non-combinatorial information about vertices -(point, etc; note that the infinite vertex is numbered 0), the number -of cells, the indices of the vertices of each cell, plus the -non-combinatorial information about each cell, then the indices of the -neighbors of each cell, where the index corresponds to the preceding -list of cells. When dimension $<$ 3, the same information is stored -for faces of maximal dimension instead of cells. - -\ccSeeAlso - -\ccc{TriangulationDataStructure_3::Vertex}\\ -\ccc{TriangulationDataStructure_3::Cell} - -%\ccExample -%%\ccIncludeExampleCode{Triangulation3/example1.cpp} - -\end{ccRefClass} diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_cell_base_3.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_cell_base_3.tex deleted file mode 100644 index f4f6ff6a5dd..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_cell_base_3.tex +++ /dev/null @@ -1,53 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Triangulation_cell_base_3.tex -% +------------------------------------------------------------------------+ -% | 29.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSTriangulationcellbaseRev}{$Id$} -\RCSdefDate{\RCSTriangulationcellbaseDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefClass}{Triangulation_cell_base_3} - -\ccDefinition - -The class \ccc{Triangulation_cell_base_3} is a model of the concept -\ccc{TriangulationCellBase_3}, the base cell of a 3D-triangulation. - -This class can be used directly or can serve as a base to derive other classes -with some additional attributes (a color for example) tuned for a specific -application. - -\ccInclude{CGAL/Triangulation_cell_base_3.h} - -\ccParameters - -The first template argument is the geometric traits class -\ccc{TriangulationTraits_3}. It is actually not used by this class. - -The second template argument is a combinatorial cell base class from which -\ccc{Triangulation_cell_base_3} derives. -It has the default value \ccc{Triangulation_ds_cell_base_3<>}. - -Note that this model does not store the circumcenter, but computes it -every time the circumcenter function is called. See -\ccc{CGAL::Triangulation_cell_base_with_circumcenter_3} for a way to cache the -circumcenter computation. - - -\ccIsModel \ccc{TriangulationCellBase_3} - -\ccInheritsFrom \ccc{TriangulationDSCellBase_3} - -\ccSeeAlso - -\ccc{CGAL::Triangulation_ds_cell_base_3}\\ -\ccc{CGAL::Triangulation_cell_base_with_info_3}\\ -\ccc{CGAL::Triangulation_cell_base_with_circumcenter_3}\\ -\ccc{CGAL::Triangulation_vertex_base_3} - -\end{ccRefClass} diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_cell_base_with_circumcenter_3.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_cell_base_with_circumcenter_3.tex deleted file mode 100644 index 6b5af88a28f..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_cell_base_with_circumcenter_3.tex +++ /dev/null @@ -1,61 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Triangulation_cell_base_with_circumcenter_3.tex -% +------------------------------------------------------------------------+ -% | 29.3.2000 Sylvain Pion -% | Package: Triangulation3 -% | -\RCSdef{\RCSTriangulationcellbaseRev}{$Id$} -\RCSdefDate{\RCSTriangulationcellbaseDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefClass}{Triangulation_cell_base_with_circumcenter_3} - -\ccDefinition - -The class \ccc{Triangulation_cell_base_with_circumcenter_3} is a model of the -concept \ccc{TriangulationCellBase_3}, the base cell of a 3D-triangulation. -It provides an easy way to cache the computation of the circumcenter of -tetrahedra. -Note that input/output operators discard this additional information. - -All functions modifying the vertices of the cell, invalidate the cached -circumcenter. - -\ccInclude{CGAL/Triangulation_cell_base_with_circumcenter_3.h} - -\ccParameters - -The first template argument is the geometric traits class -\ccc{DelaunayTriangulationTraits_3}. - -The second template argument is a cell base class from which -\ccc{Triangulation_cell_base_with_circumcenter_3} derives. -It has the default value \ccc{Triangulation_cell_base_3}. - -\ccIsModel \ccc{TriangulationCellBase_3} - -\ccInheritsFrom \ccc{TriangulationCellBase_3} - -%\ccTypes -%\ccTypedef{typedef Info Info;}{} - -\ccCreationVariable{v} - -\ccAccessFunctions -\ccThree{const Info&}{Facetxxxxxxxx}{} -\ccTagFullDeclarations - -\ccMethod{const DelaunayTriangulationTraits_3::Point_3& circumcenter( - const DelaunayTriangulationTraits_3> = DelaunayTriangulationTraits_3()) const;} -{Computes the circumcenter of the tetrahedron, or retrieve it if already -computed.} - -\ccSeeAlso - -\ccc{CGAL::Triangulation_cell_base_3}\\ -\ccc{CGAL::Triangulation_cell_base_with_info_3} - -\end{ccRefClass} diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_cell_base_with_info_3.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_cell_base_with_info_3.tex deleted file mode 100644 index d5dfd5d196a..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_cell_base_with_info_3.tex +++ /dev/null @@ -1,62 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Triangulation_cell_base_with_info_3.tex -% +------------------------------------------------------------------------+ -% | 29.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSTriangulationcellbaseRev}{$Id$} -\RCSdefDate{\RCSTriangulationcellbaseDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefClass}{Triangulation_cell_base_with_info_3} - -\ccDefinition - -The class \ccc{Triangulation_cell_base_with_info_3} is a model of the concept -\ccc{TriangulationCellBase_3}, the base cell of a 3D-triangulation. -It provides an easy way to add some user defined information in cells. -Note that input/output operators discard this additional information. - -\ccInclude{CGAL/Triangulation_cell_base_with_info_3.h} - -\ccParameters - -The first template argument is the information the user would like to add -to a cell. It has to be \ccc{DefaultConstructible} and \ccc{Assignable}. - -The second template argument is the geometric traits class -\ccc{TriangulationTraits_3}. It is actually not used by this class. - -The third template argument is a cell base class from which -\ccc{Triangulation_cell_base_with_info_3} derives. It has the default value -\ccc{Triangulation_cell_base_3}. - -\ccIsModel \ccc{TriangulationCellBase_3} - -\ccInheritsFrom \ccc{TriangulationCellBase_3} - -\ccTypes -\ccTypedef{typedef Info Info;}{} - -\ccCreationVariable{v} - -\ccAccessFunctions -\ccThree{const Info&}{Facetxxxxxxxx}{} -\ccTagFullDeclarations - -\ccMethod{const Info& info() const;} -{Returns a const reference to the object of type \ccc{Info} stored in the cell.} -\ccGlue -\ccMethod{Info & info();} -{Returns a reference to the object of type \ccc{Info} stored in the cell.} - -\ccSeeAlso - -\ccc{CGAL::Triangulation_cell_base_3}\\ -\ccc{CGAL::Triangulation_cell_base_with_circumcenter_3} -\ccc{CGAL::Triangulation_vertex_base_with_info_3} - -\end{ccRefClass} diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_hierarchy_3.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_hierarchy_3.tex deleted file mode 100644 index 77696a5c952..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_hierarchy_3.tex +++ /dev/null @@ -1,85 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Triangulation_hierarchy_3.tex -% +------------------------------------------------------------------------+ -% | -% | Package: Triangulation3 -% | -\RCSdef{\RCSTriangulationhierarchyRev}{$Id$} -\RCSdefDate{\RCSTriangulationhierarchyDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefClass}{Triangulation_hierarchy_3} - -\begin{ccDeprecated} - -{\em Note} : this class is deprecated since \cgal\ 3.6. Its functionality has -been replaced by the use of the \ccc{Fast_location} tag as the -\ccc{LocationPolicy} template parameter in \ccc{Delaunay_triangulation_3}. - -\ccDefinition - -The class \ccc{Triangulation_hierarchy_3} implements a triangulation augmented -with a data structure which allows fast point location queries. As proved -in~\cite{cgal:d-dh-02}, this structure has an optimal behavior when it is built -for Delaunay triangulations. It can however be used for other triangulations. - -\ccInclude{CGAL/Triangulation_hierarchy_3.h} - -\ccParameters - -It is templated by a parameter which must be instantiated by one of the \cgal\ -triangulation classes. \textit{In the current implementation, only -\ccc{Delaunay_triangulation_3} is supported for \ccc{Tr}.} - -\ccc{Tr::Vertex} has to be a model of the concept -\ccc{TriangulationHierarchyVertexBase_3}.\\ -\ccc{Tr::Geom_traits} has to be a model of the concept -\ccc{DelaunayTriangulationTraits_3}. - -\ccInheritsFrom - -\ccc{Tr} - -\ccRefName\ offers exactly the same functionalities as \ccc{Tr}. -Most of them (point location, insertion, removal\ldots) are overloaded to -improve their efficiency by using the hierarchic structure. - -Note that, since the algorithms that are provided are randomized, the -running time of constructing a triangulation with a hierarchy may be -improved when shuffling the data points. - -However, the I/O operations are not overloaded. So, writing a -hierarchy into a file will lose the hierarchic structure and reading -it from the file will result in an ordinary triangulation whose -efficiency will be the same as \ccc{Tr}. - -\ccImplementation -The data structure is a hierarchy -of triangulations. The triangulation at the lowest level is -the original triangulation where operations and point location are to -be performed. -Then at each succeeding level, the data structure -stores a triangulation of a small random sample of the vertices -of the triangulation at the preceding level. Point location -is done through a top-down nearest neighbor query. -The nearest neighbor query is first -performed naively in the top level triangulation. -Then, at each following level, the nearest neighbor at that level -is found through a linear walk performed from -the nearest neighbor found at the preceding level. -Because the number of vertices in each triangulation is only a small -fraction of the number of vertices of the preceding triangulation -the data structure remains small and achieves fast point location -queries on real -data. - -\ccSeeAlso -\ccc{CGAL::Triangulation_hierarchy_vertex_base_3}\\ -\ccc{CGAL::Delaunay_triangulation_3} - -\end{ccDeprecated} - -\end{ccRefClass} diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_hierarchy_vertex_base_3.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_hierarchy_vertex_base_3.tex deleted file mode 100644 index 7d5f45ca89e..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_hierarchy_vertex_base_3.tex +++ /dev/null @@ -1,54 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Triangulation_hierarchy_vertex_base_3.tex -% +------------------------------------------------------------------------+ -% | -% | Package: Triangulation3 -% | -\RCSdef{\RCSTriangulationhierarchyvertexbaseRev}{$Id$} -\RCSdefDate{\RCSTriangulationhierarchyvertexbaseDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefClass}{Triangulation_hierarchy_vertex_base_3} - -\begin{ccDeprecated} - -{\em Note} : this class is deprecated since \cgal\ 3.6. Its functionality is now -transparently added when using the \ccc{Fast_location} tag as the -\ccc{LocationPolicy} template parameter in \ccc{Delaunay_triangulation_3}, -instead of \ccc{Triangulation_hierarchy_3}. - -\ccDefinition - -This class is designed to be used as the vertex base class for -\ccc{Triangulation_hierarchy_3}. - -It inherits from its parameter \ccc{TriangulationVertexBase_3}, and adds the -requirements in order to match the concept -\ccc{TriangulationHierarchyVertexBase_3}, it does so by storing two -\ccc{Vertex_handle}s. This design allows to use either a vertex base class -provided by \cgal, or a user customized vertex base with additional -functionalities. - -\ccInclude{CGAL/Triangulation_hierarchy_vertex_base_3.h} - -\ccParameters - -It is parameterized by a model of the concept \ccc{TriangulationVertexBase_3}. - -\ccIsModel \ccc{TriangulationHierarchyVertexBase_3} - -\ccInheritsFrom \ccc{TriangulationVertexBase_3} - -\ccCreationVariable{v} - -\ccSeeAlso -\ccc{CGAL::Triangulation_hierarchy_3}\\ -\ccc{CGAL::Triangulation_vertex_base_3}\\ -\ccc{CGAL::Triangulation_vertex_base_with_info_3} - -\end{ccDeprecated} - -\end{ccRefClass} diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_locate_type_3.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_locate_type_3.tex deleted file mode 100644 index f13000ce808..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_locate_type_3.tex +++ /dev/null @@ -1,30 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Triangulation_locate_type_3.tex -% +------------------------------------------------------------------------+ -% | 29.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSTriangulationlocatetypeRev}{$Id$} -\RCSdefDate{\RCSTriangulationlocatetypeDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - -\ccModifierCrossRefOff -\begin{ccRefEnum}[Triangulation_3::]{Locate_type} - -\ccDefinition - -The enum \ccRefName\ is defined by \ccc{Triangulation_3} to specify -which case occurs when locating a point in the triangulation. - -\ccEnum{enum Locate_type {VERTEX=0, EDGE, FACET, CELL, OUTSIDE_CONVEX_HULL, -OUTSIDE_AFFINE_HULL};} -{} - -\ccSeeAlso - -\ccc{CGAL::Triangulation_3} - -\end{ccRefEnum} -\ccModifierCrossRefOn diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_simplex_3.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_simplex_3.tex deleted file mode 100644 index fc46bc610a1..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_simplex_3.tex +++ /dev/null @@ -1,126 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Triangulation_simplex_3.tex -% +------------------------------------------------------------------------+ -% | 27.09.2005 Nico Kruithof -% | Package: Triangulation_3 -% | -\RCSdef{\RCSTriangulationsimplexRev}{$Id$} -\RCSdefDate{\RCSTriangulationsimplexDate}{$Date$} -% +------------------------------------------------------------------------+ - -\ccRefPageBegin - -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefClass}{Triangulation_simplex_3} -\label{refTriangulationSimplex} - -\ccDefinition The class \ccRefName\ stores a simplex of any dimension -defined by the \ccc{Triangulation_3} class. It also defines the -operator less such that simplices can be stored in a \ccc{map} or a -\ccc{set} of simplices. The simplex is invalidated by any change in -the triangulation. - -\ccInclude{CGAL/Triangulation_simplex_3.h} - -\ccParameters -% -It is parameterized by the triangulation it derives the simplices -from. - -\ccTypes -\ccThree{typedef Triangulation_simplex_3}{Triangulated}{} -\ccThreeToTwo - -\ccTypedef{typedef Triangulation_simplex_3 Simplex;}{ - The simplex class itself.} - -\ccTypedef{typedef Triangulation_3::Vertex_handle Vertex_handle;}{} -\ccGlue -\ccTypedef{typedef Triangulation_3::Edge Edge;}{} -\ccGlue -\ccTypedef{typedef Triangulation_3::Facet Facet;}{} -\ccGlue -\ccTypedef{typedef Triangulation_3::Cell_handle Cell_handle;}{} - -\ccTypedef{typedef Triangulation_3::Cell_circulator Cell_circulator;}{} -\ccGlue -\ccTypedef{typedef Triangulation_3::Facet_circulator Facet_circulator;}{} - -\ccTypedef{typedef Triangulation_3::Edge_iterator Edge_iterator;}{} -\ccGlue -\ccTypedef{typedef Triangulation_3::Facet_iterator Facet_iterator;}{} - -\ccTypedef{typedef Triangulation_3::Finite_vertices_iterator Finite_vertices_iterator;}{} -\ccGlue -\ccTypedef{typedef Triangulation_3::Finite_edges_iterator Finite_edges_iterator;}{} -\ccGlue -\ccTypedef{typedef Triangulation_3::Finite_facets_iterator Finite_facets_iterator;}{} -\ccGlue -\ccTypedef{typedef Triangulation_3::Finite_cells_iterator Finite_cells_iterator;}{} - - -\ccCreation -\ccCreationVariable{simplex} %% choose variable name -\ccThree{Triangulation_simplex_3}{simplex}{} -\ccThreeToTwo - -\ccConstructor{Triangulation_simplex_3();}{Initializes the simplex to - an invalid simplex.} - -\ccConstructor{Triangulation_simplex_3(Vertex_handle vh);}{} -\ccGlue -\ccConstructor{Triangulation_simplex_3(Edge e);}{} -\ccGlue -\ccConstructor{Triangulation_simplex_3(Facet f);}{} -\ccGlue -\ccConstructor{Triangulation_simplex_3(Cell_handle ch);}{} - -\ccConstructor{Triangulation_simplex_3(Cell_circulator ccir);}{} -\ccGlue -\ccConstructor{Triangulation_simplex_3(Facet_circulator fcir);}{} - -\ccConstructor{Triangulation_simplex_3(Edge_iterator eit);}{} -\ccGlue -\ccConstructor{Triangulation_simplex_3(Facet_iterator fit);}{} - -\ccOperations -\ccThree{Vertex_handle}{Vertex_handle(simplex)xx}{} -\ccThreeToTwo - -\ccMethod{int dimension () const;}{returns the dimension of the - simplex.} -% -\ccMethod{operator Vertex_handle () const;}{Returns the \ccc{Vertex_handle} - stored in the simplex. \ccPrecond{dimension() == 0}} -\ccGlue -\ccMethod{operator Edge () const;}{Returns the \ccc{Edge} - stored in the simplex. \ccPrecond{dimension() == 1}} -\ccGlue -\ccMethod{operator Facet () const;}{Returns the \ccc{Facet} - stored in the simplex. \ccPrecond{dimension() == 2}} -\ccGlue -\ccMethod{operator Cell_handle () const;}{Returns the \ccc{Cell_handle} - stored in the simplex. \ccPrecond{dimension() == 3}} - -\ccMethod{Cell_handle incident_cell () const;}{Returns a cell incident - to the simplex.} - - -\ccMethod{bool operator==(const - Triangulation_simplex_3 &s1);}{Test whether two - simplices are equal.} -% -\ccGlue -% -\ccMethod{bool operator< (const - Triangulation_simplex_3 &s1);}{Defines a ordering - on the simplices. This ordering depends on the memory layout and is - independent of the geometry. Therefore, the ordering is not intrinsic} - -\ccSeeAlso -\ccRefIdfierPage{CGAL::Triangulation_3} - -\end{ccRefClass} diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_vertex_base_3.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_vertex_base_3.tex deleted file mode 100644 index c7d8ba29f0d..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_vertex_base_3.tex +++ /dev/null @@ -1,58 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Triangulation_vertex_base_3.tex -% +------------------------------------------------------------------------+ -% | 29.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSTriangulationvertexbaseRev}{$Id$} -\RCSdefDate{\RCSTriangulationvertexbaseDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefClass}{Triangulation_vertex_base_3} - -\ccDefinition - -The class \ccc{Triangulation_vertex_base_3} is a model of the concept -\ccc{TriangulationVertexBase_3}, the base vertex of a 3D-triangulation. -This class stores a point. - -This class can be used directly or can serve as a base to derive other classes -with some additional attributes (a color for example) tuned for a specific -application. - -\ccInclude{CGAL/Triangulation_vertex_base_3.h} - -\ccParameters - -The first template argument is the geometric traits class -\ccc{TriangulationTraits_3} which provides the point type, \ccc{Point_3}. -Users of the geometric triangulations (Section~\ref{TDS3-sec-design} and -Chapter~\ref{chapter-Triangulation3}) are strongly advised to use the same -geometric traits class \ccc{TriangulationTraits_3} as the one used for -\ccc{Triangulation_3}. This way, the point type defined by the base vertex is -the same as the point type defined by the geometric traits class. - -The second template argument is a combinatorial vertex base class from which -\ccc{Triangulation_vertex_base_3} derives. -It has the default value \ccc{Triangulation_ds_vertex_base_3<>}. - -\ccIsModel \ccc{TriangulationVertexBase_3} - -\ccInheritsFrom \ccc{TriangulationDSVertexBase_3} - -\ccTypes - -\ccThree{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}{} -\ccThreeToTwo -\ccTypedef{typedef TriangulationTraits_3::Point_3 Point;}{} - -\ccSeeAlso - -\ccc{CGAL::Triangulation_cell_base_3}\\ -\ccc{CGAL::Triangulation_ds_vertex_base_3}\\ -\ccc{CGAL::Triangulation_vertex_base_with_info_3} - -\end{ccRefClass} diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_vertex_base_with_info_3.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_vertex_base_with_info_3.tex deleted file mode 100644 index bfa2e99e52e..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/Triangulation_vertex_base_with_info_3.tex +++ /dev/null @@ -1,61 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Triangulation_vertex_base_with_info_3.tex -% +------------------------------------------------------------------------+ -% | 29.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSTriangulationvertexbaseRev}{$Id$} -\RCSdefDate{\RCSTriangulationvertexbaseDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefClass}{Triangulation_vertex_base_with_info_3} - -\ccDefinition - -The class \ccc{Triangulation_vertex_base_with_info_3} is a model of the concept -\ccc{TriangulationVertexBase_3}, the base vertex of a 3D-triangulation. -It provides an easy way to add some user defined information in vertices. -Note that input/output operators discard this additional information. - -\ccInclude{CGAL/Triangulation_vertex_base_with_info_3.h} - -\ccParameters - -The first template argument is the information the user would like to add -to a vertex. It has to be \ccc{DefaultConstructible} and \ccc{Assignable}. - -The second template argument is the geometric traits class -\ccc{TriangulationTraits_3} which provides the \ccc{Point_3}. - -The third template argument is a vertex base class from which -\ccc{Triangulation_vertex_base_with_info_3} derives. It has the default -value \ccc{Triangulation_vertex_base_3}. - -\ccIsModel \ccc{TriangulationVertexBase_3} - -\ccInheritsFrom \ccc{TriangulationVertexBase_3} - -\ccTypes -\ccTypedef{typedef Info Info;}{} - -\ccCreationVariable{v} - -\ccAccessFunctions -\ccThree{const Info&}{Facetxxxxxxxxxx}{} -\ccTagFullDeclarations - -\ccMethod{const Info& info() const;} -{Returns a const reference to the object of type \ccc{Info} stored in the -vertex.} -\ccGlue -\ccMethod{Info& info();} -{Returns a reference to the object of type \ccc{Info} stored in the vertex.} -\ccSeeAlso - -\ccc{CGAL::Triangulation_cell_base_with_info_3}\\ -\ccc{CGAL::Triangulation_vertex_base_3} - -\end{ccRefClass} diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/WeightedPoint.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/WeightedPoint.tex deleted file mode 100644 index 91aad12eed4..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/WeightedPoint.tex +++ /dev/null @@ -1,53 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Weight_pt.tex -% +------------------------------------------------------------------------+ -% | 27.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSWeightedpointRev}{$Id$} -\RCSdefDate{\RCSWeightedpointDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - - -\begin{ccRefConcept}{WeightedPoint} - -%% \ccHtmlCrossLink{} %% add further rules for cross referencing links -%% \ccHtmlIndexC[concept]{} %% add further index entries - -\ccDefinition - -The concept \ccRefName\ is needed by -\ccc{Regular_triangulation_euclidean_traits_3}. -It must fulfill the following requirements: - -\ccTypes -\ccThree{typedef Point::RT}{RTxxxx}{} -\ccNestedType{Point}{The point type} -\ccGlue -\ccNestedType{Weight}{The weight type} -\ccGlue -\ccTypedef{typedef Point::RT RT;}{The ring type} - -\ccCreation -\ccCreationVariable{wp} - -\ccConstructor{WeightedPoint(const Point &p=Point(), const Weight &w -= Weight(0))}{} - -\ccAccessFunctions -\ccFunction{Point point() const;}{} -\ccGlue -\ccFunction{Weight weight() const;}{} - -\ccHasModels - -\ccc{Weighted_point}. - -\ccSeeAlso - -\ccc{CGAL::Regular_triangulation_euclidean_traits_3}\\ -\ccc{CGAL::Regular_triangulation_3}. - -\end{ccRefConcept} diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/flips.gif b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/flips.gif deleted file mode 100644 index 60156fcadddeabf2f9761c3c8001cd349cfc059f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2783 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 HjS&9<_EG#= diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/insert_outside_affine_hull.gif b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/insert_outside_affine_hull.gif deleted file mode 100644 index 6ee04d717cfa34180619b5d52107d472d54ab729..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1694 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 F{||6EwbTFr diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/insert_outside_convex_hull.gif b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/insert_outside_convex_hull.gif deleted file mode 100644 index 3e21752d3ff6da8042e6f87c5c994ab771e8d228..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1893 zcmV-r2b%atNk%w1VKxD=0Du4h00030|NkNR1OWg50RSuj0000s0kHr80{)DTsmtvT zqnxzbi?iOm`wxcVNS5Y_rs~SJ?hD8AOxN~}=lag~{tpZahs2`sh)gP%%%<}RjY_A~ zs`ZM^YPa03_X`e-$K)~&fCiY?>_!^hj)ULyy8J$^rxp7*{%@qW_b|u@cz7cSSK&vf zh6rh*__$FRK^d8ep-5s$@rbD@8ZfEic@aALb&605!U;0z@+brB!~{$nC0QbcI+;)zsn z+Bq5sVwcB{1SM`9>2jO5cpNLS9HR1N36ZJ)OGIl#tpF;ZPP7R?X{Kv=iEz6*f(*(v-O7(q(uz zu+2;TVsa}h^Y5!mO*JfZ>&9=`fx#pz*1A?ODn<&OCcAezS>4f_86_?k`E%CLj!8E* z9kg@iPWdd;eGJ>RY1vgppJpBPQ*Oqaej7Ke4|v+)uV+UiNqDF7jaf5Z_3qOjH+!yme8QCenLf5{n{q#C4&hoYNm4hm_VgkqYaLfEaCDWiXi`Y5UPVOS%Zp-TFurdhIj zo+=_%dZ(VPMz?CDfOb05hPxJOs->>Jdg+7BJOlnFchX&t20{t~>s_ZWsh22_u%jo@9}y*N#W!s|+`hFvjwRJFGbJw)uv z+C44Mz2%wvGSI-p5wo8sU5RzgMr+A)ffp~jEZA#D?Qz9DAB{DrF?+?(#%0JAD3bbq zxih}0k#sd%XE~%d5q1GfR>Z;{{tn}Yn*N+Ezcq(E*T>?jXftn%8VCvCdOyhI3VWCmBgdQsLX9(xc!)vnayxaS@d%ePl_FK3t2VBNN?OAfu) z;?*5<*cnS>OtP&tk`C3sG?0iepJQ=g|`nH-hE2 z4u9P1Oi44#;HGUp6BZE6vpbFfFn;$FU)?^p1oS~o3E0sb$leA#`E@A|^t!@R8nHa- zeacN6?1ku{@F`T;PkL`VUIy23LVifhQ-{MK=*VV6-XSZ5=A+d^&gVe3;Vp*;>{sfx zXFEUnWr)G*oxkKqhNXBdD@{`${1 z$V39gcnXqP5rSW29t+#>yCBYldfd9>eViB#fyGN~P>fCt=QKb+{zHqJNTeP|#K1z% z2#`)wq_p~0$KZ9aQhDUx6Dx@gIzDobG-PDd-k3?7ZK;9zgAJEr*pp^a5^Xmr;rir; zEm)KUiA3?Iox<^??|DVbTZo&NZs#OztfdLC(s zU=-)+hz8I)waiQc{h5{iq?XX_7*t8-?4Ilp2Fhnelu2rY=LmHbOMaenqv{C|*DPsF zf+drr|G+14Y+22*0f?PYIceiyYCxH?6dftGUFAl~AA;_*MkaNpOFy_onzBZYq0`0n zk{8UO_Hrry2`TZYdQYj&2Sla2jorNAAsea})<9MXpKcLB z9+_B0q`$qHi?&0d*y8T?Z(mg|9*pW-Sxq*&W+*LnuZ!L6YInQb?XGvf3*PXGcf8~+ fuX)dl-t?+>z3gqTd*2J+_{w*_^sO%i3IG5*e&nkc diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/insert_outside_convex_hull.pdf b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/insert_outside_convex_hull.pdf deleted file mode 100644 index df40343b31e65c59f16aeda580160b2df35c5c6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6929 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 diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/intro.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/intro.tex deleted file mode 100644 index da1c3c668a6..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/intro.tex +++ /dev/null @@ -1,96 +0,0 @@ -% +------------------------------------------------------------------------+ -% | Reference manual page: Triangulation/intro.tex -% +------------------------------------------------------------------------+ -% | 27.3.2000 Monique Teillaud -% | Package: Triangulation3 -% | -\RCSdef{\RCSTriangulationcellRev}{$Id$} -\RCSdefDate{\RCSTriangulationcellDate}{$Date$} -% | -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - -%\clearpage -%\section{Reference pages for 3D-Triangulations} - -\ccRefChapter{3D Triangulations} -\ccChapterAuthor{Sylvain Pion \and Monique Teillaud} - -A three-dimensional triangulation is a three-dimensional simplicial -complex, pure connected and without singularities \cite{by-ag-98}. Its -cells ($3$-faces) are such that two cells either do not intersect or -share a common facet ($2$-face), edge ($1$-face) or vertex ($0$-face). - -The basic 3D-triangulation class of \cgal\ is primarily designed to -represent the triangulations of a set of points $A$ in $\R^3$. It can -be viewed as a partition of the convex hull of {$A$} into tetrahedra -whose vertices are the points of {$A$}. Together with the unbounded -cell having the convex hull boundary as its frontier, the triangulation -forms a partition of $\R^3$. - -In order to deal -only with tetrahedra, which is convenient for many applications, the -unbounded cell can be subdivided into tetrahedra by considering that -each convex hull facet is incident to an \ccc{infinite cell} having as -fourth vertex an auxiliary vertex called the \ccc{infinite vertex}. In -that way, each facet is incident to exactly two cells and special cases -at the boundary of the convex hull are simple to deal with. - - -A triangulation is a collection of vertices and cells that are linked -together through incidence and adjacency relations. Each cell gives -access to its four incident vertices and to its four adjacent -cells. Each vertex gives access to one of its incident cells. - -The four vertices of a cell are indexed with 0, 1, 2 and 3 in positive -orientation, the positive orientation being defined by the orientation -of the underlying Euclidean space $\R^3$. The neighbors of a cell are also -indexed with 0, 1, 2, 3 in such a way that the neighbor indexed by $i$ -is opposite to the vertex with the same index. See -Figure~\ref{Triangulation3-fig-orient}. - - -\section{Classified Reference Pages} - -\subsection*{Concepts} - -\ccRefConceptPage{TriangulationTraits_3}\\ -\ccRefConceptPage{DelaunayTriangulationTraits_3}\\ -\ccRefConceptPage{RegularTriangulationTraits_3}\\ - -\ccRefConceptPage{TriangulationCellBase_3}\\ -\ccRefConceptPage{TriangulationVertexBase_3}\\ -\ccRefConceptPage{TriangulationHierarchyVertexBase_3}\\ - -\ccRefConceptPage{RegularTriangulationCellBase_3}\\ - -\ccRefConceptPage{TriangulationDataStructure_3}\\ -\ccRefConceptPage{WeightedPoint}\\ - -\subsection*{Classes} - -\subsubsection*{Main Classes} - -\ccRefIdfierPage{CGAL::Triangulation_3}\\ -\ccRefIdfierPage{CGAL::Delaunay_triangulation_3}\\ -\ccRefIdfierPage{CGAL::Triangulation_hierarchy_3}\\ -\ccRefIdfierPage{CGAL::Regular_triangulation_3} - -\ccRefIdfierPage{CGAL::Triangulation_cell_base_3}\\ -\ccRefIdfierPage{CGAL::Triangulation_cell_base_with_info_3}\\ -\ccRefIdfierPage{CGAL::Triangulation_cell_base_with_circumcenter_3}\\ -\ccRefIdfierPage{CGAL::Triangulation_vertex_base_3}\\ -\ccRefIdfierPage{CGAL::Triangulation_vertex_base_with_info_3}\\ -\ccRefIdfierPage{CGAL::Triangulation_hierarchy_vertex_base_3}\\ -\ccRefIdfierPage{CGAL::Regular_triangulation_cell_base_3}\\ -\ccRefIdfierPage{CGAL::Triangulation_simplex_3} - -\subsubsection*{Traits Classes} - -\ccRefIdfierPage{CGAL::Regular_triangulation_euclidean_traits_3} - - -\subsection*{Enums} - -\ccRefIdfierPage{CGAL::Triangulation_3::Locate_type} - diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/main.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/main.tex deleted file mode 100644 index 95572e42ce1..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/main.tex +++ /dev/null @@ -1,40 +0,0 @@ -% +------------------------------------------------------------------------+ -% | CBP Reference Manual: main.tex -% +------------------------------------------------------------------------+ -% | Automatically generated driver file for the reference manual chapter -% | of this package. Do not edit manually, you may loose your changes. -% +------------------------------------------------------------------------+ - -\input{Triangulation_3_ref/intro.tex} - -\input{Triangulation_3_ref/Triangulation_3.tex} -\input{Triangulation_3_ref/Delaunay_triangulation_3.tex} -\input{Triangulation_3_ref/Triangulation_hierarchy_3.tex} -\input{Triangulation_3_ref/Regular_triangulation_3.tex} - -\input{Triangulation_3_ref/TriangulationTraits_3.tex} -\input{Triangulation_3_ref/DelaunayTriangulationTraits_3.tex} -\input{Triangulation_3_ref/RegularTriangulationTraits_3.tex} - -\input{Triangulation_3_ref/Regular_triangulation_euclidean_traits_3.tex} - -\input{Triangulation_3_ref/TriangulationCellBase_3.tex} -\input{Triangulation_3_ref/TriangulationVertexBase_3.tex} -\input{Triangulation_3_ref/Triangulation_simplex_3.tex} -\input{Triangulation_3_ref/TriangulationHierarchyVertexBase_3.tex} - -\input{Triangulation_3_ref/RegularCellBase_3.tex} - -\input{Triangulation_3_ref/Triangulation_cell_base_3.tex} -\input{Triangulation_3_ref/Triangulation_cell_base_with_info_3.tex} -\input{Triangulation_3_ref/Triangulation_cell_base_with_circumcenter_3.tex} -\input{Triangulation_3_ref/Triangulation_vertex_base_3.tex} -\input{Triangulation_3_ref/Triangulation_vertex_base_with_info_3.tex} -\input{Triangulation_3_ref/Triangulation_hierarchy_vertex_base_3.tex} - -\input{Triangulation_3_ref/Regular_triangulation_cell_base_3.tex} - -\input{Triangulation_3_ref/Triangulation_locate_type_3.tex} -\input{Triangulation_3_ref/WeightedPoint.tex} - -\input{Triangulation_3_ref/Regular_triangulation_filtered_traits_3.tex} diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/sidedim2.gif b/Triangulation_3_copy_tds/doc_tex/Triangulation_3_ref/sidedim2.gif deleted file mode 100644 index d0e019929faca07058497087c4b9ccae2b4dc292..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3086 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 S1aM{I<-%lOkXDt!{Qm&8eRCK9 diff --git a/Triangulation_3_copy_tds/dont_submit b/Triangulation_3_copy_tds/dont_submit deleted file mode 100644 index f59972245bd..00000000000 --- a/Triangulation_3_copy_tds/dont_submit +++ /dev/null @@ -1,2 +0,0 @@ -tds3_small.pdf -benchmark diff --git a/Triangulation_3_copy_tds/examples/Triangulation_3/README b/Triangulation_3_copy_tds/examples/Triangulation_3/README deleted file mode 100644 index d67b701d3d5..00000000000 --- a/Triangulation_3_copy_tds/examples/Triangulation_3/README +++ /dev/null @@ -1,52 +0,0 @@ -------- simple_triangulation_3 ----------------------------------------------- - -This example shows the incremental construction of a 3D triangulation, -the location of a point, and how to manipulate elementary operations -on indices in a cell. It uses the default parameters proposed by -CGAL for the Triangulation_3 class. - - -------- color ------------------------------------------------ - -This example shows how the user can plug his own vertex base in a -triangulation. - -------- adding_handles_3 --------------------------------------- - -This example shows how the user can plug his own vertex base -in a triangulation, when he needs to add handles in it. - - -------- fast_location_3 -------------------------------------------- - -This example shows the use of the Fast_location policy to speed up -point location queries in a Delaunay triangulation. - -------- tds -------------------------------------------------- - -Shows how to construct a 3D triangulation data structure by -inserting vertices. - - -------- find_conflicts_3 --------------------------------------- - -Illustrates how the insertion process of points in a Delaunay -triangulation can be decomposed in order to give access to the -cells in conflict (those which would be destroyed by the insertion -of a point) prior to deciding to do the actual insertion or not. - - -------- linking_2d_and_3d ------------------------------------ - -Illustrates how to setup a 2D and a 3D triangulation data structure -whose vertices respectively store vertex handles of the other one. - - -------- regular_3 ---------------------------------------------- - -Illustrates the use of Regular_triangulation_3. - - -------- simplex ---------------------------------------------- - -Illustrates the use of Triangulation_3::Simplex. diff --git a/Triangulation_3_copy_tds/examples/Triangulation_3/adding_handles_3.cpp b/Triangulation_3_copy_tds/examples/Triangulation_3/adding_handles_3.cpp deleted file mode 100644 index 91592697d08..00000000000 --- a/Triangulation_3_copy_tds/examples/Triangulation_3/adding_handles_3.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#include -#include -#include - -template < class GT, class Vb = CGAL::Triangulation_vertex_base_3 > -class My_vertex_base - : public Vb -{ -public: - typedef typename Vb::Vertex_handle Vertex_handle; - typedef typename Vb::Cell_handle Cell_handle; - typedef typename Vb::Point Point; - - template < class TDS2 > - struct Rebind_TDS { - typedef typename Vb::template Rebind_TDS::Other Vb2; - typedef My_vertex_base Other; - }; - - My_vertex_base() {} - - My_vertex_base(const Point& p) - : Vb(p) {} - - My_vertex_base(const Point& p, Cell_handle c) - : Vb(p, c) {} - - Vertex_handle vh; - Cell_handle ch; -}; - - -typedef CGAL::Exact_predicates_inexact_constructions_kernel K; - -typedef CGAL::Triangulation_data_structure_3 > Tds; -typedef CGAL::Delaunay_triangulation_3 Delaunay; - -typedef Delaunay::Vertex_handle Vertex_handle; -typedef Delaunay::Point Point; - -int main() -{ - Delaunay T; - - Vertex_handle v0 = T.insert(Point(0,0,0)); - Vertex_handle v1 = T.insert(Point(1,0,0)); - Vertex_handle v2 = T.insert(Point(0,1,0)); - Vertex_handle v3 = T.insert(Point(0,0,1)); - Vertex_handle v4 = T.insert(Point(2,2,2)); - Vertex_handle v5 = T.insert(Point(-1,0,1)); - - // Now we can link the vertices as we like. - v0->vh = v1; - v1->vh = v2; - v2->vh = v3; - v3->vh = v4; - v4->vh = v5; - v5->vh = v0; - - return 0; -} diff --git a/Triangulation_3_copy_tds/examples/Triangulation_3/color.cpp b/Triangulation_3_copy_tds/examples/Triangulation_3/color.cpp deleted file mode 100644 index 7bb190843b5..00000000000 --- a/Triangulation_3_copy_tds/examples/Triangulation_3/color.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include -#include -#include -#include - -typedef CGAL::Exact_predicates_inexact_constructions_kernel K; - -typedef CGAL::Triangulation_vertex_base_with_info_3 Vb; -typedef CGAL::Triangulation_data_structure_3 Tds; -typedef CGAL::Delaunay_triangulation_3 Delaunay; - -typedef Delaunay::Point Point; - -int main() -{ - Delaunay T; - - T.insert(Point(0,0,0)); - T.insert(Point(1,0,0)); - T.insert(Point(0,1,0)); - T.insert(Point(0,0,1)); - T.insert(Point(2,2,2)); - T.insert(Point(-1,0,1)); - - // Set the color of finite vertices of degree 6 to red. - Delaunay::Finite_vertices_iterator vit; - for (vit = T.finite_vertices_begin(); vit != T.finite_vertices_end(); ++vit) - if (T.degree(vit) == 6) - vit->info() = CGAL::RED; - - return 0; -} diff --git a/Triangulation_3_copy_tds/examples/Triangulation_3/fast_location_3.cpp b/Triangulation_3_copy_tds/examples/Triangulation_3/fast_location_3.cpp deleted file mode 100644 index 1d2ce0ccc77..00000000000 --- a/Triangulation_3_copy_tds/examples/Triangulation_3/fast_location_3.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include -#include -#include - -#include -#include - -typedef CGAL::Exact_predicates_inexact_constructions_kernel K; -typedef CGAL::Delaunay_triangulation_3 Delaunay; -typedef Delaunay::Point Point; - -int main() -{ - // generating points on a grid. - std::vector P; - - for (int z=0 ; z<20 ; z++) - for (int y=0 ; y<20 ; y++) - for (int x=0 ; x<20 ; x++) - P.push_back(Point(x,y,z)); - - // building their Delaunay triangulation. - Delaunay T(P.begin(), P.end()); - - assert( T.number_of_vertices() == 8000 ); - - // performing nearest vertex queries to a series of random points, - // which is a case where the Fast_location policy is beneficial. - for (int i=0; i<10000; ++i) - T.nearest_vertex(Point(CGAL::default_random.get_double(0, 20), - CGAL::default_random.get_double(0, 20), - CGAL::default_random.get_double(0, 20))); - - return 0; -} diff --git a/Triangulation_3_copy_tds/examples/Triangulation_3/find_conflicts_3.cpp b/Triangulation_3_copy_tds/examples/Triangulation_3/find_conflicts_3.cpp deleted file mode 100644 index 60211a47bb3..00000000000 --- a/Triangulation_3_copy_tds/examples/Triangulation_3/find_conflicts_3.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include -#include -#include - -#include -#include - -typedef CGAL::Exact_predicates_inexact_constructions_kernel K; - -typedef CGAL::Delaunay_triangulation_3 Delaunay; -typedef Delaunay::Point Point; -typedef Delaunay::Cell_handle Cell_handle; -typedef Delaunay::Facet Facet; - -int main() -{ - Delaunay T; - CGAL::Random_points_in_sphere_3 rnd; - - // First, make sure the triangulation is 3D. - T.insert(Point(0,0,0)); - T.insert(Point(1,0,0)); - T.insert(Point(0,1,0)); - T.insert(Point(0,0,1)); - - assert(T.dimension() == 3); - - // Inserts 100 random points if and only if their insertion - // in the Delaunay tetrahedralization conflicts with - // an even number of cells. - for (int i = 0; i != 100; ++i) { - Point p = *rnd++; - - // Locate the point - Delaunay::Locate_type lt; - int li, lj; - Cell_handle c = T.locate(p, lt, li, lj); - if (lt == Delaunay::VERTEX) - continue; // Point already exists - - // Get the cells that conflict with p in a vector V, - // and a facet on the boundary of this hole in f. - std::vector V; - Facet f; - - T.find_conflicts(p, c, - CGAL::Oneset_iterator(f), // Get one boundary facet - std::back_inserter(V)); // Conflict cells in V - - if ((V.size() & 1) == 0) // Even number of conflict cells ? - T.insert_in_hole(p, V.begin(), V.end(), f.first, f.second); - } - - std::cout << "Final triangulation has " << T.number_of_vertices() - << " vertices." << std::endl; - - return 0; -} diff --git a/Triangulation_3_copy_tds/examples/Triangulation_3/linking_2d_and_3d.cpp b/Triangulation_3_copy_tds/examples/Triangulation_3/linking_2d_and_3d.cpp deleted file mode 100644 index f4e6b63a015..00000000000 --- a/Triangulation_3_copy_tds/examples/Triangulation_3/linking_2d_and_3d.cpp +++ /dev/null @@ -1,82 +0,0 @@ -#include -#include -#include - -// declare the 2D vertex base type, parametrized by some 3D TDS. -template < typename T3, typename Vb = CGAL::Triangulation_ds_vertex_base_2<> > -class My_vertex_2; - -// declare the 3D vertex base type, parametrized by some 2D TDS. -template < typename T2, typename Vb = CGAL::Triangulation_ds_vertex_base_3<> > -class My_vertex_3; - -// Then, we have to break the dependency cycle. - -// we need to refer to a dummy 3D TDS. -typedef CGAL::Triangulation_ds_vertex_base_3<>::Triangulation_data_structure - Dummy_tds_3; -// the 2D TDS, initially plugging a dummy 3D TDS in the vertex type -// (to break the dependency cycle). -typedef CGAL::Triangulation_data_structure_2 > TDS_2; -// the 3D TDS, here we can plug the 2D TDS directly. -typedef CGAL::Triangulation_data_structure_3 > TDS_3; - - -template < typename T3, typename Vb > -class My_vertex_2 - : public Vb -{ -public: - typedef typename Vb::Face_handle Face_handle; - - template - struct Rebind_TDS { - typedef typename Vb::template Rebind_TDS::Other Vb2; - // we also have to break the cycle here by hardcoding TDS_3 instead of T3. - typedef My_vertex_2 Other; - }; - - My_vertex_2() {} - - My_vertex_2(Face_handle f) : Vb(f) {} - - // we store a vertex handle of the 3D TDS. - typename T3::Vertex_handle v3; -}; - -template < typename T2, typename Vb > -class My_vertex_3 - : public Vb -{ -public: - typedef typename Vb::Cell_handle Cell_handle; - - template - struct Rebind_TDS { - typedef typename Vb::template Rebind_TDS::Other Vb2; - typedef My_vertex_3 Other; - }; - - My_vertex_3() {} - - My_vertex_3(Cell_handle c) : Vb(c) {} - - // we store a vertex handle of the 2D TDS. - typename T2::Vertex_handle v2; -}; - - -int main() { - TDS_2 t2; - TDS_3 t3; - - TDS_2::Vertex_handle v2 = t2.insert_dim_up(); - TDS_3::Vertex_handle v3 = t3.insert_increase_dimension(); - - v2->v3 = v3; - v3->v2 = v2; - - assert(t2.is_valid()); - assert(t3.is_valid()); - return 0; -} diff --git a/Triangulation_3_copy_tds/examples/Triangulation_3/regular_3.cpp b/Triangulation_3_copy_tds/examples/Triangulation_3/regular_3.cpp deleted file mode 100644 index e75adb2a380..00000000000 --- a/Triangulation_3_copy_tds/examples/Triangulation_3/regular_3.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include -#include -#include -#include -#include - -typedef CGAL::Exact_predicates_inexact_constructions_kernel K; - -typedef CGAL::Regular_triangulation_euclidean_traits_3 Traits; - -typedef Traits::RT Weight; -typedef Traits::Bare_point Point; -typedef Traits::Weighted_point Weighted_point; - -typedef CGAL::Regular_triangulation_3 Rt; - -typedef Rt::Vertex_iterator Vertex_iterator; -typedef Rt::Vertex_handle Vertex_handle; - -int main() -{ - // generate points on a 3D grid - std::vector P; - - int number_of_points = 0; - - for (int z=0 ; z<5 ; z++) - for (int y=0 ; y<5 ; y++) - for (int x=0 ; x<5 ; x++) { - Point p(x, y, z); - Weight w = (x+y-z*y*x)*2.0; // let's say this is the weight. - P.push_back(Weighted_point(p, w)); - ++number_of_points; - } - - Rt T; - - // insert all points in a row (this is faster than one insert() at a time). - T.insert (P.begin(), P.end()); - - assert( T.is_valid() ); - assert( T.dimension() == 3 ); - - std::cout << "Number of vertices : " << T.number_of_vertices() << std::endl; - - // removal of all vertices - int count = 0; - while (T.number_of_vertices() > 0) { - T.remove (T.finite_vertices_begin()); - ++count; - } - - assert( count == number_of_points ); - - return 0; -} diff --git a/Triangulation_3_copy_tds/examples/Triangulation_3/simple_triangulation_3.cpp b/Triangulation_3_copy_tds/examples/Triangulation_3/simple_triangulation_3.cpp deleted file mode 100644 index d997669ee72..00000000000 --- a/Triangulation_3_copy_tds/examples/Triangulation_3/simple_triangulation_3.cpp +++ /dev/null @@ -1,72 +0,0 @@ -#include -#include - -#include -#include -#include -#include -#include - -typedef CGAL::Exact_predicates_inexact_constructions_kernel K; - -typedef CGAL::Triangulation_3 Triangulation; - -typedef Triangulation::Cell_handle Cell_handle; -typedef Triangulation::Vertex_handle Vertex_handle; -typedef Triangulation::Locate_type Locate_type; -typedef Triangulation::Point Point; - -int main() -{ - // construction from a list of points : - std::list L; - L.push_front(Point(0,0,0)); - L.push_front(Point(1,0,0)); - L.push_front(Point(0,1,0)); - - Triangulation T(L.begin(), L.end()); - - Triangulation::size_type n = T.number_of_vertices(); - - // insertion from a vector : - std::vector V(3); - V[0] = Point(0,0,1); - V[1] = Point(1,1,1); - V[2] = Point(2,2,2); - - n = n + T.insert(V.begin(), V.end()); - - assert( n == 6 ); // 6 points have been inserted - assert( T.is_valid() ); // checking validity of T - - Locate_type lt; - int li, lj; - Point p(0,0,0); - Cell_handle c = T.locate(p, lt, li, lj); - // p is the vertex of c of index li : - assert( lt == Triangulation::VERTEX ); - assert( c->vertex(li)->point() == p ); - - Vertex_handle v = c->vertex( (li+1)&3 ); - // v is another vertex of c - Cell_handle nc = c->neighbor(li); - // nc = neighbor of c opposite to the vertex associated with p - // nc must have vertex v : - int nli; - assert( nc->has_vertex( v, nli ) ); - // nli is the index of v in nc - - std::ofstream oFileT("output",std::ios::out); - // writing file output; - oFileT << T; - - Triangulation T1; - std::ifstream iFileT("output",std::ios::in); - // reading file output; - iFileT >> T1; - assert( T1.is_valid() ); - assert( T1.number_of_vertices() == T.number_of_vertices() ); - assert( T1.number_of_cells() == T.number_of_cells() ); - - return 0; -} diff --git a/Triangulation_3_copy_tds/examples/Triangulation_3/simplex.cpp b/Triangulation_3_copy_tds/examples/Triangulation_3/simplex.cpp deleted file mode 100644 index eed05980d79..00000000000 --- a/Triangulation_3_copy_tds/examples/Triangulation_3/simplex.cpp +++ /dev/null @@ -1,53 +0,0 @@ -#include -#include - -#include -#include -#include -#include - -typedef CGAL::Exact_predicates_inexact_constructions_kernel K; - -typedef CGAL::Triangulation_3 Triangulation; - -typedef Triangulation::Finite_vertices_iterator Finite_vertices_iterator; -typedef Triangulation::Finite_edges_iterator Finite_edges_iterator; -typedef Triangulation::Finite_facets_iterator Finite_facets_iterator; -typedef Triangulation::Finite_cells_iterator Finite_cells_iterator; -typedef Triangulation::Simplex Simplex; -typedef Triangulation::Locate_type Locate_type; -typedef Triangulation::Point Point; - -int main() -{ - // construction from a list of points : - std::list L; - L.push_front(Point(0,0,0)); - L.push_front(Point(1,0,0)); - L.push_front(Point(0,1,0)); - L.push_front(Point(0,1,1)); - - Triangulation T(L.begin(), L.end()); - - std::set simplices; - - Finite_vertices_iterator vit = T.finite_vertices_begin(); - simplices.insert(Simplex(vit)); - - Finite_cells_iterator cit = T.finite_cells_begin(); - simplices.insert(Simplex(cit)); - - Finite_edges_iterator eit = T.finite_edges_begin(); - simplices.insert(Simplex(*eit)); - - Finite_facets_iterator fit = T.finite_facets_begin(); - simplices.insert(Simplex(*fit)); - - - for (std::set::iterator it = simplices.begin(); - it != simplices.end(); it++) { - std::cout << it->dimension() << std::endl; - } - - return 0; -} diff --git a/Triangulation_3_copy_tds/examples/Triangulation_3/tds.cpp b/Triangulation_3_copy_tds/examples/Triangulation_3/tds.cpp deleted file mode 100644 index 2f3365ebe0d..00000000000 --- a/Triangulation_3_copy_tds/examples/Triangulation_3/tds.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include -#include -#include -#include -#include - -typedef CGAL::Triangulation_data_structure_3<> Tds; - -typedef Tds::size_type size_type; -typedef Tds::Cell_handle Cell_handle; -typedef Tds::Vertex_handle Vertex_handle; - -int main() -{ - Tds T; - - assert( T.number_of_vertices() == 0 ); - assert( T.dimension() == -2 ); - assert( T.is_valid() ); - - std::vector PV(7); - - PV[0] = T.insert_increase_dimension(); - assert( T.number_of_vertices() == 1 ); - assert( T.dimension() == -1 ); - assert( T.is_valid() ); - - // each of the following insertions of vertices increases the dimension - for ( int i=1; i<5; i++ ) { - PV[i] = T.insert_increase_dimension(PV[0]); - assert( T.number_of_vertices() == (size_type) i+1 ); - assert( T.dimension() == i-1 ); - assert( T.is_valid() ); - } - assert( T.number_of_cells() == 5 ); - - // we now have a simplex in dimension 4 - - // cell incident to PV[0] - Cell_handle c = PV[0]->cell(); - int ind; - bool check = c->has_vertex( PV[0], ind ); - assert( check ); - // PV[0] is the vertex of index ind in c - - // insertion of a new vertex in the facet opposite to PV[0] - PV[5] = T.insert_in_facet(c, ind); - - assert( T.number_of_vertices() == 6 ); - assert( T.dimension() == 3 ); - assert( T.is_valid() ); - - // insertion of a new vertex in c - PV[6] = T.insert_in_cell(c); - - assert( T.number_of_vertices() == 7 ); - assert( T.dimension() == 3 ); - assert( T.is_valid() ); - - std::ofstream oFileT("output_tds",std::ios::out); - // writing file output_tds; - oFileT << T; - - return 0; -} diff --git a/Triangulation_3_copy_tds/include/CGAL/Delaunay_triangulation_3.h b/Triangulation_3_copy_tds/include/CGAL/Delaunay_triangulation_3.h deleted file mode 100644 index 0e52632eb40..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/Delaunay_triangulation_3.h +++ /dev/null @@ -1,1585 +0,0 @@ -// Copyright (c) 1999-2004 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Monique Teillaud -// Sylvain Pion -// Andreas Fabri - -#ifndef CGAL_DELAUNAY_TRIANGULATION_3_H -#define CGAL_DELAUNAY_TRIANGULATION_3_H - -#include - -#include -#include - -#include -#include -#include - -#ifndef CGAL_TRIANGULATION_3_DONT_INSERT_RANGE_OF_POINTS_WITH_INFO -#include - -#include -#include -#include -#endif //CGAL_TRIANGULATION_3_DONT_INSERT_RANGE_OF_POINTS_WITH_INFO - -#ifdef CGAL_DELAUNAY_3_OLD_REMOVE -# error "The old remove() code has been removed. Please report any issue you may have with the current one." -#endif - -namespace CGAL { - -template < class Gt, - class Tds_ = Default, - class Location_policy = Default > -class Delaunay_triangulation_3; - - -template < class Gt, class Tds_ > -class Delaunay_triangulation_3 - : public Triangulation_3 -{ - typedef Delaunay_triangulation_3 Self; - typedef Triangulation_3 Tr_Base; - -public: - - typedef typename Tr_Base::Triangulation_data_structure - Triangulation_data_structure; - typedef Gt Geom_traits; - typedef Compact_location Location_policy; - - typedef typename Gt::Point_3 Point; - typedef typename Gt::Segment_3 Segment; - typedef typename Gt::Triangle_3 Triangle; - typedef typename Gt::Tetrahedron_3 Tetrahedron; - - // types for dual: - typedef typename Gt::Line_3 Line; - typedef typename Gt::Ray_3 Ray; - //typedef typename Gt::Plane_3 Plane; - typedef typename Gt::Object_3 Object; - - typedef typename Tr_Base::Cell_handle Cell_handle; - typedef typename Tr_Base::Vertex_handle Vertex_handle; - - typedef typename Tr_Base::Cell Cell; - typedef typename Tr_Base::Vertex Vertex; - typedef typename Tr_Base::Facet Facet; - typedef typename Tr_Base::Edge Edge; - - typedef typename Tr_Base::Cell_circulator Cell_circulator; - typedef typename Tr_Base::Facet_circulator Facet_circulator; - typedef typename Tr_Base::Cell_iterator Cell_iterator; - typedef typename Tr_Base::Facet_iterator Facet_iterator; - typedef typename Tr_Base::Edge_iterator Edge_iterator; - typedef typename Tr_Base::Vertex_iterator Vertex_iterator; - - typedef typename Tr_Base::Finite_vertices_iterator Finite_vertices_iterator; - typedef typename Tr_Base::Finite_cells_iterator Finite_cells_iterator; - typedef typename Tr_Base::Finite_facets_iterator Finite_facets_iterator; - typedef typename Tr_Base::Finite_edges_iterator Finite_edges_iterator; - - typedef typename Tr_Base::All_cells_iterator All_cells_iterator; - - typedef typename Tr_Base::size_type size_type; - typedef typename Tr_Base::Locate_type Locate_type; - - -#ifndef CGAL_CFG_USING_BASE_MEMBER_BUG_2 - using Tr_Base::cw; - using Tr_Base::ccw; - using Tr_Base::geom_traits; - using Tr_Base::number_of_vertices; - using Tr_Base::dimension; - using Tr_Base::finite_facets_begin; - using Tr_Base::finite_facets_end; - using Tr_Base::finite_vertices_begin; - using Tr_Base::finite_vertices_end; - using Tr_Base::finite_cells_begin; - using Tr_Base::finite_cells_end; - using Tr_Base::finite_edges_begin; - using Tr_Base::finite_edges_end; - using Tr_Base::tds; - using Tr_Base::infinite_vertex; - using Tr_Base::next_around_edge; - using Tr_Base::vertex_triple_index; - using Tr_Base::mirror_vertex; - using Tr_Base::coplanar; - using Tr_Base::coplanar_orientation; - using Tr_Base::orientation; - using Tr_Base::adjacent_vertices; - using Tr_Base::construct_segment; - using Tr_Base::incident_facets; - using Tr_Base::insert_in_conflict; - using Tr_Base::is_infinite; - using Tr_Base::is_valid_finite; - using Tr_Base::locate; - using Tr_Base::side_of_edge; - using Tr_Base::side_of_segment; - using Tr_Base::find_conflicts; -#endif - -protected: - - Oriented_side - side_of_oriented_sphere(const Point &p0, const Point &p1, const Point &p2, - const Point &p3, const Point &t, bool perturb = false) const; - - Bounded_side - coplanar_side_of_bounded_circle(const Point &p, const Point &q, - const Point &r, const Point &s, bool perturb = false) const; - - // for dual: - Point - construct_circumcenter(const Point &p, const Point &q, const Point &r) const - { - return geom_traits().construct_circumcenter_3_object()(p, q, r); - } - - Line - construct_equidistant_line(const Point &p1, const Point &p2, - const Point &p3) const - { - return geom_traits().construct_equidistant_line_3_object()(p1, p2, p3); - } - - Ray - construct_ray(const Point &p, const Line &l) const - { - return geom_traits().construct_ray_3_object()(p, l); - } - - Object - construct_object(const Point &p) const - { - return geom_traits().construct_object_3_object()(p); - } - - Object - construct_object(const Segment &s) const - { - return geom_traits().construct_object_3_object()(s); - } - - Object - construct_object(const Ray &r) const - { - return geom_traits().construct_object_3_object()(r); - } - - bool - less_distance(const Point &p, const Point &q, const Point &r) const - { - return geom_traits().compare_distance_3_object()(p, q, r) == SMALLER; - } - -public: - - Delaunay_triangulation_3(const Gt& gt = Gt()) - : Tr_Base(gt) - {} - - // copy constructor duplicates vertices and cells - Delaunay_triangulation_3(const Delaunay_triangulation_3 & tr) - : Tr_Base(tr) - { - CGAL_triangulation_postcondition( is_valid() ); - } - - template < typename InputIterator > - Delaunay_triangulation_3(InputIterator first, InputIterator last, - const Gt& gt = Gt()) - : Tr_Base(gt) - { - insert(first, last); - } - -#ifndef CGAL_TRIANGULATION_3_DONT_INSERT_RANGE_OF_POINTS_WITH_INFO - template < class InputIterator > - std::ptrdiff_t - insert( InputIterator first, InputIterator last, - typename boost::enable_if< - boost::is_base_of< - Point, - typename std::iterator_traits::value_type - > - >::type* = NULL - ) -#else - template < class InputIterator > - std::ptrdiff_t - insert( InputIterator first, InputIterator last) -#endif //CGAL_TRIANGULATION_3_DONT_INSERT_RANGE_OF_POINTS_WITH_INFO - { - size_type n = number_of_vertices(); - std::vector points (first, last); - spatial_sort (points.begin(), points.end(), geom_traits()); - - Vertex_handle hint; - for (typename std::vector::const_iterator p = points.begin(), end = points.end(); - p != end; ++p) - hint = insert(*p, hint); - - return number_of_vertices() - n; - } - - -#ifndef CGAL_TRIANGULATION_3_DONT_INSERT_RANGE_OF_POINTS_WITH_INFO -private: - template - const Point& top_get_first(const std::pair& pair) const { return pair.first; } - template - const Info& top_get_second(const std::pair& pair) const { return pair.second; } - template - const Point& top_get_first(const boost::tuple& tuple) const { return boost::get<0>(tuple); } - template - const Info& top_get_second(const boost::tuple& tuple) const { return boost::get<1>(tuple); } - - template - std::ptrdiff_t insert_with_info(InputIterator first,InputIterator last) - { - size_type n = number_of_vertices(); - std::vector indices; - std::vector points; - std::vector infos; - std::size_t index=0; - for (InputIterator it=first;it!=last;++it){ - Tuple_or_pair value=*it; - points.push_back( top_get_first(value) ); - infos.push_back ( top_get_second(value) ); - indices.push_back(index++); - } - - typedef internal::Vector_property_map Point_pmap; - typedef internal::Spatial_sort_traits_with_property_map_3 Search_traits; - - spatial_sort(indices.begin(),indices.end(),Search_traits(Point_pmap(points),geom_traits())); - - Vertex_handle hint; - for (typename std::vector::const_iterator - it = indices.begin(), end = indices.end(); - it != end; ++it){ - hint = insert(points[*it], hint); - if (hint!=Vertex_handle()) hint->info()=infos[*it]; - } - - return number_of_vertices() - n; - } - -public: - - template < class InputIterator > - std::ptrdiff_t - insert( InputIterator first, - InputIterator last, - typename boost::enable_if< - boost::is_same< - typename std::iterator_traits::value_type, - std::pair::type> - > >::type* =NULL - ) - { - return insert_with_info< std::pair::type> >(first,last); - } - - template - std::ptrdiff_t - insert( boost::zip_iterator< boost::tuple > first, - boost::zip_iterator< boost::tuple > last, - typename boost::enable_if< - boost::mpl::and_< - boost::is_same< typename std::iterator_traits::value_type, Point >, - boost::is_same< typename std::iterator_traits::value_type, typename internal::Info_check::type > - > - >::type* =NULL - ) - { - return insert_with_info< boost::tuple::type> >(first,last); - } -#endif //CGAL_TRIANGULATION_3_DONT_INSERT_RANGE_OF_POINTS_WITH_INFO - - Vertex_handle insert(const Point & p, Vertex_handle hint) - { - return insert(p, hint == Vertex_handle() ? this->infinite_cell() : hint->cell()); - } - - Vertex_handle insert(const Point & p, Cell_handle start = Cell_handle()); - - Vertex_handle insert(const Point & p, Locate_type lt, - Cell_handle c, int li, int); - -public: // internal methods - - template - Vertex_handle insert_and_give_new_cells(const Point &p, - OutputItCells fit, - Cell_handle start = Cell_handle() ); - - template - Vertex_handle insert_and_give_new_cells(const Point& p, - OutputItCells fit, - Vertex_handle hint); - - template - Vertex_handle insert_and_give_new_cells(const Point& p, - Locate_type lt, - Cell_handle c, int li, int lj, - OutputItCells fit); - -public: - -#ifndef CGAL_NO_DEPRECATED_CODE - CGAL_DEPRECATED Vertex_handle move_point(Vertex_handle v, const Point & p); -#endif - - template - Triple - find_conflicts(const Point &p, Cell_handle c, - OutputIteratorBoundaryFacets bfit, - OutputIteratorCells cit, - OutputIteratorInternalFacets ifit) const - { - CGAL_triangulation_precondition(dimension() >= 2); - - std::vector cells; - cells.reserve(32); - std::vector facets; - facets.reserve(64); - - if (dimension() == 2) { - Conflict_tester_2 tester(p, this); - ifit = Tr_Base::find_conflicts - (c, tester, - make_triple(std::back_inserter(facets), - std::back_inserter(cells), - ifit)).third; - } - else { - Conflict_tester_3 tester(p, this); - ifit = Tr_Base::find_conflicts - (c, tester, - make_triple(std::back_inserter(facets), - std::back_inserter(cells), - ifit)).third; - } - - // Reset the conflict flag on the boundary. - for(typename std::vector::iterator fit=facets.begin(); - fit != facets.end(); ++fit) { - fit->first->neighbor(fit->second)->tds_data().clear(); - *bfit++ = *fit; - } - - // Reset the conflict flag in the conflict cells. - for(typename std::vector::iterator ccit=cells.begin(); - ccit != cells.end(); ++ccit) { - (*ccit)->tds_data().clear(); - *cit++ = *ccit; - } - return make_triple(bfit, cit, ifit); - } - - template - std::pair - find_conflicts(const Point &p, Cell_handle c, - OutputIteratorBoundaryFacets bfit, - OutputIteratorCells cit) const - { - Triple t = find_conflicts(p, c, bfit, cit, - Emptyset_iterator()); - return std::make_pair(t.first, t.second); - } - -#ifndef CGAL_NO_DEPRECATED_CODE - // Returns the vertices on the boundary of the conflict hole. - template - OutputIterator - vertices_in_conflict(const Point&p, Cell_handle c, OutputIterator res) const - { - return vertices_on_conflict_zone_boundary(p, c, res); - } -#endif // CGAL_NO_DEPRECATED_CODE - - // Returns the vertices on the boundary of the conflict hole. - template - OutputIterator - vertices_on_conflict_zone_boundary(const Point&p, Cell_handle c, - OutputIterator res) const - { - CGAL_triangulation_precondition(dimension() >= 2); - - // Get the facets on the boundary of the hole. - std::vector facets; - find_conflicts(p, c, std::back_inserter(facets), - Emptyset_iterator(), Emptyset_iterator()); - - // Then extract uniquely the vertices. - std::set vertices; - if (dimension() == 3) { - for (typename std::vector::const_iterator i = facets.begin(); - i != facets.end(); ++i) { - vertices.insert(i->first->vertex((i->second+1)&3)); - vertices.insert(i->first->vertex((i->second+2)&3)); - vertices.insert(i->first->vertex((i->second+3)&3)); - } - } else { - for (typename std::vector::const_iterator i = facets.begin(); - i != facets.end(); ++i) { - vertices.insert(i->first->vertex(cw(i->second))); - vertices.insert(i->first->vertex(ccw(i->second))); - } - } - - return std::copy(vertices.begin(), vertices.end(), res); - } - - // REMOVE - void remove(Vertex_handle v); - - // return new cells (internal) - template - void remove_and_give_new_cells(Vertex_handle v, - OutputItCells fit); - - template < typename InputIterator > - size_type remove(InputIterator first, InputIterator beyond) - { - CGAL_triangulation_precondition(!this->does_repeat_in_range(first, beyond)); - size_type n = number_of_vertices(); - while (first != beyond) { - remove(*first); - ++first; - } - return n - number_of_vertices(); - } - - template < typename InputIterator > - size_type remove_cluster(InputIterator first, InputIterator beyond) - { - Self tmp; - Vertex_remover remover (tmp); - return Tr_Base::remove(first, beyond, remover); - } - - // MOVE - Vertex_handle move_if_no_collision(Vertex_handle v, const Point &p); - - Vertex_handle move(Vertex_handle v, const Point &p); - - // return new cells (internal) - template - Vertex_handle move_if_no_collision_and_give_new_cells(Vertex_handle v, - const Point &p, - OutputItCells fit); - -private: - - Bounded_side - side_of_sphere(Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3, - const Point &p, bool perturb) const; -public: - - // Queries - Bounded_side - side_of_sphere(Cell_handle c, const Point & p, - bool perturb = false) const - { - return side_of_sphere(c->vertex(0), c->vertex(1), - c->vertex(2), c->vertex(3), p, perturb); - } - - Bounded_side - side_of_circle( const Facet & f, const Point & p, bool perturb = false) const - { - return side_of_circle(f.first, f.second, p, perturb); - } - - Bounded_side - side_of_circle( Cell_handle c, int i, const Point & p, - bool perturb = false) const; - - Vertex_handle - nearest_vertex_in_cell(const Point& p, Cell_handle c) const; - - Vertex_handle - nearest_vertex(const Point& p, Cell_handle c = Cell_handle()) const; - - bool is_Gabriel(Cell_handle c, int i) const; - bool is_Gabriel(Cell_handle c, int i, int j) const; - bool is_Gabriel(const Facet& f)const ; - bool is_Gabriel(const Edge& e) const; - - bool is_delaunay_after_displacement(Vertex_handle v, - const Point &p) const; - -// Dual functions - Point dual(Cell_handle c) const; - - Object dual(const Facet & f) const - { return dual( f.first, f.second ); } - - Object dual(Cell_handle c, int i) const; - - Line dual_support(Cell_handle c, int i) const; - - bool is_valid(bool verbose = false, int level = 0) const; - - bool is_valid(Cell_handle c, bool verbose = false, int level = 0) const; - - template < class Stream> - Stream& draw_dual(Stream & os) - { - for (Finite_facets_iterator fit = finite_facets_begin(), - end = finite_facets_end(); - fit != end; ++fit) { - Object o = dual(*fit); - if (const Segment *s = object_cast(&o)) os << *s; - else if (const Ray *r = object_cast(&o)) os << *r; - else if (const Point *p = object_cast(&o)) os << *p; - } - return os; - } - -protected: - - Vertex_handle - nearest_vertex(const Point &p, Vertex_handle v, Vertex_handle w) const - { - // In case of equality, v is returned. - CGAL_triangulation_precondition(v != w); - - if (is_infinite(v)) - return w; - if (is_infinite(w)) - return v; - return less_distance(p, w->point(), v->point()) ? w : v; - } - - class Conflict_tester_3 - { - const Point &p; - const Self *t; - - public: - - Conflict_tester_3(const Point &pt, const Self *tr) - : p(pt), t(tr) {} - - bool operator()(const Cell_handle c) const - { - return t->side_of_sphere(c, p, true) == ON_BOUNDED_SIDE; - } - Oriented_side compare_weight(const Point &, const Point &) const - { - return ZERO; - } - bool test_initial_cell(Cell_handle) const - { - return true; - } - }; - - class Conflict_tester_2 - { - const Point &p; - const Self *t; - - public: - - Conflict_tester_2(const Point &pt, const Self *tr) - : p(pt), t(tr) {} - - bool operator()(const Cell_handle c) const - { - return t->side_of_circle(c, 3, p, true) == ON_BOUNDED_SIDE; - } - Oriented_side compare_weight(const Point &, const Point &) const - { - return ZERO; - } - bool test_initial_cell(Cell_handle) const - { - return true; - } - }; - class Hidden_point_visitor - { - public: - - Hidden_point_visitor() {} - - template - void process_cells_in_conflict(InputIterator, InputIterator) const {} - void reinsert_vertices(Vertex_handle ) {} - Vertex_handle replace_vertex(Cell_handle c, int index, - const Point &) { - return c->vertex(index); - } - void hide_point(Cell_handle, const Point &) {} - }; - - class Perturbation_order { - const Self *t; - - public: - Perturbation_order(const Self *tr) - : t(tr) {} - - bool operator()(const Point *p, const Point *q) const { - return t->compare_xyz(*p, *q) == SMALLER; - } - }; - - template < class DelaunayTriangulation_3 > - class Vertex_remover; - - template < class DelaunayTriangulation_3 > - class Vertex_inserter; - - friend class Perturbation_order; - friend class Conflict_tester_3; - friend class Conflict_tester_2; - - Hidden_point_visitor hidden_point_visitor; -}; - -template < class Gt, class Tds > -typename Delaunay_triangulation_3::Vertex_handle -Delaunay_triangulation_3:: -insert(const Point & p, Cell_handle start) -{ - Locate_type lt; - int li, lj; - Cell_handle c = locate(p, lt, li, lj, start); - return insert(p, lt, c, li, lj); -} - -template < class Gt, class Tds > -typename Delaunay_triangulation_3::Vertex_handle -Delaunay_triangulation_3:: -insert(const Point & p, Locate_type lt, Cell_handle c, int li, int lj) -{ - switch (dimension()) { - case 3: - { - Conflict_tester_3 tester(p, this); - Vertex_handle v = insert_in_conflict(p, lt, c, li, lj, - tester, hidden_point_visitor); - return v; - }// dim 3 - case 2: - { - Conflict_tester_2 tester(p, this); - return insert_in_conflict(p, lt, c, li, lj, - tester, hidden_point_visitor); - }//dim 2 - default : - // dimension <= 1 - // Do not use the generic insert. - return Tr_Base::insert(p, c); - } -} - -template < class Gt, class Tds > -template -typename Delaunay_triangulation_3::Vertex_handle -Delaunay_triangulation_3:: -insert_and_give_new_cells(const Point &p, - OutputItCells fit, - Cell_handle start) -{ - Vertex_handle v = insert(p, start); - int dimension = this->dimension(); - if(dimension == 3) this->incident_cells(v, fit); - else if(dimension == 2) - { - Cell_handle c = v->cell(), end = c; - do { - *fit++ = c; - int i = c->index(v); - c = c->neighbor((i+1)%3); - } while(c != end); - } - else if(dimension == 1) - { - Cell_handle c = v->cell(); - *fit++ = c; - *fit++ = c->neighbor((~(c->index(v)))&1); - } - else *fit++ = v->cell(); // dimension = 0 - return v; -} - -template < class Gt, class Tds > -template -typename Delaunay_triangulation_3::Vertex_handle -Delaunay_triangulation_3:: -insert_and_give_new_cells(const Point& p, - OutputItCells fit, - Vertex_handle hint) -{ - Vertex_handle v = insert(p, hint); - int dimension = this->dimension(); - if(dimension == 3) this->incident_cells(v, fit); - else if(dimension == 2) - { - Cell_handle c = v->cell(), end = c; - do { - *fit++ = c; - int i = c->index(v); - c = c->neighbor((i+1)%3); - } while(c != end); - } - else if(dimension == 1) - { - Cell_handle c = v->cell(); - *fit++ = c; - *fit++ = c->neighbor((~(c->index(v)))&1); - } - else *fit++ = v->cell(); // dimension = 0 - return v; -} - -template < class Gt, class Tds > -template -typename Delaunay_triangulation_3::Vertex_handle -Delaunay_triangulation_3:: -insert_and_give_new_cells(const Point& p, - Locate_type lt, - Cell_handle c, int li, int lj, - OutputItCells fit) -{ - Vertex_handle v = insert(p, lt, c, li, lj); - int dimension = this->dimension(); - if(dimension == 3) this->incident_cells(v, fit); - else if(dimension == 2) - { - Cell_handle c = v->cell(), end = c; - do { - *fit++ = c; - int i = c->index(v); - c = c->neighbor((i+1)%3); - } while(c != end); - } - else if(dimension == 1) - { - Cell_handle c = v->cell(); - *fit++ = c; - *fit++ = c->neighbor((~(c->index(v)))&1); - } - else *fit++ = v->cell(); // dimension = 0 - return v; -} - -#ifndef CGAL_NO_DEPRECATED_CODE -template < class Gt, class Tds > -typename Delaunay_triangulation_3::Vertex_handle -Delaunay_triangulation_3:: -move_point(Vertex_handle v, const Point & p) -{ - CGAL_triangulation_precondition(! is_infinite(v)); - CGAL_triangulation_expensive_precondition(is_vertex(v)); - - // Dummy implementation for a start. - - // Remember an incident vertex to restart - // the point location after the removal. - Cell_handle c = v->cell(); - Vertex_handle old_neighbor = c->vertex(c->index(v) == 0 ? 1 : 0); - CGAL_triangulation_assertion(old_neighbor != v); - - remove(v); - - if (dimension() <= 0) - return insert(p); - return insert(p, old_neighbor->cell()); -} -#endif - -template -template -class Delaunay_triangulation_3::Vertex_remover { - typedef DelaunayTriangulation_3 Delaunay; -public: - typedef Nullptr_t Hidden_points_iterator; - - Vertex_remover(Delaunay &tmp_) : tmp(tmp_) {} - - Delaunay &tmp; - - void add_hidden_points(Cell_handle) {} - Hidden_points_iterator hidden_points_begin() { return NULL; } - Hidden_points_iterator hidden_points_end() { return NULL; } - - Bounded_side side_of_bounded_circle(const Point &p, const Point &q, - const Point &r, const Point &s, bool perturb = false) const { - return tmp.coplanar_side_of_bounded_circle(p,q,r,s,perturb); - } -}; - -template -template -class Delaunay_triangulation_3::Vertex_inserter { - typedef DelaunayTriangulation_3 Delaunay; -public: - typedef Nullptr_t Hidden_points_iterator; - - Vertex_inserter(Delaunay &tmp_) : tmp(tmp_) {} - - Delaunay &tmp; - - void add_hidden_points(Cell_handle) {} - Hidden_points_iterator hidden_points_begin() { return NULL; } - Hidden_points_iterator hidden_points_end() { return NULL; } - - Vertex_handle insert(const Point& p, - Locate_type lt, Cell_handle c, int li, int lj) { - return tmp.insert(p, lt, c, li, lj); - } - - Vertex_handle insert(const Point& p, Cell_handle c) { - return tmp.insert(p, c); - } - - Vertex_handle insert(const Point& p) { - return tmp.insert(p); - } -}; - -template < class Gt, class Tds > -void -Delaunay_triangulation_3:: -remove(Vertex_handle v) -{ - Self tmp; - Vertex_remover remover (tmp); - Tr_Base::remove(v,remover); - - CGAL_triangulation_expensive_postcondition(is_valid()); -} - -template < class Gt, class Tds > -typename Delaunay_triangulation_3::Vertex_handle -Delaunay_triangulation_3:: -move_if_no_collision(Vertex_handle v, const Point &p) -{ - Self tmp; - Vertex_remover remover (tmp); - Vertex_inserter inserter (*this); - Vertex_handle res = Tr_Base::move_if_no_collision(v,p,remover,inserter); - - CGAL_triangulation_expensive_postcondition(is_valid()); - return res; -} - -template -typename Delaunay_triangulation_3::Vertex_handle -Delaunay_triangulation_3:: -move(Vertex_handle v, const Point &p) { - CGAL_triangulation_precondition(!is_infinite(v)); - if(v->point() == p) return v; - Self tmp; - Vertex_remover remover (tmp); - Vertex_inserter inserter (*this); - return Tr_Base::move(v,p,remover,inserter); -} - -template < class Gt, class Tds > -template -void -Delaunay_triangulation_3:: -remove_and_give_new_cells(Vertex_handle v, OutputItCells fit) -{ - Self tmp; - Vertex_remover remover (tmp); - Tr_Base::remove_and_give_new_cells(v,remover,fit); - - CGAL_triangulation_expensive_postcondition(is_valid()); -} - -template < class Gt, class Tds > -template -typename Delaunay_triangulation_3::Vertex_handle -Delaunay_triangulation_3:: -move_if_no_collision_and_give_new_cells(Vertex_handle v, const Point &p, - OutputItCells fit) -{ - Self tmp; - Vertex_remover remover (tmp); - Vertex_inserter inserter (*this); - Vertex_handle res = - Tr_Base::move_if_no_collision_and_give_new_cells(v,p, - remover,inserter,fit); - - CGAL_triangulation_expensive_postcondition(is_valid()); - return res; -} - -template < class Gt, class Tds > -Oriented_side -Delaunay_triangulation_3:: -side_of_oriented_sphere(const Point &p0, const Point &p1, const Point &p2, - const Point &p3, const Point &p, bool perturb) const -{ - CGAL_triangulation_precondition( orientation(p0, p1, p2, p3) == POSITIVE ); - - Oriented_side os = - geom_traits().side_of_oriented_sphere_3_object()(p0, p1, p2, p3, p); - - if (os != ON_ORIENTED_BOUNDARY || !perturb) - return os; - - // We are now in a degenerate case => we do a symbolic perturbation. - - // We sort the points lexicographically. - const Point * points[5] = {&p0, &p1, &p2, &p3, &p}; - std::sort(points, points+5, Perturbation_order(this) ); - - // We successively look whether the leading monomial, then 2nd monomial - // of the determinant has non null coefficient. - // 2 iterations are enough (cf paper) - for (int i=4; i>2; --i) { - if (points[i] == &p) - return ON_NEGATIVE_SIDE; // since p0 p1 p2 p3 are non coplanar - // and positively oriented - Orientation o; - if (points[i] == &p3 && (o = orientation(p0,p1,p2,p)) != COPLANAR ) - return o; - if (points[i] == &p2 && (o = orientation(p0,p1,p,p3)) != COPLANAR ) - return o; - if (points[i] == &p1 && (o = orientation(p0,p,p2,p3)) != COPLANAR ) - return o; - if (points[i] == &p0 && (o = orientation(p,p1,p2,p3)) != COPLANAR ) - return o; - } - - CGAL_triangulation_assertion(false); - return ON_NEGATIVE_SIDE; -} - -template < class Gt, class Tds > -Bounded_side -Delaunay_triangulation_3:: -coplanar_side_of_bounded_circle(const Point &p0, const Point &p1, - const Point &p2, const Point &p, bool perturb) const -{ - // In dim==2, we should even be able to assert orient == POSITIVE. - CGAL_triangulation_precondition( coplanar_orientation(p0, p1, p2) - != COLLINEAR ); - - Bounded_side bs = - geom_traits().coplanar_side_of_bounded_circle_3_object()(p0, p1, p2, p); - - if (bs != ON_BOUNDARY || !perturb) - return bs; - - // We are now in a degenerate case => we do a symbolic perturbation. - - // We sort the points lexicographically. - const Point * points[4] = {&p0, &p1, &p2, &p}; - std::sort(points, points+4, Perturbation_order(this) ); - - Orientation local = coplanar_orientation(p0, p1, p2); - - // we successively look whether the leading monomial, then 2nd monimial, - // then 3rd monomial, of the determinant which has non null coefficient - // [syl] : TODO : Probably it can be stopped earlier like the 3D version - for (int i=3; i>0; --i) { - if (points[i] == &p) - return Bounded_side(NEGATIVE); // since p0 p1 p2 are non collinear - // but not necessarily positively oriented - Orientation o; - if (points[i] == &p2 - && (o = coplanar_orientation(p0,p1,p)) != COLLINEAR ) - // [syl] : TODO : I'm not sure of the signs here (nor the rest :) - return Bounded_side(o*local); - if (points[i] == &p1 - && (o = coplanar_orientation(p0,p,p2)) != COLLINEAR ) - return Bounded_side(o*local); - if (points[i] == &p0 - && (o = coplanar_orientation(p,p1,p2)) != COLLINEAR ) - return Bounded_side(o*local); - } - - // case when the first non null coefficient is the coefficient of - // the 4th monomial - // moreover, the tests (points[] == &p) were false up to here, so the - // monomial corresponding to p is the only monomial with non-zero - // coefficient, it is equal to coplanar_orient(p0,p1,p2) == positive - // so, no further test is required - return Bounded_side(-local); //ON_UNBOUNDED_SIDE; -} - -template < class Gt, class Tds > -Bounded_side -Delaunay_triangulation_3:: -side_of_sphere(Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3, - const Point &p, bool perturb) const -{ - CGAL_triangulation_precondition( dimension() == 3 ); - - if (is_infinite(v0)) { - Orientation o = orientation(v2->point(), v1->point(), v3->point(), p); - if (o != COPLANAR) - return Bounded_side(o); - return coplanar_side_of_bounded_circle(v2->point(), v1->point(), v3->point(), p, perturb); - } - - if (is_infinite(v1)) { - Orientation o = orientation(v2->point(), v3->point(), v0->point(), p); - if (o != COPLANAR) - return Bounded_side(o); - return coplanar_side_of_bounded_circle(v2->point(), v3->point(), v0->point(), p, perturb); - } - - if (is_infinite(v2)) { - Orientation o = orientation(v1->point(), v0->point(), v3->point(), p); - if (o != COPLANAR) - return Bounded_side(o); - return coplanar_side_of_bounded_circle(v1->point(), v0->point(), v3->point(), p, perturb); - } - - if (is_infinite(v3)) { - Orientation o = orientation(v0->point(), v1->point(), v2->point(), p); - if (o != COPLANAR) - return Bounded_side(o); - return coplanar_side_of_bounded_circle(v0->point(), v1->point(), v2->point(), p, perturb); - } - - return (Bounded_side) side_of_oriented_sphere(v0->point(), v1->point(), v2->point(), v3->point(), p, perturb); -} - -template < class Gt, class Tds > -Bounded_side -Delaunay_triangulation_3:: -side_of_circle(Cell_handle c, int i, - const Point & p, bool perturb) const - // precondition : dimension >=2 - // in dimension 3, - for a finite facet - // returns ON_BOUNDARY if the point lies on the circle, - // ON_UNBOUNDED_SIDE when exterior, ON_BOUNDED_SIDE - // interior - // for an infinite facet, considers the plane defined by the - // adjacent finite facet of the same cell, and does the same as in - // dimension 2 in this plane - // in dimension 2, for an infinite facet - // in this case, returns ON_BOUNDARY if the point lies on the - // finite edge (endpoints included) - // ON_BOUNDED_SIDE for a point in the open half-plane - // ON_UNBOUNDED_SIDE elsewhere -{ - CGAL_triangulation_precondition( dimension() >= 2 ); - int i3 = 5; - - if ( dimension() == 2 ) { - CGAL_triangulation_precondition( i == 3 ); - // the triangulation is supposed to be valid, ie the facet - // with vertices 0 1 2 in this order is positively oriented - if ( ! c->has_vertex( infinite_vertex(), i3 ) ) - return coplanar_side_of_bounded_circle( c->vertex(0)->point(), - c->vertex(1)->point(), - c->vertex(2)->point(), - p, perturb); - // else infinite facet - // v1, v2 finite vertices of the facet such that v1,v2,infinite - // is positively oriented - Vertex_handle v1 = c->vertex( ccw(i3) ), - v2 = c->vertex( cw(i3) ); - CGAL_triangulation_assertion(coplanar_orientation(v1->point(), v2->point(), - mirror_vertex(c, i3)->point()) == NEGATIVE); - Orientation o = coplanar_orientation(v1->point(), v2->point(), p); - if ( o != COLLINEAR ) - return Bounded_side( o ); - // because p is in f iff - // it does not lie on the same side of v1v2 as vn - int i_e; - Locate_type lt; - // case when p collinear with v1v2 - return side_of_segment( p, - v1->point(), v2->point(), - lt, i_e ); - } - - // else dimension == 3 - CGAL_triangulation_precondition( i >= 0 && i < 4 ); - if ( ( ! c->has_vertex(infinite_vertex(),i3) ) || ( i3 != i ) ) { - // finite facet - // initialization of i0 i1 i2, vertices of the facet positively - // oriented (if the triangulation is valid) - int i0 = (i>0) ? 0 : 1; - int i1 = (i>1) ? 1 : 2; - int i2 = (i>2) ? 2 : 3; - CGAL_triangulation_precondition( coplanar( c->vertex(i0)->point(), - c->vertex(i1)->point(), - c->vertex(i2)->point(), - p ) ); - return coplanar_side_of_bounded_circle( c->vertex(i0)->point(), - c->vertex(i1)->point(), - c->vertex(i2)->point(), - p, perturb); - } - - //else infinite facet - // v1, v2 finite vertices of the facet such that v1,v2,infinite - // is positively oriented - Vertex_handle v1 = c->vertex( next_around_edge(i3,i) ), - v2 = c->vertex( next_around_edge(i,i3) ); - Orientation o = (Orientation) - (coplanar_orientation( v1->point(), v2->point(), - c->vertex(i)->point()) * - coplanar_orientation( v1->point(), v2->point(), p )); - // then the code is duplicated from 2d case - if ( o != COLLINEAR ) - return Bounded_side( -o ); - // because p is in f iff - // it is not on the same side of v1v2 as c->vertex(i) - int i_e; - Locate_type lt; - // case when p collinear with v1v2 - return side_of_segment( p, - v1->point(), v2->point(), - lt, i_e ); -} - -template < class Gt, class Tds > -typename Delaunay_triangulation_3::Vertex_handle -Delaunay_triangulation_3:: -nearest_vertex_in_cell(const Point& p, Cell_handle c) const -// Returns the finite vertex of the cell c which is the closest to p. -{ - CGAL_triangulation_precondition(dimension() >= 0); - - Vertex_handle nearest = nearest_vertex(p, c->vertex(0), c->vertex(1)); - if (dimension() >= 2) { - nearest = nearest_vertex(p, nearest, c->vertex(2)); - if (dimension() == 3) - nearest = nearest_vertex(p, nearest, c->vertex(3)); - } - return nearest; -} - -template < class Gt, class Tds > -typename Delaunay_triangulation_3::Vertex_handle -Delaunay_triangulation_3:: -nearest_vertex(const Point& p, Cell_handle start) const -{ - if (number_of_vertices() == 0) - return Vertex_handle(); - - // Use a brute-force algorithm if dimension < 3. - if (dimension() < 3) { - Finite_vertices_iterator vit = finite_vertices_begin(); - Vertex_handle res = vit; - ++vit; - for (Finite_vertices_iterator end = finite_vertices_end(); vit != end; ++vit) - res = nearest_vertex(p, res, vit); - return res; - } - - Locate_type lt; - int li, lj; - Cell_handle c = locate(p, lt, li, lj, start); - if (lt == Tr_Base::VERTEX) - return c->vertex(li); - - // - start with the closest vertex from the located cell. - // - repeatedly take the nearest of its incident vertices if any - // - if not, we're done. - Vertex_handle nearest = nearest_vertex_in_cell(p, c); - std::vector vs; - vs.reserve(32); - while (true) { - Vertex_handle tmp = nearest; - adjacent_vertices(nearest, std::back_inserter(vs)); - for (typename std::vector::const_iterator - vsit = vs.begin(); vsit != vs.end(); ++vsit) - tmp = nearest_vertex(p, tmp, *vsit); - if (tmp == nearest) - break; - vs.clear(); - nearest = tmp; - } - - return nearest; -} - -// This is not a fast version. -// The optimized version needs an int for book-keeping in -// tds() so as to avoiding the need to clear -// the tds marker in each cell (which is an unsigned char) -// Also the visitor in TDS could be more clever. -// The Delaunay triangulation which filters displacements -// will do these optimizations. -template -bool -Delaunay_triangulation_3:: -is_delaunay_after_displacement(Vertex_handle v, const Point &p) const -{ - CGAL_triangulation_precondition(!this->is_infinite(v)); - CGAL_triangulation_precondition(this->dimension() == 2); - CGAL_triangulation_precondition(!this->test_dim_down(v)); - if(v->point() == p) return true; - Point ant = v->point(); - v->set_point(p); - - std::size_t size; - - // are incident cells well-oriented - std::vector cells; - cells.reserve(64); - this->incident_cells(v, std::back_inserter(cells)); - size = cells.size(); - for(std::size_t i=0; iis_infinite(c)) continue; - if(this->orientation(c->vertex(0)->point(), c->vertex(1)->point(), - c->vertex(2)->point(), c->vertex(3)->point()) - != POSITIVE) - { - v->set_point(ant); - return false; - } - } - - // are incident bi-cells Delaunay? - std::vector facets; - facets.reserve(128); - this->incident_facets(v, std::back_inserter(facets)); - size = facets.size(); - for(std::size_t i=0; ineighbor(j); - int mj = this->mirror_index(c, j); - Vertex_handle h1 = c->vertex(j); - if(this->is_infinite(h1)) { - if(this->side_of_sphere(c, cj->vertex(mj)->point(), true) - != ON_UNBOUNDED_SIDE) { - v->set_point(ant); - return false; - } - } else { - if(this->side_of_sphere(cj, h1->point(), true) != ON_UNBOUNDED_SIDE) { - v->set_point(ant); - return false; - } - } - } - - v->set_point(ant); - return true; -} - -template < class Gt, class Tds > -bool -Delaunay_triangulation_3:: -is_Gabriel(const Facet& f) const -{ - return is_Gabriel(f.first, f.second); -} - -template < class Gt, class Tds > -bool -Delaunay_triangulation_3:: -is_Gabriel(Cell_handle c, int i) const -{ - CGAL_triangulation_precondition(dimension() == 3 && !is_infinite(c,i)); - typename Geom_traits::Side_of_bounded_sphere_3 - side_of_bounded_sphere = - geom_traits().side_of_bounded_sphere_3_object(); - - if ((!is_infinite(c->vertex(i))) && - side_of_bounded_sphere ( - c->vertex(vertex_triple_index(i,0))->point(), - c->vertex(vertex_triple_index(i,1))->point(), - c->vertex(vertex_triple_index(i,2))->point(), - c->vertex(i)->point()) == ON_BOUNDED_SIDE ) return false; - Cell_handle neighbor = c->neighbor(i); - int in = neighbor->index(c); - - if ((!is_infinite(neighbor->vertex(in))) && - side_of_bounded_sphere( - c->vertex(vertex_triple_index(i,0))->point(), - c->vertex(vertex_triple_index(i,1))->point(), - c->vertex(vertex_triple_index(i,2))->point(), - neighbor->vertex(in)->point()) == ON_BOUNDED_SIDE ) return false; - - return true; -} - -template < class Gt, class Tds > -bool -Delaunay_triangulation_3:: -is_Gabriel(const Edge& e) const -{ - return is_Gabriel(e.first, e.second, e.third); -} - -template < class Gt, class Tds > -bool -Delaunay_triangulation_3:: -is_Gabriel(Cell_handle c, int i, int j) const -{ - CGAL_triangulation_precondition(dimension() == 3 && !is_infinite(c,i,j)); - typename Geom_traits::Side_of_bounded_sphere_3 - side_of_bounded_sphere = - geom_traits().side_of_bounded_sphere_3_object(); - - Facet_circulator fcirc = incident_facets(c,i,j), - fdone(fcirc); - Vertex_handle v1 = c->vertex(i); - Vertex_handle v2 = c->vertex(j); - do { - // test whether the vertex of cc opposite to *fcirc - // is inside the sphere defined by the edge e = (s, i,j) - Cell_handle cc = (*fcirc).first; - int ii = (*fcirc).second; - if (!is_infinite(cc->vertex(ii)) && - side_of_bounded_sphere( v1->point(), - v2->point(), - cc->vertex(ii)->point()) - == ON_BOUNDED_SIDE ) return false; - } while(++fcirc != fdone); - return true; -} - -template < class Gt, class Tds > -typename Delaunay_triangulation_3::Point -Delaunay_triangulation_3:: -dual(Cell_handle c) const -{ - CGAL_triangulation_precondition(dimension()==3); - CGAL_triangulation_precondition( ! is_infinite(c) ); - return c->circumcenter(geom_traits()); -} - - -template < class Gt, class Tds > -typename Delaunay_triangulation_3::Object -Delaunay_triangulation_3:: -dual(Cell_handle c, int i) const -{ - CGAL_triangulation_precondition(dimension()>=2); - CGAL_triangulation_precondition( ! is_infinite(c,i) ); - - if ( dimension() == 2 ) { - CGAL_triangulation_precondition( i == 3 ); - return construct_object( construct_circumcenter(c->vertex(0)->point(), - c->vertex(1)->point(), - c->vertex(2)->point()) ); - } - - // dimension() == 3 - Cell_handle n = c->neighbor(i); - if ( ! is_infinite(c) && ! is_infinite(n) ) - return construct_object(construct_segment( dual(c), dual(n) )); - - // either n or c is infinite - int in; - if ( is_infinite(c) ) - in = n->index(c); - else { - n = c; - in = i; - } - // n now denotes a finite cell, either c or c->neighbor(i) - int ind[3] = {(in+1)&3,(in+2)&3,(in+3)&3}; - if ( (in&1) == 1 ) - std::swap(ind[0], ind[1]); - // in=0: 1 2 3 - // in=1: 3 2 0 - // in=2: 3 0 1 - // in=3: 1 0 2 - const Point& p = n->vertex(ind[0])->point(); - const Point& q = n->vertex(ind[1])->point(); - const Point& r = n->vertex(ind[2])->point(); - - Line l = construct_equidistant_line( p, q, r ); - return construct_object(construct_ray( dual(n), l)); -} - - - -template < class Gt, class Tds > -typename Delaunay_triangulation_3::Line -Delaunay_triangulation_3:: -dual_support(Cell_handle c, int i) const -{ - CGAL_triangulation_precondition(dimension()>=2); - CGAL_triangulation_precondition( ! is_infinite(c,i) ); - - if ( dimension() == 2 ) { - CGAL_triangulation_precondition( i == 3 ); - return construct_equidistant_line( c->vertex(0)->point(), - c->vertex(1)->point(), - c->vertex(2)->point() ); - } - - return construct_equidistant_line( c->vertex((i+1)&3)->point(), - c->vertex((i+2)&3)->point(), - c->vertex((i+3)&3)->point() ); -} - - -template < class Gt, class Tds > -bool -Delaunay_triangulation_3:: -is_valid(bool verbose, int level) const -{ - if ( ! tds().is_valid(verbose,level) ) { - if (verbose) - std::cerr << "invalid data structure" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - - if ( infinite_vertex() == Vertex_handle() ) { - if (verbose) - std::cerr << "no infinite vertex" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - - switch ( dimension() ) { - case 3: - { - for(Finite_cells_iterator it = finite_cells_begin(), end = finite_cells_end(); it != end; ++it) { - is_valid_finite(it); - for(int i=0; i<4; i++ ) { - if ( !is_infinite - (it->neighbor(i)->vertex(it->neighbor(i)->index(it))) ) { - if ( side_of_sphere - (it, - it->neighbor(i)->vertex(it->neighbor(i)->index(it))->point()) - == ON_BOUNDED_SIDE ) { - if (verbose) - std::cerr << "non-empty sphere " << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - } - } - } - break; - } - case 2: - { - for(Finite_facets_iterator it = finite_facets_begin(), end = finite_facets_end(); it != end; ++it) { - is_valid_finite((*it).first); - for(int i=0; i<3; i++ ) { - if( !is_infinite - ((*it).first->neighbor(i)->vertex( (((*it).first)->neighbor(i)) - ->index((*it).first))) ) { - if ( side_of_circle ( (*it).first, 3, - (*it).first->neighbor(i)-> - vertex( (((*it).first)->neighbor(i)) - ->index((*it).first) )->point() ) - == ON_BOUNDED_SIDE ) { - if (verbose) - std::cerr << "non-empty circle " << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - } - } - } - break; - } - case 1: - { - for(Finite_edges_iterator it = finite_edges_begin(), end = finite_edges_end(); it != end; ++it) - is_valid_finite((*it).first); - break; - } - } - if (verbose) - std::cerr << "Delaunay valid triangulation" << std::endl; - return true; -} - -template < class Gt, class Tds > -bool -Delaunay_triangulation_3:: -is_valid(Cell_handle c, bool verbose, int level) const -{ - if ( ! Tr_Base::is_valid(c,verbose,level) ) { - if (verbose) { - std::cerr << "combinatorically invalid cell" ; - for (int i=0; i <= dimension(); i++ ) - std::cerr << c->vertex(i)->point() << ", " ; - std::cerr << std::endl; - } - CGAL_triangulation_assertion(false); - return false; - } - switch ( dimension() ) { - case 3: - { - if ( ! is_infinite(c) ) { - is_valid_finite(c,verbose,level); - for (int i=0; i<4; i++ ) { - if (side_of_sphere(c, c->vertex((c->neighbor(i))->index(c))->point()) - == ON_BOUNDED_SIDE ) { - if (verbose) - std::cerr << "non-empty sphere " << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - } - } - break; - } - case 2: - { - if ( ! is_infinite(c,3) ) { - for (int i=0; i<2; i++ ) { - if (side_of_circle(c, 3, c->vertex(c->neighbor(i)->index(c))->point()) - == ON_BOUNDED_SIDE ) { - if (verbose) - std::cerr << "non-empty circle " << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - } - } - break; - } - } - if (verbose) - std::cerr << "Delaunay valid cell" << std::endl; - return true; -} - -} //namespace CGAL - -#include - -#endif // CGAL_DELAUNAY_TRIANGULATION_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/IO/Triangulation_geomview_ostream_3.h b/Triangulation_3_copy_tds/include/CGAL/IO/Triangulation_geomview_ostream_3.h deleted file mode 100644 index 4b4eb25f484..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/IO/Triangulation_geomview_ostream_3.h +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (c) 2000 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Sylvain Pion - -#ifndef CGAL_IO_TRIANGULATION_GEOMVIEW_OSTREAM_3_H -#define CGAL_IO_TRIANGULATION_GEOMVIEW_OSTREAM_3_H - -#include -#include - -// TODO : -// - Check the correctness when dimension < 3. -// - Use the stream color instead of built-in constant/random. -// - If interfaces were more similar, we could think of sharing 2d and 3d ? - -namespace CGAL { - -// This one is to show the edges of a 3D triangulation. -template < class GT, class TDS > -void -show_triangulation_edges(Geomview_stream &gv, const Triangulation_3 &T) -{ - // Header. - gv.set_ascii_mode(); - gv << "(geometry " << gv.get_new_id("triangulationedge") - << " {appearance {}{ SKEL \n" - << T.number_of_vertices() << T.number_of_finite_edges() << "\n"; - - // Finite vertices coordinates. - std::map::Vertex_handle, int> V; - int inum = 0; - for( typename Triangulation_3::Finite_vertices_iterator - vit = T.finite_vertices_begin(); vit != T.finite_vertices_end(); ++vit) { - V[vit] = inum++; - gv << vit->point() << "\n"; - } - - // Finite edges indices. - for( typename Triangulation_3::Finite_edges_iterator - eit = T.finite_edges_begin(); eit != T.finite_edges_end(); ++eit) { - gv << 2 - << V[(*eit).first->vertex((*eit).second)] - << V[(*eit).first->vertex((*eit).third)] - << "\n"; // without color. - // << 4 << drand48() << drand48() << drand48() << 1.0; // random color. - } -} - -template < class GT, class TDS > -Geomview_stream& -operator<<( Geomview_stream &gv, const Triangulation_3 &T) -{ - if (gv.get_wired()) { - // We draw the edges. - bool ascii_bak = gv.get_ascii_mode(); - bool raw_bak = gv.set_raw(true); - - show_triangulation_edges(gv, T); - - // Footer. - gv << "}})"; - - gv.set_raw(raw_bak); - gv.set_ascii_mode(ascii_bak); - } - else { - // We draw the facets. - std::vector triangles; - - for (typename Triangulation_3::Finite_facets_iterator - fit = T.finite_facets_begin(); fit != T.finite_facets_end(); - ++fit) - triangles.push_back(T.triangle(*fit)); - - gv.draw_triangles(triangles.begin(), triangles.end()); - } - return gv; -} - -} //namespace CGAL - -#endif // CGAL_IO_TRIANGULATION_GEOMVIEW_OSTREAM_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/Regular_triangulation_3.h b/Triangulation_3_copy_tds/include/CGAL/Regular_triangulation_3.h deleted file mode 100644 index f63120f6cae..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/Regular_triangulation_3.h +++ /dev/null @@ -1,1693 +0,0 @@ -// Copyright (c) 1999-2004 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Monique Teillaud -// Sylvain Pion -// Christophe Delage - -#ifndef CGAL_REGULAR_TRIANGULATION_3_H -#define CGAL_REGULAR_TRIANGULATION_3_H - -#include - -#include - -#include -#include -#include - -#ifndef CGAL_TRIANGULATION_3_DONT_INSERT_RANGE_OF_POINTS_WITH_INFO -#include - -#include -#include -#endif //CGAL_TRIANGULATION_3_DONT_INSERT_RANGE_OF_POINTS_WITH_INFO - -#if defined(BOOST_MSVC) -# pragma warning(push) -# pragma warning(disable:4355) // complaint about using 'this' to -#endif // initialize a member - -namespace CGAL { - -template < class Gt, class Tds_ = Default > -class Regular_triangulation_3 - : public Triangulation_3, - Regular_triangulation_cell_base_3 > >::type> -{ - typedef Regular_triangulation_3 Self; - - typedef typename Default::Get, - Regular_triangulation_cell_base_3 > >::type Tds; - - typedef Triangulation_3 Tr_Base; - -public: - - typedef Tds Triangulation_data_structure; - typedef Gt Geom_traits; - - typedef typename Tr_Base::Vertex_handle Vertex_handle; - typedef typename Tr_Base::Cell_handle Cell_handle; - typedef typename Tr_Base::Vertex Vertex; - typedef typename Tr_Base::Cell Cell; - typedef typename Tr_Base::Facet Facet; - typedef typename Tr_Base::Edge Edge; - - typedef typename Tr_Base::size_type size_type; - typedef typename Tr_Base::Locate_type Locate_type; - typedef typename Tr_Base::Cell_iterator Cell_iterator; - typedef typename Tr_Base::Facet_iterator Facet_iterator; - typedef typename Tr_Base::Edge_iterator Edge_iterator; - typedef typename Tr_Base::Facet_circulator Facet_circulator; - - typedef typename Tr_Base::Finite_vertices_iterator Finite_vertices_iterator; - typedef typename Tr_Base::Finite_cells_iterator Finite_cells_iterator; - typedef typename Tr_Base::Finite_facets_iterator Finite_facets_iterator; - typedef typename Tr_Base::Finite_edges_iterator Finite_edges_iterator; - typedef typename Tr_Base::All_cells_iterator All_cells_iterator; - - typedef typename Gt::Weighted_point_3 Weighted_point; - typedef typename Gt::Bare_point Bare_point; - typedef typename Gt::Segment_3 Segment; - typedef typename Gt::Triangle_3 Triangle; - typedef typename Gt::Tetrahedron_3 Tetrahedron; - - // types for dual: - typedef typename Gt::Line_3 Line; - typedef typename Gt::Ray_3 Ray; - typedef typename Gt::Plane_3 Plane; - typedef typename Gt::Object_3 Object; - - //Tag to distinguish Delaunay from Regular triangulations - typedef Tag_true Weighted_tag; - - using Tr_Base::cw; - using Tr_Base::ccw; -#ifndef CGAL_CFG_USING_BASE_MEMBER_BUG_2 - using Tr_Base::geom_traits; -#endif - using Tr_Base::number_of_vertices; - using Tr_Base::dimension; - using Tr_Base::finite_facets_begin; - using Tr_Base::finite_facets_end; - using Tr_Base::finite_vertices_begin; - using Tr_Base::finite_vertices_end; - using Tr_Base::finite_cells_begin; - using Tr_Base::finite_cells_end; - using Tr_Base::finite_edges_begin; - using Tr_Base::finite_edges_end; - using Tr_Base::tds; - using Tr_Base::infinite_vertex; - using Tr_Base::next_around_edge; - using Tr_Base::vertex_triple_index; - using Tr_Base::mirror_vertex; - using Tr_Base::mirror_index; - using Tr_Base::orientation; - using Tr_Base::coplanar_orientation; - using Tr_Base::adjacent_vertices; - using Tr_Base::construct_segment; - using Tr_Base::incident_facets; - using Tr_Base::insert_in_conflict; - using Tr_Base::is_infinite; - using Tr_Base::is_valid_finite; - using Tr_Base::locate; - using Tr_Base::side_of_segment; - using Tr_Base::side_of_edge; - using Tr_Base::find_conflicts; - using Tr_Base::is_valid; - - Regular_triangulation_3(const Gt & gt = Gt()) - : Tr_Base(gt), hidden_point_visitor(this) - {} - - Regular_triangulation_3(const Regular_triangulation_3 & rt) - : Tr_Base(rt), hidden_point_visitor(this) - { - CGAL_triangulation_postcondition( is_valid() ); - } - - //insertion - template < typename InputIterator > - Regular_triangulation_3(InputIterator first, InputIterator last, - const Gt & gt = Gt()) - : Tr_Base(gt), hidden_point_visitor(this) - { - insert(first, last); - } - -#ifndef CGAL_TRIANGULATION_3_DONT_INSERT_RANGE_OF_POINTS_WITH_INFO - template < class InputIterator > - std::ptrdiff_t - insert( InputIterator first, InputIterator last, - typename boost::enable_if< - boost::mpl::or_< - boost::is_same< - typename std::iterator_traits::value_type, - Weighted_point - >, - boost::is_same< - typename std::iterator_traits::value_type, - Bare_point - > - > - >::type* = NULL - ) -#else - template < class InputIterator > - std::ptrdiff_t - insert( InputIterator first, InputIterator last) -#endif //CGAL_TRIANGULATION_3_DONT_INSERT_RANGE_OF_POINTS_WITH_INFO - { - size_type n = number_of_vertices(); - - std::vector points(first, last); - spatial_sort (points.begin(), points.end(), geom_traits()); - - Cell_handle hint; - for (typename std::vector::const_iterator p = points.begin(), - end = points.end(); p != end; ++p) - { - Locate_type lt; - Cell_handle c; - int li, lj; - c = locate (*p, lt, li, lj, hint); - - Vertex_handle v = insert (*p, lt, c, li, lj); - - hint = v == Vertex_handle() ? c : v->cell(); - } - return number_of_vertices() - n; - } - - -#ifndef CGAL_TRIANGULATION_3_DONT_INSERT_RANGE_OF_POINTS_WITH_INFO -private: - template - const Weighted_point& top_get_first(const std::pair& pair) const { return pair.first; } - template - const Info& top_get_second(const std::pair& pair) const { return pair.second; } - template - const Weighted_point& top_get_first(const boost::tuple& tuple) const { return boost::get<0>(tuple); } - template - const Info& top_get_second(const boost::tuple& tuple) const { return boost::get<1>(tuple); } - - template - std::ptrdiff_t insert_with_info(InputIterator first,InputIterator last) - { - int n = number_of_vertices(); - std::vector indices; - std::vector points; - std::vector infos; - std::size_t index=0; - for (InputIterator it=first;it!=last;++it){ - Tuple_or_pair pair = *it; - points.push_back( top_get_first(pair) ); - infos.push_back ( top_get_second(pair) ); - indices.push_back(index++); - } - - typedef internal::Vector_property_map Point_pmap; - typedef internal::Spatial_sort_traits_with_property_map_3 Search_traits; - - spatial_sort(indices.begin(),indices.end(),Search_traits(Point_pmap(points),geom_traits())); - - Cell_handle hint; - for (typename std::vector::const_iterator - it = indices.begin(), end = indices.end(); - it != end; ++it) - { - Locate_type lt; - Cell_handle c; - int li, lj; - c = locate (points[*it], lt, li, lj, hint); - - Vertex_handle v = insert (points[*it], lt, c, li, lj); - if (v!=Vertex_handle()){ - v->info()=infos[*it]; - hint=v->cell(); - } - else - hint=c; - } - - return number_of_vertices() - n; - } - -public: - - template < class InputIterator > - std::ptrdiff_t - insert( InputIterator first, - InputIterator last, - typename boost::enable_if< - boost::mpl::or_< - boost::is_same< - typename std::iterator_traits::value_type, - std::pair::type> - >, - boost::is_same< - typename std::iterator_traits::value_type, - std::pair::type> - > - > - >::type* = NULL - ) - {return insert_with_info< std::pair::type> >(first,last);} - - template - std::ptrdiff_t - insert( boost::zip_iterator< boost::tuple > first, - boost::zip_iterator< boost::tuple > last, - typename boost::enable_if< - boost::mpl::and_< - boost::mpl::or_< - typename boost::is_same< typename std::iterator_traits::value_type, Weighted_point >, - typename boost::is_same< typename std::iterator_traits::value_type, Bare_point > - >, - typename boost::is_same< typename std::iterator_traits::value_type, typename internal::Info_check::type > - > - >::type* =NULL - ) - {return insert_with_info< boost::tuple::type> >(first,last);} -#endif //CGAL_TRIANGULATION_3_DONT_INSERT_RANGE_OF_POINTS_WITH_INFO - - - Vertex_handle insert(const Weighted_point & p, Vertex_handle hint) - { - return insert(p, hint == Vertex_handle() ? this->infinite_cell() : hint->cell()); - } - - Vertex_handle insert(const Weighted_point & p, - Cell_handle start = Cell_handle()); - - Vertex_handle insert(const Weighted_point & p, Locate_type lt, - Cell_handle c, int li, int); - - template - Vertex_handle - insert_in_hole(const Weighted_point & p, CellIt cell_begin, CellIt cell_end, - Cell_handle begin, int i); - - template - Vertex_handle - insert_in_hole(const Weighted_point & p, CellIt cell_begin, CellIt cell_end, - Cell_handle begin, int i, Vertex_handle newv); - - template - Triple - find_conflicts(const Weighted_point &p, Cell_handle c, - OutputIteratorBoundaryFacets bfit, - OutputIteratorCells cit, - OutputIteratorInternalFacets ifit) const - { - CGAL_triangulation_precondition(dimension() >= 2); - - std::vector cells; - cells.reserve(32); - std::vector facets; - facets.reserve(64); - - if (dimension() == 2) { - Conflict_tester_2 tester(p, this); - if (! tester (c)) return make_triple (bfit, cit, ifit); - ifit = Tr_Base::find_conflicts - (c, tester, - make_triple(std::back_inserter(facets), - std::back_inserter(cells), - ifit)).third; - } - else { - Conflict_tester_3 tester(p, this); - if (! tester (c)) return make_triple (bfit, cit, ifit); - ifit = Tr_Base::find_conflicts - (c, tester, - make_triple(std::back_inserter(facets), - std::back_inserter(cells), - ifit)).third; - } - - // Reset the conflict flag on the boundary. - for(typename std::vector::iterator fit=facets.begin(); - fit != facets.end(); ++fit) { - fit->first->neighbor(fit->second)->tds_data().clear(); - *bfit++ = *fit; - } - - // Reset the conflict flag in the conflict cells. - for(typename std::vector::iterator ccit=cells.begin(); - ccit != cells.end(); ++ccit) { - (*ccit)->tds_data().clear(); - *cit++ = *ccit; - } - return make_triple(bfit, cit, ifit); - } - - template - std::pair - find_conflicts(const Weighted_point &p, Cell_handle c, - OutputIteratorBoundaryFacets bfit, - OutputIteratorCells cit) const - { - Triple t = find_conflicts(p, c, bfit, cit, - Emptyset_iterator()); - return std::make_pair(t.first, t.second); - } - - // Returns the vertices on the interior of the conflict hole. - template - OutputIterator - vertices_inside_conflict_zone(const Weighted_point&p, Cell_handle c, - OutputIterator res) const - { - CGAL_triangulation_precondition(dimension() >= 2); - - // Get the facets on the boundary of the hole, and the cells of the hole - std::vector cells; - std::vector facets; - find_conflicts(p, c, std::back_inserter(facets), - std::back_inserter(cells), Emptyset_iterator()); - - // Put all vertices on the hole in 'vertices' - const int d = dimension(); - std::set vertices; - for (typename std::vector::const_iterator - it = cells.begin(), - end = cells.end(); it != end; ++it) - { - for(int i = 0; i <= d; ++i) { - vertices.insert((*it)->vertex(i)); - } - } - // Then extract the vertices of the boundary and remove them from - // 'vertices' - if (dimension() == 3) { - for (typename std::vector::const_iterator i = facets.begin(); - i != facets.end(); ++i) { - vertices.erase(i->first->vertex((i->second+1)&3)); - vertices.erase(i->first->vertex((i->second+2)&3)); - vertices.erase(i->first->vertex((i->second+3)&3)); - } - } else { - for (typename std::vector::const_iterator i = facets.begin(); - i != facets.end(); ++i) { - vertices.erase(i->first->vertex(cw(i->second))); - vertices.erase(i->first->vertex(ccw(i->second))); - } - } - - return std::copy(vertices.begin(), vertices.end(), res); - } - -#ifndef CGAL_NO_DEPRECATED_CODE - // Returns the vertices on the boundary of the conflict hole. - template - OutputIterator - vertices_in_conflict(const Weighted_point&p, Cell_handle c, OutputIterator res) const - { - return vertices_on_conflict_zone_boundary(p, c, res); - } -#endif // CGAL_NO_DEPRECATED_CODE - - // Returns the vertices on the boundary of the conflict hole. - template - OutputIterator - vertices_on_conflict_zone_boundary(const Weighted_point&p, Cell_handle c, - OutputIterator res) const - { - CGAL_triangulation_precondition(dimension() >= 2); - - // Get the facets on the boundary of the hole. - std::vector facets; - find_conflicts(p, c, std::back_inserter(facets), - Emptyset_iterator(), Emptyset_iterator()); - - // Then extract uniquely the vertices. - std::set vertices; - if (dimension() == 3) { - for (typename std::vector::const_iterator i = facets.begin(); - i != facets.end(); ++i) { - vertices.insert(i->first->vertex((i->second+1)&3)); - vertices.insert(i->first->vertex((i->second+2)&3)); - vertices.insert(i->first->vertex((i->second+3)&3)); - } - } else { - for (typename std::vector::const_iterator i = facets.begin(); - i != facets.end(); ++i) { - vertices.insert(i->first->vertex(cw(i->second))); - vertices.insert(i->first->vertex(ccw(i->second))); - } - } - - return std::copy(vertices.begin(), vertices.end(), res); - } - - void remove (Vertex_handle v); - - template < typename InputIterator > - size_type remove(InputIterator first, InputIterator beyond) - { - CGAL_triangulation_precondition(!this->does_repeat_in_range(first, beyond)); - size_type n = number_of_vertices(); - while (first != beyond) { - remove (*first); - ++first; - } - return n - number_of_vertices(); - } - - // DISPLACEMENT - Vertex_handle move_point(Vertex_handle v, const Weighted_point & p); - - // Displacement works only for Regular triangulation - // without hidden points at any time - Vertex_handle move_if_no_collision(Vertex_handle v, const Weighted_point & p); - Vertex_handle move(Vertex_handle v, const Weighted_point & p); - - // REMOVE CLUSTER - works only when Regular has no hidden point at all - // "regular as Delaunay" - template < typename InputIterator > - size_type remove_cluster(InputIterator first, InputIterator beyond) - { - Self tmp; - Vertex_remover remover (tmp); - return Tr_Base::remove(first, beyond, remover); - } - -protected: - - Oriented_side - side_of_oriented_power_sphere(const Weighted_point &p0, - const Weighted_point &p1, - const Weighted_point &p2, - const Weighted_point &p3, - const Weighted_point &p, - bool perturb = false) const; - - Oriented_side - side_of_oriented_power_circle(const Weighted_point &p0, - const Weighted_point &p1, - const Weighted_point &p2, - const Weighted_point &p, - bool perturb = false) const; - - Bounded_side - side_of_bounded_power_circle(const Weighted_point &p0, - const Weighted_point &p1, - const Weighted_point &p2, - const Weighted_point &p, - bool perturb = false) const; - - Bounded_side - side_of_bounded_power_segment(const Weighted_point &p0, - const Weighted_point &p1, - const Weighted_point &p, - bool perturb = false) const; - - -public: - - // Queries - Bounded_side - side_of_power_sphere(Cell_handle c, const Weighted_point &p, - bool perturb = false) const; - - Bounded_side - side_of_power_circle(const Facet & f, const Weighted_point & p, - bool /* perturb */ = false) const - { - return side_of_power_circle(f.first, f.second, p); - } - - Bounded_side - side_of_power_circle(Cell_handle c, int i, const Weighted_point &p, - bool perturb = false) const; - - Bounded_side - side_of_power_segment(Cell_handle c, const Weighted_point &p, - bool perturb = false) const; - - Vertex_handle - nearest_power_vertex_in_cell(const Bare_point& p, - Cell_handle c) const; - - Vertex_handle - nearest_power_vertex(const Bare_point& p, Cell_handle c = - Cell_handle()) const; - - bool is_Gabriel(Cell_handle c, int i) const; - bool is_Gabriel(Cell_handle c, int i, int j) const; - bool is_Gabriel(const Facet& f)const ; - bool is_Gabriel(const Edge& e) const; - bool is_Gabriel(Vertex_handle v) const; - - - // Dual functions - Bare_point dual(Cell_handle c) const; - - Object dual(const Facet & f) const - { return dual( f.first, f.second ); } - - Object dual(Cell_handle c, int i) const; - - template < class Stream> - Stream& draw_dual(Stream & os) - { - for (Finite_facets_iterator fit = finite_facets_begin(), - end = finite_facets_end(); - fit != end; ++fit) { - Object o = dual(*fit); - if (const Segment *s = object_cast(&o)) os << *s; - else if (const Ray *r = object_cast(&o)) os << *r; - else if (const Bare_point *p = object_cast(&o)) os << *p; - } - return os; - } - - bool is_valid(bool verbose = false, int level = 0) const; - -protected: - bool - less_power_distance(const Bare_point &p, - const Weighted_point &q, - const Weighted_point &r) const - { - return - geom_traits().compare_power_distance_3_object()(p, q, r) == SMALLER; - } - - Bare_point - construct_weighted_circumcenter(const Weighted_point &p, - const Weighted_point &q, - const Weighted_point &r, - const Weighted_point &s) const - { - return geom_traits().construct_weighted_circumcenter_3_object()(p,q,r,s); - } - - Bare_point - construct_weighted_circumcenter(const Weighted_point &p, - const Weighted_point &q, - const Weighted_point &r) const - { - return geom_traits().construct_weighted_circumcenter_3_object()(p,q,r); - } - - Line - construct_perpendicular_line(const Plane &pl, const Bare_point &p) const - { - return geom_traits().construct_perpendicular_line_3_object()(pl, p); - } - - Plane - construct_plane(const Bare_point &p, const Bare_point &q, const Bare_point &r) const - { - return geom_traits().construct_plane_3_object()(p, q, r); - } - - Ray - construct_ray(const Bare_point &p, const Line &l) const - { - return geom_traits().construct_ray_3_object()(p, l); - } - - Object - construct_object(const Bare_point &p) const - { - return geom_traits().construct_object_3_object()(p); - } - - Object - construct_object(const Segment &s) const - { - return geom_traits().construct_object_3_object()(s); - } - - Object - construct_object(const Ray &r) const - { - return geom_traits().construct_object_3_object()(r); - } - - Vertex_handle - nearest_power_vertex(const Bare_point &p, - Vertex_handle v, - Vertex_handle w) const - { - // In case of equality, v is returned. - CGAL_triangulation_precondition(v != w); - if (is_infinite(v)) return w; - if (is_infinite(w)) return v; - return less_power_distance(p, w->point(), v->point()) ? w : v; - } - - Oriented_side - power_test(const Weighted_point &p, const Weighted_point &q) const - { - CGAL_triangulation_precondition(this->equal(p, q)); - return geom_traits().power_test_3_object()(p, q); - } - - Oriented_side - power_test(const Weighted_point &p, const Weighted_point &q, - const Weighted_point &r) const - { - CGAL_triangulation_precondition(this->collinear(p, q, r)); - return geom_traits().power_test_3_object()(p, q, r); - } - - Oriented_side - power_test(const Weighted_point &p, const Weighted_point &q, - const Weighted_point &r, const Weighted_point &s) const - { - CGAL_triangulation_precondition(this->coplanar(p, q, r, s)); - return geom_traits().power_test_3_object()(p, q, r, s); - } - - Oriented_side - power_test(const Weighted_point &p, const Weighted_point &q, - const Weighted_point &r, const Weighted_point &s, - const Weighted_point &t) const - { - return geom_traits().power_test_3_object()(p, q, r, s, t); - } - - bool in_conflict_3(const Weighted_point &p, const Cell_handle c) const - { - return side_of_power_sphere(c, p, true) == ON_BOUNDED_SIDE; - } - - bool in_conflict_2(const Weighted_point &p, const Cell_handle c, int i) const - { - return side_of_power_circle(c, i, p, true) == ON_BOUNDED_SIDE; - } - - bool in_conflict_1(const Weighted_point &p, const Cell_handle c) const - { - return side_of_power_segment(c, p, true) == ON_BOUNDED_SIDE; - } - - bool in_conflict_0(const Weighted_point &p, const Cell_handle c) const - { - return power_test(c->vertex(0)->point(), p) == ON_POSITIVE_SIDE; - } - - bool in_conflict(const Weighted_point &p, const Cell_handle c) const - { - switch (dimension()) { - case 0: return in_conflict_0(p, c); - case 1: return in_conflict_1(p, c); - case 2: return in_conflict_2(p, c, 3); - case 3: return in_conflict_3(p, c); - } - return true; - } - - class Conflict_tester_3 - { - const Weighted_point &p; - const Self *t; - - public: - - Conflict_tester_3(const Weighted_point &pt, const Self *tr) - : p(pt), t(tr) {} - - bool operator()(const Cell_handle c) const { - return t->in_conflict_3(p, c); - } - - bool test_initial_cell(const Cell_handle c) const { - return operator()(c); - } - Oriented_side compare_weight(const Weighted_point &wp1, - const Weighted_point &wp2) const - { - return t->power_test (wp1, wp2); - } - }; - - class Conflict_tester_2 - { - const Weighted_point &p; - const Self *t; - public: - - Conflict_tester_2(const Weighted_point &pt, const Self *tr) - : p(pt), t(tr) {} - - bool operator()(const Cell_handle c) const - { - return t->in_conflict_2(p, c, 3); - } - bool test_initial_cell(const Cell_handle c) const { - return operator()(c); - } - Oriented_side compare_weight(const Weighted_point &wp1, - const Weighted_point &wp2) const - { - return t->power_test (wp1, wp2); - } - }; - - class Conflict_tester_1 - { - const Weighted_point &p; - const Self *t; - - public: - - Conflict_tester_1(const Weighted_point &pt, const Self *tr) - : p(pt), t(tr) {} - - bool operator()(const Cell_handle c) const - { - return t->in_conflict_1(p, c); - } - bool test_initial_cell(const Cell_handle c) const { - return operator()(c); - } - Oriented_side compare_weight(const Weighted_point &wp1, - const Weighted_point &wp2) const - { - return t->power_test (wp1, wp2); - } - }; - - class Conflict_tester_0 - { - const Weighted_point &p; - const Self *t; - - public: - - Conflict_tester_0(const Weighted_point &pt, const Self *tr) - : p(pt), t(tr) {} - - bool operator()(const Cell_handle c) const - { - return t->in_conflict_0(p, c); - } - bool test_initial_cell(const Cell_handle c) const { - return operator()(c); - } - int compare_weight(const Weighted_point &wp1, - const Weighted_point &wp2) const - { - return t->power_test (wp1, wp2); - } - }; - - class Hidden_point_visitor - { - Self *t; - mutable std::vector vertices; - mutable std::vector hidden_points; - - public: - - Hidden_point_visitor(Self *tr) : t(tr) {} - - template - void process_cells_in_conflict(InputIterator start, InputIterator end) const - { - int dim = t->dimension(); - while (start != end) { - std::copy((*start)->hidden_points_begin(), - (*start)->hidden_points_end(), - std::back_inserter(hidden_points)); - - for (int i=0; i<=dim; i++) { - Vertex_handle v = (*start)->vertex(i); - if (v->cell() != Cell_handle()) { - vertices.push_back(v); - v->set_cell(Cell_handle()); - } - } - start ++; - } - } - void reinsert_vertices(Vertex_handle v) { - Cell_handle hc = v->cell(); - for (typename std::vector::iterator - vi = vertices.begin(); vi != vertices.end(); ++vi) { - if ((*vi)->cell() != Cell_handle()) continue; - hc = t->locate ((*vi)->point(), hc); - hide_point(hc, (*vi)->point()); - t->tds().delete_vertex(*vi); - } - vertices.clear(); - for (typename std::vector::iterator - hp = hidden_points.begin(); hp != hidden_points.end(); ++hp) { - hc = t->locate (*hp, hc); - hide_point (hc, *hp); - } - hidden_points.clear(); - } - Vertex_handle replace_vertex(Cell_handle c, int index, - const Weighted_point &p) { - Vertex_handle v = c->vertex(index); - hide_point(c, v->point()); - v->set_point(p); - return v; - } - void hide_point(Cell_handle c, const Weighted_point &p) { - c->hide_point(p); - } - }; - - template < class RegularTriangulation_3 > - class Vertex_remover; - - template < class RegularTriangulation_3 > - class Vertex_inserter; - - Hidden_point_visitor hidden_point_visitor; -}; - - -template < class Gt, class Tds > -typename Regular_triangulation_3::Vertex_handle -Regular_triangulation_3:: -nearest_power_vertex_in_cell(const Bare_point& p, - Cell_handle c) const -// Returns the finite vertex of the cell c with smaller -// power distance to p. -{ - CGAL_triangulation_precondition(dimension() >= 1); - Vertex_handle nearest = nearest_power_vertex(p, - c->vertex(0), - c->vertex(1)); - if (dimension() >= 2) { - nearest = nearest_power_vertex(p, nearest, c->vertex(2)); - if (dimension() == 3) - nearest = nearest_power_vertex(p, nearest, c->vertex(3)); - } - return nearest; -} - - -template < class Gt, class Tds > -typename Regular_triangulation_3::Vertex_handle -Regular_triangulation_3:: -nearest_power_vertex(const Bare_point& p, Cell_handle start) const -{ - if (number_of_vertices() == 0) - return Vertex_handle(); - - // Use a brute-force algorithm if dimension < 3. - if (dimension() < 3) { - Finite_vertices_iterator vit = finite_vertices_begin(); - Vertex_handle res = vit; - ++vit; - for (Finite_vertices_iterator end = finite_vertices_end(); vit != end; ++vit) - res = nearest_power_vertex(p, res, vit); - return res; - } - - Locate_type lt; - int li, lj; - // I put the cast here temporarily - // until we solve the traits class pb of regular triangulation - Cell_handle c = locate(static_cast(p), lt, li, lj, start); - - // - start with the closest vertex from the located cell. - // - repeatedly take the nearest of its incident vertices if any - // - if not, we're done. - Vertex_handle nearest = nearest_power_vertex_in_cell(p, c); - std::vector vs; - vs.reserve(32); - while (true) { - Vertex_handle tmp = nearest; - adjacent_vertices(nearest, std::back_inserter(vs)); - for (typename std::vector::const_iterator - vsit = vs.begin(); vsit != vs.end(); ++vsit) - tmp = nearest_power_vertex(p, tmp, *vsit); - if (tmp == nearest) - break; - vs.clear(); - nearest = tmp; - } - return nearest; -} - -template < class Gt, class Tds > -typename Regular_triangulation_3::Bare_point -Regular_triangulation_3:: -dual(Cell_handle c) const -{ - CGAL_triangulation_precondition(dimension()==3); - CGAL_triangulation_precondition( ! is_infinite(c) ); - return construct_weighted_circumcenter( c->vertex(0)->point(), - c->vertex(1)->point(), - c->vertex(2)->point(), - c->vertex(3)->point() ); -} - -template < class Gt, class Tds > -typename Regular_triangulation_3::Object -Regular_triangulation_3:: -dual(Cell_handle c, int i) const -{ - CGAL_triangulation_precondition(dimension()>=2); - CGAL_triangulation_precondition( ! is_infinite(c,i) ); - - if ( dimension() == 2 ) { - CGAL_triangulation_precondition( i == 3 ); - return construct_object( - construct_weighted_circumcenter(c->vertex(0)->point(), - c->vertex(1)->point(), - c->vertex(2)->point()) ); - } - - // dimension() == 3 - Cell_handle n = c->neighbor(i); - if ( ! is_infinite(c) && ! is_infinite(n) ) - return construct_object(construct_segment( dual(c), dual(n) )); - - // either n or c is infinite - int in; - if ( is_infinite(c) ) - in = n->index(c); - else { - n = c; - in = i; - } - // n now denotes a finite cell, either c or c->neighbor(i) - int ind[3] = {(in+1)&3,(in+2)&3,(in+3)&3}; - if ( (in&1) == 1 ) - std::swap(ind[0], ind[1]); - const Weighted_point& p = n->vertex(ind[0])->point(); - const Weighted_point& q = n->vertex(ind[1])->point(); - const Weighted_point& r = n->vertex(ind[2])->point(); - - Line l = - construct_perpendicular_line( construct_plane(p,q,r), - construct_weighted_circumcenter(p,q,r) ); - return construct_object(construct_ray( dual(n), l)); -} - - -template < class Gt, class Tds > -Oriented_side -Regular_triangulation_3:: -side_of_oriented_power_sphere(const Weighted_point &p0, - const Weighted_point &p1, - const Weighted_point &p2, - const Weighted_point &p3, - const Weighted_point &p, bool perturb) const -{ - CGAL_triangulation_precondition( orientation(p0, p1, p2, p3) == POSITIVE ); - - using namespace boost; - - Oriented_side os = power_test(p0, p1, p2, p3, p); - - if (os != ON_ORIENTED_BOUNDARY || !perturb) - return os; - - // We are now in a degenerate case => we do a symbolic perturbation. - - // We sort the points lexicographically. - const Weighted_point * points[5] = {&p0, &p1, &p2, &p3, &p}; - std::sort(points, points + 5, - boost::bind(geom_traits().compare_xyz_3_object(), - boost::bind(Dereference(), _1), - boost::bind(Dereference(), _2)) == SMALLER); - - // We successively look whether the leading monomial, then 2nd monomial - // of the determinant has non null coefficient. - for (int i=4; i>1; --i) { - if (points[i] == &p) - return ON_NEGATIVE_SIDE; // since p0 p1 p2 p3 are non coplanar - // and positively oriented - Orientation o; - if (points[i] == &p3 && (o = orientation(p0,p1,p2,p)) != COPLANAR ) - return o; - if (points[i] == &p2 && (o = orientation(p0,p1,p,p3)) != COPLANAR ) - return o; - if (points[i] == &p1 && (o = orientation(p0,p,p2,p3)) != COPLANAR ) - return o; - if (points[i] == &p0 && (o = orientation(p,p1,p2,p3)) != COPLANAR ) - return o; - } - - CGAL_triangulation_assertion(false); - return ON_NEGATIVE_SIDE; -} - - -template < class Gt, class Tds > -Bounded_side -Regular_triangulation_3:: -side_of_power_sphere(Cell_handle c, const Weighted_point &p, - bool perturb) const -{ - CGAL_triangulation_precondition( dimension() == 3 ); - int i3; - if ( ! c->has_vertex( infinite_vertex(), i3 ) ) { - return Bounded_side( side_of_oriented_power_sphere(c->vertex(0)->point(), - c->vertex(1)->point(), - c->vertex(2)->point(), - c->vertex(3)->point(), - p, perturb) ); - } - // else infinite cell : - int i0,i1,i2; - if ( (i3%2) == 1 ) { - i0 = (i3+1)&3; - i1 = (i3+2)&3; - i2 = (i3+3)&3; - } - else { - i0 = (i3+2)&3; - i1 = (i3+1)&3; - i2 = (i3+3)&3; - } - - // general case - Orientation o = orientation(c->vertex(i0)->point(), - c->vertex(i1)->point(), - c->vertex(i2)->point(), p); - if (o != ZERO) - return Bounded_side(o); - - // else p coplanar with i0,i1,i2 - return side_of_bounded_power_circle(c->vertex(i0)->point(), - c->vertex(i1)->point(), - c->vertex(i2)->point(), - p, perturb); -} - - -template < class Gt, class Tds > -Bounded_side -Regular_triangulation_3:: -side_of_bounded_power_circle(const Weighted_point &p0, - const Weighted_point &p1, - const Weighted_point &p2, - const Weighted_point &p, bool perturb) const -{ - CGAL_triangulation_precondition(coplanar_orientation(p0, p1, p2) != 0); - if (coplanar_orientation(p0, p1, p2) == POSITIVE) - return Bounded_side (side_of_oriented_power_circle(p0, p1, p2, p, perturb)); - // Wrong because the low level power test already does a coplanar orientation - // test. - // return Bounded_side (- side_of_oriented_power_circle (p0, p2, p1, p, - // perturb)); - return Bounded_side (side_of_oriented_power_circle(p0, p2, p1, p, perturb)); -} - - -template < class Gt, class Tds > -Oriented_side -Regular_triangulation_3:: -side_of_oriented_power_circle(const Weighted_point &p0, - const Weighted_point &p1, - const Weighted_point &p2, - const Weighted_point &p, bool perturb) const -{ - CGAL_triangulation_precondition( coplanar_orientation(p0, p1, p2) == POSITIVE ); - - using namespace boost; - - Oriented_side os = power_test(p0, p1, p2, p); - - if (os != ON_ORIENTED_BOUNDARY || !perturb) - return os; - - // We are now in a degenerate case => we do a symbolic perturbation. - - // We sort the points lexicographically. - const Weighted_point * points[4] = {&p0, &p1, &p2, &p}; - std::sort(points, points + 4, - boost::bind(geom_traits().compare_xyz_3_object(), - boost::bind(Dereference(), _1), - boost::bind(Dereference(), _2)) == SMALLER); - - // We successively look whether the leading monomial, then 2nd monomial - // of the determinant has non null coefficient. - // 2 iterations are enough (cf paper) - for (int i=3; i>1; --i) { - if (points[i] == &p) - return ON_NEGATIVE_SIDE; // since p0 p1 p2 are non collinear - // and positively oriented - Orientation o; - if (points[i] == &p2 && (o = coplanar_orientation(p0,p1,p)) != COPLANAR ) - return o; - if (points[i] == &p1 && (o = coplanar_orientation(p0,p,p2)) != COPLANAR ) - return o; - if (points[i] == &p0 && (o = coplanar_orientation(p,p1,p2)) != COPLANAR ) - return o; - } - - CGAL_triangulation_assertion(false); - return ON_NEGATIVE_SIDE; -} - - -template < class Gt, class Tds > -Bounded_side -Regular_triangulation_3:: -side_of_power_circle(Cell_handle c, int i, const Weighted_point &p, - bool perturb) const -{ - CGAL_triangulation_precondition( dimension() >= 2 ); - int i3 = 5; - if ( dimension() == 2 ) { - CGAL_triangulation_precondition( i == 3 ); - // the triangulation is supposed to be valid, ie the facet - // with vertices 0 1 2 in this order is positively oriented - if ( ! c->has_vertex( infinite_vertex(), i3 ) ) - return Bounded_side( side_of_oriented_power_circle(c->vertex(0)->point(), - c->vertex(1)->point(), - c->vertex(2)->point(), - p, perturb) ); - // else infinite facet - // v1, v2 finite vertices of the facet such that v1,v2,infinite - // is positively oriented - Vertex_handle v1 = c->vertex( ccw(i3) ), - v2 = c->vertex( cw(i3) ); - CGAL_triangulation_assertion(coplanar_orientation(v1->point(), v2->point(), - mirror_vertex(c, i3)->point()) == NEGATIVE); - Orientation o = coplanar_orientation(v1->point(), v2->point(), p); - if ( o != ZERO ) - return Bounded_side( o ); - // case when p collinear with v1v2 - return side_of_bounded_power_segment(v1->point(), - v2->point(), - p, perturb); - }// dim 2 - - // else dimension == 3 - CGAL_triangulation_precondition( (i >= 0) && (i < 4) ); - if ( ( ! c->has_vertex(infinite_vertex(),i3) ) || ( i3 != i ) ) { - // finite facet - // initialization of i0 i1 i2, vertices of the facet positively - // oriented (if the triangulation is valid) - int i0 = (i>0) ? 0 : 1; - int i1 = (i>1) ? 1 : 2; - int i2 = (i>2) ? 2 : 3; - CGAL_triangulation_precondition(this->coplanar(c->vertex(i0)->point(), - c->vertex(i1)->point(), - c->vertex(i2)->point(), p)); - return side_of_bounded_power_circle(c->vertex(i0)->point(), - c->vertex(i1)->point(), - c->vertex(i2)->point(), - p, perturb); - } - //else infinite facet - // v1, v2 finite vertices of the facet such that v1,v2,infinite - // is positively oriented - Vertex_handle v1 = c->vertex( next_around_edge(i3,i) ), - v2 = c->vertex( next_around_edge(i,i3) ); - Orientation o = (Orientation) - (coplanar_orientation( v1->point(), v2->point(), - c->vertex(i)->point()) * - coplanar_orientation( v1->point(), v2->point(), p)); - // then the code is duplicated from 2d case - if ( o != ZERO ) - return Bounded_side( -o ); - // because p is in f iff - // it is not on the same side of v1v2 as c->vertex(i) - // case when p collinear with v1v2 : - return side_of_bounded_power_segment(v1->point(), - v2->point(), - p, perturb); -} - -template < class Gt, class Tds > -Bounded_side -Regular_triangulation_3:: -side_of_bounded_power_segment(const Weighted_point &p0, - const Weighted_point &p1, - const Weighted_point &p, bool perturb) const -{ - Oriented_side os = power_test(p0, p1, p); - - if (os != ON_ORIENTED_BOUNDARY || !perturb) - return Bounded_side(os); - - // We are now in a degenerate case => we do a symbolic perturbation. - - switch (this->collinear_position(p0, p, p1)) { - case Tr_Base::BEFORE: case Tr_Base::AFTER: - return ON_UNBOUNDED_SIDE; - case Tr_Base::MIDDLE: - return ON_BOUNDED_SIDE; - default: - ; - } - - CGAL_triangulation_assertion(false); - return ON_UNBOUNDED_SIDE; -} - -template < class Gt, class Tds > -Bounded_side -Regular_triangulation_3:: -side_of_power_segment(Cell_handle c, const Weighted_point &p, - bool perturb) const -{ - CGAL_triangulation_precondition( dimension() == 1 ); - if ( ! is_infinite(c,0,1) ) - return side_of_bounded_power_segment(c->vertex(0)->point(), - c->vertex(1)->point(), - p, perturb); - Locate_type lt; int i; - Bounded_side soe = side_of_edge( p, c, lt, i ); - if (soe != ON_BOUNDARY) - return soe; - // Either we compare weights, or we use the finite neighboring edge - Cell_handle finite_neighbor = c->neighbor(c->index(infinite_vertex())); - CGAL_triangulation_assertion(!is_infinite(finite_neighbor,0,1)); - return side_of_bounded_power_segment(finite_neighbor->vertex(0)->point(), - finite_neighbor->vertex(1)->point(), - p, perturb); -} - -template < class Gt, class Tds > -bool -Regular_triangulation_3:: -is_Gabriel(const Facet& f) const -{ - return is_Gabriel(f.first, f.second); -} - -template < class Gt, class Tds > -bool -Regular_triangulation_3:: -is_Gabriel(Cell_handle c, int i) const -{ - CGAL_triangulation_precondition(dimension() == 3 && !is_infinite(c,i)); - typename Geom_traits::Side_of_bounded_orthogonal_sphere_3 - side_of_bounded_orthogonal_sphere = - geom_traits().side_of_bounded_orthogonal_sphere_3_object(); - - if ((!is_infinite(c->vertex(i))) && - side_of_bounded_orthogonal_sphere( - c->vertex(vertex_triple_index(i,0))->point(), - c->vertex(vertex_triple_index(i,1))->point(), - c->vertex(vertex_triple_index(i,2))->point(), - c->vertex(i)->point()) == ON_BOUNDED_SIDE ) return false; - - Cell_handle neighbor = c->neighbor(i); - int in = neighbor->index(c); - - if ((!is_infinite(neighbor->vertex(in))) && - side_of_bounded_orthogonal_sphere( - c->vertex(vertex_triple_index(i,0))->point(), - c->vertex(vertex_triple_index(i,1))->point(), - c->vertex(vertex_triple_index(i,2))->point(), - neighbor->vertex(in)->point()) == ON_BOUNDED_SIDE ) return false; - - return true; -} - - -template < class Gt, class Tds > -bool -Regular_triangulation_3:: -is_Gabriel(const Edge& e) const -{ - return is_Gabriel(e.first, e.second, e.third); -} - -template < class Gt, class Tds > -bool -Regular_triangulation_3:: -is_Gabriel(Cell_handle c, int i, int j) const -{ - CGAL_triangulation_precondition(dimension() == 3 && !is_infinite(c,i,j)); - typename Geom_traits::Side_of_bounded_orthogonal_sphere_3 - side_of_bounded_orthogonal_sphere = - geom_traits().side_of_bounded_orthogonal_sphere_3_object(); - - Facet_circulator fcirc = incident_facets(c,i,j), - fdone(fcirc); - Vertex_handle v1 = c->vertex(i); - Vertex_handle v2 = c->vertex(j); - do { - // test whether the vertex of cc opposite to *fcirc - // is inside the sphere defined by the edge e = (s, i,j) - Cell_handle cc = (*fcirc).first; - int ii = (*fcirc).second; - if (!is_infinite(cc->vertex(ii)) && - side_of_bounded_orthogonal_sphere( v1->point(), - v2->point(), - cc->vertex(ii)->point()) - == ON_BOUNDED_SIDE ) return false; - } while(++fcirc != fdone); - return true; -} - -template < class Gt, class Tds > -bool -Regular_triangulation_3:: -is_Gabriel(Vertex_handle v) const -{ - return nearest_power_vertex( v->point().point(), v->cell()) == v; -} - -template < class Gt, class Tds > -typename Regular_triangulation_3::Vertex_handle -Regular_triangulation_3:: -insert(const Weighted_point & p, Cell_handle start) -{ - Locate_type lt; - int li, lj; - Cell_handle c = locate(p, lt, li, lj, start); - return insert(p, lt, c, li, lj); -} - -template < class Gt, class Tds > -typename Regular_triangulation_3::Vertex_handle -Regular_triangulation_3:: -insert(const Weighted_point & p, Locate_type lt, Cell_handle c, int li, int lj) -{ - switch (dimension()) { - case 3: - { - Conflict_tester_3 tester (p, this); - return insert_in_conflict(p, lt,c,li,lj, tester, hidden_point_visitor); - } - case 2: - { - Conflict_tester_2 tester (p, this); - return insert_in_conflict(p, lt,c,li,lj, tester, hidden_point_visitor); - } - case 1: - { - Conflict_tester_1 tester (p, this); - return insert_in_conflict(p, lt,c,li,lj, tester, hidden_point_visitor); - } - } - - Conflict_tester_0 tester (p, this); - return insert_in_conflict(p, lt,c,li,lj, tester, hidden_point_visitor); -} - - -template < class Gt, class Tds > -template -typename Regular_triangulation_3::Vertex_handle -Regular_triangulation_3:: -insert_in_hole(const Weighted_point & p, CellIt cell_begin, CellIt cell_end, - Cell_handle begin, int i) -{ - CGAL_triangulation_precondition(cell_begin != cell_end); - - hidden_point_visitor.process_cells_in_conflict(cell_begin,cell_end); - - Vertex_handle v = - Tr_Base::insert_in_hole(p, cell_begin, cell_end, begin, i); - - // Store the hidden points in their new cells and hide vertices that - // have to be hidden - hidden_point_visitor.reinsert_vertices(v); - return v; -} - - -template < class Gt, class Tds > -template -typename Regular_triangulation_3::Vertex_handle -Regular_triangulation_3:: -insert_in_hole(const Weighted_point & p, CellIt cell_begin, CellIt cell_end, - Cell_handle begin, int i, Vertex_handle newv) -{ - CGAL_triangulation_precondition(cell_begin != cell_end); - - hidden_point_visitor.process_cells_in_conflict(cell_begin,cell_end); - - Vertex_handle v = - Tr_Base::insert_in_hole(p, cell_begin, cell_end, begin, i, newv); - - // Store the hidden points in their new cells and hide vertices that - // have to be hidden - hidden_point_visitor.reinsert_vertices(v); - return v; -} - -template -template -class Regular_triangulation_3::Vertex_remover { - typedef RegularTriangulation_3 Regular; - typedef typename Gt::Point_3 Point; -public: - typedef typename std::vector::iterator - Hidden_points_iterator; - - Vertex_remover(Regular &tmp_) : tmp(tmp_) {} - - Regular &tmp; - - void add_hidden_points(Cell_handle ch) { - std::copy (ch->hidden_points_begin(), ch->hidden_points_end(), - std::back_inserter(hidden)); - } - - Hidden_points_iterator hidden_points_begin() { - return hidden.begin(); - } - Hidden_points_iterator hidden_points_end() { - return hidden.end(); - } - - Bounded_side side_of_bounded_circle(const Point &p, const Point &q, - const Point &r, const Point &s, bool perturb = false) const { - return tmp.side_of_bounded_power_circle(p,q,r,s,perturb); - } - -private: - // The removal of v may un-hide some points, - // Space functions output them. - std::vector hidden; -}; - -// The displacement method works only -// on regular triangulation without hidden points at any time -// the vertex inserter is used only -// for the purpose of displacements -template -template -class Regular_triangulation_3::Vertex_inserter { - typedef RegularTriangulation_3 Regular; -public: - typedef Nullptr_t Hidden_points_iterator; - - Vertex_inserter(Regular &tmp_) : tmp(tmp_) {} - - Regular &tmp; - - void add_hidden_points(Cell_handle) {} - Hidden_points_iterator hidden_points_begin() { return NULL; } - Hidden_points_iterator hidden_points_end() { return NULL; } - - Vertex_handle insert(const Weighted_point& p, - Locate_type lt, Cell_handle c, int li, int lj) { - return tmp.insert(p, lt, c, li, lj); - } - - Vertex_handle insert(const Weighted_point& p, Cell_handle c) { - return tmp.insert(p, c); - } - - Vertex_handle insert(const Weighted_point& p) { - return tmp.insert(p); - } -}; - -template < class Gt, class Tds > -void -Regular_triangulation_3:: -remove(Vertex_handle v) -{ - Cell_handle c; - if (dimension() > 0) - c = v->cell()->neighbor(v->cell()->index(v)); - - Self tmp; - Vertex_remover remover(tmp); - Tr_Base::remove(v,remover); - - // Re-insert the points that v was hiding. - for (typename Vertex_remover::Hidden_points_iterator - hi = remover.hidden_points_begin(); - hi != remover.hidden_points_end(); ++hi) { - Vertex_handle hv = insert (*hi, c); - if (hv != Vertex_handle()) c = hv->cell(); - } - CGAL_triangulation_expensive_postcondition (is_valid()); -} - -// Again, verbatim copy from Delaunay. -template < class Gt, class Tds > -typename Regular_triangulation_3::Vertex_handle -Regular_triangulation_3:: -move_point(Vertex_handle v, const Weighted_point & p) -{ - CGAL_triangulation_precondition(! is_infinite(v)); - CGAL_triangulation_expensive_precondition(is_vertex(v)); - - // Dummy implementation for a start. - - // Remember an incident vertex to restart - // the point location after the removal. - Cell_handle c = v->cell(); - Vertex_handle old_neighbor = c->vertex(c->index(v) == 0 ? 1 : 0); - CGAL_triangulation_assertion(old_neighbor != v); - - remove(v); - - if (dimension() <= 0) - return insert(p); - return insert(p, old_neighbor->cell()); -} - -// Displacement works only for Regular triangulation -// without hidden points at any time -template < class Gt, class Tds > -typename Regular_triangulation_3::Vertex_handle -Regular_triangulation_3:: -move_if_no_collision(Vertex_handle v, const Weighted_point &p) -{ - Self tmp; - Vertex_remover remover (tmp); - Vertex_inserter inserter (*this); - Vertex_handle res = Tr_Base::move_if_no_collision(v,p,remover,inserter); - - CGAL_triangulation_expensive_postcondition(is_valid()); - return res; -} - -template -typename Regular_triangulation_3::Vertex_handle -Regular_triangulation_3:: -move(Vertex_handle v, const Weighted_point &p) { - CGAL_triangulation_precondition(!is_infinite(v)); - if(v->point() == p) return v; - Self tmp; - Vertex_remover remover (tmp); - Vertex_inserter inserter (*this); - return Tr_Base::move(v,p,remover,inserter); -} - -template < class Gt, class Tds > -bool -Regular_triangulation_3:: -is_valid(bool verbose, int level) const -{ - if ( ! Tr_Base::is_valid(verbose,level) ) { - if (verbose) - std::cerr << "invalid base triangulation" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - - switch ( dimension() ) { - case 3: - { - for(Finite_cells_iterator it = finite_cells_begin(), end = finite_cells_end(); it != end; ++it) { - is_valid_finite(it, verbose, level); - for(int i=0; i<4; i++) { - if ( !is_infinite - (it->neighbor(i)->vertex(it->neighbor(i)->index(it))) ) { - if ( side_of_power_sphere - (it, - it->neighbor(i)->vertex(it->neighbor(i)->index(it))->point()) - == ON_BOUNDED_SIDE ) { - if (verbose) - std::cerr << "non-empty sphere " << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - } - } - } - break; - } - case 2: - { - for(Finite_facets_iterator it = finite_facets_begin(), end = finite_facets_end(); it!= end; ++it) { - is_valid_finite((*it).first, verbose, level); - for(int i=0; i<3; i++) { - if( !is_infinite - ((*it).first->neighbor(i)->vertex( (((*it).first)->neighbor(i)) - ->index((*it).first))) ) { - if ( side_of_power_circle - ( (*it).first, 3, - (*it).first->neighbor(i)-> - vertex( (((*it).first)->neighbor(i)) - ->index((*it).first) )->point() ) - == ON_BOUNDED_SIDE ) { - if (verbose) - std::cerr << "non-empty circle " << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - } - } - } - break; - } - case 1: - { - for(Finite_edges_iterator it = finite_edges_begin(), end = finite_edges_end(); it != end; ++it) { - is_valid_finite((*it).first, verbose, level); - for(int i=0; i<2; i++) { - if( !is_infinite - ((*it).first->neighbor(i)->vertex( (((*it).first)->neighbor(i)) - ->index((*it).first))) ) { - if ( side_of_power_segment - ( (*it).first, - (*it).first->neighbor(i)-> - vertex( (((*it).first)->neighbor(i)) - ->index((*it).first) )->point() ) - == ON_BOUNDED_SIDE ) { - if (verbose) - std::cerr << "non-empty edge " << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - } - } - } - break; - } - } - if (verbose) - std::cerr << "valid Regular triangulation" << std::endl; - return true; -} - -} //namespace CGAL - -#if defined(BOOST_MSVC) -# pragma warning(pop) -#endif - -#endif // CGAL_REGULAR_TRIANGULATION_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/Regular_triangulation_cell_base_3.h b/Triangulation_3_copy_tds/include/CGAL/Regular_triangulation_cell_base_3.h deleted file mode 100644 index fe6759275e2..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/Regular_triangulation_cell_base_3.h +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) 2004 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// Author(s) : Christophe Delage - -// cell of a triangulation of any dimension <=3 -// with hidden points (for the regular triangulation) - -#ifndef CGAL_REGULAR_TRIANGULATION_CELL_BASE_3_H -#define CGAL_REGULAR_TRIANGULATION_CELL_BASE_3_H - -#include -#include - -namespace CGAL { - -template < typename GT, - typename Cb = Triangulation_cell_base_3, - typename C = std::list > -class Regular_triangulation_cell_base_3 - : public Cb -{ -public: - static const bool DO_HIDE_POINT = true; - typedef typename Cb::Vertex_handle Vertex_handle; - typedef typename Cb::Cell_handle Cell_handle; - - typedef GT Geom_traits; - typedef typename Geom_traits::Weighted_point_3 Point; - - typedef C Point_container; - typedef typename Point_container::iterator Point_iterator; - typedef typename Point_container::const_iterator Point_const_iterator; - - template < typename TDS2 > - struct Rebind_TDS { - typedef typename Cb::template Rebind_TDS::Other Cb2; - typedef Regular_triangulation_cell_base_3 Other; - }; - - Regular_triangulation_cell_base_3() - : Cb() {} - - Regular_triangulation_cell_base_3(Vertex_handle v0, - Vertex_handle v1, - Vertex_handle v2, - Vertex_handle v3) - : Cb(v0, v1, v2, v3) {} - - Regular_triangulation_cell_base_3(Vertex_handle v0, - Vertex_handle v1, - Vertex_handle v2, - Vertex_handle v3, - Cell_handle n0, - Cell_handle n1, - Cell_handle n2, - Cell_handle n3) - : Cb(v0, v1, v2, v3, n0, n1, n2, n3) {} - - Point_iterator hidden_points_begin() { return _hidden.begin(); } - Point_iterator hidden_points_end() { return _hidden.end(); } - - Point_const_iterator hidden_points_begin() const { return _hidden.begin(); } - Point_const_iterator hidden_points_end() const { return _hidden.end(); } - - void hide_point (const Point &p) { _hidden.push_back(p); } - // void unhide_point (Point_iterator i) { _hidden.delete(i); } - -private: - Point_container _hidden; -}; - -} //namespace CGAL - -#endif // CGAL_REGULAR_TRIANGULATION_CELL_BASE_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/Regular_triangulation_euclidean_traits_3.h b/Triangulation_3_copy_tds/include/CGAL/Regular_triangulation_euclidean_traits_3.h deleted file mode 100644 index 0c31dd52680..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/Regular_triangulation_euclidean_traits_3.h +++ /dev/null @@ -1,774 +0,0 @@ -// Copyright (c) 1999,2004 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// Author(s) : Sylvain Pion -// Monique Teillaud -// Mariette Yvinec - -#ifndef CGAL_REGULAR_TRIANGULATION_EUCLIDEAN_TRAITS_3_H -#define CGAL_REGULAR_TRIANGULATION_EUCLIDEAN_TRAITS_3_H - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -namespace CGAL { - -// returns minus the sign of the determinant of the lifted points -// associated with p,q,r,s,t [P,Q,R,S,T] -// where the P colum is [ p, p^2-wp,1] -template < typename K > -class Power_test_3 -{ -public: - typedef typename K::Weighted_point_3 Weighted_point_3; - typedef typename K::Oriented_side Oriented_side; - - typedef Oriented_side result_type; - - Oriented_side operator() ( const Weighted_point_3 & p, - const Weighted_point_3 & q, - const Weighted_point_3 & r, - const Weighted_point_3 & s, - const Weighted_point_3 & t) const - { - return power_test_3(p,q,r,s,t); - } - - Oriented_side operator() ( const Weighted_point_3 & p, - const Weighted_point_3 & q, - const Weighted_point_3 & r, - const Weighted_point_3 & s) const - { - return power_test_3(p,q,r,s); - } - - Oriented_side operator() ( const Weighted_point_3 & p, - const Weighted_point_3 & q, - const Weighted_point_3 & r) const - { - return power_test_3(p,q,r); - } - - Oriented_side operator() ( const Weighted_point_3 & p, - const Weighted_point_3 & q) const - { - return power_test_3(p,q); - } -}; - - -template < typename K > -class Compare_power_distance_3 -{ -public: - typedef typename K::Weighted_point_3 Weighted_point_3; - typedef typename K::Bare_point Point_3; - typedef typename K::Comparison_result Comparison_result; - - typedef Comparison_result result_type; - - Comparison_result operator() ( const Point_3 & p, - const Weighted_point_3 & q, - const Weighted_point_3 & r) const - { - return compare_power_distance_3(p,q,r); - } -}; - - -// operator () -// return the sign of the power test of last weighted point -// with respect to the smallest sphere orthogonal to the others -template< typename K > -class In_smallest_orthogonal_sphere_3 -{ -public: - typedef typename K::Weighted_point_3 Weighted_point_3; - typedef typename K::Sign Sign; - - typedef Sign result_type; - - Sign operator() ( const Weighted_point_3 & p, - const Weighted_point_3 & q, - const Weighted_point_3 & r, - const Weighted_point_3 & s, - const Weighted_point_3 & t) const - { - K traits; - typename K::Orientation_3 orientation = traits.orientation_3_object(); - typename K::Orientation o = orientation(p,q,r,s); - typename K::Oriented_side os = power_test_3(p,q,r,s,t); - CGAL_triangulation_assertion( o != COPLANAR); - // the minus sign below is due to the fact that power_test_3 - // return in fact minus the 5x5 determinant of lifted (p,q,r,s.t) - return - o * os; - } - - Sign operator() ( const Weighted_point_3 & p, - const Weighted_point_3 & q, - const Weighted_point_3 & r, - const Weighted_point_3 & s) const - { - return in_smallest_orthogonal_sphereC3( - p.x(), p.y(), p.z(), p.weight(), - q.x(), q.y(), q.z(), q.weight(), - r.x(), r.y(), r.z(), r.weight(), - s.x(), s.y(), s.z(), s.weight()); - } - - Sign operator() ( const Weighted_point_3 & p, - const Weighted_point_3 & q, - const Weighted_point_3 & r) const - { - return in_smallest_orthogonal_sphereC3( - p.x(), p.y(), p.z(), p.weight(), - q.x(), q.y(), q.z(), q.weight(), - r.x(), r.y(), r.z(), r.weight()); - } - - Sign operator() ( const Weighted_point_3 & p, - const Weighted_point_3 & q) const - { - return CGAL_NTS sign( CGAL_NTS square(p.x()-q.x()) + - CGAL_NTS square(p.y()-q.y()) + - CGAL_NTS square(p.z()-q.z()) + - p.weight() - q.weight()); - } - -}; - -template < typename K > -class Side_of_bounded_orthogonal_sphere_3 -{ -public : - typedef typename K::Weighted_point_3 Weighted_point_3; - typedef typename K::In_smallest_orthogonal_sphere_3 In_sphere; - typedef typename K::Bounded_side Bounded_side; - - typedef Bounded_side result_type; - - Bounded_side operator() ( const Weighted_point_3 & p, - const Weighted_point_3 & q, - const Weighted_point_3 & r, - const Weighted_point_3 & s, - const Weighted_point_3 & t) const - { - return enum_cast( - In_sphere()(p,q,r,s,t)); - } - - Bounded_side operator() ( const Weighted_point_3 & p, - const Weighted_point_3 & q, - const Weighted_point_3 & r, - const Weighted_point_3 & s) const - { - return enum_cast( - In_sphere()(p,q,r,s) ); - } - - Bounded_side operator() ( const Weighted_point_3 & p, - const Weighted_point_3 & q, - const Weighted_point_3 & r) const - { - return enum_cast( - In_sphere()(p,q,r) ); - } - -}; - - -// operator() returns true if the affine hull of the dual -// to the given weighted points -// intersect the simplex formed by the bare points -template < typename K > -class Does_simplex_intersect_weighted_dual_support_3 -{ -public: - typedef typename K::Weighted_point_3 Weighted_point_3; - typedef typename K::Bounded_side Bounded_side; - - typedef Bounded_side result_type; - - Bounded_side operator()(const Weighted_point_3 & p, - const Weighted_point_3 & q, - const Weighted_point_3 & r, - const Weighted_point_3 & s) const - { - return does_simplex_intersect_weighted_dual_supportC3( - p.x(), p.y(), p.z(), p.weight(), - q.x(), q.y(), q.z(), q.weight(), - r.x(), r.y(), r.z(), r.weight(), - s.x(), s.y(), s.z(), s.weight()); - } - - Bounded_side operator()(const Weighted_point_3 & p, - const Weighted_point_3 & q, - const Weighted_point_3 & r) const - { - return does_simplex_intersect_weighted_dual_supportC3( - p.x(), p.y(), p.z(), p.weight(), - q.x(), q.y(), q.z(), q.weight(), - r.x(), r.y(), r.z(), r.weight()); - } - - Bounded_side operator()(const Weighted_point_3 & p, - const Weighted_point_3 & q) const - { - return does_simplex_intersect_weighted_dual_supportC3( - p.x(), p.y(), p.z(), p.weight(), - q.x(), q.y(), q.z(), q.weight()); - } -}; - -template < typename K > -class Construct_weighted_circumcenter_3 -{ -public: - typedef typename K::Weighted_point_3 Weighted_point_3; - typedef typename K::Bare_point Bare_point; - typedef typename K::FT FT; - - typedef Bare_point result_type; - - Bare_point operator() ( const Weighted_point_3 & p, - const Weighted_point_3 & q, - const Weighted_point_3 & r, - const Weighted_point_3 & s) const - { - FT x, y, z; - weighted_circumcenterC3(p.x(), p.y(), p.z(), p.weight(), - q.x(), q.y(), q.z(), q.weight(), - r.x(), r.y(), r.z(), r.weight(), - s.x(), s.y(), s.z(), s.weight(), - x,y,z); - return Bare_point(x,y,z); - } - - Bare_point operator() ( const Weighted_point_3 & p, - const Weighted_point_3 & q, - const Weighted_point_3 & r) const - { - FT x, y, z; - weighted_circumcenterC3(p.x(), p.y(), p.z(), p.weight(), - q.x(), q.y(), q.z(), q.weight(), - r.x(), r.y(), r.z(), r.weight(), - x,y,z); - return Bare_point(x,y,z); - } - - Bare_point operator() ( const Weighted_point_3 & p, - const Weighted_point_3 & q) const - { - FT x, y, z; - weighted_circumcenterC3(p.x(), p.y(), p.z(), p.weight(), - q.x(), q.y(), q.z(), q.weight(), - x,y,z); - return Bare_point(x,y,z); - } -}; - - -template < typename K > -class Compute_power_product_3 -{ -public: - typedef typename K::Weighted_point_3 Weighted_point_3; - typedef typename K::FT FT; - - typedef FT result_type; - - FT operator() (const Weighted_point_3 & p, - const Weighted_point_3 & q) const - { - return power_productC3(p.x(), p.y(), p.z(), p.weight(), - q.x(), q.y(), q.z(), q.weight()); - } -}; - - -template < typename K > -class Compute_squared_radius_smallest_orthogonal_sphere_3 -{ -public: - typedef typename K::Weighted_point_3 Weighted_point_3; - typedef typename K::FT FT; - - typedef FT result_type; - - FT operator() ( const Weighted_point_3 & p, - const Weighted_point_3 & q, - const Weighted_point_3 & r, - const Weighted_point_3 & s) const - { - return squared_radius_orthogonal_sphereC3( - p.x(), p.y(), p.z(), p.weight(), - q.x(), q.y(), q.z(), q.weight(), - r.x(), r.y(), r.z(), r.weight(), - s.x(), s.y(), s.z(), s.weight()); - } - - FT operator() ( const Weighted_point_3 & p, - const Weighted_point_3 & q, - const Weighted_point_3 & r) const - { - return squared_radius_smallest_orthogonal_sphereC3( - p.x(), p.y(), p.z(), p.weight(), - q.x(), q.y(), q.z(), q.weight(), - r.x(), r.y(), r.z(), r.weight()); - } - - FT operator() (const Weighted_point_3 & p, - const Weighted_point_3 & q) const - { - return squared_radius_smallest_orthogonal_sphereC3( - p.x(), p.y(), p.z(), p.weight(), - q.x(), q.y(), q.z(), q.weight()); - } - - FT operator() (const Weighted_point_3 & p) const - { - return -p.weight(); - } - -}; - - -// Compute the square radius of the circle centered in t -// and orthogonal to the circle orthogonal to p,q,r,s -template< typename K> -class Compute_critical_squared_radius_3 -{ - public: - typedef typename K::Weighted_point_3 Weighted_point_3; - typedef typename K::FT FT; - - typedef FT result_type; - - result_type operator() (const Weighted_point_3 & p, - const Weighted_point_3 & q, - const Weighted_point_3 & r, - const Weighted_point_3 & s, - const Weighted_point_3 & t) const - { - return critical_squared_radiusC3 (p.x(),p.y(),p.z(),FT(p.weight()), - q.x(),q.y(),q.z(),FT(q.weight()), - r.x(),r.y(),r.z(),FT(r.weight()), - s.x(),s.y(),s.z(),FT(s.weight()), - t.x(),t.y(),t.z(),FT(t.weight())); - } -}; - - - -template -class Compare_weighted_squared_radius_3 -{ - - typedef typename K::Weighted_point_3 Weighted_point_3; - typedef typename K::Comparison_result Comparison_result; - typedef typename K::FT FT; - -public: - typedef Comparison_result result_type; - - - result_type operator() ( - const Weighted_point_3 & p, - const Weighted_point_3 & q, - const Weighted_point_3 & r, - const Weighted_point_3 & s, - const FT& w) const - { - return compare( - squared_radius_orthogonal_sphereC3( - p.x(),p.y(),p.z(),p.weight(), - q.x(),q.y(),q.z(),q.weight(), - r.x(),r.y(),r.z(),r.weight(), - s.x(),s.y(),s.z(),s.weight() ), - w); - } - - result_type operator() ( - const Weighted_point_3 & p, - const Weighted_point_3 & q, - const Weighted_point_3 & r, - const FT& w) const - { - return compare( - squared_radius_smallest_orthogonal_sphereC3( - p.x(),p.y(),p.z(),p.weight(), - q.x(),q.y(),q.z(),q.weight(), - r.x(),r.y(),r.z(),r.weight() ), - w); - } - - result_type operator() ( - const Weighted_point_3 & p, - const Weighted_point_3 & q, - const FT& w) const - { - return compare( - squared_radius_smallest_orthogonal_sphereC3( - p.x(),p.y(),p.z(),p.weight(), - q.x(),q.y(),q.z(),q.weight() ), - w); - } - - result_type operator() ( - const Weighted_point_3 & p, - const FT& w) const - { - return compare(-p.weight(),w); - } -}; - - - - -template < class K, class Weight = typename K::RT > -class Regular_triangulation_euclidean_traits_base_3 - : public K -{ -public: - typedef K Kernel; - typedef typename K::FT FT; - typedef typename K::Point_3 Bare_point; - typedef CGAL::Weighted_point Weighted_point; - typedef Weighted_point Weighted_point_3; - typedef Weighted_point Point_3; - //typedef typename K::Point_3 Point_3; - - typedef Regular_triangulation_euclidean_traits_base_3 Self; - - // The next typedef is there for backward compatibility - // Some users take their point type from the traits class. - // Before this type was Point - typedef Point_3 Point; - - typedef CGAL::Power_test_3 Power_test_3; - typedef CGAL::Compare_power_distance_3 Compare_power_distance_3; - typedef CGAL::In_smallest_orthogonal_sphere_3 - In_smallest_orthogonal_sphere_3; - typedef CGAL::Side_of_bounded_orthogonal_sphere_3 - Side_of_bounded_orthogonal_sphere_3; - typedef CGAL::Does_simplex_intersect_weighted_dual_support_3 - Does_simplex_intersect_dual_support_3; - typedef CGAL::Construct_weighted_circumcenter_3 - Construct_weighted_circumcenter_3; - typedef CGAL::Compute_squared_radius_smallest_orthogonal_sphere_3 - Compute_squared_radius_smallest_orthogonal_sphere_3; - typedef CGAL::Compute_power_product_3 Compute_power_product_3; - typedef CGAL::Compute_critical_squared_radius_3 - Compute_critical_squared_radius_3; - typedef CGAL::Compare_weighted_squared_radius_3 - Compare_weighted_squared_radius_3; - - enum { Has_filtered_predicates = false }; - - Power_test_3 power_test_3_object() const - { return Power_test_3(); } - - Compare_power_distance_3 compare_power_distance_3_object() const - { return Compare_power_distance_3(); } - - In_smallest_orthogonal_sphere_3 - in_smallest_orthogonal_sphere_3_object() const - { return In_smallest_orthogonal_sphere_3(); } - - Side_of_bounded_orthogonal_sphere_3 - side_of_bounded_orthogonal_sphere_3_object() const - { return Side_of_bounded_orthogonal_sphere_3(); } - - Does_simplex_intersect_dual_support_3 - does_simplex_intersect_dual_support_3_object() const - { return Does_simplex_intersect_dual_support_3(); } - - Construct_weighted_circumcenter_3 - construct_weighted_circumcenter_3_object() const - { return Construct_weighted_circumcenter_3(); } - - Compute_power_product_3 - compute_power_product_3_object() const - { return Compute_power_product_3(); } - - Compute_squared_radius_smallest_orthogonal_sphere_3 - compute_squared_radius_smallest_orthogonal_sphere_3_object() const - { return Compute_squared_radius_smallest_orthogonal_sphere_3(); } - - Compute_critical_squared_radius_3 - compute_critical_squared_radius_3_object() const - {return Compute_critical_squared_radius_3(); } - - Compare_weighted_squared_radius_3 - compare_weighted_squared_radius_3_object() const - {return Compare_weighted_squared_radius_3(); } -}; - -// We need to introduce a "traits_base_3" class in order to get the -// specialization for Exact_predicates_inexact_constructions_kernel to work, -// otherwise there is a cycle in the derivation. -template < typename K, class Weight = typename K::RT, bool UseFilteredPredicates = K::Has_filtered_predicates> -class Regular_triangulation_euclidean_traits_3 - : public Regular_triangulation_euclidean_traits_base_3 -{}; - -// Cartesian versions. -template < class Point, class Weight > -inline -typename Kernel_traits::Kernel::Oriented_side -power_test_3(const Weighted_point &p, - const Weighted_point &q, - const Weighted_point &r, - const Weighted_point &s, - const Weighted_point &t, - Cartesian_tag) -{ - typedef typename Kernel_traits::Kernel::FT FT; - return power_testC3(p.x(), p.y(), p.z(), FT(p.weight()), - q.x(), q.y(), q.z(), FT(q.weight()), - r.x(), r.y(), r.z(), FT(r.weight()), - s.x(), s.y(), s.z(), FT(s.weight()), - t.x(), t.y(), t.z(), FT(t.weight())); -} - -template < class Point, class Weight > -inline -typename Kernel_traits::Kernel::Oriented_side -power_test_3(const Weighted_point &p, - const Weighted_point &q, - const Weighted_point &r, - const Weighted_point &t, - Cartesian_tag) -{ - typedef typename Kernel_traits::Kernel::FT FT; - return power_testC3(p.x(), p.y(), p.z(), FT(p.weight()), - q.x(), q.y(), q.z(), FT(q.weight()), - r.x(), r.y(), r.z(), FT(r.weight()), - t.x(), t.y(), t.z(), FT(t.weight())); -} - -template < class Point, class Weight > -inline -typename Kernel_traits::Kernel::Oriented_side -power_test_3(const Weighted_point &p, - const Weighted_point &q, - const Weighted_point &t, - Cartesian_tag) -{ - typedef typename Kernel_traits::Kernel::FT FT; - return power_testC3(p.x(), p.y(), p.z(), FT(p.weight()), - q.x(), q.y(), q.z(), FT(q.weight()), - t.x(), t.y(), t.z(), FT(t.weight())); -} - -template < class Point, class Weight > -inline -typename Kernel_traits::Kernel::Oriented_side -power_test_3(const Weighted_point &p, - const Weighted_point &q, - Cartesian_tag) -{ - typedef typename Kernel_traits::Kernel::FT FT; - return power_testC3(FT(p.weight()), - FT(q.weight())); -} - - -template < class Point, class Weight > -inline -typename Kernel_traits::Kernel::Comparison_result -compare_power_distance_3 (const Point &p, - const Weighted_point &q, - const Weighted_point &r, - Cartesian_tag) -{ - typedef typename Kernel_traits::Kernel::FT FT; - return compare_power_distanceC3(p.x(), p.y(), p.z(), - q.x(), q.y(), q.z(), FT(q.weight()), - r.x(), r.y(), r.z(), FT(r.weight())); -} - - - -// Homogeneous versions. -template < class Point, class Weight > -inline -typename Kernel_traits::Kernel::Oriented_side -power_test_3(const Weighted_point &p, - const Weighted_point &q, - const Weighted_point &r, - const Weighted_point &s, - const Weighted_point &t, - Homogeneous_tag) -{ - typedef typename Kernel_traits::Kernel::RT RT; - return power_testH3(p.hx(), p.hy(), p.hz(), p.hw(), RT(p.weight()), - q.hx(), q.hy(), q.hz(), q.hw(), RT(q.weight()), - r.hx(), r.hy(), r.hz(), r.hw(), RT(r.weight()), - s.hx(), s.hy(), s.hz(), s.hw(), RT(s.weight()), - t.hx(), t.hy(), t.hz(), t.hw(), RT(t.weight())); -} - -// The followings call the cartesian version over FT, because an homogeneous -// special version would be boring to write. - -template < class Point, class Weight > -inline -typename Kernel_traits::Kernel::Oriented_side -power_test_3(const Weighted_point &p, - const Weighted_point &q, - const Weighted_point &r, - const Weighted_point &t, - Homogeneous_tag) -{ - typedef typename Kernel_traits::Kernel::FT FT; - return power_testC3(p.x(), p.y(), p.z(), FT(p.weight()), - q.x(), q.y(), q.z(), FT(q.weight()), - r.x(), r.y(), r.z(), FT(r.weight()), - t.x(), t.y(), t.z(), FT(t.weight())); -} - -template < class Point, class Weight > -inline -typename Kernel_traits::Kernel::Oriented_side -power_test_3(const Weighted_point &p, - const Weighted_point &q, - const Weighted_point &t, - Homogeneous_tag) -{ - typedef typename Kernel_traits::Kernel::FT FT; - return power_testC3(p.x(), p.y(), p.z(), FT(p.weight()), - q.x(), q.y(), q.z(), FT(q.weight()), - t.x(), t.y(), t.z(), FT(t.weight())); -} - -template < class Point, class Weight > -inline -typename Kernel_traits::Kernel::Oriented_side -power_test_3(const Weighted_point &p, - const Weighted_point &q, - Homogeneous_tag) -{ - typedef typename Kernel_traits::Kernel::FT FT; - return power_testC3(FT(p.weight()), - FT(q.weight())); -} - -template < class Point, class Weight > -inline -typename Kernel_traits::Kernel::Comparison_result -compare_power_distance_3 (const Point &p, - const Weighted_point &q, - const Weighted_point &t, - Homogeneous_tag) -{ - typedef typename Kernel_traits::Kernel::FT FT; - return compare_power_distanceC3(p.x(), p.y(), p.z(), FT(p.weight()), - q.x(), q.y(), q.z(), FT(q.weight()), - t.x(), t.y(), t.z(), FT(t.weight())); -} - -// Kludges for M$. - -template < class Point, class Weight > -inline -typename Kernel_traits::Kernel::Oriented_side -power_test_3(const Weighted_point &p, - const Weighted_point &q, - const Weighted_point &r, - const Weighted_point &s, - const Weighted_point &t) -{ - typedef typename Kernel_traits::Kernel::Rep_tag Tag; - return power_test_3(p,q,r,s,t, Tag()); -} - -template < class Point, class Weight > -inline -typename Kernel_traits::Kernel::Oriented_side -power_test_3(const Weighted_point &p, - const Weighted_point &q, - const Weighted_point &r, - const Weighted_point &t) -{ - typedef typename Kernel_traits::Kernel::Rep_tag Tag; - return power_test_3(p,q,r,t, Tag()); -} - -template < class Point, class Weight > -inline -typename Kernel_traits::Kernel::Oriented_side -power_test_3(const Weighted_point &p, - const Weighted_point &q, - const Weighted_point &t) -{ - typedef typename Kernel_traits::Kernel::Rep_tag Tag; - return power_test_3(p,q,t, Tag()); -} - -template < class Point, class Weight > -inline -typename Kernel_traits::Kernel::Oriented_side -power_test_3(const Weighted_point &p, - const Weighted_point &q) -{ - typedef typename Kernel_traits::Kernel::Rep_tag Tag; - return power_test_3(p,q, Tag()); -} - -template < class Point, class Weight > -inline -typename Kernel_traits::Kernel::Comparison_result -compare_power_distance_3 (const Point &p, - const Weighted_point &q, - const Weighted_point &r) -{ - typedef typename Kernel_traits::Kernel::Rep_tag Tag; - return compare_power_distance_3(p,q,r, Tag()); -} - -} //namespace CGAL - -// Partial specialization for Filtered_kernel. - -#include -#include - -namespace CGAL { - -namespace internal{ - // This declaration is needed to break the cyclic dependency. - template < typename K,bool b > - class Regular_triangulation_filtered_traits_3; -} //namespace internal - -template < typename K, class Weight> -class Regular_triangulation_euclidean_traits_3 - : public internal::Regular_triangulation_filtered_traits_3 -{ -public: - typedef K Kernel; -}; - - -} //namespace CGAL - -#endif // CGAL_REGULAR_TRIANGULATION_EUCLIDEAN_TRAITS_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/Regular_triangulation_filtered_traits_3.h b/Triangulation_3_copy_tds/include/CGAL/Regular_triangulation_filtered_traits_3.h deleted file mode 100644 index 17163831751..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/Regular_triangulation_filtered_traits_3.h +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) 2004 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// Author(s) : Sylvain Pion - -#ifndef CGAL_REGULAR_TRIANGULATION_FILTERED_TRAITS_3_H -#define CGAL_REGULAR_TRIANGULATION_FILTERED_TRAITS_3_H - -#ifndef CGAL_NO_DEPRECATED_CODE - -#include - - -namespace CGAL{ - - -// The argument is supposed to be a Filtered_kernel like kernel. -template < typename K> -class Regular_triangulation_filtered_traits_3 - : public Regular_triangulation_euclidean_traits_3 -{}; - - - -} //namespace CGAL::internal - -#endif //CGAL_NO_DEPRECATED_CODE - -#endif // CGAL_REGULAR_TRIANGULATION_FILTERED_TRAITS_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/Triangulation_3.h b/Triangulation_3_copy_tds/include/CGAL/Triangulation_3.h deleted file mode 100644 index 9a7f67521f6..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/Triangulation_3.h +++ /dev/null @@ -1,5590 +0,0 @@ -// Copyright (c) 1999-2003 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// Author(s) : Monique Teillaud -// Sylvain Pion - -#ifndef CGAL_TRIANGULATION_3_H -#define CGAL_TRIANGULATION_3_H - -#include - -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#ifndef CGAL_NO_STRUCTURAL_FILTERING -#include -#include -#endif // no CGAL_NO_STRUCTURAL_FILTERING - -namespace CGAL { - -template < class GT, class Tds = Default > class Triangulation_3; - -template < class GT, class Tds > std::istream& operator>> -(std::istream& is, Triangulation_3 &tr); - -#ifndef CGAL_NO_STRUCTURAL_FILTERING -namespace internal { -// structural filtering is performed only for EPIC -struct Structural_filtering_3_tag {}; -struct No_structural_filtering_3_tag {}; - -template -struct Structural_filtering_selector_3 { - typedef No_structural_filtering_3_tag Tag; -}; - -template <> -struct Structural_filtering_selector_3 { - typedef Structural_filtering_3_tag Tag; -}; -} -#endif // no CGAL_NO_STRUCTURAL_FILTERING - -template < class GT, class Tds_ > -class Triangulation_3 - : public Triangulation_utils_3 -{ - friend std::istream& operator>> <> - (std::istream& is, Triangulation_3 &tr); - - typedef Triangulation_3 Self; - - typedef typename Default::Get, - Triangulation_cell_base_3 > >::type Tds; - -public: - - typedef Tds Triangulation_data_structure; - typedef GT Geom_traits; - - typedef typename GT::Point_3 Point; - typedef typename GT::Segment_3 Segment; - typedef typename GT::Triangle_3 Triangle; - typedef typename GT::Tetrahedron_3 Tetrahedron; - - typedef typename Tds::Vertex Vertex; - typedef typename Tds::Cell Cell; - typedef typename Tds::Facet Facet; - typedef typename Tds::Edge Edge; - - typedef typename Tds::size_type size_type; - typedef typename Tds::difference_type difference_type; - - typedef typename Tds::Vertex_handle Vertex_handle; - typedef typename Tds::Cell_handle Cell_handle; - - typedef typename Tds::Cell_circulator Cell_circulator; - typedef typename Tds::Facet_circulator Facet_circulator; - - // Not documented, see TDS. - typedef typename Tds::Face_circulator Face_circulator; - - typedef typename Tds::Cell_iterator Cell_iterator; - typedef typename Tds::Facet_iterator Facet_iterator; - typedef typename Tds::Edge_iterator Edge_iterator; - typedef typename Tds::Vertex_iterator Vertex_iterator; - - typedef Cell_iterator All_cells_iterator; - typedef Facet_iterator All_facets_iterator; - typedef Edge_iterator All_edges_iterator; - typedef Vertex_iterator All_vertices_iterator; - - typedef typename Tds::Simplex Simplex; -private: - // This class is used to generate the Finite_*_iterators. - class Infinite_tester - { - const Self *t; - - public: - - Infinite_tester() {} - - Infinite_tester(const Self *tr) - : t(tr) {} - - bool operator()(const Vertex_iterator & v) const - { - return t->is_infinite(v); - } - - bool operator()(const Cell_iterator & c) const - { - return t->is_infinite(c); - } - - bool operator()(const Edge_iterator & e) const - { - return t->is_infinite(*e); - } - - bool operator()(const Facet_iterator & f) const - { - return t->is_infinite(*f); - } - }; - -public: - - // We derive in order to add a conversion to handle. - class Finite_cells_iterator - : public Filter_iterator { - typedef Filter_iterator Base; - typedef Finite_cells_iterator Self; - public: - - Finite_cells_iterator() : Base() {} - Finite_cells_iterator(const Base &b) : Base(b) {} - - Self & operator++() { Base::operator++(); return *this; } - Self & operator--() { Base::operator--(); return *this; } - Self operator++(int) { Self tmp(*this); ++(*this); return tmp; } - Self operator--(int) { Self tmp(*this); --(*this); return tmp; } - - operator Cell_handle() const { return Base::base(); } - }; - - // We derive in order to add a conversion to handle. - class Finite_vertices_iterator - : public Filter_iterator { - typedef Filter_iterator Base; - typedef Finite_vertices_iterator Self; - public: - - Finite_vertices_iterator() : Base() {} - Finite_vertices_iterator(const Base &b) : Base(b) {} - - Self & operator++() { Base::operator++(); return *this; } - Self & operator--() { Base::operator--(); return *this; } - Self operator++(int) { Self tmp(*this); ++(*this); return tmp; } - Self operator--(int) { Self tmp(*this); --(*this); return tmp; } - - operator Vertex_handle() const { return Base::base(); } - }; - - typedef Filter_iterator - Finite_edges_iterator; - typedef Filter_iterator - Finite_facets_iterator; - -private: - // Auxiliary iterators for convenience - // do not use default template argument to please VC++ - typedef Project_point Proj_point; -public: - typedef Iterator_project Point_iterator; - - typedef Point value_type; // to have a back_inserter - typedef const value_type& const_reference; - - //Tag to distinguish triangulations with weighted_points - typedef Tag_false Weighted_tag; - - - - enum Locate_type { - VERTEX=0, - EDGE, //1 - FACET, //2 - CELL, //3 - OUTSIDE_CONVEX_HULL, //4 - OUTSIDE_AFFINE_HULL };//5 - -protected: - Tds _tds; - GT _gt; - Vertex_handle infinite; //infinite vertex - - Comparison_result - compare_xyz(const Point &p, const Point &q) const - { - return geom_traits().compare_xyz_3_object()(p, q); - } - - bool - equal(const Point &p, const Point &q) const - { - return compare_xyz(p, q) == EQUAL; - } - - Orientation - orientation(const Point &p, const Point &q, - const Point &r, const Point &s) const - { - return geom_traits().orientation_3_object()(p, q, r, s); - } - - bool - coplanar(const Point &p, const Point &q, - const Point &r, const Point &s) const - { - return orientation(p, q, r, s) == COPLANAR; - } - - Orientation - coplanar_orientation(const Point &p, const Point &q, const Point &r) const - { - return geom_traits().coplanar_orientation_3_object()(p, q, r); - } - - bool - collinear(const Point &p, const Point &q, const Point &r) const - { - return coplanar_orientation(p, q, r) == COLLINEAR; - } - - Segment - construct_segment(const Point &p, const Point &q) const - { - return geom_traits().construct_segment_3_object()(p, q); - } - - Triangle - construct_triangle(const Point &p, const Point &q, const Point &r) const - { - return geom_traits().construct_triangle_3_object()(p, q, r); - } - - Tetrahedron - construct_tetrahedron(const Point &p, const Point &q, - const Point &r, const Point &s) const - { - return geom_traits().construct_tetrahedron_3_object()(p, q, r, s); - } - - enum COLLINEAR_POSITION {BEFORE, SOURCE, MIDDLE, TARGET, AFTER}; - - COLLINEAR_POSITION - collinear_position(const Point &s, const Point &p, const Point &t) const - // (s,t) defines a line, p is on that line. - // Depending on the position of p wrt s and t, returns : - // --------------- s ---------------- t -------------- - // BEFORE SOURCE MIDDLE TARGET AFTER - { - CGAL_triangulation_precondition(!equal(s, t)); - CGAL_triangulation_precondition(collinear(s, p, t)); - - Comparison_result ps = compare_xyz(p, s); - if (ps == EQUAL) - return SOURCE; - Comparison_result st = compare_xyz(s, t); - if (ps == st) - return BEFORE; - Comparison_result pt = compare_xyz(p, t); - if (pt == EQUAL) - return TARGET; - if (pt == st) - return MIDDLE; - return AFTER; - } - - void init_tds() - { - infinite = _tds.insert_increase_dimension(); - } - -public: - - // CONSTRUCTORS - Triangulation_3(const GT & gt = GT()) - : _tds(), _gt(gt) - { - init_tds(); - } - - // copy constructor duplicates vertices and cells - Triangulation_3(const Triangulation_3 & tr) - : _gt(tr._gt) - { - infinite = _tds.copy_tds(tr._tds, tr.infinite); - CGAL_triangulation_expensive_postcondition(*this == tr); - } - - template < typename InputIterator > - Triangulation_3(InputIterator first, InputIterator last, - const GT & gt = GT()) - : _gt(gt) - { - init_tds(); - insert(first, last); - } - - void clear() - { - _tds.clear(); - init_tds(); - } - - Triangulation_3 & operator=(Triangulation_3 tr) - { - // The triangulation passed as argument has been copied, - // because the parameter tr is passed by value. Then the following - // swap consumes the *copy*. The original triangulation is left - // untouched. - swap(tr); - return *this; - } - - // HELPING FUNCTIONS - - void swap(Triangulation_3 &tr) - { - std::swap(tr._gt, _gt); - std::swap(tr.infinite, infinite); - _tds.swap(tr._tds); - } - - //ACCESS FUNCTIONS - const GT & geom_traits() const - { return _gt;} - - const Tds & tds() const - { return _tds;} - - Tds & tds() - { return _tds;} - - int dimension() const - { return _tds.dimension();} - - size_type number_of_finite_cells() const; - - size_type number_of_cells() const; - - size_type number_of_finite_facets() const; - - size_type number_of_facets() const; - - size_type number_of_finite_edges() const; - - size_type number_of_edges() const; - - size_type number_of_vertices() const // number of finite vertices - {return _tds.number_of_vertices()-1;} - - Vertex_handle infinite_vertex() const - { return infinite; } - - Cell_handle infinite_cell() const - { - CGAL_triangulation_assertion(infinite_vertex()->cell()-> - has_vertex(infinite_vertex())); - return infinite_vertex()->cell(); - } - - // GEOMETRIC ACCESS FUNCTIONS - - Tetrahedron tetrahedron(const Cell_handle c) const - { - CGAL_triangulation_precondition( dimension() == 3 ); - CGAL_triangulation_precondition( ! is_infinite(c) ); - return construct_tetrahedron(c->vertex(0)->point(), - c->vertex(1)->point(), - c->vertex(2)->point(), - c->vertex(3)->point()); - } - - Triangle triangle(const Cell_handle c, int i) const; - - Triangle triangle(const Facet & f) const - { return triangle(f.first, f.second); } - - Segment segment(const Cell_handle c, int i, int j) const; - - Segment segment(const Edge & e) const - { return segment(e.first,e.second,e.third); } - - const Point & point(Cell_handle c, int i) const { - CGAL_triangulation_precondition( dimension() >= 0 ); - CGAL_triangulation_precondition( i >= 0 && i <= dimension() ); - CGAL_triangulation_precondition( ! is_infinite(c->vertex(i)) ); - return c->vertex(i)->point(); - } - - const Point & point(Vertex_handle v) const { - CGAL_triangulation_precondition( dimension() >= 0 ); - CGAL_triangulation_precondition( ! is_infinite(v) ); - return v->point(); - } - - // TEST IF INFINITE FEATURES - bool is_infinite(const Vertex_handle v) const - { return v == infinite_vertex(); } - - bool is_infinite(const Cell_handle c) const - { - CGAL_triangulation_precondition( dimension() == 3 ); - return c->has_vertex(infinite_vertex()); - } - - bool is_infinite(const Cell_handle c, int i) const; - - bool is_infinite(const Facet & f) const - { return is_infinite(f.first,f.second); } - - bool is_infinite(const Cell_handle c, int i, int j) const; - - bool is_infinite(const Edge & e) const - { return is_infinite(e.first,e.second,e.third); } - - - //QUERIES - - bool is_vertex(const Point & p, Vertex_handle & v) const; - - bool is_vertex(Vertex_handle v) const; - bool is_edge(Vertex_handle u, Vertex_handle v, - Cell_handle & c, int & i, int & j) const; - bool is_facet(Vertex_handle u, Vertex_handle v, Vertex_handle w, - Cell_handle & c, int & i, int & j, int & k) const; - bool is_cell(Cell_handle c) const; - bool is_cell(Vertex_handle u, Vertex_handle v, - Vertex_handle w, Vertex_handle t, - Cell_handle & c, int & i, int & j, int & k, int & l) const; - bool is_cell(Vertex_handle u, Vertex_handle v, - Vertex_handle w, Vertex_handle t, - Cell_handle & c) const; - - bool has_vertex(const Facet & f, Vertex_handle v, int & j) const; - bool has_vertex(Cell_handle c, int i, Vertex_handle v, int & j) const; - bool has_vertex(const Facet & f, Vertex_handle v) const; - bool has_vertex(Cell_handle c, int i, Vertex_handle v) const; - - bool are_equal(Cell_handle c, int i, Cell_handle n, int j) const; - bool are_equal(const Facet & f, const Facet & g) const; - bool are_equal(const Facet & f, Cell_handle n, int j) const; - -#ifdef CGAL_NO_STRUCTURAL_FILTERING - Cell_handle - locate(const Point & p, - Locate_type & lt, int & li, int & lj, - Cell_handle start = Cell_handle()) const; -#else // no CGAL_NO_STRUCTURAL_FILTERING -# ifndef CGAL_T3_STRUCTURAL_FILTERING_MAX_VISITED_CELLS -# define CGAL_T3_STRUCTURAL_FILTERING_MAX_VISITED_CELLS 2500 -# endif // no CGAL_T3_STRUCTURAL_FILTERING_MAX_VISITED_CELLS - - -protected: - Cell_handle - inexact_locate(const Point& p, - Cell_handle start, - int max_num_cells = CGAL_T3_STRUCTURAL_FILTERING_MAX_VISITED_CELLS) const; - - Cell_handle - exact_locate(const Point& p, - Locate_type& lt, - int& li, int & lj, - Cell_handle start) const; - - Cell_handle - generic_locate(const Point& p, - Locate_type& lt, - int& li, int & lj, - Cell_handle start, - internal::Structural_filtering_3_tag) const { - return exact_locate(p, lt, li, lj, inexact_locate(p, start)); - } - - Cell_handle - generic_locate(const Point& p, - Locate_type& lt, - int& li, int & lj, - Cell_handle start, - internal::No_structural_filtering_3_tag) const { - return exact_locate(p, lt, li, lj, start); - } - - Orientation - inexact_orientation(const Point &p, const Point &q, - const Point &r, const Point &s) const - { - const double px = to_double(p.x()); - const double py = to_double(p.y()); - const double pz = to_double(p.z()); - const double qx = to_double(q.x()); - const double qy = to_double(q.y()); - const double qz = to_double(q.z()); - const double rx = to_double(r.x()); - const double ry = to_double(r.y()); - const double rz = to_double(r.z()); - const double sx = to_double(s.x()); - const double sy = to_double(s.y()); - const double sz = to_double(s.z()); - - const double pqx = qx - px; - const double pqy = qy - py; - const double pqz = qz - pz; - const double prx = rx - px; - const double pry = ry - py; - const double prz = rz - pz; - const double psx = sx - px; - const double psy = sy - py; - const double psz = sz - pz; - - const double det = determinant(pqx, pqy, pqz, - prx, pry, prz, - psx, psy, psz); - if (det > 0) return POSITIVE; - if (det < 0) return NEGATIVE; - return ZERO; - } - -public: - - Cell_handle - locate(const Point & p, - Locate_type & lt, int & li, int & lj, - Cell_handle start = Cell_handle()) const - { - typedef Triangulation_structural_filtering_traits TSFT; - typedef typename internal::Structural_filtering_selector_3< - TSFT::Use_structural_filtering_tag::value >::Tag Should_filter_tag; - - return generic_locate(p, lt, li, lj, start, Should_filter_tag()); - } -#endif // no CGAL_NO_STRUCTURAL_FILTERING - - Cell_handle - locate(const Point & p, Cell_handle start = Cell_handle()) const - { - Locate_type lt; - int li, lj; - return locate( p, lt, li, lj, start); - } - - Cell_handle - locate(const Point & p, - Locate_type & lt, int & li, int & lj, Vertex_handle hint) const - { - return locate(p, lt, li, lj, hint == Vertex_handle() ? infinite_cell() : hint->cell()); - } - - Cell_handle - locate(const Point & p, Vertex_handle hint) const - { - return locate(p, hint == Vertex_handle() ? infinite_cell() : hint->cell()); - } - - // PREDICATES ON POINTS ``TEMPLATED'' by the geom traits - - Bounded_side - side_of_tetrahedron(const Point & p, - const Point & p0, - const Point & p1, - const Point & p2, - const Point & p3, - Locate_type & lt, int & i, int & j ) const; - Bounded_side - side_of_cell(const Point & p, - Cell_handle c, - Locate_type & lt, int & i, int & j) const; - Bounded_side - side_of_triangle(const Point & p, - const Point & p0, const Point & p1, const Point & p2, - Locate_type & lt, int & i, int & j ) const; - Bounded_side - side_of_facet(const Point & p, - Cell_handle c, - Locate_type & lt, int & li, int & lj) const; - Bounded_side - side_of_facet(const Point & p, - const Facet & f, - Locate_type & lt, int & li, int & lj) const - { - CGAL_triangulation_precondition( f.second == 3 ); - return side_of_facet(p, f.first, lt, li, lj); - } - Bounded_side - side_of_segment(const Point & p, - const Point & p0, const Point & p1, - Locate_type & lt, int & i ) const; - Bounded_side - side_of_edge(const Point & p, - Cell_handle c, - Locate_type & lt, int & li) const; - Bounded_side - side_of_edge(const Point & p, - const Edge & e, - Locate_type & lt, int & li) const - { - CGAL_triangulation_precondition( e.second == 0 ); - CGAL_triangulation_precondition( e.third == 1 ); - return side_of_edge(p, e.first, lt, li); - } - - // Functions forwarded from TDS. - int mirror_index(Cell_handle c, int i) const - { return _tds.mirror_index(c, i); } - - Vertex_handle mirror_vertex(Cell_handle c, int i) const - { return _tds.mirror_vertex(c, i); } - - Facet mirror_facet(Facet f) const - { return _tds.mirror_facet(f);} - - // MODIFIERS - bool flip(const Facet &f) - // returns false if the facet is not flippable - // true other wise and - // flips facet i of cell c - // c will be replaced by one of the new cells - { - return flip( f.first, f.second); - } - bool flip(Cell_handle c, int i); - void flip_flippable(const Facet &f) - { - flip_flippable( f.first, f.second); - } - void flip_flippable(Cell_handle c, int i); - bool flip(const Edge &e) - // returns false if the edge is not flippable - // true otherwise and - // flips edge i,j of cell c - // c will be deleted - { - return flip( e.first, e.second, e.third ); - } - bool flip(Cell_handle c, int i, int j); - void flip_flippable(const Edge &e) - { - flip_flippable( e.first, e.second, e.third ); - } - void flip_flippable(Cell_handle c, int i, int j); - - //INSERTION - - Vertex_handle insert(const Point & p, Vertex_handle hint) - { - return insert(p, hint == Vertex_handle() ? infinite_cell() : hint->cell()); - } - Vertex_handle insert(const Point & p, Cell_handle start = Cell_handle()); - Vertex_handle insert(const Point & p, Locate_type lt, Cell_handle c, - int li, int lj); - -//protected: // internal methods - - template - Vertex_handle insert_and_give_new_cells(const Point &p, - OutputItCells fit, - Cell_handle start = Cell_handle() ); - - template - Vertex_handle insert_and_give_new_cells(const Point& p, - OutputItCells fit, - Vertex_handle hint); - - template - Vertex_handle insert_and_give_new_cells(const Point& p, - Locate_type lt, - Cell_handle c, int li, int lj, - OutputItCells fit); - - template < class Conflict_tester, class Hidden_points_visitor > - inline Vertex_handle insert_in_conflict(const Point & p, - Locate_type lt, - Cell_handle c, int li, int lj, - const Conflict_tester &tester, - Hidden_points_visitor &hider); - - template < class InputIterator > - std::ptrdiff_t insert(InputIterator first, InputIterator last) - { - size_type n = number_of_vertices(); - - std::vector points (first, last); - spatial_sort (points.begin(), points.end(), geom_traits()); - - Vertex_handle hint; - for (typename std::vector::const_iterator p = points.begin(), end = points.end(); - p != end; ++p) - hint = insert(*p, hint); - - return number_of_vertices() - n; - } - - Vertex_handle - insert_in_cell(const Point & p, Cell_handle c); - - Vertex_handle - insert_in_facet(const Point & p, Cell_handle c, int i); - - Vertex_handle - insert_in_facet(const Point & p, const Facet & f) - { - return insert_in_facet(p, f.first, f.second); - } - - Vertex_handle - insert_in_edge(const Point & p, Cell_handle c, int i, int j); - - Vertex_handle - insert_in_edge(const Point & p, const Edge & e) - { - return insert_in_edge(p, e.first, e.second, e.third); - } - - Vertex_handle - insert_outside_convex_hull(const Point & p, Cell_handle c); - - Vertex_handle - insert_outside_affine_hull(const Point & p); - - template - Vertex_handle - insert_in_hole(const Point & p, CellIt cell_begin, CellIt cell_end, - Cell_handle begin, int i) - { - // Some geometric preconditions should be tested... - Vertex_handle v = _tds.insert_in_hole(cell_begin, cell_end, begin, i); - v->set_point(p); - return v; - } - - template - Vertex_handle - insert_in_hole(const Point & p, CellIt cell_begin, CellIt cell_end, - Cell_handle begin, int i, Vertex_handle newv) - { - // Some geometric preconditions should be tested... - newv->set_point(p); - return _tds.insert_in_hole(cell_begin, cell_end, begin, i, newv); - } - - // Internal function, cells should already be marked. - template - Vertex_handle - _insert_in_hole(const Point & p, CellIt cell_begin, CellIt cell_end, - Cell_handle begin, int i) - { - // Some geometric preconditions should be tested... - Vertex_handle v = _tds._insert_in_hole(cell_begin, cell_end, begin, i); - v->set_point(p); - return v; - } - - // Internal function, cells should already be marked. - template - Vertex_handle - _insert_in_hole(const Point & p, CellIt cell_begin, CellIt cell_end, - Cell_handle begin, int i, Vertex_handle newv) - { - // Some geometric preconditions should be tested... - newv->set_point(p); - return _tds._insert_in_hole(cell_begin, cell_end, begin, i, newv); - } - -protected: - - template < class InputIterator > - bool does_repeat_in_range(InputIterator first, InputIterator beyond) const; - - template < class InputIterator > - bool infinite_vertex_in_range(InputIterator first, InputIterator beyond) const; - - // - c is the current cell, which must be in conflict. - // - tester is the function object that tests if a cell is in conflict. - template < - class Conflict_test, - class OutputIteratorBoundaryFacets, - class OutputIteratorCells, - class OutputIteratorInternalFacets> - Triple - find_conflicts(Cell_handle d, const Conflict_test &tester, - Triple it) const - { - CGAL_triangulation_precondition( dimension()>=2 ); - CGAL_triangulation_precondition( tester(d) ); - - std::stack cell_stack; - cell_stack.push(d); - d->tds_data().mark_in_conflict(); - *it.second++ = d; - - do { - Cell_handle c = cell_stack.top(); - cell_stack.pop(); - - for (int i=0; ineighbor(i); - if (test->tds_data().is_in_conflict()) { - if (c < test) - *it.third++ = Facet(c, i); // Internal facet. - continue; // test was already in conflict. - } - if (test->tds_data().is_clear()) { - if (tester(test)) { - if (c < test) - *it.third++ = Facet(c, i); // Internal facet. - - cell_stack.push(test); - test->tds_data().mark_in_conflict(); - *it.second++ = test; - continue; - } - test->tds_data().mark_on_boundary(); - } - *it.first++ = Facet(c, i); - } - } while (!cell_stack.empty()); - return it; - } - - // This one takes a function object to recursively determine the cells in - // conflict, then calls _tds._insert_in_hole(). - template < class Conflict_test > - Vertex_handle - insert_conflict(Cell_handle c, const Conflict_test &tester) - { - CGAL_triangulation_precondition( dimension() >= 2 ); - CGAL_triangulation_precondition( c != Cell_handle() ); - CGAL_triangulation_precondition( tester(c) ); - - std::vector cells; - cells.reserve(32); - - Facet facet; - - // Find the cells in conflict - switch (dimension()) { - case 3: - find_conflicts(c, tester, make_triple(Oneset_iterator(facet), - std::back_inserter(cells), - Emptyset_iterator())); - break; - case 2: - find_conflicts(c, tester, make_triple(Oneset_iterator(facet), - std::back_inserter(cells), - Emptyset_iterator())); - } - // Create the new cells and delete the old. - return _tds._insert_in_hole(cells.begin(), cells.end(), - facet.first, facet.second); - } - -private: - // Here are the conflit tester function objects passed to - // insert_conflict_[23]() by insert_outside_convex_hull(). - class Conflict_tester_outside_convex_hull_3 - { - const Point &p; - const Self *t; - - public: - - Conflict_tester_outside_convex_hull_3(const Point &pt, const Self *tr) - : p(pt), t(tr) {} - - bool operator()(const Cell_handle c) const - { - Locate_type loc; - int i, j; - return t->side_of_cell( p, c, loc, i, j ) == ON_BOUNDED_SIDE; - } - }; - - class Conflict_tester_outside_convex_hull_2 - { - const Point &p; - const Self *t; - - public: - - Conflict_tester_outside_convex_hull_2(const Point &pt, const Self *tr) - : p(pt), t(tr) {} - - bool operator()(const Cell_handle c) const - { - Locate_type loc; - int i, j; - return t->side_of_facet( p, c, loc, i, j ) == ON_BOUNDED_SIDE; - } - }; - -protected: - - // no point being private, we might need to test - // whether a displacement decreases dimension on - // others inherited triangulations - bool test_dim_down(Vertex_handle v) const; - - // REMOVAL - template < class VertexRemover > - void remove(Vertex_handle v, VertexRemover &remover); - - template < class VertexRemover, class OutputItCells > - void remove_and_give_new_cells(Vertex_handle v, VertexRemover &remover, - OutputItCells fit); - - // This function removes a batch of points at once. - // If points are grouped in cluster, the performance is increased - // compared to removing one by one. - // For now, this function is only guaranteed for Delaunay triangulations (or Regular as Delaunay). - // By doing these kind of remove followed by inserting the cluster, - // we achieve fast relocations for a batch of points (in a Delaunay triangulation). - template < class InputIterator, class VertexRemover > - size_type remove(InputIterator first, InputIterator beyond, - VertexRemover &remover); - enum REMOVE_VERTEX_STATE {CLEAR, TO_REMOVE, PROCESSED, EXTREMITY}; - - // MOVE - template < class VertexRemover, class VertexInserter > - Vertex_handle move_if_no_collision(Vertex_handle v, const Point &p, - VertexRemover &remover, - VertexInserter &inserter); - - template < class VertexRemover, class VertexInserter > - Vertex_handle move(Vertex_handle v, const Point &p, - VertexRemover &remover, VertexInserter &inserter); - - // move and give new cells - template < class VertexRemover, class VertexInserter, class OutputItCells > - Vertex_handle move_if_no_collision_and_give_new_cells( - Vertex_handle v, const Point &p, VertexRemover &remover, - VertexInserter &inserter, OutputItCells fit); - - // This is a function better suited for tds - // but because it is not required in the model of tds - // at this time, it should be implemented here. - void flip_2D(Cell_handle f, int i) - { - CGAL_triangulation_precondition( dimension()==2); - Cell_handle n = f->neighbor(i); - int ni = this->_tds.mirror_index(f,i); //ni = n->index(f); - - int cwi = (i+2)%3; - int ccwi = (i+1)%3; - int cwni = (ni+2)%3; - int ccwni = (ni+1)%3; - - Vertex_handle v_cw = f->vertex(cwi); - Vertex_handle v_ccw = f->vertex(ccwi); - - // bl == bottom left, tr == top right - Cell_handle tr = f->neighbor(ccwi); - int tri = this->_tds.mirror_index(f,ccwi); - Cell_handle bl = n->neighbor(ccwni); - int bli = this->_tds.mirror_index(n,ccwni); - - f->set_vertex(cwi, n->vertex(ni)); - n->set_vertex(cwni, f->vertex(i)); - - // update the neighborhood relations - this->_tds.set_adjacency(f, i, bl, bli); - this->_tds.set_adjacency(f, ccwi, n, ccwni); - this->_tds.set_adjacency(n, ni, tr, tri); - - if(v_cw->cell() == f) { - v_cw->set_cell(n); - } - - if(v_ccw->cell() == n) { - v_ccw->set_cell(f); - } - } - - template < class VertexRemover, class VertexInserter > - void restore_edges_after_decrease_dimension(Vertex_handle v, - VertexRemover &remover, VertexInserter &inserter) - { - - Cell_handle fkstart = v->cell(); - Cell_handle start = fkstart->neighbor(fkstart->index(v)); - - std::list hole; - make_hole_2D(v, hole, remover); - fill_hole_2D(hole, remover); - // make hole here will work if the link of v is a valid triangulation - // the aim here is Delaunay triangulations - // to make it more general one could have an internal function here - // to remove v without touching its handle - - // This insert must be from Delaunay (or the particular trian.) - // not the basic Triangulation_3. - // Here we correct the recent triangulation (with decreased dimension) formed - // in particular here a 2D (from 3D to 2D displacement) - Vertex_handle inserted = inserter.insert(v->point(), start); - - // fixing pointer - Cell_handle fc = inserted->cell(), done(fc); - std::vector faces_pt; - faces_pt.reserve(16); - do { - faces_pt.push_back(fc); - fc = fc->neighbor((fc->index(inserted) + 1)%3); - } while(fc != done); - std::size_t ss = faces_pt.size(); - for(std::size_t k=0; kindex(inserted); - f->set_vertex(i, v); - } - v->set_cell(inserted->cell()); - - tds().delete_vertex(inserted); - } - -private: - typedef Facet Edge_2D; - typedef Triple Vertex_triple; - - Vertex_triple make_vertex_triple(const Facet& f) const; - void make_canonical(Vertex_triple& t) const; - - template < class VertexRemover > - VertexRemover& make_hole_2D(Vertex_handle v, std::list & hole, - VertexRemover &remover); - template < class VertexRemover > - VertexRemover& make_hole_2D(Vertex_handle v, std::list & hole, - VertexRemover &remover, - std::set &cells_set); - - template < class VertexRemover > - void fill_hole_2D(std::list & hole, VertexRemover &remover); - - void make_hole_3D( Vertex_handle v, std::map& outer_map, - std::vector & hole); - - template < class VertexRemover > - VertexRemover& remove_dim_down(Vertex_handle v, VertexRemover &remover); - template < class VertexRemover > - VertexRemover& remove_1D(Vertex_handle v, VertexRemover &remover); - template < class VertexRemover > - VertexRemover& remove_2D(Vertex_handle v, VertexRemover &remover); - template < class VertexRemover > - VertexRemover& remove_3D(Vertex_handle v, VertexRemover &remover); - - template < class VertexRemover, class OutputItCells > - VertexRemover& remove_dim_down(Vertex_handle v, VertexRemover &remover, - OutputItCells fit); - - template < class VertexRemover, class OutputItCells > - VertexRemover& remove_1D(Vertex_handle v, VertexRemover &remover, - OutputItCells fit); - - template < class VertexRemover, class OutputItCells > - VertexRemover& remove_2D(Vertex_handle v, VertexRemover &remover, - OutputItCells fit); - - template < class VertexRemover, class OutputItCells > - VertexRemover& remove_3D(Vertex_handle v, VertexRemover &remover, - OutputItCells fit); - - template < class VertexRemover, class OutputItCells > - void fill_hole_2D(std::list & hole, VertexRemover &remover, - OutputItCells fit); - - // They access "Self", so need to be friend. - friend class Conflict_tester_outside_convex_hull_3; - friend class Conflict_tester_outside_convex_hull_2; - friend class Infinite_tester; - friend class Finite_vertices_iterator; - friend class Finite_cells_iterator; - - // remove cluster - template < class InputIterator > - void _mark_vertices_to_remove(InputIterator first, InputIterator beyond, - std::map &vstates) const - { - while (first != beyond) vstates[*first++] = TO_REMOVE; - } - - bool _test_dim_down_cluster( - std::map &vstates) const - // tests whether removing the cluster of vertices - // marked as "to remove", decreases the dimension of the triangulation - { - CGAL_triangulation_precondition( dimension() == 3 ); - int k=0; - Vertex_handle v[4]; - for (Finite_vertices_iterator fit = finite_vertices_begin(); - fit != finite_vertices_end(); ++fit ) { - if(vstates[fit] == TO_REMOVE) continue; - v[k++] = fit; - if(k == 4) - { - if (!coplanar(v[0]->point(), v[1]->point(), - v[2]->point(), v[3]->point())) return false; - k--; - } - } - return k < 4; - } - - template < class InputIterator, class VertexRemover > - bool - _remove_cluster_3D(InputIterator first, InputIterator beyond, VertexRemover &remover, - std::map &vstates); - - void _make_big_hole_3D(Vertex_handle v, - std::map& outer_map, - std::vector & hole, - std::vector & vertices, - std::map &vstates); - -public: - - //TRAVERSING : ITERATORS AND CIRCULATORS - Finite_cells_iterator finite_cells_begin() const - { - if ( dimension() < 3 ) - return finite_cells_end(); - return CGAL::filter_iterator(cells_end(), Infinite_tester(this), - cells_begin()); - } - Finite_cells_iterator finite_cells_end() const - { - return CGAL::filter_iterator(cells_end(), Infinite_tester(this)); - } - - Cell_iterator cells_begin() const - { - return _tds.cells_begin(); - } - Cell_iterator cells_end() const - { - return _tds.cells_end(); - } - - All_cells_iterator all_cells_begin() const - { - return _tds.cells_begin(); - } - All_cells_iterator all_cells_end() const - { - return _tds.cells_end(); - } - - Finite_vertices_iterator finite_vertices_begin() const - { - if ( number_of_vertices() <= 0 ) - return finite_vertices_end(); - return CGAL::filter_iterator(vertices_end(), Infinite_tester(this), - vertices_begin()); - } - Finite_vertices_iterator finite_vertices_end() const - { - return CGAL::filter_iterator(vertices_end(), Infinite_tester(this)); - } - - Vertex_iterator vertices_begin() const - { - return _tds.vertices_begin(); - } - Vertex_iterator vertices_end() const - { - return _tds.vertices_end(); - } - - All_vertices_iterator all_vertices_begin() const - { - return _tds.vertices_begin(); - } - All_vertices_iterator all_vertices_end() const - { - return _tds.vertices_end(); - } - - Finite_edges_iterator finite_edges_begin() const - { - if ( dimension() < 1 ) - return finite_edges_end(); - return CGAL::filter_iterator(edges_end(), Infinite_tester(this), - edges_begin()); - } - Finite_edges_iterator finite_edges_end() const - { - return CGAL::filter_iterator(edges_end(), Infinite_tester(this)); - } - - Edge_iterator edges_begin() const - { - return _tds.edges_begin(); - } - Edge_iterator edges_end() const - { - return _tds.edges_end(); - } - - All_edges_iterator all_edges_begin() const - { - return _tds.edges_begin(); - } - All_edges_iterator all_edges_end() const - { - return _tds.edges_end(); - } - - Finite_facets_iterator finite_facets_begin() const - { - if ( dimension() < 2 ) - return finite_facets_end(); - return CGAL::filter_iterator(facets_end(), Infinite_tester(this), - facets_begin()); - } - Finite_facets_iterator finite_facets_end() const - { - return CGAL::filter_iterator(facets_end(), Infinite_tester(this)); - } - - Facet_iterator facets_begin() const - { - return _tds.facets_begin(); - } - Facet_iterator facets_end() const - { - return _tds.facets_end(); - } - - All_facets_iterator all_facets_begin() const - { - return _tds.facets_begin(); - } - All_facets_iterator all_facets_end() const - { - return _tds.facets_end(); - } - - Point_iterator points_begin() const - { - return Point_iterator(finite_vertices_begin()); - } - Point_iterator points_end() const - { - return Point_iterator(finite_vertices_end()); - } - - // cells around an edge - Cell_circulator incident_cells(const Edge & e) const - { - return _tds.incident_cells(e); - } - Cell_circulator incident_cells(Cell_handle c, int i, int j) const - { - return _tds.incident_cells(c, i, j); - } - Cell_circulator incident_cells(const Edge & e, Cell_handle start) const - { - return _tds.incident_cells(e, start); - } - Cell_circulator incident_cells(Cell_handle c, int i, int j, - Cell_handle start) const - { - return _tds.incident_cells(c, i, j, start); - } - - // facets around an edge - Facet_circulator incident_facets(const Edge & e) const - { - return _tds.incident_facets(e); - } - Facet_circulator incident_facets(Cell_handle c, int i, int j) const - { - return _tds.incident_facets(c, i, j); - } - Facet_circulator incident_facets(const Edge & e, const Facet & start) const - { - return _tds.incident_facets(e, start); - } - Facet_circulator incident_facets(Cell_handle c, int i, int j, - const Facet & start) const - { - return _tds.incident_facets(c, i, j, start); - } - Facet_circulator incident_facets(const Edge & e, - Cell_handle start, int f) const - { - return _tds.incident_facets(e, start, f); - } - Facet_circulator incident_facets(Cell_handle c, int i, int j, - Cell_handle start, int f) const - { - return _tds.incident_facets(c, i, j, start, f); - } - - // around a vertex - class Finite_filter { - const Self* t; - public: - Finite_filter(const Self* _t): t(_t) {} - template - bool operator() (const T& e) const { - return t->is_infinite(e); - } - }; - - class Finite_filter_2D { - const Self* t; - public: - Finite_filter_2D(const Self* _t): t(_t) {} - - template - bool operator() (const T& e) const { - return t->is_infinite(e); - } - - bool operator() (const Cell_handle c) { - return t->is_infinite(c, 3); - } - }; - - template - OutputIterator - incident_cells(Vertex_handle v, OutputIterator cells) const - { - return _tds.incident_cells(v, cells); - } - - template - OutputIterator - finite_incident_cells(Vertex_handle v, OutputIterator cells) const - { - if(dimension() == 2) - return _tds.incident_cells(v, cells, Finite_filter_2D(this)); - return _tds.incident_cells(v, cells, Finite_filter(this)); - } - - template - OutputIterator - incident_facets(Vertex_handle v, OutputIterator facets) const - { - return _tds.incident_facets(v, facets); - } - - template - OutputIterator - finite_incident_facets(Vertex_handle v, OutputIterator facets) const - { - return _tds.incident_facets(v, facets, Finite_filter(this)); - } - - // old name (up to CGAL 3.4) - // kept for backwards compatibility but not documented - template - OutputIterator - incident_vertices(Vertex_handle v, OutputIterator vertices) const - { - return _tds.adjacent_vertices(v, vertices); - } - - // correct name - template - OutputIterator - adjacent_vertices(Vertex_handle v, OutputIterator vertices) const - { - return _tds.adjacent_vertices(v, vertices); - } - - // old name (up to CGAL 3.4) - // kept for backwards compatibility but not documented - template - OutputIterator - finite_incident_vertices(Vertex_handle v, OutputIterator vertices) const - { - return _tds.adjacent_vertices(v, vertices, Finite_filter(this)); - } - - // correct name - template - OutputIterator - finite_adjacent_vertices(Vertex_handle v, OutputIterator vertices) const - { - return _tds.adjacent_vertices(v, vertices, Finite_filter(this)); - } - - template - OutputIterator - incident_edges(Vertex_handle v, OutputIterator edges) const - { - return _tds.incident_edges(v, edges); - } - - template - OutputIterator - finite_incident_edges(Vertex_handle v, OutputIterator edges) const - { - return _tds.incident_edges(v, edges, Finite_filter(this)); - } - - size_type degree(Vertex_handle v) const - { - return _tds.degree(v); - } - - - - // CHECKING - bool is_valid(bool verbose = false, int level = 0) const; - - bool is_valid(Cell_handle c, bool verbose = false, int level = 0) const; - - bool is_valid_finite(Cell_handle c, bool verbose = false, int level=0) const; -}; - -template < class GT, class Tds > -std::istream & -operator>> (std::istream& is, Triangulation_3 &tr) - // reads - // the dimension - // the number of finite vertices - // the non combinatorial information on vertices (point, etc) - // the number of cells - // the cells by the indices of their vertices in the preceding list - // of vertices, plus the non combinatorial information on each cell - // the neighbors of each cell by their index in the preceding list of cells - // when dimension < 3 : the same with faces of maximal dimension -{ - typedef Triangulation_3 Triangulation; - typedef typename Triangulation::Vertex_handle Vertex_handle; - typedef typename Triangulation::Cell_handle Cell_handle; - - tr._tds.clear(); // infinite vertex deleted - tr.infinite = tr._tds.create_vertex(); - - std::size_t n; - int d; - if(is_ascii(is)) - is >> d >> n; - else { - read(is, d); - read(is, n); - } - if(!is) return is; - tr._tds.set_dimension(d); - - std::map< std::size_t, Vertex_handle > V; - V[0] = tr.infinite_vertex(); - // the infinite vertex is numbered 0 - - for (std::size_t i=1; i <= n; i++) { - V[i] = tr._tds.create_vertex(); - if(!(is >> *V[i])) return is; - } - - std::map< std::size_t, Cell_handle > C; - - std::size_t m; - tr._tds.read_cells(is, V, m, C); - - for (std::size_t j=0 ; j < m; j++) - if(!(is >> *(C[j]))) return is; - - CGAL_triangulation_assertion( tr.is_valid(false) ); - return is; -} - -template < class GT, class Tds > -std::ostream & -operator<< (std::ostream& os, const Triangulation_3 &tr) - // writes : - // the dimension - // the number of finite vertices - // the non combinatorial information on vertices (point, etc) - // the number of cells - // the cells by the indices of their vertices in the preceding list - // of vertices, plus the non combinatorial information on each cell - // the neighbors of each cell by their index in the preceding list of cells - // when dimension < 3 : the same with faces of maximal dimension -{ - typedef Triangulation_3 Triangulation; - typedef typename Triangulation::size_type size_type; - typedef typename Triangulation::Vertex_handle Vertex_handle; - typedef typename Triangulation::Vertex_iterator Vertex_iterator; - typedef typename Triangulation::Cell_iterator Cell_iterator; - typedef typename Triangulation::Edge_iterator Edge_iterator; - typedef typename Triangulation::Facet_iterator Facet_iterator; - - // outputs dimension and number of vertices - size_type n = tr.number_of_vertices(); - if (is_ascii(os)) - os << tr.dimension() << std::endl << n << std::endl; - else - { - write(os, tr.dimension()); - write(os, n); - } - - if (n == 0) - return os; - - std::vector TV(n+1); - size_type i = 0; - - // write the vertices - - for (Vertex_iterator it = tr.vertices_begin(), end = tr.vertices_end(); - it != end; ++it) - TV[i++] = it; - - CGAL_triangulation_assertion( i == n+1 ); - CGAL_triangulation_assertion( tr.is_infinite(TV[0]) ); - - std::map V; - - V[tr.infinite_vertex()] = 0; - for (i=1; i <= n; i++) { - os << *TV[i]; - V[TV[i]] = i; - if (is_ascii(os)) - os << std::endl; - } - - // asks the tds for the combinatorial information - tr.tds().print_cells(os, V); - - - // write the non combinatorial information on the cells - // using the << operator of Cell - // works because the iterator of the tds traverses the cells in the - // same order as the iterator of the triangulation - switch ( tr.dimension() ) { - case 3: - { - for(Cell_iterator it = tr.cells_begin(), end = tr.cells_end(); it != end; ++it) { - os << *it; // other information - if(is_ascii(os)) - os << std::endl; - } - break; - } - case 2: - { - for(Facet_iterator it = tr.facets_begin(), end = tr.facets_end(); it != end; ++it) { - os << *((*it).first); // other information - if(is_ascii(os)) - os << std::endl; - } - break; - } - case 1: - { - for(Edge_iterator it = tr.edges_begin(), end = tr.edges_end(); it != end; ++it) { - os << *((*it).first); // other information - if(is_ascii(os)) - os << std::endl; - } - break; - } - } - - - return os ; -} - -template < class GT, class Tds > -typename Triangulation_3::size_type -Triangulation_3:: -number_of_finite_cells() const -{ - if ( dimension() < 3 ) return 0; - return std::distance(finite_cells_begin(), finite_cells_end()); -} - -template < class GT, class Tds > -typename Triangulation_3::size_type -Triangulation_3:: -number_of_cells() const -{ - return _tds.number_of_cells(); -} - -template < class GT, class Tds > -typename Triangulation_3::size_type -Triangulation_3:: -number_of_finite_facets() const -{ - if ( dimension() < 2 ) return 0; - return std::distance(finite_facets_begin(), finite_facets_end()); -} - -template < class GT, class Tds > -typename Triangulation_3::size_type -Triangulation_3:: -number_of_facets() const -{ - return _tds.number_of_facets(); -} - -template < class GT, class Tds > -typename Triangulation_3::size_type -Triangulation_3:: -number_of_finite_edges() const -{ - if ( dimension() < 1 ) return 0; - return std::distance(finite_edges_begin(), finite_edges_end()); -} - -template < class GT, class Tds > -typename Triangulation_3::size_type -Triangulation_3:: -number_of_edges() const -{ - return _tds.number_of_edges(); -} - -template < class GT, class Tds > -typename Triangulation_3::Triangle -Triangulation_3:: -triangle(const Cell_handle c, int i) const -{ - CGAL_triangulation_precondition( dimension() == 2 || dimension() == 3 ); - CGAL_triangulation_precondition( (dimension() == 2 && i == 3) - || (dimension() == 3 && i >= 0 && i <= 3) ); - CGAL_triangulation_precondition( ! is_infinite(Facet(c, i)) ); - if ( (i&1)==0 ) - return construct_triangle(c->vertex( (i+2)&3 )->point(), - c->vertex( (i+1)&3 )->point(), - c->vertex( (i+3)&3 )->point()); - return construct_triangle(c->vertex( (i+1)&3 )->point(), - c->vertex( (i+2)&3 )->point(), - c->vertex( (i+3)&3 )->point()); -} - -template < class GT, class Tds > -typename Triangulation_3::Segment -Triangulation_3:: -segment(const Cell_handle c, int i, int j) const -{ - CGAL_triangulation_precondition( i != j ); - CGAL_triangulation_precondition( dimension() >= 1 && dimension() <= 3 ); - CGAL_triangulation_precondition( i >= 0 && i <= dimension() - && j >= 0 && j <= dimension() ); - CGAL_triangulation_precondition( ! is_infinite(Edge(c, i, j)) ); - return construct_segment( c->vertex(i)->point(), c->vertex(j)->point() ); -} - -template < class GT, class Tds > -inline -bool -Triangulation_3:: -is_infinite(const Cell_handle c, int i) const -{ - CGAL_triangulation_precondition( dimension() == 2 || dimension() == 3 ); - CGAL_triangulation_precondition( (dimension() == 2 && i == 3) - || (dimension() == 3 && i >= 0 && i <= 3) ); - return is_infinite(c->vertex(i<=0 ? 1 : 0)) || - is_infinite(c->vertex(i<=1 ? 2 : 1)) || - is_infinite(c->vertex(i<=2 ? 3 : 2)); -} - -template < class GT, class Tds > -inline -bool -Triangulation_3:: -is_infinite(const Cell_handle c, int i, int j) const -{ - CGAL_triangulation_precondition( i != j ); - CGAL_triangulation_precondition( dimension() >= 1 && dimension() <= 3 ); - CGAL_triangulation_precondition( - i >= 0 && i <= dimension() && j >= 0 && j <= dimension() ); - return is_infinite( c->vertex(i) ) || is_infinite( c->vertex(j) ); -} - -template < class GT, class Tds > -bool -Triangulation_3:: -is_vertex(const Point & p, Vertex_handle & v) const -{ - Locate_type lt; - int li, lj; - Cell_handle c = locate( p, lt, li, lj ); - if ( lt != VERTEX ) - return false; - v = c->vertex(li); - return true; -} - -template < class GT, class Tds > -inline -bool -Triangulation_3:: -is_vertex(Vertex_handle v) const -{ - return _tds.is_vertex(v); -} - -template < class GT, class Tds > -bool -Triangulation_3:: -is_edge(Vertex_handle u, Vertex_handle v, - Cell_handle & c, int & i, int & j) const -{ - return _tds.is_edge(u, v, c, i, j); -} - -template < class GT, class Tds > -bool -Triangulation_3:: -is_facet(Vertex_handle u, Vertex_handle v, Vertex_handle w, - Cell_handle & c, int & i, int & j, int & k) const -{ - return _tds.is_facet(u, v, w, c, i, j, k); -} - -template < class GT, class Tds > -inline -bool -Triangulation_3:: -is_cell(Cell_handle c) const -{ - return _tds.is_cell(c); -} - -template < class GT, class Tds > -bool -Triangulation_3:: -is_cell(Vertex_handle u, Vertex_handle v, - Vertex_handle w, Vertex_handle t, - Cell_handle & c, int & i, int & j, int & k, int & l) const -{ - return _tds.is_cell(u, v, w, t, c, i, j, k, l); -} - -template < class GT, class Tds > -bool -Triangulation_3:: -is_cell(Vertex_handle u, Vertex_handle v, - Vertex_handle w, Vertex_handle t, - Cell_handle & c) const -{ - int i,j,k,l; - return _tds.is_cell(u, v, w, t, c, i, j, k, l); -} - -template < class GT, class Tds > -inline -bool -Triangulation_3:: -has_vertex(const Facet & f, Vertex_handle v, int & j) const -{ - return _tds.has_vertex(f.first, f.second, v, j); -} - -template < class GT, class Tds > -inline -bool -Triangulation_3:: -has_vertex(Cell_handle c, int i, Vertex_handle v, int & j) const -{ - return _tds.has_vertex(c, i, v, j); -} - -template < class GT, class Tds > -inline -bool -Triangulation_3:: -has_vertex(const Facet & f, Vertex_handle v) const -{ - return _tds.has_vertex(f.first, f.second, v); -} - -template < class GT, class Tds > -inline -bool -Triangulation_3:: -has_vertex(Cell_handle c, int i, Vertex_handle v) const -{ - return _tds.has_vertex(c, i, v); -} - -template < class GT, class Tds > -inline -bool -Triangulation_3:: -are_equal(Cell_handle c, int i, Cell_handle n, int j) const -{ - return _tds.are_equal(c, i, n, j); -} - -template < class GT, class Tds > -inline -bool -Triangulation_3:: -are_equal(const Facet & f, const Facet & g) const -{ - return _tds.are_equal(f.first, f.second, g.first, g.second); -} - -template < class GT, class Tds > -inline -bool -Triangulation_3:: -are_equal(const Facet & f, Cell_handle n, int j) const -{ - return _tds.are_equal(f.first, f.second, n, j); -} - -template < class GT, class Tds > -typename Triangulation_3::Cell_handle -Triangulation_3:: -#ifdef CGAL_NO_STRUCTURAL_FILTERING -locate(const Point & p, Locate_type & lt, int & li, int & lj, - Cell_handle start ) const -#else -exact_locate(const Point & p, Locate_type & lt, int & li, int & lj, - Cell_handle start ) const -#endif - // returns the (finite or infinite) cell p lies in - // starts at cell "start" - // if lt == OUTSIDE_CONVEX_HULL, li is the - // index of a facet separating p from the rest of the triangulation - // in dimension 2 : - // returns a facet (Cell_handle,li) if lt == FACET - // returns an edge (Cell_handle,li,lj) if lt == EDGE - // returns a vertex (Cell_handle,li) if lt == VERTEX - // if lt == OUTSIDE_CONVEX_HULL, li, lj give the edge of c - // separating p from the rest of the triangulation - // lt = OUTSIDE_AFFINE_HULL if p is not coplanar with the triangulation -{ - CGAL_triangulation_expensive_assertion(start == Cell_handle() || tds().is_simplex(start) ); - - if ( dimension() >= 1 ) { - // Make sure we continue from here with a finite cell. - if ( start == Cell_handle() ) - start = infinite_cell(); - - int ind_inf; - if ( start->has_vertex(infinite, ind_inf) ) - start = start->neighbor(ind_inf); - } - - boost::rand48 rng; - - switch (dimension()) { - case 3: - { - CGAL_triangulation_precondition( start != Cell_handle() ); - CGAL_triangulation_precondition( ! start->has_vertex(infinite) ); - - // We implement the remembering visibility/stochastic walk. - - // Remembers the previous cell to avoid useless orientation tests. - Cell_handle previous = Cell_handle(); - Cell_handle c = start; - - // Stores the results of the 4 orientation tests. It will be used - // at the end to decide if p lies on a face/edge/vertex/interior. - Orientation o[4]; - - boost::uniform_smallint<> four(0, 3); - boost::variate_generator > die4(rng, four); - - // Now treat the cell c. - try_next_cell: - - // We know that the 4 vertices of c are positively oriented. - // So, in order to test if p is seen outside from one of c's facets, - // we just replace the corresponding point by p in the orientation - // test. We do this using the array below. - const Point* pts[4] = { &(c->vertex(0)->point()), - &(c->vertex(1)->point()), - &(c->vertex(2)->point()), - &(c->vertex(3)->point()) }; - - // For the remembering stochastic walk, - // we need to start trying with a random index : - int i = die4(); - // For the remembering visibility walk (Delaunay and Regular only), we don't : - // int i = 0; - - for (int j=0; j != 4; ++j, i = (i+1)&3) { - Cell_handle next = c->neighbor(i); - if (previous == next) { - o[i] = POSITIVE; - continue; - } - // We temporarily put p at i's place in pts. - const Point* backup = pts[i]; - pts[i] = &p; - o[i] = orientation(*pts[0], *pts[1], *pts[2], *pts[3]); - if ( o[i] != NEGATIVE ) { - pts[i] = backup; - continue; - } - if ( next->has_vertex(infinite, li) ) { - // We are outside the convex hull. - lt = OUTSIDE_CONVEX_HULL; - return next; - } - previous = c; - c = next; - goto try_next_cell; - } - - // now p is in c or on its boundary - int sum = ( o[0] == COPLANAR ) - + ( o[1] == COPLANAR ) - + ( o[2] == COPLANAR ) - + ( o[3] == COPLANAR ); - switch (sum) { - case 0: - { - lt = CELL; - break; - } - case 1: - { - lt = FACET; - li = ( o[0] == COPLANAR ) ? 0 : - ( o[1] == COPLANAR ) ? 1 : - ( o[2] == COPLANAR ) ? 2 : 3; - break; - } - case 2: - { - lt = EDGE; - li = ( o[0] != COPLANAR ) ? 0 : - ( o[1] != COPLANAR ) ? 1 : 2; - lj = ( o[li+1] != COPLANAR ) ? li+1 : - ( o[li+2] != COPLANAR ) ? li+2 : li+3; - CGAL_triangulation_assertion(collinear( p, - c->vertex( li )->point(), - c->vertex( lj )->point())); - break; - } - case 3: - { - lt = VERTEX; - li = ( o[0] != COPLANAR ) ? 0 : - ( o[1] != COPLANAR ) ? 1 : - ( o[2] != COPLANAR ) ? 2 : 3; - break; - } - } - return c; - } - case 2: - { - CGAL_triangulation_precondition( start != Cell_handle() ); - CGAL_triangulation_precondition( ! start->has_vertex(infinite) ); - Cell_handle c = start; - - boost::uniform_smallint<> three(0, 2); - boost::variate_generator > die3(rng, three); - - //first tests whether p is coplanar with the current triangulation - if ( orientation( c->vertex(0)->point(), - c->vertex(1)->point(), - c->vertex(2)->point(), - p ) != DEGENERATE ) { - lt = OUTSIDE_AFFINE_HULL; - li = 3; // only one facet in dimension 2 - return c; - } - // if p is coplanar, location in the triangulation - // only the facet numbered 3 exists in each cell - while (1) { - int inf; - if ( c->has_vertex(infinite,inf) ) { - // c must contain p in its interior - lt = OUTSIDE_CONVEX_HULL; - li = cw(inf); - lj = ccw(inf); - return c; - } - - // else c is finite - // we test its edges in a random order until we find a - // neighbor to go further - int i = die3(); - const Point & p0 = c->vertex( i )->point(); - const Point & p1 = c->vertex( ccw(i) )->point(); - const Point & p2 = c->vertex( cw(i) )->point(); - Orientation o[3]; - CGAL_triangulation_assertion(coplanar_orientation(p0,p1,p2)==POSITIVE); - o[0] = coplanar_orientation(p0,p1,p); - if ( o[0] == NEGATIVE ) { - c = c->neighbor( cw(i) ); - continue; - } - o[1] = coplanar_orientation(p1,p2,p); - if ( o[1] == NEGATIVE ) { - c = c->neighbor( i ); - continue; - } - o[2] = coplanar_orientation(p2,p0,p); - if ( o[2] == NEGATIVE ) { - c = c->neighbor( ccw(i) ); - continue; - } - - // now p is in c or on its boundary - int sum = ( o[0] == COLLINEAR ) - + ( o[1] == COLLINEAR ) - + ( o[2] == COLLINEAR ); - switch (sum) { - case 0: - { - lt = FACET; - li = 3; // useless ? - break; - } - case 1: - { - lt = EDGE; - li = ( o[0] == COLLINEAR ) ? i : - ( o[1] == COLLINEAR ) ? ccw(i) : - cw(i); - lj = ccw(li); - break; - } - case 2: - { - lt = VERTEX; - li = ( o[0] != COLLINEAR ) ? cw(i) : - ( o[1] != COLLINEAR ) ? i : - ccw(i); - break; - } - } - return c; - } - } - case 1: - { - CGAL_triangulation_precondition( start != Cell_handle() ); - CGAL_triangulation_precondition( ! start->has_vertex(infinite) ); - Cell_handle c = start; - - //first tests whether p is collinear with the current triangulation - if ( ! collinear( p, - c->vertex(0)->point(), - c->vertex(1)->point()) ) { - lt = OUTSIDE_AFFINE_HULL; - return c; - } - // if p is collinear, location : - while (1) { - if ( c->has_vertex(infinite) ) { - // c must contain p in its interior - lt = OUTSIDE_CONVEX_HULL; - return c; - } - - // else c is finite - // we test on which direction to continue the traversal - switch (collinear_position(c->vertex(0)->point(), - p, - c->vertex(1)->point()) ) { - case AFTER: - c = c->neighbor(0); - continue; - case BEFORE: - c = c->neighbor(1); - continue; - case MIDDLE: - lt = EDGE; - li = 0; - lj = 1; - return c; - case SOURCE: - lt = VERTEX; - li = 0; - return c; - case TARGET: - lt = VERTEX; - li = 1; - return c; - } - } - } - case 0: - { - Finite_vertices_iterator vit = finite_vertices_begin(); - if ( ! equal( p, vit->point() ) ) { - lt = OUTSIDE_AFFINE_HULL; - } - else { - lt = VERTEX; - li = 0; - } - return vit->cell(); - } - case -1: - { - lt = OUTSIDE_AFFINE_HULL; - return Cell_handle(); - } - default: - { - CGAL_triangulation_assertion(false); - return Cell_handle(); - } - } -} - -#ifndef CGAL_NO_STRUCTURAL_FILTERING -template -inline -typename Triangulation_3::Cell_handle -Triangulation_3:: -inexact_locate(const Point & t, Cell_handle start, int n_of_turns) const -{ - CGAL_triangulation_expensive_assertion(start == Cell_handle() || tds().is_simplex(start) ); - - if(dimension() < 3) return start; - - // Make sure we continue from here with a finite cell. - if ( start == Cell_handle() ) - start = infinite_cell(); - - int ind_inf; - if( start->has_vertex(infinite, ind_inf) ) - start = start->neighbor(ind_inf); - - CGAL_triangulation_precondition( start != Cell_handle() ); - CGAL_triangulation_precondition( ! start->has_vertex(infinite) ); - - // We implement the remembering visibility walk. - // in this phase, no need to be stochastic - - // Remembers the previous cell to avoid useless orientation tests. - Cell_handle previous = Cell_handle(); - Cell_handle c = start; - - // Now treat the cell c. - try_next_cell: - - n_of_turns--; - - // We know that the 4 vertices of c are positively oriented. - // So, in order to test if p is seen outside from one of c's facets, - // we just replace the corresponding point by p in the orientation - // test. We do this using the array below. - const Point* pts[4] = { &(c->vertex(0)->point()), - &(c->vertex(1)->point()), - &(c->vertex(2)->point()), - &(c->vertex(3)->point()) }; - - // (non-stochastic) visibility walk - for (int i=0; i != 4; ++i) { - Cell_handle next = c->neighbor(i); - if (previous == next) continue; - - // We temporarily put p at i's place in pts. - const Point* backup = pts[i]; - pts[i] = &t; - if( inexact_orientation(*pts[0], *pts[1], *pts[2], *pts[3]) != NEGATIVE) { - pts[i] = backup; - continue; - } - if(next->has_vertex(infinite)) { - // We are outside the convex hull. - return next; - } - previous = c; - c = next; - if(n_of_turns) goto try_next_cell; - } - - return c; -} -#endif // no CGAL_NO_STRUCTURAL_FILTERING - -template < class GT, class Tds > -Bounded_side -Triangulation_3:: -side_of_tetrahedron(const Point & p, - const Point & p0, - const Point & p1, - const Point & p2, - const Point & p3, - Locate_type & lt, int & i, int & j ) const - // p0,p1,p2,p3 supposed to be non coplanar - // tetrahedron p0,p1,p2,p3 is supposed to be well oriented - // returns : - // ON_BOUNDED_SIDE if p lies strictly inside the tetrahedron - // ON_BOUNDARY if p lies on one of the facets - // ON_UNBOUNDED_SIDE if p lies strictly outside the tetrahedron -{ - CGAL_triangulation_precondition - ( orientation(p0,p1,p2,p3) == POSITIVE ); - - Orientation o0,o1,o2,o3; - if ( ((o0 = orientation(p,p1,p2,p3)) == NEGATIVE) || - ((o1 = orientation(p0,p,p2,p3)) == NEGATIVE) || - ((o2 = orientation(p0,p1,p,p3)) == NEGATIVE) || - ((o3 = orientation(p0,p1,p2,p)) == NEGATIVE) ) { - lt = OUTSIDE_CONVEX_HULL; - return ON_UNBOUNDED_SIDE; - } - - // now all the oi's are >=0 - // sum gives the number of facets p lies on - int sum = ( (o0 == ZERO) ? 1 : 0 ) - + ( (o1 == ZERO) ? 1 : 0 ) - + ( (o2 == ZERO) ? 1 : 0 ) - + ( (o3 == ZERO) ? 1 : 0 ); - - switch (sum) { - case 0: - { - lt = CELL; - return ON_BOUNDED_SIDE; - } - case 1: - { - lt = FACET; - // i = index such that p lies on facet(i) - i = ( o0 == ZERO ) ? 0 : - ( o1 == ZERO ) ? 1 : - ( o2 == ZERO ) ? 2 : - 3; - return ON_BOUNDARY; - } - case 2: - { - lt = EDGE; - // i = smallest index such that p does not lie on facet(i) - // i must be < 3 since p lies on 2 facets - i = ( o0 == POSITIVE ) ? 0 : - ( o1 == POSITIVE ) ? 1 : - 2; - // j = larger index such that p not on facet(j) - // j must be > 0 since p lies on 2 facets - j = ( o3 == POSITIVE ) ? 3 : - ( o2 == POSITIVE ) ? 2 : - 1; - return ON_BOUNDARY; - } - case 3: - { - lt = VERTEX; - // i = index such that p does not lie on facet(i) - i = ( o0 == POSITIVE ) ? 0 : - ( o1 == POSITIVE ) ? 1 : - ( o2 == POSITIVE ) ? 2 : - 3; - return ON_BOUNDARY; - } - default: - { - // impossible : cannot be on 4 facets for a real tetrahedron - CGAL_triangulation_assertion(false); - return ON_BOUNDARY; - } - } -} - -template < class GT, class Tds > -Bounded_side -Triangulation_3:: -side_of_cell(const Point & p, - Cell_handle c, - Locate_type & lt, int & i, int & j) const - // returns - // ON_BOUNDED_SIDE if p inside the cell - // (for an infinite cell this means that p lies strictly in the half space - // limited by its finite facet) - // ON_BOUNDARY if p on the boundary of the cell - // (for an infinite cell this means that p lies on the *finite* facet) - // ON_UNBOUNDED_SIDE if p lies outside the cell - // (for an infinite cell this means that p is not in the preceding - // two cases) - // lt has a meaning only when ON_BOUNDED_SIDE or ON_BOUNDARY -{ - CGAL_triangulation_precondition( dimension() == 3 ); - if ( ! is_infinite(c) ) { - return side_of_tetrahedron(p, - c->vertex(0)->point(), - c->vertex(1)->point(), - c->vertex(2)->point(), - c->vertex(3)->point(), - lt, i, j); - } - else { - int inf = c->index(infinite); - Orientation o; - Vertex_handle - v1=c->vertex((inf+1)&3), - v2=c->vertex((inf+2)&3), - v3=c->vertex((inf+3)&3); - if ( (inf&1) == 0 ) - o = orientation(p, v1->point(), v2->point(), v3->point()); - else - o = orientation(v3->point(), p, v1->point(), v2->point()); - - switch (o) { - case POSITIVE: - { - lt = CELL; - return ON_BOUNDED_SIDE; - } - case NEGATIVE: - return ON_UNBOUNDED_SIDE; - case ZERO: - { - // location in the finite facet - int i_f, j_f; - Bounded_side side = - side_of_triangle(p, v1->point(), v2->point(), v3->point(), - lt, i_f, j_f); - // lt need not be modified in most cases : - switch (side) { - case ON_BOUNDED_SIDE: - { - // lt == FACET ok - i = inf; - return ON_BOUNDARY; - } - case ON_BOUNDARY: - { - // lt == VERTEX OR EDGE ok - i = ( i_f == 0 ) ? ((inf+1)&3) : - ( i_f == 1 ) ? ((inf+2)&3) : - ((inf+3)&3); - if ( lt == EDGE ) { - j = (j_f == 0 ) ? ((inf+1)&3) : - ( j_f == 1 ) ? ((inf+2)&3) : - ((inf+3)&3); - } - return ON_BOUNDARY; - } - case ON_UNBOUNDED_SIDE: - { - // p lies on the plane defined by the finite facet - // lt must be initialized - return ON_UNBOUNDED_SIDE; - } - default: - { - CGAL_triangulation_assertion(false); - return ON_BOUNDARY; - } - } // switch side - }// case ZERO - default: - { - CGAL_triangulation_assertion(false); - return ON_BOUNDARY; - } - } // switch o - } // else infinite cell -} // side_of_cell - -template < class GT, class Tds > -Bounded_side -Triangulation_3:: -side_of_triangle(const Point & p, - const Point & p0, - const Point & p1, - const Point & p2, - Locate_type & lt, int & i, int & j ) const - // p0,p1,p2 supposed to define a plane - // p supposed to lie on plane p0,p1,p2 - // triangle p0,p1,p2 defines the orientation of the plane - // returns - // ON_BOUNDED_SIDE if p lies strictly inside the triangle - // ON_BOUNDARY if p lies on one of the edges - // ON_UNBOUNDED_SIDE if p lies strictly outside the triangle -{ - CGAL_triangulation_precondition( coplanar(p,p0,p1,p2) ); - - Orientation o012 = coplanar_orientation(p0,p1,p2); - CGAL_triangulation_precondition( o012 != COLLINEAR ); - - Orientation o0; // edge p0 p1 - Orientation o1; // edge p1 p2 - Orientation o2; // edge p2 p0 - - if ((o0 = coplanar_orientation(p0,p1,p)) == opposite(o012) || - (o1 = coplanar_orientation(p1,p2,p)) == opposite(o012) || - (o2 = coplanar_orientation(p2,p0,p)) == opposite(o012)) { - lt = OUTSIDE_CONVEX_HULL; - return ON_UNBOUNDED_SIDE; - } - - // now all the oi's are >=0 - // sum gives the number of edges p lies on - int sum = ( (o0 == ZERO) ? 1 : 0 ) - + ( (o1 == ZERO) ? 1 : 0 ) - + ( (o2 == ZERO) ? 1 : 0 ); - - switch (sum) { - case 0: - { - lt = FACET; - return ON_BOUNDED_SIDE; - } - case 1: - { - lt = EDGE; - i = ( o0 == ZERO ) ? 0 : - ( o1 == ZERO ) ? 1 : - 2; - if ( i == 2 ) - j=0; - else - j = i+1; - return ON_BOUNDARY; - } - case 2: - { - lt = VERTEX; - i = ( o0 == o012 ) ? 2 : - ( o1 == o012 ) ? 0 : - 1; - return ON_BOUNDARY; - } - default: - { - // cannot happen - CGAL_triangulation_assertion(false); - return ON_BOUNDARY; - } - } -} - -template < class GT, class Tds > -Bounded_side -Triangulation_3:: -side_of_facet(const Point & p, - Cell_handle c, - Locate_type & lt, int & li, int & lj) const - // supposes dimension 2 otherwise does not work for infinite facets - // returns : - // ON_BOUNDED_SIDE if p inside the facet - // (for an infinite facet this means that p lies strictly in the half plane - // limited by its finite edge) - // ON_BOUNDARY if p on the boundary of the facet - // (for an infinite facet this means that p lies on the *finite* edge) - // ON_UNBOUNDED_SIDE if p lies outside the facet - // (for an infinite facet this means that p is not in the - // preceding two cases) - // lt has a meaning only when ON_BOUNDED_SIDE or ON_BOUNDARY - // when they mean anything, li and lj refer to indices in the cell c - // giving the facet (c,i) -{ - CGAL_triangulation_precondition( dimension() == 2 ); - if ( ! is_infinite(c,3) ) { - // The following precondition is useless because it is written - // in side_of_facet - // CGAL_triangulation_precondition( coplanar (p, - // c->vertex(0)->point, - // c->vertex(1)->point, - // c->vertex(2)->point) ); - int i_t, j_t; - Bounded_side side = side_of_triangle(p, - c->vertex(0)->point(), - c->vertex(1)->point(), - c->vertex(2)->point(), - lt, i_t, j_t); - // We protect the following code by this test to avoid valgrind messages. - if (side == ON_BOUNDARY) { - // indices in the original cell : - li = ( i_t == 0 ) ? 0 : - ( i_t == 1 ) ? 1 : 2; - lj = ( j_t == 0 ) ? 0 : - ( j_t == 1 ) ? 1 : 2; - } - return side; - } - // else infinite facet - int inf = c->index(infinite); - // The following precondition is useless because it is written - // in side_of_facet - // CGAL_triangulation_precondition( coplanar (p, - // c->neighbor(inf)->vertex(0)->point(), - // c->neighbor(inf)->vertex(1)->point(), - // c->neighbor(inf)->vertex(2)->point())); - int i2 = next_around_edge(inf,3); - int i1 = 3-inf-i2; - Vertex_handle v1 = c->vertex(i1), - v2 = c->vertex(i2); - - CGAL_triangulation_assertion(coplanar_orientation(v1->point(), v2->point(), - mirror_vertex(c, inf)->point()) == POSITIVE); - - switch (coplanar_orientation(v1->point(), v2->point(), p)) { - case POSITIVE: - // p lies on the same side of v1v2 as vn, so not in f - return ON_UNBOUNDED_SIDE; - case NEGATIVE: - // p lies in f - lt = FACET; - li = 3; - return ON_BOUNDED_SIDE; - default: // case ZERO: - // p collinear with v1v2 - int i_e; - switch (side_of_segment(p, v1->point(), v2->point(), lt, i_e)) { - // computation of the indices in the original cell - case ON_BOUNDED_SIDE: - // lt == EDGE ok - li = i1; - lj = i2; - return ON_BOUNDARY; - case ON_BOUNDARY: - // lt == VERTEX ok - li = ( i_e == 0 ) ? i1 : i2; - return ON_BOUNDARY; - default: // case ON_UNBOUNDED_SIDE: - // p lies on the line defined by the finite edge - return ON_UNBOUNDED_SIDE; - } - } -} - -template < class GT, class Tds > -Bounded_side -Triangulation_3:: -side_of_segment(const Point & p, - const Point & p0, - const Point & p1, - Locate_type & lt, int & i ) const - // p0, p1 supposed to be different - // p supposed to be collinear to p0, p1 - // returns : - // ON_BOUNDED_SIDE if p lies strictly inside the edge - // ON_BOUNDARY if p equals p0 or p1 - // ON_UNBOUNDED_SIDE if p lies strictly outside the edge -{ - CGAL_triangulation_precondition( ! equal(p0, p1) ); - CGAL_triangulation_precondition( collinear(p, p0, p1) ); - - switch (collinear_position(p0, p, p1)) { - case MIDDLE: - lt = EDGE; - return ON_BOUNDED_SIDE; - case SOURCE: - lt = VERTEX; - i = 0; - return ON_BOUNDARY; - case TARGET: - lt = VERTEX; - i = 1; - return ON_BOUNDARY; - default: // case BEFORE: case AFTER: - lt = OUTSIDE_CONVEX_HULL; - return ON_UNBOUNDED_SIDE; - } -} - -template < class GT, class Tds > -Bounded_side -Triangulation_3:: -side_of_edge(const Point & p, - Cell_handle c, - Locate_type & lt, int & li) const - // supposes dimension 1 otherwise does not work for infinite edges - // returns : - // ON_BOUNDED_SIDE if p inside the edge - // (for an infinite edge this means that p lies in the half line - // defined by the vertex) - // ON_BOUNDARY if p equals one of the vertices - // ON_UNBOUNDED_SIDE if p lies outside the edge - // (for an infinite edge this means that p lies on the other half line) - // lt has a meaning when ON_BOUNDED_SIDE and ON_BOUNDARY - // li refer to indices in the cell c -{ - CGAL_triangulation_precondition( dimension() == 1 ); - if ( ! is_infinite(c,0,1) ) - return side_of_segment(p, c->vertex(0)->point(), c->vertex(1)->point(), - lt, li); - // else infinite edge - int inf = c->index(infinite); - switch (collinear_position(c->vertex(1-inf)->point(), p, - mirror_vertex(c, inf)->point())) { - case SOURCE: - lt = VERTEX; - li = 1-inf; - return ON_BOUNDARY; - case BEFORE: - lt = EDGE; - return ON_BOUNDED_SIDE; - default: // case MIDDLE: case AFTER: case TARGET: - return ON_UNBOUNDED_SIDE; - } -} - -template < class GT, class Tds > -bool -Triangulation_3:: -flip( Cell_handle c, int i ) -{ - CGAL_triangulation_precondition( (dimension() == 3) && (0<=i) && (i<4) - && (number_of_vertices() >= 5) ); - - Cell_handle n = c->neighbor(i); - int in = n->index(c); - if ( is_infinite( c ) || is_infinite( n ) ) return false; - - if ( i%2 == 1 ) { - if ( orientation( c->vertex((i+1)&3)->point(), - c->vertex((i+2)&3)->point(), - n->vertex(in)->point(), - c->vertex(i)->point() ) - != POSITIVE ) return false; - if ( orientation( c->vertex((i+2)&3)->point(), - c->vertex((i+3)&3)->point(), - n->vertex(in)->point(), - c->vertex(i)->point() ) - != POSITIVE ) return false; - if ( orientation( c->vertex((i+3)&3)->point(), - c->vertex((i+1)&3)->point(), - n->vertex(in)->point(), - c->vertex(i)->point() ) - != POSITIVE ) return false; - } - else { - if ( orientation( c->vertex((i+2)&3)->point(), - c->vertex((i+1)&3)->point(), - n->vertex(in)->point(), - c->vertex(i)->point() ) - != POSITIVE ) return false; - if ( orientation( c->vertex((i+3)&3)->point(), - c->vertex((i+2)&3)->point(), - n->vertex(in)->point(), - c->vertex(i)->point() ) - != POSITIVE ) return false; - if ( orientation( c->vertex((i+1)&3)->point(), - c->vertex((i+3)&3)->point(), - n->vertex(in)->point(), - c->vertex(i)->point() ) - != POSITIVE ) return false; - } - - _tds.flip_flippable(c, i); - return true; -} - -template < class GT, class Tds > -void -Triangulation_3:: -flip_flippable( Cell_handle c, int i ) -{ - CGAL_triangulation_precondition( (dimension() == 3) && (0<=i) && (i<4) - && (number_of_vertices() >= 5) ); - CGAL_triangulation_precondition_code( Cell_handle n = c->neighbor(i); ); - CGAL_triangulation_precondition_code( int in = n->index(c); ); - CGAL_triangulation_precondition( ( ! is_infinite( c ) ) && - ( ! is_infinite( n ) ) ); - - if ( i%2 == 1 ) { - CGAL_triangulation_precondition( orientation( c->vertex((i+1)&3)->point(), - c->vertex((i+2)&3)->point(), - n->vertex(in)->point(), - c->vertex(i)->point() ) - == POSITIVE ); - CGAL_triangulation_precondition( orientation( c->vertex((i+2)&3)->point(), - c->vertex((i+3)&3)->point(), - n->vertex(in)->point(), - c->vertex(i)->point() ) - == POSITIVE ); - CGAL_triangulation_precondition( orientation( c->vertex((i+3)&3)->point(), - c->vertex((i+1)&3)->point(), - n->vertex(in)->point(), - c->vertex(i)->point() ) - == POSITIVE ); - } - else { - CGAL_triangulation_precondition( orientation( c->vertex((i+2)&3)->point(), - c->vertex((i+1)&3)->point(), - n->vertex(in)->point(), - c->vertex(i)->point() ) - == POSITIVE ); - CGAL_triangulation_precondition( orientation( c->vertex((i+3)&3)->point(), - c->vertex((i+2)&3)->point(), - n->vertex(in)->point(), - c->vertex(i)->point() ) - == POSITIVE ); - CGAL_triangulation_precondition( orientation( c->vertex((i+1)&3)->point(), - c->vertex((i+3)&3)->point(), - n->vertex(in)->point(), - c->vertex(i)->point() ) - == POSITIVE ); - } - - _tds.flip_flippable(c, i); -} - -template < class GT, class Tds > -bool -Triangulation_3:: -flip( Cell_handle c, int i, int j ) - // flips edge i,j of cell c -{ - CGAL_triangulation_precondition( (dimension() == 3) - && (0<=i) && (i<4) - && (0<=j) && (j<4) - && ( i != j ) - && (number_of_vertices() >= 5) ); - - // checks that degree 3 and not on the convex hull - int degree = 0; - Cell_circulator ccir = incident_cells(c,i,j); - Cell_circulator cdone = ccir; - do { - if ( is_infinite(ccir) ) return false; - ++degree; - ++ccir; - } while ( ccir != cdone ); - - if ( degree != 3 ) return false; - - // checks that future tetrahedra are well oriented - Cell_handle n = c->neighbor( next_around_edge(i,j) ); - int in = n->index( c->vertex(i) ); - int jn = n->index( c->vertex(j) ); - if ( orientation( c->vertex(next_around_edge(i,j))->point(), - c->vertex(next_around_edge(j,i))->point(), - n->vertex(next_around_edge(jn,in))->point(), - c->vertex(j)->point() ) - != POSITIVE ) return false; - if ( orientation( c->vertex(i)->point(), - c->vertex(next_around_edge(j,i))->point(), - n->vertex(next_around_edge(jn,in))->point(), - c->vertex(next_around_edge(i,j))->point() ) - != POSITIVE ) return false; - - _tds.flip_flippable(c, i, j); - return true; -} - -template < class GT, class Tds > -void -Triangulation_3:: -flip_flippable( Cell_handle c, int i, int j ) - // flips edge i,j of cell c -{ -#if !defined CGAL_TRIANGULATION_NO_PRECONDITIONS && \ - !defined CGAL_NO_PRECONDITIONS && !defined NDEBUG - CGAL_triangulation_precondition( (dimension() == 3) - && (0<=i) && (i<4) - && (0<=j) && (j<4) - && ( i != j ) - && (number_of_vertices() >= 5) ); - int degree = 0; - Cell_circulator ccir = incident_cells(c,i,j); - Cell_circulator cdone = ccir; - do { - CGAL_triangulation_precondition( ! is_infinite(ccir) ); - ++degree; - ++ccir; - } while ( ccir != cdone ); - CGAL_triangulation_precondition( degree == 3 ); - - Cell_handle n = c->neighbor( next_around_edge(i, j) ); - int in = n->index( c->vertex(i) ); - int jn = n->index( c->vertex(j) ); - CGAL_triangulation_precondition - ( orientation( c->vertex(next_around_edge(i,j))->point(), - c->vertex(next_around_edge(j,i))->point(), - n->vertex(next_around_edge(jn,in))->point(), - c->vertex(j)->point() ) == POSITIVE ); - CGAL_triangulation_precondition - ( orientation( c->vertex(i)->point(), - c->vertex(next_around_edge(j,i))->point(), - n->vertex(next_around_edge(jn,in))->point(), - c->vertex(next_around_edge(i,j))->point() ) == POSITIVE ); -#endif - _tds.flip_flippable(c, i, j); -} - -template < class GT, class Tds > -typename Triangulation_3::Vertex_handle -Triangulation_3:: -insert(const Point & p, Cell_handle start) -{ - Locate_type lt; - int li, lj; - Cell_handle c = locate( p, lt, li, lj, start); - return insert(p, lt, c, li, lj); -} - -template < class GT, class Tds > -typename Triangulation_3::Vertex_handle -Triangulation_3:: -insert(const Point & p, Locate_type lt, Cell_handle c, int li, int lj) -{ - switch (lt) { - case VERTEX: - return c->vertex(li); - case EDGE: - return insert_in_edge(p, c, li, lj); - case FACET: - return insert_in_facet(p, c, li); - case CELL: - return insert_in_cell(p, c); - case OUTSIDE_CONVEX_HULL: - return insert_outside_convex_hull(p, c); - case OUTSIDE_AFFINE_HULL: - default: - return insert_outside_affine_hull(p); - } -} - - - -template < class GT, class Tds > -template < class Conflict_tester, class Hidden_points_visitor > -typename Triangulation_3::Vertex_handle -Triangulation_3:: -insert_in_conflict(const Point & p, - Locate_type lt, Cell_handle c, int li, int /*lj*/, - const Conflict_tester &tester, - Hidden_points_visitor &hider) -{ - switch (dimension()) { - case 3: - { - if ((lt == VERTEX) && - (tester.compare_weight(c->vertex(li)->point(), p)==0) ) { - return c->vertex(li); - } - // If the new point is not in conflict with its cell, it is hidden. - if (!tester.test_initial_cell(c)) { - hider.hide_point(c,p); - return Vertex_handle(); - } - - // Ok, we really insert the point now. - // First, find the conflict region. - std::vector cells; - Facet facet; - - cells.reserve(32); - find_conflicts - (c, tester, make_triple(Oneset_iterator(facet), - std::back_inserter(cells), - Emptyset_iterator())); - - // Remember the points that are hidden by the conflicting cells, - // as they will be deleted during the insertion. - hider.process_cells_in_conflict(cells.begin(), cells.end()); - - Vertex_handle v = _insert_in_hole(p, cells.begin(), cells.end(), - facet.first, facet.second); - - // Store the hidden points in their new cells. - hider.reinsert_vertices(v); - return v; - } - case 2: - { - // This check is added compared to the 3D case - if (lt == OUTSIDE_AFFINE_HULL) - return insert_outside_affine_hull (p); - - if ((lt == VERTEX) && - (tester.compare_weight(c->vertex(li)->point(), p)==0) ) { - return c->vertex(li); - } - // If the new point is not in conflict with its cell, it is hidden. - if (!tester.test_initial_cell(c)) { - hider.hide_point(c,p); - return Vertex_handle(); - } - - // Ok, we really insert the point now. - // First, find the conflict region. - std::vector cells; - Facet facet; - - cells.reserve(32); - find_conflicts - (c, tester, make_triple(Oneset_iterator(facet), - std::back_inserter(cells), - Emptyset_iterator())); - - // Remember the points that are hidden by the conflicting cells, - // as they will be deleted during the insertion. - hider.process_cells_in_conflict(cells.begin(), cells.end()); - - Vertex_handle v = _insert_in_hole(p, cells.begin(), cells.end(), - facet.first, facet.second); - - // Store the hidden points in their new cells. - hider.reinsert_vertices(v); - return v; - } - default: - { - // dimension() <= 1 - if (lt == OUTSIDE_AFFINE_HULL) - return insert_outside_affine_hull (p); - - if (lt == VERTEX && - tester.compare_weight(c->vertex(li)->point(), p) == 0) { - return c->vertex(li); - } - - // If the new point is not in conflict with its cell, it is hidden. - if (! tester.test_initial_cell(c)) { - hider.hide_point(c,p); - return Vertex_handle(); - } - - if (dimension() == 0) { - return hider.replace_vertex(c, li, p); - } - - - // dimension() == 1; - - // Ok, we really insert the point now. - // First, find the conflict region. - std::vector cells; - Facet facet; - Cell_handle bound[2]; - // corresponding index: bound[j]->neighbor(1-j) is in conflict. - - // We get all cells in conflict, - // and remember the 2 external boundaries. - cells.push_back(c); - - for (int j = 0; j<2; ++j) { - Cell_handle n = c->neighbor(j); - while ( tester(n) ) { - cells.push_back(n); - n = n->neighbor(j); - } - bound[j] = n; - } - - // Insertion. - hider.process_cells_in_conflict(cells.begin(), cells.end()); - - tds().delete_cells(cells.begin(), cells.end()); - - // We preserve the order (like the orientation in 2D-3D). - Vertex_handle v = tds().create_vertex(); - Cell_handle c0 = tds().create_face(v, bound[0]->vertex(0), Vertex_handle()); - Cell_handle c1 = tds().create_face(bound[1]->vertex(1), v, Vertex_handle()); - tds().set_adjacency(c0, 1, c1, 0); - tds().set_adjacency(bound[0], 1, c0, 0); - tds().set_adjacency(c1, 1, bound[1], 0); - bound[0]->vertex(0)->set_cell(bound[0]); - bound[1]->vertex(1)->set_cell(bound[1]); - v->set_cell(c0); - v->set_point (p); - - hider.reinsert_vertices(v); - - return v; - } - } -} - -template < class GT, class Tds > -typename Triangulation_3::Vertex_handle -Triangulation_3:: -insert_in_cell(const Point & p, Cell_handle c) -{ - CGAL_triangulation_precondition( dimension() == 3 ); - CGAL_triangulation_precondition_code - ( Locate_type lt; - int i; int j; ); - CGAL_triangulation_precondition - ( side_of_tetrahedron( p, - c->vertex(0)->point(), - c->vertex(1)->point(), - c->vertex(2)->point(), - c->vertex(3)->point(), - lt,i,j ) == ON_BOUNDED_SIDE ); - - Vertex_handle v = _tds.insert_in_cell(c); - v->set_point(p); - return v; -} - -template < class GT, class Tds > -inline -typename Triangulation_3::Vertex_handle -Triangulation_3:: -insert_in_facet(const Point & p, Cell_handle c, int i) -{ - CGAL_triangulation_precondition( dimension() == 2 || dimension() == 3); - CGAL_triangulation_precondition( (dimension() == 2 && i == 3) - || (dimension() == 3 && i >= 0 && i <= 3) ); - CGAL_triangulation_exactness_precondition_code - ( Locate_type lt; - int li; int lj; ); - CGAL_triangulation_exactness_precondition - ( coplanar( p, c->vertex((i+1)&3)->point(), - c->vertex((i+2)&3)->point(), - c->vertex((i+3)&3)->point() ) - && - side_of_triangle( p, - c->vertex((i+1)&3)->point(), - c->vertex((i+2)&3)->point(), - c->vertex((i+3)&3)->point(), - lt, li, lj) == ON_BOUNDED_SIDE ); - - Vertex_handle v = _tds.insert_in_facet(c, i); - v->set_point(p); - return v; -} - -template < class GT, class Tds > -typename Triangulation_3::Vertex_handle -Triangulation_3:: -insert_in_edge(const Point & p, Cell_handle c, int i, int j) -{ - CGAL_triangulation_precondition( i != j ); - CGAL_triangulation_precondition( dimension() >= 1 && dimension() <= 3 ); - CGAL_triangulation_precondition( i >= 0 && i <= dimension() - && j >= 0 && j <= dimension() ); - CGAL_triangulation_exactness_precondition_code( Locate_type lt; int li; ); - switch ( dimension() ) { - case 3: - case 2: - { - CGAL_triangulation_precondition( ! is_infinite(c, i, j) ); - CGAL_triangulation_exactness_precondition( - collinear( c->vertex(i)->point(), - p, - c->vertex(j)->point() ) - && side_of_segment( p, - c->vertex(i)->point(), - c->vertex(j)->point(), - lt, li ) == ON_BOUNDED_SIDE ); - break; - } - case 1: - { - CGAL_triangulation_exactness_precondition( side_of_edge(p, c, lt, li) - == ON_BOUNDED_SIDE ); - break; - } - } - - Vertex_handle v = _tds.insert_in_edge(c, i, j); - v->set_point(p); - return v; -} - -template < class GT, class Tds > -typename Triangulation_3::Vertex_handle -Triangulation_3:: -insert_outside_convex_hull(const Point & p, Cell_handle c) - // c is an infinite cell containing p - // p is strictly outside the convex hull - // dimension 0 not allowed, use outside-affine-hull -{ - CGAL_triangulation_precondition( dimension() > 0 ); - CGAL_triangulation_precondition( c->has_vertex(infinite) ); - // the precondition that p is in c is tested in each of the - // insertion methods called from this method - switch ( dimension() ) { - case 1: - { - // // p lies in the infinite edge neighboring c - // // on the other side of li - // return insert_in_edge(p,c->neighbor(1-li),0,1); - return insert_in_edge(p,c,0,1); - } - case 2: - { - Conflict_tester_outside_convex_hull_2 tester(p, this); - Vertex_handle v = insert_conflict(c, tester); - v->set_point(p); - return v; - } - default: // case 3: - { - Conflict_tester_outside_convex_hull_3 tester(p, this); - Vertex_handle v = insert_conflict(c, tester); - v->set_point(p); - return v; - } - } -} - -template < class GT, class Tds > -typename Triangulation_3::Vertex_handle -Triangulation_3:: -insert_outside_affine_hull(const Point & p) -{ - CGAL_triangulation_precondition( dimension() < 3 ); - bool reorient; - switch ( dimension() ) { - case 1: - { - Cell_handle c = infinite_cell(); - Cell_handle n = c->neighbor(c->index(infinite_vertex())); - Orientation o = coplanar_orientation(n->vertex(0)->point(), - n->vertex(1)->point(), p); - CGAL_triangulation_precondition ( o != COLLINEAR ); - reorient = o == NEGATIVE; - break; - } - case 2: - { - Cell_handle c = infinite_cell(); - Cell_handle n = c->neighbor(c->index(infinite_vertex())); - Orientation o = orientation( n->vertex(0)->point(), - n->vertex(1)->point(), - n->vertex(2)->point(), p ); - CGAL_triangulation_precondition ( o != COPLANAR ); - reorient = o == NEGATIVE; - break; - } - default: - reorient = false; - } - - Vertex_handle v = _tds.insert_increase_dimension(infinite_vertex()); - v->set_point(p); - - if (reorient) - _tds.reorient(); - - return v; -} - -template < class GT, class Tds > -template < class OutputItCells > -typename Triangulation_3::Vertex_handle -Triangulation_3::insert_and_give_new_cells(const Point &p, - OutputItCells fit, - Cell_handle start) -{ - Vertex_handle v = insert(p, start); - int dimension = this->dimension(); - if(dimension == 3) this->incident_cells(v, fit); - else if(dimension == 2) - { - Cell_handle c = v->cell(), end = c; - do { - *fit++ = c; - int i = c->index(v); - c = c->neighbor((i+1)%3); - } while(c != end); - } - else if(dimension == 1) - { - Cell_handle c = v->cell(); - *fit++ = c; - *fit++ = c->neighbor((~(c->index(v)))&1); - } - else *fit++ = v->cell(); // dimension = 0 - return v; -} - -template < class GT, class Tds > -template < class OutputItCells > -typename Triangulation_3::Vertex_handle -Triangulation_3::insert_and_give_new_cells(const Point& p, - OutputItCells fit, - Vertex_handle hint) -{ - Vertex_handle v = insert(p, hint); - int dimension = this->dimension(); - if(dimension == 3) this->incident_cells(v, fit); - else if(dimension == 2) - { - Cell_handle c = v->cell(), end = c; - do { - *fit++ = c; - int i = c->index(v); - c = c->neighbor((i+1)%3); - } while(c != end); - } - else if(dimension == 1) - { - Cell_handle c = v->cell(); - *fit++ = c; - *fit++ = c->neighbor((~(c->index(v)))&1); - } - else *fit++ = v->cell(); // dimension = 0 - return v; -} - -template < class GT, class Tds > -template < class OutputItCells > -typename Triangulation_3::Vertex_handle -Triangulation_3::insert_and_give_new_cells(const Point& p, - Locate_type lt, - Cell_handle c, int li, int lj, - OutputItCells fit) -{ - Vertex_handle v = insert(p, lt, c, li, lj); - int dimension = this->dimension(); - if(dimension == 3) this->incident_cells(v, fit); - else if(dimension == 2) - { - Cell_handle c = v->cell(), end = c; - do { - *fit++ = c; - int i = c->index(v); - c = c->neighbor((i+1)%3); - } while(c != end); - } - else if(dimension == 1) - { - Cell_handle c = v->cell(); - *fit++ = c; - *fit++ = c->neighbor((~(c->index(v)))&1); - } - else *fit++ = v->cell(); // dimension = 0 - return v; -} - -template < class Gt, class Tds > -typename Triangulation_3::Vertex_triple -Triangulation_3:: -make_vertex_triple(const Facet& f) const -{ - Cell_handle ch = f.first; - int i = f.second; - - return Vertex_triple(ch->vertex(vertex_triple_index(i,0)), - ch->vertex(vertex_triple_index(i,1)), - ch->vertex(vertex_triple_index(i,2))); -} - -template < class Gt, class Tds > -void -Triangulation_3:: -make_canonical(Vertex_triple& t) const -{ - int i = (&*(t.first) < &*(t.second))? 0 : 1; - if(i==0) { - i = (&*(t.first) < &*(t.third))? 0 : 2; - } else { - i = (&*(t.second) < &*(t.third))? 1 : 2; - } - Vertex_handle tmp; - switch(i){ - case 0: return; - case 1: - tmp = t.first; - t.first = t.second; - t.second = t.third; - t.third = tmp; - return; - default: - tmp = t.first; - t.first = t.third; - t.third = t.second; - t.second = tmp; - } -} - -template < class GT, class Tds > -bool -Triangulation_3:: -test_dim_down(Vertex_handle v) const - // tests whether removing v decreases the dimension of the triangulation - // true iff - // v is incident to all finite cells/facets - // and all the other vertices are coplanar/collinear in dim3/2. -{ - CGAL_triangulation_precondition(dimension() >= 0); - CGAL_triangulation_precondition(! is_infinite(v) ); - - if (dimension() == 3) { - Finite_cells_iterator cit = finite_cells_begin(); - - int iv; - if ( ! cit->has_vertex(v,iv) ) - return false; - const Point &p1=cit->vertex((iv+1)&3)->point(); - const Point &p2=cit->vertex((iv+2)&3)->point(); - const Point &p3=cit->vertex((iv+3)&3)->point(); - ++cit; - - for (; cit != finite_cells_end(); ++cit ) { - if ( ! cit->has_vertex(v,iv) ) - return false; - for (int i=1; i<4; i++ ) - if ( !coplanar(p1,p2,p3,cit->vertex((iv+i)&3)->point()) ) - return false; - } - } - else if (dimension() == 2) - { - Finite_facets_iterator cit = finite_facets_begin(); - - int iv; - if ( ! cit->first->has_vertex(v,iv) ) - return false; - const Point &p1 = cit->first->vertex(cw(iv))->point(); - const Point &p2 = cit->first->vertex(ccw(iv))->point(); - ++cit; - - for (; cit != finite_facets_end(); ++cit ) { - if ( ! cit->first->has_vertex(v,iv) ) - return false; - if ( !collinear(p1, p2, cit->first->vertex(cw(iv))->point()) || - !collinear(p1, p2, cit->first->vertex(ccw(iv))->point()) ) - return false; - } - } - else // dimension() == 1 or 0 - return number_of_vertices() == (size_type) dimension() + 1; - - return true; -} - -template -template < class VertexRemover > -VertexRemover& -Triangulation_3:: -make_hole_2D(Vertex_handle v, std::list &hole, VertexRemover &remover) -{ - std::vector to_delete; - to_delete.reserve(32); - - Face_circulator fc = tds().incident_faces(v); - Face_circulator done(fc); - - // We prepare for deleting all interior cells. - // We ->set_cell() pointers to cells outside the hole. - // We push the Edges_2D of the boundary (seen from outside) in "hole". - do { - Cell_handle f = fc; - int i = f->index(v); - Cell_handle fn = f->neighbor(i); - int in = fn->index(f); - - f->vertex(cw(i))->set_cell(fn); - fn->set_neighbor(in, Cell_handle()); - - hole.push_back(Edge_2D(fn, in)); - remover.add_hidden_points(f); - to_delete.push_back(f); - - ++fc; - } while (fc != done); - - tds().delete_cells(to_delete.begin(), to_delete.end()); - return remover; -} - -// this one also erases a set of cells -// which is useful to the move method -// outputting newly created cells -template -template < class VertexRemover > -VertexRemover& -Triangulation_3:: -make_hole_2D(Vertex_handle v, std::list &hole, VertexRemover &remover, - std::set &cells_set) -{ - std::vector to_delete; - to_delete.reserve(32); - - Face_circulator fc = tds().incident_faces(v); - Face_circulator done(fc); - - // We prepare for deleting all interior cells. - // We ->set_cell() pointers to cells outside the hole. - // We push the Edges_2D of the boundary (seen from outside) in "hole". - do { - Cell_handle f = fc; - int i = f->index(v); - Cell_handle fn = f->neighbor(i); - int in = fn->index(f); - - f->vertex(cw(i))->set_cell(fn); - fn->set_neighbor(in, Cell_handle()); - - hole.push_back(Edge_2D(fn, in)); - remover.add_hidden_points(f); - to_delete.push_back(f); - - ++fc; - } while (fc != done); - - for(typename std::vector::const_iterator ib = to_delete.begin(), - iend = to_delete.end(); ib != iend; ib++) cells_set.erase(*ib); - - tds().delete_cells(to_delete.begin(), to_delete.end()); - return remover; -} - -template -template < class VertexRemover > -void -Triangulation_3:: -fill_hole_2D(std::list & first_hole, VertexRemover &remover) -{ - typedef std::list Hole; - - std::vector hole_list; - - Cell_handle f, ff, fn; - int i, ii, in; - - hole_list.push_back(first_hole); - - while( ! hole_list.empty()) - { - Hole hole = hole_list.back(); - hole_list.pop_back(); - - // if the hole has only three edges, create the triangle - if (hole.size() == 3) { - typename Hole::iterator hit = hole.begin(); - f = (*hit).first; i = (*hit).second; - ff = (* ++hit).first; ii = (*hit).second; - fn = (* ++hit).first; in = (*hit).second; - tds().create_face(f, i, ff, ii, fn, in); - continue; - } - - // else find an edge with two finite vertices - // on the hole boundary - // and the new triangle adjacent to that edge - // cut the hole and push it back - - // first, ensure that a neighboring face - // whose vertices on the hole boundary are finite - // is the first of the hole - while (1) { - ff = (hole.front()).first; - ii = (hole.front()).second; - if ( is_infinite(ff->vertex(cw(ii))) || - is_infinite(ff->vertex(ccw(ii)))) { - hole.push_back(hole.front()); - hole.pop_front(); - } - else - break; - } - - // take the first neighboring face and pop it; - ff = (hole.front()).first; - ii = (hole.front()).second; - hole.pop_front(); - - Vertex_handle v0 = ff->vertex(cw(ii)); - Vertex_handle v1 = ff->vertex(ccw(ii)); - Vertex_handle v2 = infinite_vertex(); - const Point &p0 = v0->point(); - const Point &p1 = v1->point(); - const Point *p2 = NULL; // Initialize to NULL to avoid warning. - - typename Hole::iterator hdone = hole.end(); - typename Hole::iterator hit = hole.begin(); - typename Hole::iterator cut_after(hit); - - // if tested vertex is c with respect to the vertex opposite - // to NULL neighbor, - // stop at the before last face; - hdone--; - for (; hit != hdone; ++hit) { - fn = hit->first; - in = hit->second; - Vertex_handle vv = fn->vertex(ccw(in)); - if (is_infinite(vv)) { - if (is_infinite(v2)) - cut_after = hit; - } - else { // vv is a finite vertex - const Point &p = vv->point(); - if (coplanar_orientation(p0, p1, p) == COUNTERCLOCKWISE) { - if (is_infinite(v2) || - remover.side_of_bounded_circle(p0, p1, *p2, p, true) - == ON_BOUNDED_SIDE) { - v2 = vv; - p2 = &p; - cut_after = hit; - } - } - } - } - - // create new triangle and update adjacency relations - Cell_handle newf; - - //update the hole and push back in the Hole_List stack - // if v2 belongs to the neighbor following or preceding *f - // the hole remain a single hole - // otherwise it is split in two holes - - fn = (hole.front()).first; - in = (hole.front()).second; - if (fn->has_vertex(v2, i) && i == ccw(in)) { - newf = tds().create_face(ff, ii, fn, in); - hole.pop_front(); - hole.push_front(Edge_2D(newf, 1)); - hole_list.push_back(hole); - } - else{ - fn = (hole.back()).first; - in = (hole.back()).second; - if (fn->has_vertex(v2, i) && i == cw(in)) { - newf = tds().create_face(fn, in, ff, ii); - hole.pop_back(); - hole.push_back(Edge_2D(newf, 1)); - hole_list.push_back(hole); - } - else{ - // split the hole in two holes - newf = tds().create_face(ff, ii, v2); - Hole new_hole; - ++cut_after; - while( hole.begin() != cut_after ) - { - new_hole.push_back(hole.front()); - hole.pop_front(); - } - - hole.push_front(Edge_2D(newf, 1)); - new_hole.push_front(Edge_2D(newf, 0)); - hole_list.push_back(hole); - hole_list.push_back(new_hole); - } - } - } -} - -template -template < class VertexRemover, class OutputItCells > -void -Triangulation_3:: -fill_hole_2D(std::list & first_hole, VertexRemover &remover, - OutputItCells fit) -{ - typedef std::list Hole; - - std::vector hole_list; - - Cell_handle f, ff, fn; - int i, ii, in; - - hole_list.push_back(first_hole); - - while( ! hole_list.empty()) - { - Hole hole = hole_list.back(); - hole_list.pop_back(); - - // if the hole has only three edges, create the triangle - if (hole.size() == 3) { - typename Hole::iterator hit = hole.begin(); - f = (*hit).first; i = (*hit).second; - ff = (* ++hit).first; ii = (*hit).second; - fn = (* ++hit).first; in = (*hit).second; - *fit++ = tds().create_face(f, i, ff, ii, fn, in); - continue; - } - - // else find an edge with two finite vertices - // on the hole boundary - // and the new triangle adjacent to that edge - // cut the hole and push it back - - // first, ensure that a neighboring face - // whose vertices on the hole boundary are finite - // is the first of the hole - while (1) { - ff = (hole.front()).first; - ii = (hole.front()).second; - if ( is_infinite(ff->vertex(cw(ii))) || - is_infinite(ff->vertex(ccw(ii)))) { - hole.push_back(hole.front()); - hole.pop_front(); - } - else - break; - } - - // take the first neighboring face and pop it; - ff = (hole.front()).first; - ii = (hole.front()).second; - hole.pop_front(); - - Vertex_handle v0 = ff->vertex(cw(ii)); - Vertex_handle v1 = ff->vertex(ccw(ii)); - Vertex_handle v2 = infinite_vertex(); - const Point &p0 = v0->point(); - const Point &p1 = v1->point(); - const Point *p2 = NULL; // Initialize to NULL to avoid warning. - - typename Hole::iterator hdone = hole.end(); - typename Hole::iterator hit = hole.begin(); - typename Hole::iterator cut_after(hit); - - // if tested vertex is c with respect to the vertex opposite - // to NULL neighbor, - // stop at the before last face; - hdone--; - for (; hit != hdone; ++hit) { - fn = hit->first; - in = hit->second; - Vertex_handle vv = fn->vertex(ccw(in)); - if (is_infinite(vv)) { - if (is_infinite(v2)) - cut_after = hit; - } - else { // vv is a finite vertex - const Point &p = vv->point(); - if (coplanar_orientation(p0, p1, p) == COUNTERCLOCKWISE) { - if (is_infinite(v2) || - remover.side_of_bounded_circle(p0, p1, *p2, p, true) - == ON_BOUNDED_SIDE) { - v2 = vv; - p2 = &p; - cut_after = hit; - } - } - } - } - - // create new triangle and update adjacency relations - Cell_handle newf; - - //update the hole and push back in the Hole_List stack - // if v2 belongs to the neighbor following or preceding *f - // the hole remain a single hole - // otherwise it is split in two holes - - fn = (hole.front()).first; - in = (hole.front()).second; - if (fn->has_vertex(v2, i) && i == ccw(in)) { - newf = tds().create_face(ff, ii, fn, in); - hole.pop_front(); - hole.push_front(Edge_2D(newf, 1)); - hole_list.push_back(hole); - } else { - fn = (hole.back()).first; - in = (hole.back()).second; - if (fn->has_vertex(v2, i) && i == cw(in)) { - newf = tds().create_face(fn, in, ff, ii); - hole.pop_back(); - hole.push_back(Edge_2D(newf, 1)); - hole_list.push_back(hole); - } else { - // split the hole in two holes - newf = tds().create_face(ff, ii, v2); - Hole new_hole; - ++cut_after; - while( hole.begin() != cut_after ) - { - new_hole.push_back(hole.front()); - hole.pop_front(); - } - hole.push_front(Edge_2D(newf, 1)); - new_hole.push_front(Edge_2D(newf, 0)); - hole_list.push_back(hole); - hole_list.push_back(new_hole); - } - } - - *fit++ = newf; - - } -} - -template < class Gt, class Tds > -void -Triangulation_3:: -make_hole_3D( Vertex_handle v, - std::map& outer_map, - std::vector & hole) -{ - CGAL_triangulation_expensive_precondition( ! test_dim_down(v) ); - - incident_cells(v, std::back_inserter(hole)); - - for (typename std::vector::iterator cit = hole.begin(), - end = hole.end(); cit != end; ++cit) { - int indv = (*cit)->index(v); - Cell_handle opp_cit = (*cit)->neighbor( indv ); - Facet f(opp_cit, opp_cit->index(*cit)); - Vertex_triple vt = make_vertex_triple(f); - make_canonical(vt); - outer_map[vt] = f; - for (int i=0; i<4; i++) - if ( i != indv ) - (*cit)->vertex(i)->set_cell(opp_cit); - } -} - -template < class Gt, class Tds > -template < class VertexRemover > -VertexRemover& -Triangulation_3:: -remove_dim_down(Vertex_handle v, VertexRemover &remover) -{ - CGAL_triangulation_precondition (dimension() >= 0); - - // Collect all the hidden points. - for (All_cells_iterator ci = tds().raw_cells_begin(), - end = tds().raw_cells_end(); ci != end; ++ci) - remover.add_hidden_points(ci); - - tds().remove_decrease_dimension(v, infinite_vertex()); - - // Now try to see if we need to re-orient. - if (dimension() == 2) { - Facet f = *finite_facets_begin(); - if (coplanar_orientation(f.first->vertex(0)->point(), - f.first->vertex(1)->point(), - f.first->vertex(2)->point()) == NEGATIVE) - tds().reorient(); - } - - return remover; -} - -template < class Gt, class Tds > -template < class VertexRemover > -VertexRemover& -Triangulation_3:: -remove_1D(Vertex_handle v, VertexRemover &remover) -{ - CGAL_triangulation_precondition (dimension() == 1); - - Cell_handle c1 = v->cell(); - Cell_handle c2 = c1->neighbor(c1->index(v) == 0 ? 1 : 0); - remover.add_hidden_points(c1); - remover.add_hidden_points(c2); - - tds().remove_from_maximal_dimension_simplex (v); - - return remover; -} - -template < class Gt, class Tds > -template < class VertexRemover > -VertexRemover& -Triangulation_3:: -remove_2D(Vertex_handle v, VertexRemover &remover) -{ - CGAL_triangulation_precondition(dimension() == 2); - std::list hole; - make_hole_2D(v, hole, remover); - fill_hole_2D(hole, remover); - tds().delete_vertex(v); - return remover; -} - -template < class Gt, class Tds > -template < class VertexRemover > -VertexRemover& -Triangulation_3:: -remove_3D(Vertex_handle v, VertexRemover &remover) -{ - std::vector hole; - hole.reserve(64); - - // Construct the set of vertex triples on the boundary - // with the facet just behind - typedef std::map Vertex_triple_Facet_map; - Vertex_triple_Facet_map outer_map; - Vertex_triple_Facet_map inner_map; - - make_hole_3D(v, outer_map, hole); - CGAL_assertion(remover.hidden_points_begin() == - remover.hidden_points_end() ); - - // Output the hidden points. - for (typename std::vector::iterator - hi = hole.begin(), hend = hole.end(); hi != hend; ++hi) - remover.add_hidden_points(*hi); - - bool inf = false; - unsigned int i; - // collect all vertices on the boundary - std::vector vertices; - vertices.reserve(64); - - adjacent_vertices(v, std::back_inserter(vertices)); - - // create a Delaunay triangulation of the points on the boundary - // and make a map from the vertices in remover.tmp towards the vertices - // in *this - - Unique_hash_map vmap; - Cell_handle ch = Cell_handle(); - for(i=0; i < vertices.size(); i++){ - if(! is_infinite(vertices[i])){ - Vertex_handle vh = remover.tmp.insert(vertices[i]->point(), ch); - ch = vh->cell(); - vmap[vh] = vertices[i]; - }else { - inf = true; - } - } - - if(remover.tmp.dimension()==2){ - Vertex_handle fake_inf = remover.tmp.insert(v->point()); - vmap[fake_inf] = infinite_vertex(); - } else { - vmap[remover.tmp.infinite_vertex()] = infinite_vertex(); - } - - CGAL_triangulation_assertion(remover.tmp.dimension() == 3); - - // Construct the set of vertex triples of remover.tmp - // We reorient the vertex triple so that it matches those from outer_map - // Also note that we use the vertices of *this, not of remover.tmp - - if(inf){ - for(All_cells_iterator it = remover.tmp.all_cells_begin(), - end = remover.tmp.all_cells_end(); it != end; ++it){ - for(i=0; i < 4; i++){ - Facet f = std::pair(it,i); - Vertex_triple vt_aux = make_vertex_triple(f); - Vertex_triple vt(vmap[vt_aux.first],vmap[vt_aux.third],vmap[vt_aux.second]); - make_canonical(vt); - inner_map[vt]= f; - } - } - } else { - for(Finite_cells_iterator it = remover.tmp.finite_cells_begin(), - end = remover.tmp.finite_cells_end(); it != end; ++it){ - for(i=0; i < 4; i++){ - Facet f = std::pair(it,i); - Vertex_triple vt_aux = make_vertex_triple(f); - Vertex_triple vt(vmap[vt_aux.first],vmap[vt_aux.third],vmap[vt_aux.second]); - make_canonical(vt); - inner_map[vt]= f; - } - } - } - // Grow inside the hole, by extending the surface - while(! outer_map.empty()){ - typename Vertex_triple_Facet_map::iterator oit = outer_map.begin(); - while(is_infinite(oit->first.first) || - is_infinite(oit->first.second) || - is_infinite(oit->first.third)){ - ++oit; - // otherwise the lookup in the inner_map fails - // because the infinite vertices are different - } - typename Vertex_triple_Facet_map::value_type o_vt_f_pair = *oit; - Cell_handle o_ch = o_vt_f_pair.second.first; - unsigned int o_i = o_vt_f_pair.second.second; - - typename Vertex_triple_Facet_map::iterator iit = - inner_map.find(o_vt_f_pair.first); - CGAL_triangulation_assertion(iit != inner_map.end()); - typename Vertex_triple_Facet_map::value_type i_vt_f_pair = *iit; - Cell_handle i_ch = i_vt_f_pair.second.first; - unsigned int i_i = i_vt_f_pair.second.second; - - // create a new cell and glue it to the outer surface - Cell_handle new_ch = tds().create_cell(); - new_ch->set_vertices(vmap[i_ch->vertex(0)], vmap[i_ch->vertex(1)], - vmap[i_ch->vertex(2)], vmap[i_ch->vertex(3)]); - - o_ch->set_neighbor(o_i,new_ch); - new_ch->set_neighbor(i_i, o_ch); - - // for the other faces check, if they can also be glued - for(i = 0; i < 4; i++){ - if(i != i_i){ - Facet f = std::pair(new_ch,i); - Vertex_triple vt = make_vertex_triple(f); - make_canonical(vt); - std::swap(vt.second,vt.third); - typename Vertex_triple_Facet_map::iterator oit2 = outer_map.find(vt); - if(oit2 == outer_map.end()){ - std::swap(vt.second,vt.third); - outer_map[vt]= f; - } else { - // glue the faces - typename Vertex_triple_Facet_map::value_type o_vt_f_pair2 = *oit2; - Cell_handle o_ch2 = o_vt_f_pair2.second.first; - int o_i2 = o_vt_f_pair2.second.second; - o_ch2->set_neighbor(o_i2,new_ch); - new_ch->set_neighbor(i, o_ch2); - outer_map.erase(oit2); - } - } - } - outer_map.erase(oit); - } - tds().delete_vertex(v); - tds().delete_cells(hole.begin(), hole.end()); - - return remover; -} - -template < class Gt, class Tds > -template < class VertexRemover > -void -Triangulation_3:: -remove(Vertex_handle v, VertexRemover &remover) { - CGAL_triangulation_precondition( v != Vertex_handle()); - CGAL_triangulation_precondition( !is_infinite(v)); - CGAL_triangulation_expensive_precondition( tds().is_vertex(v) ); - - if (test_dim_down (v)) { - remove_dim_down (v, remover); - } - else { - switch (dimension()) { - case 1: remove_1D (v, remover); break; - case 2: remove_2D (v, remover); break; - case 3: remove_3D (v, remover); break; - default: - CGAL_triangulation_assertion (false); - } - } -} - -// The remove here uses the remover, but -// no function envolving hidden points -// will be used in this internal version -template < class Gt, class Tds > -template < class VertexRemover, class OutputItCells > -VertexRemover& -Triangulation_3:: -remove_dim_down(Vertex_handle v, VertexRemover &remover, OutputItCells fit) { - remove_dim_down(v, remover); - for(All_cells_iterator afi = tds().raw_cells_begin(); - afi != tds().raw_cells_end(); - afi++) *fit++ = afi; -} - -template < class Gt, class Tds > -template < class VertexRemover, class OutputItCells > -VertexRemover& -Triangulation_3:: -remove_1D(Vertex_handle v, VertexRemover &remover, OutputItCells fit) { - Point p = v->point(); - remove_1D(v, remover); - *fit++ = locate(p); -} - -template < class Gt, class Tds > -template < class VertexRemover, class OutputItCells > -VertexRemover& -Triangulation_3:: -remove_2D(Vertex_handle v, VertexRemover &remover, OutputItCells fit) { - CGAL_triangulation_precondition(dimension() == 2); - std::list hole; - make_hole_2D(v, hole, remover); - fill_hole_2D(hole, remover, fit); - tds().delete_vertex(v); - return remover; -} - -template < class Gt, class Tds > -template < class VertexRemover, class OutputItCells > -VertexRemover& -Triangulation_3:: -remove_3D(Vertex_handle v, VertexRemover &remover, OutputItCells fit) { - CGAL_triangulation_precondition(dimension() == 3); - - std::vector hole; - hole.reserve(64); - - // Construct the set of vertex triples on the boundary - // with the facet just behind - typedef std::map Vertex_triple_Facet_map; - Vertex_triple_Facet_map outer_map; - Vertex_triple_Facet_map inner_map; - - make_hole_3D(v, outer_map, hole); - - CGAL_assertion(remover.hidden_points_begin() == - remover.hidden_points_end() ); - - // Output the hidden points. - for (typename std::vector::iterator - hi = hole.begin(), hend = hole.end(); hi != hend; ++hi) - remover.add_hidden_points(*hi); - - bool inf = false; - unsigned int i; - // collect all vertices on the boundary - std::vector vertices; - vertices.reserve(64); - - adjacent_vertices(v, std::back_inserter(vertices)); - - // create a Delaunay triangulation of the points on the boundary - // and make a map from the vertices in remover.tmp towards the vertices - // in *this - - Unique_hash_map vmap; - Cell_handle ch = Cell_handle(); - for(i=0; i < vertices.size(); i++){ - if(! is_infinite(vertices[i])){ - Vertex_handle vh = remover.tmp.insert(vertices[i]->point(), ch); - ch = vh->cell(); - vmap[vh] = vertices[i]; - }else { - inf = true; - } - } - - if(remover.tmp.dimension()==2){ - Vertex_handle fake_inf = remover.tmp.insert(v->point()); - vmap[fake_inf] = infinite_vertex(); - } else { - vmap[remover.tmp.infinite_vertex()] = infinite_vertex(); - } - - CGAL_triangulation_assertion(remover.tmp.dimension() == 3); - - // Construct the set of vertex triples of remover.tmp - // We reorient the vertex triple so that it matches those from outer_map - // Also note that we use the vertices of *this, not of remover.tmp - - if(inf){ - for(All_cells_iterator it = remover.tmp.all_cells_begin(), - end = remover.tmp.all_cells_end(); it != end; ++it) - { - for(i=0; i < 4; i++){ - Facet f = std::pair(it,i); - Vertex_triple vt_aux = make_vertex_triple(f); - Vertex_triple vt(vmap[vt_aux.first],vmap[vt_aux.third],vmap[vt_aux.second]); - make_canonical(vt); - inner_map[vt]= f; - } - } - } else { - for(Finite_cells_iterator it = remover.tmp.finite_cells_begin(), - end = remover.tmp.finite_cells_end(); it != end; ++it) - { - for(i=0; i < 4; i++){ - Facet f = std::pair(it,i); - Vertex_triple vt_aux = make_vertex_triple(f); - Vertex_triple vt(vmap[vt_aux.first],vmap[vt_aux.third],vmap[vt_aux.second]); - make_canonical(vt); - inner_map[vt]= f; - } - } - } - // Grow inside the hole, by extending the surface - while(! outer_map.empty()){ - typename Vertex_triple_Facet_map::iterator oit = outer_map.begin(); - while(is_infinite(oit->first.first) || - is_infinite(oit->first.second) || - is_infinite(oit->first.third)){ - ++oit; - // otherwise the lookup in the inner_map fails - // because the infinite vertices are different - } - typename Vertex_triple_Facet_map::value_type o_vt_f_pair = *oit; - Cell_handle o_ch = o_vt_f_pair.second.first; - unsigned int o_i = o_vt_f_pair.second.second; - - typename Vertex_triple_Facet_map::iterator iit = - inner_map.find(o_vt_f_pair.first); - CGAL_triangulation_assertion(iit != inner_map.end()); - typename Vertex_triple_Facet_map::value_type i_vt_f_pair = *iit; - Cell_handle i_ch = i_vt_f_pair.second.first; - unsigned int i_i = i_vt_f_pair.second.second; - - // create a new cell and glue it to the outer surface - Cell_handle new_ch = tds().create_cell(); - *fit++ = new_ch; - - new_ch->set_vertices(vmap[i_ch->vertex(0)], vmap[i_ch->vertex(1)], - vmap[i_ch->vertex(2)], vmap[i_ch->vertex(3)]); - - o_ch->set_neighbor(o_i,new_ch); - new_ch->set_neighbor(i_i, o_ch); - - // for the other faces check, if they can also be glued - for(i = 0; i < 4; i++){ - if(i != i_i){ - Facet f = std::pair(new_ch,i); - Vertex_triple vt = make_vertex_triple(f); - make_canonical(vt); - std::swap(vt.second,vt.third); - typename Vertex_triple_Facet_map::iterator oit2 = outer_map.find(vt); - if(oit2 == outer_map.end()){ - std::swap(vt.second,vt.third); - outer_map[vt]= f; - } else { - // glue the faces - typename Vertex_triple_Facet_map::value_type o_vt_f_pair2 = *oit2; - Cell_handle o_ch2 = o_vt_f_pair2.second.first; - int o_i2 = o_vt_f_pair2.second.second; - o_ch2->set_neighbor(o_i2,new_ch); - new_ch->set_neighbor(i, o_ch2); - outer_map.erase(oit2); - } - } - } - outer_map.erase(oit); - } - tds().delete_vertex(v); - tds().delete_cells(hole.begin(), hole.end()); - - return remover; -} - - -template < class Gt, class Tds > -template < class VertexRemover, class OutputItCells > -void -Triangulation_3:: -remove_and_give_new_cells(Vertex_handle v, VertexRemover &remover, - OutputItCells fit) { - CGAL_triangulation_precondition( v != Vertex_handle()); - CGAL_triangulation_precondition( !is_infinite(v)); - CGAL_triangulation_expensive_precondition( tds().is_vertex(v) ); - - if (test_dim_down (v)) { - remove_dim_down (v, remover, fit); - } - else { - switch (dimension()) { - case 1: remove_1D (v, remover, fit); break; - case 2: remove_2D (v, remover, fit); break; - case 3: remove_3D (v, remover, fit); break; - default: - CGAL_triangulation_assertion (false); - } - } -} - -// The VertexInserter is needed so as to -// allow us the usage of the insertion method -// from the particular triangulation -template -template < class VertexRemover, class VertexInserter > -typename Triangulation_3::Vertex_handle -Triangulation_3:: -move_if_no_collision(Vertex_handle v, const Point &p, - VertexRemover &remover, VertexInserter &inserter) { - CGAL_assertion(remover.hidden_points_begin() == - remover.hidden_points_end() ); - CGAL_triangulation_precondition(!is_infinite(v)); - if(v->point() == p) return v; - const int dim = dimension(); - - // If displacements are known to be small - // we might want to optimize by checking - // whether there is a topological change - // or not before. - // In this version this will not be put inside this method - // because it is for general purposes, - // and remaining Delaunay after motion is a bit too restrictive. - // In the filtered version optimized for displacements - // it will be used as an a priori. - // However, a non-fully optimized but good version of - // is_delaunay_after_displacement is provided as an internal method of - // Delaunay_triangulation_3 (see the class for more details). - - Locate_type lt; - int li, lj; - Cell_handle loc = locate(p, lt, li, lj, v->cell()); - - if(lt == VERTEX) return loc->vertex(li); - - if(dim == 0) { - v->set_point(p); - return v; - } - - size_type n_vertices = tds().number_of_vertices(); - - if((lt == OUTSIDE_AFFINE_HULL) && (dim == 1) && (n_vertices == 3)) { - v->set_point(p); - return v; - } - - if((lt == OUTSIDE_AFFINE_HULL) && (dim == 2) && (n_vertices == 4)) { - v->set_point(p); - return v; - } - - if((lt != OUTSIDE_AFFINE_HULL) && (dim == 1)) { - - if(loc->has_vertex(v)) { - v->set_point(p); - } else { - Vertex_handle inserted = insert(p, lt, loc, li, lj); - Cell_handle f = v->cell(); - int i = f->index(v); - if (i==0) {f = f->neighbor(1);} - CGAL_triangulation_assertion(f->index(v) == 1); - Cell_handle g= f->neighbor(0); - f->set_vertex(1, g->vertex(1)); - f->set_neighbor(0,g->neighbor(0)); - g->neighbor(0)->set_neighbor(1,f); - g->vertex(1)->set_cell(f); - tds().delete_cell(g); - Cell_handle f_ins = inserted->cell(); - i = f_ins->index(inserted); - if (i==0) {f_ins = f_ins->neighbor(1);} - CGAL_triangulation_assertion(f_ins->index(inserted) == 1); - Cell_handle g_ins = f_ins->neighbor(0); - f_ins->set_vertex(1, v); - g_ins->set_vertex(0, v); - v->set_point(p); - v->set_cell(inserted->cell()); - tds().delete_vertex(inserted); - } - return v; - } - - bool dim_down = test_dim_down(v); - - if((lt != OUTSIDE_AFFINE_HULL) && dim_down && (dim == 2)) { - // verify if p and two static vertices are collinear in this case - int iinf; - Cell_handle finf = infinite_vertex()->cell(), fdone; - fdone = finf; - do { - iinf = finf->index(infinite_vertex()); - if(!finf->has_vertex(v)) break; - finf = finf->neighbor((iinf+1)%3); - } while(finf != fdone); - iinf = ~iinf; - if(this->collinear(finf->vertex(iinf&1)->point(), - finf->vertex(iinf&2)->point(), - p)) - { - v->set_point(p); - _tds.decrease_dimension(loc, loc->index(v)); - return v; - } - } - - if(((dim == 2) && (lt != OUTSIDE_AFFINE_HULL)) || - ((lt == OUTSIDE_AFFINE_HULL) && (dim == 1))) - { - - // This is insert must be from Delaunay (or the particular trian.) - // not Triangulation_3 ! - Vertex_handle inserted = inserter.insert(p, lt, loc, li, lj); - - std::list hole; - make_hole_2D(v, hole, remover); - fill_hole_2D(hole, remover); - - // fixing pointer - Cell_handle fc = inserted->cell(), done(fc); - std::vector faces_pt; - faces_pt.reserve(16); - do { - faces_pt.push_back(fc); - fc = fc->neighbor((fc->index(inserted) + 1)%3); - } while(fc != done); - std::size_t ss = faces_pt.size(); - for(std::size_t k=0; kindex(inserted); - f->set_vertex(i, v); - } - v->set_point(p); - v->set_cell(inserted->cell()); - - tds().delete_vertex(inserted); - - return v; - } - - if((lt != OUTSIDE_AFFINE_HULL) && dim_down && (dim == 3)) { - // verify if p and two static vertices are collinear in this case - std::vector ics; - incident_cells(infinite_vertex(), std::back_inserter(ics)); - std::size_t size = ics.size(); - Cell_handle finf; - for (std::size_t i=0; ihas_vertex(v)) break; - } - int iinf = finf->index(infinite_vertex()); - if(remover.tmp.coplanar(finf->vertex((iinf+1)&3)->point(), - finf->vertex((iinf+2)&3)->point(), - finf->vertex((iinf+3)&3)->point(), - p)) - { - v->set_point(p); - _tds.decrease_dimension(loc, loc->index(v)); - Facet f = *finite_facets_begin(); - if (coplanar_orientation(f.first->vertex(0)->point(), - f.first->vertex(1)->point(), - f.first->vertex(2)->point()) == NEGATIVE) - tds().reorient(); - restore_edges_after_decrease_dimension(v, remover,inserter); - return v; - } - } - - // This is insert must be from Delaunay (or the particular trian.) - // not Triangulation_3 ! - Vertex_handle inserted = inserter.insert(p, lt, loc, li, lj); - - std::vector hole; - hole.reserve(64); - - // Construct the set of vertex triples on the boundary - // with the facet just behind - typedef std::map Vertex_triple_Facet_map; - Vertex_triple_Facet_map outer_map; - Vertex_triple_Facet_map inner_map; - - make_hole_3D(v, outer_map, hole); - - CGAL_assertion(remover.hidden_points_begin() == - remover.hidden_points_end() ); - - // Output the hidden points. - for (typename std::vector::iterator - hi = hole.begin(), hend = hole.end(); hi != hend; ++hi) - remover.add_hidden_points(*hi); - - bool inf = false; - unsigned int i; - // collect all vertices on the boundary - std::vector vertices; - vertices.reserve(64); - - adjacent_vertices(v, std::back_inserter(vertices)); - - // create a Delaunay triangulation of the points on the boundary - // and make a map from the vertices in remover.tmp towards the vertices - // in *this - - Unique_hash_map vmap; - Cell_handle ch = Cell_handle(); - for(i=0; i < vertices.size(); i++){ - if(! is_infinite(vertices[i])){ - Vertex_handle vh = remover.tmp.insert(vertices[i]->point(), ch); - ch = vh->cell(); - vmap[vh] = vertices[i]; - }else { - inf = true; - } - } - - if(remover.tmp.dimension()==2){ - Vertex_handle fake_inf = remover.tmp.insert(v->point()); - vmap[fake_inf] = infinite_vertex(); - } else { - vmap[remover.tmp.infinite_vertex()] = infinite_vertex(); - } - - CGAL_triangulation_assertion(remover.tmp.dimension() == 3); - - // Construct the set of vertex triples of remover.tmp - // We reorient the vertex triple so that it matches those from outer_map - // Also note that we use the vertices of *this, not of remover.tmp - - if(inf){ - for(All_cells_iterator it = remover.tmp.all_cells_begin(), - end = remover.tmp.all_cells_end(); it != end; ++it){ - for(i=0; i < 4; i++){ - Facet f = std::pair(it,i); - Vertex_triple vt_aux = make_vertex_triple(f); - Vertex_triple vt(vmap[vt_aux.first],vmap[vt_aux.third],vmap[vt_aux.second]); - make_canonical(vt); - inner_map[vt]= f; - } - } - } else { - for(Finite_cells_iterator it = remover.tmp.finite_cells_begin(), - end = remover.tmp.finite_cells_end(); it != end; ++it){ - for(i=0; i < 4; i++){ - Facet f = std::pair(it,i); - Vertex_triple vt_aux = make_vertex_triple(f); - Vertex_triple vt(vmap[vt_aux.first],vmap[vt_aux.third],vmap[vt_aux.second]); - make_canonical(vt); - inner_map[vt]= f; - } - } - } - // Grow inside the hole, by extending the surface - while(! outer_map.empty()){ - typename Vertex_triple_Facet_map::iterator oit = outer_map.begin(); - while(is_infinite(oit->first.first) || - is_infinite(oit->first.second) || - is_infinite(oit->first.third)){ - ++oit; - // otherwise the lookup in the inner_map fails - // because the infinite vertices are different - } - typename Vertex_triple_Facet_map::value_type o_vt_f_pair = *oit; - Cell_handle o_ch = o_vt_f_pair.second.first; - unsigned int o_i = o_vt_f_pair.second.second; - - typename Vertex_triple_Facet_map::iterator iit = - inner_map.find(o_vt_f_pair.first); - CGAL_triangulation_assertion(iit != inner_map.end()); - typename Vertex_triple_Facet_map::value_type i_vt_f_pair = *iit; - Cell_handle i_ch = i_vt_f_pair.second.first; - unsigned int i_i = i_vt_f_pair.second.second; - - // create a new cell and glue it to the outer surface - Cell_handle new_ch = tds().create_cell(); - - new_ch->set_vertices(vmap[i_ch->vertex(0)], vmap[i_ch->vertex(1)], - vmap[i_ch->vertex(2)], vmap[i_ch->vertex(3)]); - - o_ch->set_neighbor(o_i,new_ch); - new_ch->set_neighbor(i_i, o_ch); - - // for the other faces check, if they can also be glued - for(i = 0; i < 4; i++){ - if(i != i_i){ - Facet f = std::pair(new_ch,i); - Vertex_triple vt = make_vertex_triple(f); - make_canonical(vt); - std::swap(vt.second,vt.third); - typename Vertex_triple_Facet_map::iterator oit2 = outer_map.find(vt); - if(oit2 == outer_map.end()){ - std::swap(vt.second,vt.third); - outer_map[vt]= f; - } else { - // glue the faces - typename Vertex_triple_Facet_map::value_type o_vt_f_pair2 = *oit2; - Cell_handle o_ch2 = o_vt_f_pair2.second.first; - int o_i2 = o_vt_f_pair2.second.second; - o_ch2->set_neighbor(o_i2,new_ch); - new_ch->set_neighbor(i, o_ch2); - outer_map.erase(oit2); - } - } - } - outer_map.erase(oit); - } - - // fixing pointer - std::vector cells_pt; - cells_pt.reserve(64); - incident_cells(inserted, std::back_inserter(cells_pt)); - std::size_t size = cells_pt.size(); - for(std::size_t i=0; iset_vertex(c->index(inserted), v); - } - v->set_point(p); - v->set_cell(inserted->cell()); - tds().delete_vertex(inserted); - tds().delete_cells(hole.begin(), hole.end()); - return v; -} - -template -template < class VertexRemover, class VertexInserter > -typename Triangulation_3::Vertex_handle -Triangulation_3:: -move(Vertex_handle v, const Point &p, - VertexRemover &remover, VertexInserter &inserter) { - CGAL_assertion(remover.hidden_points_begin() == - remover.hidden_points_end() ); - CGAL_triangulation_precondition(!is_infinite(v)); - if(v->point() == p) return v; - Vertex_handle w = move_if_no_collision(v,p,remover,inserter); - if(w != v) { - remove(v, remover); - return w; - } - return v; -} - -// The VertexInserter is needed so as to -// allow us the usage of the insertion method -// from the particular triangulation -template -template < class VertexRemover, class VertexInserter, class OutputItCells > -typename Triangulation_3::Vertex_handle -Triangulation_3:: -move_if_no_collision_and_give_new_cells(Vertex_handle v, const Point &p, - VertexRemover &remover, VertexInserter &inserter, OutputItCells fit) { - CGAL_assertion(remover.hidden_points_begin() == - remover.hidden_points_end() ); - CGAL_triangulation_precondition(!is_infinite(v)); - if(v->point() == p) return v; - const int dim = dimension(); - - // If displacements are known to be small - // we might want to optimize by checking - // whether there is a topological change - // or not before. - // In this version this will not be put inside this method - // because it is for general purposes, - // and remaining Delaunay after motion is a bit too restrictive. - // In the filtered version optimized for displacements - // it will be used as an a priori. - // However, a non-fully optimized but good version of - // is_delaunay_after_displacement is provided as an internal method of - // Delaunay_triangulation_3 (see the class for more details). - - Locate_type lt; - int li, lj; - Cell_handle loc = locate(p, lt, li, lj, v->cell()); - - if(lt == VERTEX) return loc->vertex(li); - - if(dim == 0) { - v->set_point(p); - return v; - } - - int n_vertices = tds().number_of_vertices(); - - if((lt == OUTSIDE_AFFINE_HULL) && (dim == 1) && (n_vertices == 3)) { - v->set_point(p); - for(All_cells_iterator afi = tds().raw_cells_begin(); - afi != tds().raw_cells_end(); - afi++) *fit++ = afi; - return v; - } - - if((lt == OUTSIDE_AFFINE_HULL) && (dim == 2) && (n_vertices == 4)) { - v->set_point(p); - for(All_cells_iterator afi = tds().raw_cells_begin(); - afi != tds().raw_cells_end(); - afi++) *fit++ = afi; - return v; - } - - if((lt != OUTSIDE_AFFINE_HULL) && (dim == 1)) { - if(loc->has_vertex(v)) { - v->set_point(p); - } else { - Vertex_handle inserted = insert(p, lt, loc, li, lj); - Cell_handle f = v->cell(); - int i = f->index(v); - if (i==0) {f = f->neighbor(1);} - CGAL_triangulation_assertion(f->index(v) == 1); - Cell_handle g= f->neighbor(0); - f->set_vertex(1, g->vertex(1)); - f->set_neighbor(0,g->neighbor(0)); - g->neighbor(0)->set_neighbor(1,f); - g->vertex(1)->set_cell(f); - tds().delete_cell(g); - *fit++ = f; - Cell_handle f_ins = inserted->cell(); - i = f_ins->index(inserted); - if (i==0) {f_ins = f_ins->neighbor(1);} - CGAL_triangulation_assertion(f_ins->index(inserted) == 1); - Cell_handle g_ins = f_ins->neighbor(0); - f_ins->set_vertex(1, v); - g_ins->set_vertex(0, v); - v->set_point(p); - v->set_cell(inserted->cell()); - tds().delete_vertex(inserted); - } - *fit++ = v->cell(); - if(v->cell()->neighbor(0)->has_vertex(v)) - *fit++ = v->cell()->neighbor(0); - if(v->cell()->neighbor(1)->has_vertex(v)) - *fit++ = v->cell()->neighbor(1); - return v; - } - - bool dim_down = test_dim_down(v); - - if((lt != OUTSIDE_AFFINE_HULL) && dim_down && (dim == 2)) { - // verify if p and two static vertices are collinear in this case - int iinf; - Cell_handle finf = infinite_vertex()->cell(), fdone; - fdone = finf; - do { - iinf = finf->index(infinite_vertex()); - if(!finf->has_vertex(v)) break; - finf = finf->neighbor((iinf+1)%3); - } while(finf != fdone); - iinf = ~iinf; - if(this->collinear(finf->vertex(iinf&1)->point(), - finf->vertex(iinf&2)->point(), - p)) - { - v->set_point(p); - _tds.decrease_dimension(loc, loc->index(v)); - for(All_cells_iterator afi = tds().raw_cells_begin(); - afi != tds().raw_cells_end(); - afi++) *fit++ = afi; - return v; - } - } - - if(((dim == 2) && (lt != OUTSIDE_AFFINE_HULL)) || - ((lt == OUTSIDE_AFFINE_HULL) && (dim == 1))) - { - - std::set cells_set; - // This is insert must be from Delaunay (or the particular trian.) - // not Triangulation_3 ! - Vertex_handle inserted = inserter.insert(p, lt, loc, li, lj); - Cell_handle c = inserted->cell(), end = c; - do { - cells_set.insert(c); - int i = c->index(inserted); - c = c->neighbor((i+1)%3); - } while(c != end); - - std::list hole; - make_hole_2D(v, hole, remover, cells_set); - fill_hole_2D(hole, remover, fit); - - // fixing pointer - Cell_handle fc = inserted->cell(), done(fc); - std::vector faces_pt; - faces_pt.reserve(16); - do { - faces_pt.push_back(fc); - fc = fc->neighbor((fc->index(inserted) + 1)%3); - } while(fc != done); - int ss = faces_pt.size(); - for(int k=0; kindex(inserted); - f->set_vertex(i, v); - } - v->set_point(p); - v->set_cell(inserted->cell()); - - tds().delete_vertex(inserted); - - for(typename std::set::const_iterator ib = cells_set.begin(), - iend = cells_set.end(); ib != iend; ib++) *fit++ = *ib; - - return v; - } - - if((lt != OUTSIDE_AFFINE_HULL) && dim_down && (dim == 3)) { - // verify if p and two static vertices are collinear in this case - std::vector ics; - incident_cells(infinite_vertex(), std::back_inserter(ics)); - int size = ics.size(); - Cell_handle finf; - for (int i=0; ihas_vertex(v)) break; - } - int iinf = finf->index(infinite_vertex()); - if(remover.tmp.coplanar(finf->vertex((iinf+1)&3)->point(), - finf->vertex((iinf+2)&3)->point(), - finf->vertex((iinf+3)&3)->point(), - p)) - { - v->set_point(p); - _tds.decrease_dimension(loc, loc->index(v)); - Facet f = *finite_facets_begin(); - if (coplanar_orientation(f.first->vertex(0)->point(), - f.first->vertex(1)->point(), - f.first->vertex(2)->point()) == NEGATIVE) - tds().reorient(); - restore_edges_after_decrease_dimension(v, remover,inserter); - for(All_cells_iterator afi = tds().raw_cells_begin(); - afi != tds().raw_cells_end(); - afi++) *fit++ = afi; - return v; - } - } - - std::set cells_set; - - // This is insert must be from Delaunay (or the particular trian.) - // not Triangulation_3 ! - Vertex_handle inserted = inserter.insert(p, lt, loc, li, lj); - - std::vector cells_tmp; - cells_tmp.reserve(64); - incident_cells(inserted, std::back_inserter(cells_tmp)); - int size = cells_tmp.size(); - for(int i=0; i hole; - hole.reserve(64); - - // Construct the set of vertex triples on the boundary - // with the facet just behind - typedef std::map Vertex_triple_Facet_map; - Vertex_triple_Facet_map outer_map; - Vertex_triple_Facet_map inner_map; - - make_hole_3D(v, outer_map, hole); - - for(typename std::vector::const_iterator ib = hole.begin(), - iend = hole.end(); ib != iend; ib++) cells_set.erase(*ib); - - CGAL_assertion(remover.hidden_points_begin() == - remover.hidden_points_end() ); - - // Output the hidden points. - for (typename std::vector::iterator - hi = hole.begin(), hend = hole.end(); hi != hend; ++hi) - remover.add_hidden_points(*hi); - - bool inf = false; - unsigned int i; - // collect all vertices on the boundary - std::vector vertices; - vertices.reserve(64); - - adjacent_vertices(v, std::back_inserter(vertices)); - - // create a Delaunay triangulation of the points on the boundary - // and make a map from the vertices in remover.tmp towards the vertices - // in *this - - Unique_hash_map vmap; - Cell_handle ch = Cell_handle(); - for(i=0; i < vertices.size(); i++){ - if(! is_infinite(vertices[i])){ - Vertex_handle vh = remover.tmp.insert(vertices[i]->point(), ch); - ch = vh->cell(); - vmap[vh] = vertices[i]; - }else { - inf = true; - } - } - - if(remover.tmp.dimension()==2){ - Vertex_handle fake_inf = remover.tmp.insert(v->point()); - vmap[fake_inf] = infinite_vertex(); - } else { - vmap[remover.tmp.infinite_vertex()] = infinite_vertex(); - } - - CGAL_triangulation_assertion(remover.tmp.dimension() == 3); - - // Construct the set of vertex triples of remover.tmp - // We reorient the vertex triple so that it matches those from outer_map - // Also note that we use the vertices of *this, not of remover.tmp - - if(inf){ - for(All_cells_iterator it = remover.tmp.all_cells_begin(), - end = remover.tmp.all_cells_end(); it != end; ++it){ - for(i=0; i < 4; i++){ - Facet f = std::pair(it,i); - Vertex_triple vt_aux = make_vertex_triple(f); - Vertex_triple vt(vmap[vt_aux.first],vmap[vt_aux.third],vmap[vt_aux.second]); - make_canonical(vt); - inner_map[vt]= f; - } - } - } else { - for(Finite_cells_iterator it = remover.tmp.finite_cells_begin(), - end = remover.tmp.finite_cells_end(); it != end; ++it){ - for(i=0; i < 4; i++){ - Facet f = std::pair(it,i); - Vertex_triple vt_aux = make_vertex_triple(f); - Vertex_triple vt(vmap[vt_aux.first],vmap[vt_aux.third],vmap[vt_aux.second]); - make_canonical(vt); - inner_map[vt]= f; - } - } - } - // Grow inside the hole, by extending the surface - while(! outer_map.empty()){ - typename Vertex_triple_Facet_map::iterator oit = outer_map.begin(); - while(is_infinite(oit->first.first) || - is_infinite(oit->first.second) || - is_infinite(oit->first.third)){ - ++oit; - // otherwise the lookup in the inner_map fails - // because the infinite vertices are different - } - typename Vertex_triple_Facet_map::value_type o_vt_f_pair = *oit; - Cell_handle o_ch = o_vt_f_pair.second.first; - unsigned int o_i = o_vt_f_pair.second.second; - - typename Vertex_triple_Facet_map::iterator iit = - inner_map.find(o_vt_f_pair.first); - CGAL_triangulation_assertion(iit != inner_map.end()); - typename Vertex_triple_Facet_map::value_type i_vt_f_pair = *iit; - Cell_handle i_ch = i_vt_f_pair.second.first; - unsigned int i_i = i_vt_f_pair.second.second; - - // create a new cell and glue it to the outer surface - Cell_handle new_ch = tds().create_cell(); - *fit++ = new_ch; - - new_ch->set_vertices(vmap[i_ch->vertex(0)], vmap[i_ch->vertex(1)], - vmap[i_ch->vertex(2)], vmap[i_ch->vertex(3)]); - - o_ch->set_neighbor(o_i,new_ch); - new_ch->set_neighbor(i_i, o_ch); - - // for the other faces check, if they can also be glued - for(i = 0; i < 4; i++){ - if(i != i_i){ - Facet f = std::pair(new_ch,i); - Vertex_triple vt = make_vertex_triple(f); - make_canonical(vt); - std::swap(vt.second,vt.third); - typename Vertex_triple_Facet_map::iterator oit2 = outer_map.find(vt); - if(oit2 == outer_map.end()){ - std::swap(vt.second,vt.third); - outer_map[vt]= f; - } else { - // glue the faces - typename Vertex_triple_Facet_map::value_type o_vt_f_pair2 = *oit2; - Cell_handle o_ch2 = o_vt_f_pair2.second.first; - int o_i2 = o_vt_f_pair2.second.second; - o_ch2->set_neighbor(o_i2,new_ch); - new_ch->set_neighbor(i, o_ch2); - outer_map.erase(oit2); - } - } - } - outer_map.erase(oit); - } - - // fixing pointer - std::vector cells_pt; - cells_pt.reserve(64); - incident_cells(inserted, std::back_inserter(cells_pt)); - size = cells_pt.size(); - for(int i=0; iset_vertex(c->index(inserted), v); - } - v->set_point(p); - v->set_cell(inserted->cell()); - tds().delete_vertex(inserted); - tds().delete_cells(hole.begin(), hole.end()); - - for(typename std::set::const_iterator ib = cells_set.begin(), - iend = cells_set.end(); ib != iend; ib++) *fit++ = *ib; - return v; -} - -template < class Gt, class Tds > -void -Triangulation_3:: -_make_big_hole_3D( Vertex_handle v, - std::map& outer_map, - std::vector & hole, - std::vector & vertices, - std::map &vstates) -{ - - Cell_handle start = v->cell(); - start->tds_data().mark_processed(); - hole.push_back(start); - std::size_t i=0, n=1; - while(i < n) - { - - Cell_handle c = hole[i++]; - - for(int k=0; k<4; k++) - { - Vertex_handle v0 = c->vertex(k); - - const REMOVE_VERTEX_STATE vst = vstates[v0]; - - if(vst == CLEAR) - { - vstates[v0] = EXTREMITY; - vertices.push_back(v0); - } else if(vst == TO_REMOVE) { - // we mark the vertices, so all the vertices - // from the same cluster will be skipped - // in the remove_cluster_3D function - vstates[v0] = PROCESSED; - } - - int i1 = vertex_triple_index(k, 0); - int i2 = vertex_triple_index(k, 1); - int i3 = vertex_triple_index(k, 2); - - Vertex_handle v1 = c->vertex(i1); - Vertex_handle v2 = c->vertex(i2); - Vertex_handle v3 = c->vertex(i3); - - Cell_handle opp_cit = c->neighbor(k); - int opp_i = tds().mirror_index(c,k); - Vertex_handle vm = opp_cit->vertex(opp_i); - - bool pb1 = false, pb2 = false, pb3 = false, pbm = false; - - const REMOVE_VERTEX_STATE vst1 = vstates[v1]; - pb1 = vst1 == TO_REMOVE || vst1 == PROCESSED; - - if(!pb1) { - const REMOVE_VERTEX_STATE vst2 = vstates[v2]; - pb2 = vst2 == TO_REMOVE || vst2 == PROCESSED; - - if(!pb2) { - const REMOVE_VERTEX_STATE vst3 = vstates[v3]; - pb3 = vst3 == TO_REMOVE || vst3 == PROCESSED; - - if(!pb3) { - const REMOVE_VERTEX_STATE vstm = vstates[vm]; - pbm = vstm == TO_REMOVE || vstm == PROCESSED; - } - - } - - } - - bool bad_opposite_cell = pb1 || pb2 || pb3 || pbm; - - // update the hole if needed - // when the vertex is not to be removed - if(bad_opposite_cell) - { - if(opp_cit->tds_data().is_clear()) - { - hole.push_back(opp_cit); - opp_cit->tds_data().mark_processed(); - n++; - } - continue; - } - - Facet f(opp_cit, opp_i); - Vertex_triple vt = make_vertex_triple(f); - make_canonical(vt); - outer_map[vt] = f; - v1->set_cell(opp_cit); - v2->set_cell(opp_cit); - v3->set_cell(opp_cit); - vm->set_cell(opp_cit); - - } - } - - std::size_t vsize = vertices.size(); - for(std::size_t i=0; i -template < class InputIterator, class VertexRemover > -bool -Triangulation_3:: -_remove_cluster_3D(InputIterator first, InputIterator beyond, VertexRemover &remover, - std::map &vstates) { - InputIterator init = first; - while(first != beyond) - { - Vertex_handle v = *first++; - - if(vstates[v] == PROCESSED) continue; - - // _make_big_hole_3D and we fill the hole for each cluster - vstates[v] = PROCESSED; - - // here, we make the hole for the cluster with v inside - typedef std::map Vertex_triple_Facet_map; - std::vector hole; - std::vector vertices; - hole.reserve(64); - vertices.reserve(32); - Vertex_triple_Facet_map outer_map; - _make_big_hole_3D(v, outer_map, hole, vertices, vstates); - - // the connectivity is totally lost, we need to rebuild - if(!outer_map.size()) - { - std::size_t nh = hole.size(); - for(std::size_t i=0; itds_data().clear(); - return false; - } - - std::size_t vsi = vertices.size(); - - bool inf = false; - std::size_t i; - Unique_hash_map vmap; - Cell_handle ch = Cell_handle(); - - if(vsi > 100) - { - // spatial sort if too many points - std::vector vps; - std::map mp_vps; - for(i=0; iis_infinite(vv)) { - vps.push_back(vv->point()); - mp_vps[vv->point()] = vv; - } else inf = true; - } - spatial_sort(vps.begin(), vps.end()); - - std::size_t svps = vps.size(); - - for(i=0; i < svps; i++){ - Vertex_handle vv = mp_vps[vps[i]]; - Vertex_handle vh = remover.tmp.insert(vv->point(), ch); - ch = vh->cell(); - vmap[vh] = vv; - } - - if(remover.tmp.dimension()==2){ - Vertex_handle fake_inf = remover.tmp.insert(v->point()); - vmap[fake_inf] = this->infinite_vertex(); - } else { - vmap[remover.tmp.infinite_vertex()] = this->infinite_vertex(); - } - } else { - - for(i=0; i < vsi; i++){ - if(!this->is_infinite(vertices[i])){ - Vertex_handle vh = remover.tmp.insert(vertices[i]->point(), ch); - ch = vh->cell(); - vmap[vh] = vertices[i]; - } else { - inf = true; - } - } - - if(remover.tmp.dimension()==2){ - Vertex_handle fake_inf = remover.tmp.insert(v->point()); - vmap[fake_inf] = this->infinite_vertex(); - } else { - vmap[remover.tmp.infinite_vertex()] = this->infinite_vertex(); - } - } - - Vertex_triple_Facet_map inner_map; - - if(inf){ - for(All_cells_iterator it = remover.tmp.all_cells_begin(), - end = remover.tmp.all_cells_end(); it != end; ++it){ - for(i=0; i < 4; i++) { - Facet f = std::pair(it,i); - Vertex_triple vt_aux = this->make_vertex_triple(f); - Vertex_triple vt(vmap[vt_aux.first],vmap[vt_aux.third],vmap[vt_aux.second]); - this->make_canonical(vt); - inner_map[vt]= f; - } - } - } else { - for(Finite_cells_iterator it = remover.tmp.finite_cells_begin(), - end = remover.tmp.finite_cells_end(); it != end; ++it){ - for(i=0; i < 4; i++){ - Facet f = std::pair(it,i); - Vertex_triple vt_aux = this->make_vertex_triple(f); - Vertex_triple vt(vmap[vt_aux.first],vmap[vt_aux.third],vmap[vt_aux.second]); - this->make_canonical(vt); - inner_map[vt]= f; - } - } - } - - // Grow inside the hole, by extending the surface - while(! outer_map.empty()){ - typename Vertex_triple_Facet_map::iterator oit = outer_map.begin(); - - while(this->is_infinite(oit->first.first) || - this->is_infinite(oit->first.second) || - this->is_infinite(oit->first.third)){ - ++oit; - // otherwise the lookup in the inner_map fails - // because the infinite vertices are different - } - typename Vertex_triple_Facet_map::value_type o_vt_f_pair = *oit; - Cell_handle o_ch = o_vt_f_pair.second.first; - unsigned int o_i = o_vt_f_pair.second.second; - - typename Vertex_triple_Facet_map::iterator iit = - inner_map.find(o_vt_f_pair.first); - CGAL_triangulation_assertion(iit != inner_map.end()); - typename Vertex_triple_Facet_map::value_type i_vt_f_pair = *iit; - Cell_handle i_ch = i_vt_f_pair.second.first; - unsigned int i_i = i_vt_f_pair.second.second; - - // create a new cell and glue it to the outer surface - Cell_handle new_ch = tds().create_cell(); - new_ch->set_vertices(vmap[i_ch->vertex(0)], vmap[i_ch->vertex(1)], - vmap[i_ch->vertex(2)], vmap[i_ch->vertex(3)]); - - o_ch->set_neighbor(o_i,new_ch); - new_ch->set_neighbor(i_i, o_ch); - - for(i=0;i<4;i++) new_ch->vertex(i)->set_cell(new_ch); - - // for the other faces check, if they can also be glued - for(i = 0; i < 4; i++){ - if(i != i_i){ - Facet f = std::pair(new_ch,i); - Vertex_triple vt = this->make_vertex_triple(f); - this->make_canonical(vt); - std::swap(vt.second,vt.third); - typename Vertex_triple_Facet_map::iterator oit2 = outer_map.find(vt); - if(oit2 == outer_map.end()){ - std::swap(vt.second,vt.third); - outer_map[vt]= f; - } else { - // glue the faces - typename Vertex_triple_Facet_map::value_type o_vt_f_pair2 = *oit2; - Cell_handle o_ch2 = o_vt_f_pair2.second.first; - int o_i2 = o_vt_f_pair2.second.second; - o_ch2->set_neighbor(o_i2,new_ch); - new_ch->set_neighbor(i, o_ch2); - outer_map.erase(oit2); - } - } - } - - outer_map.erase(oit); - } - - this->tds().delete_cells(hole.begin(), hole.end()); - remover.tmp.clear(); - - } - - this->tds().delete_vertices(init, beyond); - - return true; -} - -template < class Gt, class Tds > -template < class InputIterator > -bool -Triangulation_3:: -does_repeat_in_range(InputIterator first, InputIterator beyond) const { - std::set s; - while (first!=beyond) if (! s.insert(*first++).second ) return true; - return false; -} - -template < class Gt, class Tds > -template < class InputIterator > -bool -Triangulation_3:: -infinite_vertex_in_range(InputIterator first, InputIterator beyond) const { - while(first != beyond) if(is_infinite(*first++)) return true; - return false; -} - -template < class Gt, class Tds > -template < class InputIterator, class VertexRemover > -typename Triangulation_3::size_type -Triangulation_3:: -remove(InputIterator first, InputIterator beyond, VertexRemover &remover) { - CGAL_triangulation_precondition(!does_repeat_in_range(first, beyond)); - CGAL_triangulation_precondition(!infinite_vertex_in_range(first, beyond)); - size_type n = number_of_vertices(); - InputIterator init = first, init2 = first; - if(dimension() == 3 && n > 4) - { - // If we could add states on a vertex base as it is done - // for cells, it would improve the performance. - std::map vstates; - _mark_vertices_to_remove(first, beyond, vstates); - if(!_test_dim_down_cluster(vstates)) - { - if(_remove_cluster_3D(init, beyond, remover, vstates)) - return n - number_of_vertices(); - } - } - - // dimension() < 3 or - // no connectivity of the remaining vertices - // we remove one by one - while (init2 != beyond) { - Vertex_handle v = *init2++; - remover.tmp.clear(); - remove(v, remover); - } - return n - number_of_vertices(); -} - -template < class GT, class Tds > -bool -Triangulation_3:: -is_valid(bool verbose, int level) const -{ - if ( ! _tds.is_valid(verbose,level) ) { - if (verbose) - std::cerr << "invalid data structure" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - - if ( infinite_vertex() == Vertex_handle() ) { - if (verbose) - std::cerr << "no infinite vertex" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - - switch ( dimension() ) { - case 3: - { - for(Finite_cells_iterator it = finite_cells_begin(), end = finite_cells_end(); - it != end; ++it) - is_valid_finite(it, verbose, level); - break; - } - case 2: - { - for(Finite_facets_iterator it = finite_facets_begin(), end = finite_facets_end(); - it != end; ++it) - is_valid_finite(it->first,verbose,level); - break; - } - case 1: - { - for(Finite_edges_iterator it = finite_edges_begin(), end = finite_edges_end(); - it != end; ++it) - is_valid_finite(it->first,verbose,level); - break; - } - } - if (verbose) - std::cerr << "valid triangulation" << std::endl; - return true; -} - -template < class GT, class Tds > -bool -Triangulation_3:: -is_valid(Cell_handle c, bool verbose, int level) const -{ - if ( ! _tds.is_valid(c,verbose,level) ) { - if (verbose) { - std::cerr << "combinatorially invalid cell"; - for (int i=0; i <= dimension(); i++ ) - std::cerr << c->vertex(i)->point() << ", "; - std::cerr << std::endl; - } - CGAL_triangulation_assertion(false); - return false; - } - if ( ! is_infinite(c) ) - is_valid_finite(c, verbose, level); - if (verbose) - std::cerr << "geometrically valid cell" << std::endl; - return true; -} - - -template < class GT, class Tds > -bool -Triangulation_3:: -is_valid_finite(Cell_handle c, bool verbose, int) const -{ - switch ( dimension() ) { - case 3: - { - if ( orientation(c->vertex(0)->point(), - c->vertex(1)->point(), - c->vertex(2)->point(), - c->vertex(3)->point()) != POSITIVE ) { - if (verbose) - std::cerr << "badly oriented cell " - << c->vertex(0)->point() << ", " - << c->vertex(1)->point() << ", " - << c->vertex(2)->point() << ", " - << c->vertex(3)->point() << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - break; - } - case 2: - { - if (coplanar_orientation(c->vertex(0)->point(), - c->vertex(1)->point(), - c->vertex(2)->point()) != POSITIVE) { - if (verbose) - std::cerr << "badly oriented face " - << c->vertex(0)->point() << ", " - << c->vertex(1)->point() << ", " - << c->vertex(2)->point() << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - break; - } - case 1: - { - const Point & p0 = c->vertex(0)->point(); - const Point & p1 = c->vertex(1)->point(); - - Vertex_handle v = c->neighbor(0)->vertex(c->neighbor(0)->index(c)); - if ( ! is_infinite(v) ) - { - if ( collinear_position(p0, p1, v->point()) != MIDDLE ) { - if (verbose) - std::cerr << "badly oriented edge " - << p0 << ", " << p1 << std::endl - << "with neighbor 0" - << c->neighbor(0)->vertex(1-c->neighbor(0)->index(c)) - ->point() - << ", " << v->point() << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - } - - v = c->neighbor(1)->vertex(c->neighbor(1)->index(c)); - if ( ! is_infinite(v) ) - { - if ( collinear_position(p1, p0, v->point()) != MIDDLE ) { - if (verbose) - std::cerr << "badly oriented edge " - << p0 << ", " << p1 << std::endl - << "with neighbor 1" - << c->neighbor(1)->vertex(1-c->neighbor(1)->index(c)) - ->point() - << ", " << v->point() << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - } - break; - } - } - return true; -} - - -namespace internal { - -// Internal function used by operator==. -template < class GT, class Tds1, class Tds2 > -bool -test_next(const Triangulation_3 &t1, - const Triangulation_3 &t2, - typename Triangulation_3::Cell_handle c1, - typename Triangulation_3::Cell_handle c2, - std::map::Cell_handle, - typename Triangulation_3::Cell_handle> &Cmap, - std::map::Vertex_handle, - typename Triangulation_3::Vertex_handle> &Vmap) -{ - // This function tests and registers the 4 neighbors of c1/c2, - // and recursively calls itself over them. - // Returns false if an inequality has been found. - - // Precondition: c1, c2 have been registered as well as their 4 vertices. - CGAL_triangulation_precondition(t1.dimension() >= 2); - CGAL_triangulation_precondition(Cmap[c1] == c2); - CGAL_triangulation_precondition(Vmap.find(c1->vertex(0)) != Vmap.end()); - CGAL_triangulation_precondition(Vmap.find(c1->vertex(1)) != Vmap.end()); - CGAL_triangulation_precondition(Vmap.find(c1->vertex(2)) != Vmap.end()); - CGAL_triangulation_precondition(t1.dimension() == 2 || - Vmap.find(c1->vertex(3)) != Vmap.end()); - - typedef Triangulation_3 Tr1; - typedef Triangulation_3 Tr2; - typedef typename Tr1::Vertex_handle Vertex_handle1; - typedef typename Tr1::Cell_handle Cell_handle1; - typedef typename Tr2::Vertex_handle Vertex_handle2; - typedef typename Tr2::Cell_handle Cell_handle2; - typedef typename std::map::const_iterator Cit; - typedef typename std::map::const_iterator Vit; - - for (int i=0; i <= t1.dimension(); ++i) { - Cell_handle1 n1 = c1->neighbor(i); - Cit cit = Cmap.find(n1); - Vertex_handle1 v1 = c1->vertex(i); - Vertex_handle2 v2 = Vmap[v1]; - Cell_handle2 n2 = c2->neighbor(c2->index(v2)); - if (cit != Cmap.end()) { - // n1 was already registered. - if (cit->second != n2) - return false; - continue; - } - // n1 has not yet been registered. - // We check that the new vertices match geometrically. - // And we register them. - Vertex_handle1 vn1 = n1->vertex(n1->index(c1)); - Vertex_handle2 vn2 = n2->vertex(n2->index(c2)); - Vit vit = Vmap.find(vn1); - if (vit != Vmap.end()) { - // vn1 already registered - if (vit->second != vn2) - return false; - } - else { - if (t2.is_infinite(vn2)) - return false; // vn1 can't be infinite, - // since it would have been registered. - if (t1.geom_traits().compare_xyz_3_object()(vn1->point(), - vn2->point()) != 0) - return false; - // We register vn1/vn2. - Vmap.insert(std::make_pair(vn1, vn2)); - } - - // We register n1/n2. - Cmap.insert(std::make_pair(n1, n2)); - - // We recurse on n1/n2. - if (!test_next(t1, t2, n1, n2, Cmap, Vmap)) - return false; - } - - return true; -} - -} // namespace internal - - -template < class GT, class Tds1, class Tds2 > -bool -operator==(const Triangulation_3 &t1, - const Triangulation_3 &t2) -{ - typedef typename Triangulation_3::Vertex_handle Vertex_handle1; - typedef typename Triangulation_3::Cell_handle Cell_handle1; - typedef typename Triangulation_3::Vertex_handle Vertex_handle2; - typedef typename Triangulation_3::Cell_handle Cell_handle2; - - typedef typename Triangulation_3::Point Point; - typedef typename Triangulation_3::Geom_traits::Equal_3 Equal_3; - typedef typename Triangulation_3::Geom_traits::Compare_xyz_3 Compare_xyz_3; - - Equal_3 equal = t1.geom_traits().equal_3_object(); - Compare_xyz_3 cmp1 = t1.geom_traits().compare_xyz_3_object(); - Compare_xyz_3 cmp2 = t2.geom_traits().compare_xyz_3_object(); - - // Some quick checks. - if (t1.dimension() != t2.dimension() - || t1.number_of_vertices() != t2.number_of_vertices() - || t1.number_of_cells() != t2.number_of_cells()) - return false; - - int dim = t1.dimension(); - // Special case for dimension < 1. - // The triangulation is uniquely defined in these cases. - if (dim < 1) - return true; - - // Special case for dimension == 1. - if (dim == 1) { - // It's enough to test that the points are the same, - // since the triangulation is uniquely defined in this case. - using namespace boost; - std::vector V1 (t1.points_begin(), t1.points_end()); - std::vector V2 (t2.points_begin(), t2.points_end()); - std::sort(V1.begin(), V1.end(), bind(cmp1, _1, _2) == NEGATIVE); - std::sort(V2.begin(), V2.end(), bind(cmp2, _1, _2) == NEGATIVE); - return V1 == V2; - } - - // We will store the mapping between the 2 triangulations vertices and - // cells in 2 maps. - std::map Vmap; - std::map Cmap; - - // Handle the infinite vertex. - Vertex_handle1 v1 = t1.infinite_vertex(); - Vertex_handle2 iv2 = t2.infinite_vertex(); - Vmap.insert(std::make_pair(v1, iv2)); - - // We pick one infinite cell of t1, and try to match it against the - // infinite cells of t2. - Cell_handle1 c = v1->cell(); - Vertex_handle1 v2 = c->vertex((c->index(v1)+1)%(dim+1)); - Vertex_handle1 v3 = c->vertex((c->index(v1)+2)%(dim+1)); - Vertex_handle1 v4 = c->vertex((c->index(v1)+3)%(dim+1)); - const Point &p2 = v2->point(); - const Point &p3 = v3->point(); - const Point &p4 = v4->point(); - - std::vector ics; - t2.incident_cells(iv2, std::back_inserter(ics)); - for (typename std::vector::const_iterator cit = ics.begin(); - cit != ics.end(); ++cit) { - int inf = (*cit)->index(iv2); - - if (equal(p2, (*cit)->vertex((inf+1)%(dim+1))->point())) - Vmap.insert(std::make_pair(v2, (*cit)->vertex((inf+1)%(dim+1)))); - else if (equal(p2, (*cit)->vertex((inf+2)%(dim+1))->point())) - Vmap.insert(std::make_pair(v2, (*cit)->vertex((inf+2)%(dim+1)))); - else if (dim == 3 && - equal(p2, (*cit)->vertex((inf+3)%(dim+1))->point())) - Vmap.insert(std::make_pair(v2, (*cit)->vertex((inf+3)%(dim+1)))); - else - continue; // None matched v2. - - if (equal(p3, (*cit)->vertex((inf+1)%(dim+1))->point())) - Vmap.insert(std::make_pair(v3, (*cit)->vertex((inf+1)%(dim+1)))); - else if (equal(p3, (*cit)->vertex((inf+2)%(dim+1))->point())) - Vmap.insert(std::make_pair(v3, (*cit)->vertex((inf+2)%(dim+1)))); - else if (dim == 3 && - equal(p3, (*cit)->vertex((inf+3)%(dim+1))->point())) - Vmap.insert(std::make_pair(v3, (*cit)->vertex((inf+3)%(dim+1)))); - else - continue; // None matched v3. - - if (dim == 3) { - if (equal(p4, (*cit)->vertex((inf+1)%(dim+1))->point())) - Vmap.insert(std::make_pair(v4, - (*cit)->vertex((inf+1)%(dim+1)))); - else if (equal(p4, (*cit)->vertex((inf+2)%(dim+1))->point())) - Vmap.insert(std::make_pair(v4, - (*cit)->vertex((inf+2)%(dim+1)))); - else if (equal(p4, (*cit)->vertex((inf+3)%(dim+1))->point())) - Vmap.insert(std::make_pair(v4, - (*cit)->vertex((inf+3)%(dim+1)))); - else - continue; // None matched v4. - } - - // Found it ! - Cmap.insert(std::make_pair(c, *cit)); - break; - } - - if (Cmap.size() == 0) - return false; - - // We now have one cell, we need to propagate recursively. - return internal::test_next(t1, t2, - Cmap.begin()->first, Cmap.begin()->second, Cmap, Vmap); -} - -template < class GT, class Tds1, class Tds2 > -inline -bool -operator!=(const Triangulation_3 &t1, - const Triangulation_3 &t2) -{ - return ! (t1 == t2); -} - -} //namespace CGAL - -#endif // CGAL_TRIANGULATION_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/Triangulation_cell_base_3.h b/Triangulation_3_copy_tds/include/CGAL/Triangulation_cell_base_3.h deleted file mode 100644 index ff4dec07903..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/Triangulation_cell_base_3.h +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (c) 1999 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// Author(s) : Monique Teillaud -// Sylvain Pion - -// cell of a triangulation of any dimension <=3 - -#ifndef CGAL_TRIANGULATION_CELL_BASE_3_H -#define CGAL_TRIANGULATION_CELL_BASE_3_H - -#include -#include -#include - -namespace CGAL { - -template < typename GT, typename Cb = Triangulation_ds_cell_base_3<> > -class Triangulation_cell_base_3 - : public Cb -{ -public: - typedef typename Cb::Vertex_handle Vertex_handle; - typedef typename Cb::Cell_handle Cell_handle; - - typedef GT Geom_traits; - typedef typename Geom_traits::Point_3 Point; - - typedef Point* Point_container; - typedef Point* Point_iterator; - typedef const Point* Point_const_iterator; - - template < typename TDS2 > - struct Rebind_TDS { - typedef typename Cb::template Rebind_TDS::Other Cb2; - typedef Triangulation_cell_base_3 Other; - }; - - Triangulation_cell_base_3() - : Cb() {} - - Triangulation_cell_base_3(Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3) - : Cb(v0, v1, v2, v3) {} - - Triangulation_cell_base_3(Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3, - Cell_handle n0, Cell_handle n1, - Cell_handle n2, Cell_handle n3) - : Cb(v0, v1, v2, v3, n0, n1, n2, n3) {} - - Point_iterator hidden_points_begin() const { return hidden_points_end(); } - Point_iterator hidden_points_end() const { return NULL; } - void hide_point (const Point &) const { } - - typename Geom_traits::Point_3 - circumcenter(const Geom_traits& gt = Geom_traits()) const - { - return gt.construct_circumcenter_3_object()(this->vertex(0)->point(), - this->vertex(1)->point(), - this->vertex(2)->point(), - this->vertex(3)->point()); - } - -}; - -// The following should be useless. -#if 0 -template < class GT, class Cb > -inline -std::istream& -operator>>(std::istream &is, Triangulation_cell_base_3 &c) - // non combinatorial information. Default = nothing -{ - return is >> static_cast(c); -} - -template < class GT, class Cb > -inline -std::ostream& -operator<<(std::ostream &os, const Triangulation_cell_base_3 &c) - // non combinatorial information. Default = nothing -{ - return os << static_cast(c); -} -#endif - -} //namespace CGAL - -#endif // CGAL_TRIANGULATION_CELL_BASE_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/Triangulation_cell_base_with_circumcenter_3.h b/Triangulation_3_copy_tds/include/CGAL/Triangulation_cell_base_with_circumcenter_3.h deleted file mode 100644 index a0ef35940e2..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/Triangulation_cell_base_with_circumcenter_3.h +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (c) 1999-2006 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// Author(s) : Monique Teillaud -// Sylvain Pion - -// cell of a triangulation of any dimension <=3, -// storing its circumcenter lazily. - -#ifndef CGAL_TRIANGULATION_CELL_BASE_WITH_CIRCUMCENTER_3_H -#define CGAL_TRIANGULATION_CELL_BASE_WITH_CIRCUMCENTER_3_H - -#include -#include -#include - -namespace CGAL { - -template < typename GT, typename Cb = Triangulation_ds_cell_base_3<> > -class Triangulation_cell_base_with_circumcenter_3 - : public Cb -{ - typedef typename GT::Point_3 Point_3; - - mutable Point_3 * circumcenter_; - - void invalidate_circumcenter() - { - if (circumcenter_) { - delete circumcenter_; - circumcenter_ = NULL; - } - } - -public: - typedef typename Cb::Vertex_handle Vertex_handle; - typedef typename Cb::Cell_handle Cell_handle; - - typedef GT Geom_traits; - - template < typename TDS2 > - struct Rebind_TDS { - typedef typename Cb::template Rebind_TDS::Other Cb2; - typedef Triangulation_cell_base_with_circumcenter_3 Other; - }; - - Triangulation_cell_base_with_circumcenter_3() - : Cb(), circumcenter_(NULL) {} - - Triangulation_cell_base_with_circumcenter_3 - (const Triangulation_cell_base_with_circumcenter_3 &c) - : Cb(c), circumcenter_(c.circumcenter_ != NULL ? new Point_3(*(c.circumcenter_)) : NULL) - {} - - Triangulation_cell_base_with_circumcenter_3& - operator=(const Triangulation_cell_base_with_circumcenter_3 &c) - { - Triangulation_cell_base_with_circumcenter_3 tmp=c; - std::swap(tmp, *this); - return *this; - } - - Triangulation_cell_base_with_circumcenter_3( - Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3) - : Cb(v0, v1, v2, v3), circumcenter_(NULL) {} - - Triangulation_cell_base_with_circumcenter_3( - Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3, - Cell_handle n0, Cell_handle n1, - Cell_handle n2, Cell_handle n3) - : Cb(v0, v1, v2, v3, n0, n1, n2, n3), circumcenter_(NULL) {} - - ~Triangulation_cell_base_with_circumcenter_3() - { - delete circumcenter_; - } - - // We must override the functions that modify the vertices. - // And if the point inside a vertex is modified, we fail, - // but there's not much we can do for this now. - void set_vertex(int i, Vertex_handle v) - { - invalidate_circumcenter(); - Cb::set_vertex(i, v); - } - - void set_vertices() - { - invalidate_circumcenter(); - Cb::set_vertices(); - } - - void set_vertices(Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3) - { - invalidate_circumcenter(); - Cb::set_vertices(v0, v1, v2, v3); - } - - const Point_3 & - circumcenter(const Geom_traits& gt = Geom_traits()) const - { - if (circumcenter_ == NULL) { - circumcenter_ = new Point_3( - gt.construct_circumcenter_3_object()(this->vertex(0)->point(), - this->vertex(1)->point(), - this->vertex(2)->point(), - this->vertex(3)->point())); - } - return *circumcenter_; - } -}; - -} //namespace CGAL - -#endif // CGAL_TRIANGULATION_CELL_BASE_WITH_CIRCUMCENTER_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/Triangulation_cell_base_with_info_3.h b/Triangulation_3_copy_tds/include/CGAL/Triangulation_cell_base_with_info_3.h deleted file mode 100644 index 68d344f6507..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/Triangulation_cell_base_with_info_3.h +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) 2003 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Sylvain Pion - -// cell of a triangulation of any dimension <=3 - -#ifndef CGAL_TRIANGULATION_CELL_BASE_WITH_INFO_3_H -#define CGAL_TRIANGULATION_CELL_BASE_WITH_INFO_3_H - -#include - -namespace CGAL { - -template < typename Info_, typename GT, - typename Cb = Triangulation_cell_base_3 > -class Triangulation_cell_base_with_info_3 - : public Cb -{ - Info_ _info; -public: - typedef typename Cb::Vertex_handle Vertex_handle; - typedef typename Cb::Cell_handle Cell_handle; - typedef Info_ Info; - - template < typename TDS2 > - struct Rebind_TDS { - typedef typename Cb::template Rebind_TDS::Other Cb2; - typedef Triangulation_cell_base_with_info_3 Other; - }; - - Triangulation_cell_base_with_info_3() - : Cb() {} - - Triangulation_cell_base_with_info_3(Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3) - : Cb(v0, v1, v2, v3) {} - - Triangulation_cell_base_with_info_3(Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3, - Cell_handle n0, Cell_handle n1, - Cell_handle n2, Cell_handle n3) - : Cb(v0, v1, v2, v3, n0, n1, n2, n3) {} - - const Info& info() const { return _info; } - Info& info() { return _info; } -}; - -} //namespace CGAL - -#endif // CGAL_TRIANGULATION_CELL_BASE_WITH_INFO_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/Triangulation_data_structure_3.h b/Triangulation_3_copy_tds/include/CGAL/Triangulation_data_structure_3.h deleted file mode 100644 index d53a516c771..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/Triangulation_data_structure_3.h +++ /dev/null @@ -1,3472 +0,0 @@ -// Copyright (c) 1999-2005 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// Author(s) : Monique Teillaud -// Sylvain Pion - -// combinatorial triangulation of the boundary of a polytope -// of dimension d in dimension d+1 -// for -1 <= d <= 3 - -#ifndef CGAL_TRIANGULATION_DATA_STRUCTURE_3_H -#define CGAL_TRIANGULATION_DATA_STRUCTURE_3_H - -#include - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include - -#include - -#include -#include -#include - -#include -#include - -#ifdef CGAL_HAS_THREADS -# include -#endif - - -namespace CGAL { - -// TODO : noms : Vb != Vertex_base : clarifier. - -template < class Vb = Triangulation_ds_vertex_base_3<>, - class Cb = Triangulation_ds_cell_base_3<> > -class Triangulation_data_structure_3 - : public Triangulation_utils_3 -{ - typedef Triangulation_data_structure_3 Tds; - -public: - - // Tools to change the Vertex and Cell types of the TDS. - template < typename Vb2 > - struct Rebind_vertex { - typedef Triangulation_data_structure_3 Other; - }; - - template < typename Cb2 > - struct Rebind_cell { - typedef Triangulation_data_structure_3 Other; - }; - - // Put this TDS inside the Vertex and Cell types. - typedef typename Vb::template Rebind_TDS::Other Vertex; - typedef typename Cb::template Rebind_TDS::Other Cell; - - class Cell_data { - unsigned char conflict_state; - public: - Cell_data() : conflict_state(0) {} - - void clear() { conflict_state = 0; } - void mark_in_conflict() { conflict_state = 1; } - void mark_on_boundary() { conflict_state = 2; } - void mark_processed() { conflict_state = 1; } - - bool is_clear() const { return conflict_state == 0; } - bool is_in_conflict() const { return conflict_state == 1; } - bool is_on_boundary() const { return conflict_state == 2; } - bool processed() const { return conflict_state == 1; } - }; - -private: - - friend class internal::Triangulation_ds_facet_iterator_3; - friend class internal::Triangulation_ds_edge_iterator_3; - - friend class internal::Triangulation_ds_cell_circulator_3; - friend class internal::Triangulation_ds_facet_circulator_3; - -public: - - typedef Compact_container Cell_range; - typedef Compact_container Vertex_range; - - typedef typename Cell_range::size_type size_type; - typedef typename Cell_range::difference_type difference_type; - - typedef typename Cell_range::iterator Cell_iterator; - typedef typename Vertex_range::iterator Vertex_iterator; - - typedef internal::Triangulation_ds_facet_iterator_3 Facet_iterator; - typedef internal::Triangulation_ds_edge_iterator_3 Edge_iterator; - - typedef internal::Triangulation_ds_cell_circulator_3 Cell_circulator; - typedef internal::Triangulation_ds_facet_circulator_3 Facet_circulator; - -//private: // In 2D only : - typedef internal::Triangulation_ds_face_circulator_3 Face_circulator; - - typedef Vertex_iterator Vertex_handle; - typedef Cell_iterator Cell_handle; - - typedef std::pair Facet; - typedef Triple Edge; - - typedef Triangulation_simplex_3 Simplex; -#ifndef CGAL_TDS_USE_OLD_CREATE_STAR_3 - //internally used for create_star_3 (faster than a tuple) - struct iAdjacency_info{ - int v1; - Cell_handle v2; - int v3; - Cell_handle v4; - int v5; - int v6; - iAdjacency_info(){} - iAdjacency_info(int a1,Cell_handle a2,int a3,Cell_handle a4,int a5 ,int a6): - v1(a1),v2(a2),v3(a3),v4(a4),v5(a5),v6(a6) {} - void update_variables(int& a1,Cell_handle& a2,int& a3,Cell_handle& a4,int& a5 ,int& a6) - { - a1=v1; - a2=v2; - a3=v3; - a4=v4; - a5=v5; - a6=v6; - } - }; -#endif - - -public: - Triangulation_data_structure_3() - : _dimension(-2) - {} - - Triangulation_data_structure_3(const Tds & tds) - { - copy_tds(tds); - } - - Tds & operator= (const Tds & tds) - { - if (&tds != this) { - Tds tmp(tds); - swap(tmp); - } - return *this; - } - - size_type number_of_vertices() const { return vertices().size(); } - - int dimension() const {return _dimension;} - - size_type number_of_cells() const - { - if ( dimension() < 3 ) return 0; - return cells().size(); - } - - size_type number_of_facets() const - { - if ( dimension() < 2 ) return 0; - return std::distance(facets_begin(), facets_end()); - } - - size_type number_of_edges() const - { - if ( dimension() < 1 ) return 0; - return std::distance(edges_begin(), edges_end()); - } - - // USEFUL CONSTANT TIME FUNCTIONS - - // SETTING - - void set_dimension(int n) { _dimension = n; } - - Vertex_handle create_vertex(const Vertex &v) - { - return vertices().insert(v); - } - - Vertex_handle create_vertex() - { - return vertices().emplace(); - } - - Vertex_handle create_vertex(Vertex_handle v) - { - return create_vertex(*v); - } - - Cell_handle create_cell(const Cell &c) - { - return cells().insert(c); - } - - Cell_handle create_cell() - { - return cells().emplace(); - } - - Cell_handle create_cell(Cell_handle c) - { - return create_cell(*c); - } - - Cell_handle create_cell(Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3) - { - return cells().emplace(v0, v1, v2, v3); - } - - Cell_handle create_cell(Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3, - Cell_handle n0, Cell_handle n1, - Cell_handle n2, Cell_handle n3) - { - return cells().emplace(v0, v1, v2, v3, n0, n1, n2, n3); - } - - Cell_handle create_face() - { - CGAL_triangulation_precondition(dimension()<3); - return create_cell(); - } - - Cell_handle create_face(Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2) - { - CGAL_triangulation_precondition(dimension()<3); - return cells().emplace(v0, v1, v2, Vertex_handle()); - } - - // The following functions come from TDS_2. - Cell_handle create_face(Cell_handle f0, int i0, - Cell_handle f1, int i1, - Cell_handle f2, int i2) - { - CGAL_triangulation_precondition(dimension() <= 2); - Cell_handle newf = create_face(f0->vertex(cw(i0)), - f1->vertex(cw(i1)), - f2->vertex(cw(i2))); - set_adjacency(newf, 2, f0, i0); - set_adjacency(newf, 0, f1, i1); - set_adjacency(newf, 1, f2, i2); - return newf; - } - - Cell_handle create_face(Cell_handle f0, int i0, - Cell_handle f1, int i1) - { - CGAL_triangulation_precondition(dimension() <= 2); - Cell_handle newf = create_face(f0->vertex(cw(i0)), - f1->vertex(cw(i1)), - f1->vertex(ccw(i1))); - set_adjacency(newf, 2, f0, i0); - set_adjacency(newf, 0, f1, i1); - return newf; - } - - Cell_handle create_face(Cell_handle f, int i, Vertex_handle v) - { - CGAL_triangulation_precondition(dimension() <= 2); - Cell_handle newf = create_face(f->vertex(cw(i)), - f->vertex(ccw(i)), - v); - set_adjacency(newf, 2, f, i); - return newf; - } - - // not documented - void read_cells(std::istream& is, std::map< std::size_t, Vertex_handle > &V, - std::size_t & m, std::map< std::size_t, Cell_handle > &C ); - // not documented - void print_cells(std::ostream& os, - const std::map &V ) const; - - // ACCESS FUNCTIONS - - void delete_vertex( Vertex_handle v ) - { - CGAL_triangulation_expensive_precondition( is_vertex(v) ); - vertices().erase(v); - } - - void delete_cell( Cell_handle c ) - { - CGAL_triangulation_expensive_precondition( is_simplex(c) ); - cells().erase(c); - } - - template - void delete_vertices(InputIterator begin, InputIterator end) - { - for(; begin != end; ++begin) - delete_vertex(*begin); - } - - template - void delete_cells(InputIterator begin, InputIterator end) - { - for(; begin != end; ++begin) - delete_cell(*begin); - } - - // QUERIES - - bool is_simplex(Cell_handle c) const; // undocumented for now - bool is_vertex(Vertex_handle v) const; - bool is_edge(Cell_handle c, int i, int j) const; - bool is_edge(Vertex_handle u, Vertex_handle v, Cell_handle & c, - int & i, int & j) const; - bool is_edge(Vertex_handle u, Vertex_handle v) const; - bool is_facet(Cell_handle c, int i) const; - bool is_facet(Vertex_handle u, Vertex_handle v, - Vertex_handle w, - Cell_handle & c, int & i, int & j, int & k) const; - bool is_cell(Cell_handle c) const; - bool is_cell(Vertex_handle u, Vertex_handle v, - Vertex_handle w, Vertex_handle t, - Cell_handle & c, int & i, int & j, int & k, int & l) const; - bool is_cell(Vertex_handle u, Vertex_handle v, - Vertex_handle w, Vertex_handle t) const; - - bool has_vertex(const Facet & f, Vertex_handle v, int & j) const; - bool has_vertex(Cell_handle c, int i, - Vertex_handle v, int & j) const; - bool has_vertex(const Facet & f, Vertex_handle v) const; - bool has_vertex(Cell_handle c, int i, Vertex_handle v) const; - - bool are_equal(Cell_handle c, int i, - Cell_handle n, int j) const; - bool are_equal(const Facet & f, const Facet & g) const; - bool are_equal(const Facet & f, Cell_handle n, int j) const; - - // MODIFY - - bool flip(Cell_handle c, int i); - bool flip(const Facet &f) - { return flip( f.first, f.second); } - - void flip_flippable(Cell_handle c, int i); - void flip_flippable(const Facet &f) - { flip_flippable( f.first, f.second ); } - - bool flip(Cell_handle c, int i, int j); - bool flip(const Edge &e) - { return flip( e.first, e.second, e.third ); } - - void flip_flippable(Cell_handle c, int i, int j); - void flip_flippable(const Edge &e) - { flip_flippable( e.first, e.second, e.third ); } - -private: - // common to flip and flip_flippable - void flip_really(Cell_handle c, int i, Cell_handle n, int in); - void flip_really(Cell_handle c, int i, int j, - Cell_handle c1, Vertex_handle v1, - int i1, int j1, int next1, - Cell_handle c2, Vertex_handle v2, - int i2, int j2, int next2, - Vertex_handle v3); - - Cell_handle create_star_3(Vertex_handle v, Cell_handle c, - int li, int prev_ind2 = -1); - - Cell_handle create_star_2(Vertex_handle v, - Cell_handle c, int li); - -public: - - // Internal function : assumes the conflict cells are marked. - template - Vertex_handle _insert_in_hole(CellIt cell_begin, CellIt cell_end, - Cell_handle begin, int i, - Vertex_handle newv) - { - CGAL_triangulation_precondition(begin != Cell_handle()); - // if begin == NULL (default arg), we could compute one by walking in - // CellIt. At the moment, the functionality is not available, you have - // to specify a starting facet. - - Cell_handle cnew; - if (dimension() == 3) - cnew = create_star_3(newv, begin, i); - else - cnew = create_star_2(newv, begin, i); - - newv->set_cell(cnew); - delete_cells(cell_begin, cell_end); - return newv; - } - - // Internal function : assumes the conflict cells are marked. - template - Vertex_handle _insert_in_hole(CellIt cell_begin, CellIt cell_end, - Cell_handle begin, int i) - { - return _insert_in_hole(cell_begin, cell_end, begin, i, create_vertex()); - } - - // Mark the cells in conflict, then calls the internal function. - template - Vertex_handle insert_in_hole(CellIt cell_begin, CellIt cell_end, - Cell_handle begin, int i, - Vertex_handle newv) - { - for (CellIt cit = cell_begin; cit != cell_end; ++cit) - (*cit)->tds_data().mark_in_conflict(); - - return _insert_in_hole(cell_begin, cell_end, begin, i, newv); - } - - // Mark the cells in conflict, then calls the internal function. - template - Vertex_handle insert_in_hole(CellIt cell_begin, CellIt cell_end, - Cell_handle begin, int i) - { - return insert_in_hole(cell_begin, cell_end, begin, i, create_vertex()); - } - - //INSERTION - - Vertex_handle insert_in_cell(Cell_handle c); - - Vertex_handle insert_in_facet(const Facet & f) - { return insert_in_facet(f.first, f.second); } - - Vertex_handle insert_in_facet(Cell_handle c, int i); - - Vertex_handle insert_in_edge(const Edge & e) - { return insert_in_edge(e.first, e.second, e.third); } - - Vertex_handle insert_in_edge(Cell_handle c, int i, int j); - - Vertex_handle insert_increase_dimension(Vertex_handle star =Vertex_handle()); - - // REMOVAL - -private: - Cell_handle remove_degree_4(Vertex_handle v); - Cell_handle remove_degree_3(Vertex_handle v); - Cell_handle remove_degree_2(Vertex_handle v); -public: - Cell_handle remove_from_maximal_dimension_simplex(Vertex_handle v); - void remove_decrease_dimension(Vertex_handle v) - { - remove_decrease_dimension (v, v); - } - void remove_decrease_dimension(Vertex_handle v, Vertex_handle w); - void decrease_dimension(Cell_handle f, int i); - - // Change orientation of the whole TDS. - void reorient() - { - CGAL_triangulation_precondition(dimension() >= 1); - for (Cell_iterator i = cells().begin(); - i != cells().end(); ++i) - change_orientation(i); - } - - // ITERATOR METHODS - - Cell_iterator cells_begin() const - { - if ( dimension() < 3 ) - return cells_end(); - return cells().begin(); - } - - Cell_iterator cells_end() const - { - return cells().end(); - } - - Cell_iterator raw_cells_begin() const - { - return cells().begin(); - } - - Cell_iterator raw_cells_end() const - { - return cells().end(); - } - - Facet_iterator facets_begin() const - { - if ( dimension() < 2 ) - return facets_end(); - return Facet_iterator(this); - } - - Facet_iterator facets_end() const - { - return Facet_iterator(this, 1); - } - - Edge_iterator edges_begin() const - { - if ( dimension() < 1 ) - return edges_end(); - return Edge_iterator(this); - } - - Edge_iterator edges_end() const - { - return Edge_iterator(this,1); - } - - Vertex_iterator vertices_begin() const - { - return vertices().begin(); - } - - Vertex_iterator vertices_end() const - { - return vertices().end(); - } - - // CIRCULATOR METHODS - - // cells around an edge - Cell_circulator incident_cells(const Edge & e) const - { - CGAL_triangulation_precondition( dimension() == 3 ); - return Cell_circulator(e); - } - Cell_circulator incident_cells(Cell_handle ce, int i, int j) const - { - CGAL_triangulation_precondition( dimension() == 3 ); - return Cell_circulator(ce, i, j); - } - - Cell_circulator incident_cells(const Edge &e, Cell_handle start) const - { - CGAL_triangulation_precondition( dimension() == 3 ); - return Cell_circulator(e, start); - } - Cell_circulator incident_cells(Cell_handle ce, int i, int j, - Cell_handle start) const - { - CGAL_triangulation_precondition( dimension() == 3 ); - return Cell_circulator(ce, i, j, start); - } - - //facets around an edge - Facet_circulator incident_facets(const Edge & e) const - { - CGAL_triangulation_precondition( dimension() == 3 ); - return Facet_circulator(e); - } - Facet_circulator incident_facets(Cell_handle ce, int i, int j) const - { - CGAL_triangulation_precondition( dimension() == 3 ); - return Facet_circulator(ce, i, j); - } - Facet_circulator incident_facets(const Edge & e, const Facet & start) const - { - CGAL_triangulation_precondition( dimension() == 3 ); - return Facet_circulator(e, start); - } - Facet_circulator incident_facets(Cell_handle ce, int i, int j, - const Facet & start) const - { - CGAL_triangulation_precondition( dimension() == 3 ); - return Facet_circulator(ce, i, j, start); - } - Facet_circulator incident_facets(const Edge & e, - Cell_handle start, int f) const - { - CGAL_triangulation_precondition( dimension() == 3 ); - return Facet_circulator(e, start, f); - } - Facet_circulator incident_facets(Cell_handle ce, int i, int j, - Cell_handle start, int f) const - { - CGAL_triangulation_precondition( dimension() == 3 ); - return Facet_circulator(ce, i, j, start, f); - } - - // 2D : circulates on the faces adjacent to a vertex. - Face_circulator incident_faces(Vertex_handle v) const - { - CGAL_triangulation_precondition( dimension() == 2 ); - return Face_circulator(v, v->cell()); - } - - // around a vertex -private: - - template - std::pair - incident_cells_3(Vertex_handle v, Cell_handle d, - std::pair it) const - { - CGAL_triangulation_precondition(dimension() == 3); - - std::stack cell_stack; - cell_stack.push(d); - d->tds_data().mark_in_conflict(); - *it.first++ = d; - - do { - Cell_handle c = cell_stack.top(); - cell_stack.pop(); - - for (int i=0; i<4; ++i) { - if (c->vertex(i) == v) - continue; - Cell_handle next = c->neighbor(i); - if (c < next) - *it.second++ = Facet(c, i); // Incident facet. - if (! next->tds_data().is_clear()) - continue; - cell_stack.push(next); - next->tds_data().mark_in_conflict(); - *it.first++ = next; - } - } while(!cell_stack.empty()); - - return it; - } - - - template - void - incident_cells_2(Vertex_handle v, Cell_handle c, - OutputIterator cells) const - { - CGAL_triangulation_precondition(dimension() == 2); - - // TODO : in 2D, there's no real need for tds_data, we could use - // a smarter algorithm. We could use the 2D Face_circulator. - // Should we just have this Face_circulator ? - - // Flag values : - // 1 : incident cell already visited - // 0 : unknown - c->tds_data().mark_in_conflict(); - *cells++ = c; - - for (int i=0; i<3; ++i) { - if (c->vertex(i) == v) - continue; - Cell_handle next = c->neighbor(i); - if (! next->tds_data().is_clear()) - continue; - incident_cells_2(v, next, cells); - } - } - -public: - - class False_filter { - public: - False_filter() {} - template - bool operator() (T) { - return false; - } - }; - - // Visitor for visit_incident_cells: - // outputs the facets - template - class Facet_extractor { - OutputIterator output; - Filter filter; - public: - Facet_extractor(Vertex_handle, OutputIterator _output, const Tds*, Filter _filter): - output(_output), filter(_filter){} - void operator() (Cell_handle) {} - - OutputIterator result() { - return output; - } - - class Facet_it { - OutputIterator& output; - Filter& filter; - public: - Facet_it(OutputIterator& _output, Filter& _filter): output(_output), filter(_filter) {} - Facet_it& operator*() {return *this;}; - Facet_it& operator++() {return *this;}; - Facet_it operator++(int) {return *this;}; - template - Facet_it& operator=(const T& e) { - if(filter(e)) - return *this; - *output++ = e; - return *this; - } - Facet_it& operator=(const Facet_it& f) { - output = f.output; - filter = f.filter; - return *this; - } - }; - Facet_it facet_it() { - return Facet_it(output, filter); - } - }; - - // Visitor for visit_incident_cells: - // outputs the cells - template - class Cell_extractor { - OutputIterator output; - Filter filter; - public: - Cell_extractor(Vertex_handle, OutputIterator _output, const Tds*, Filter _filter): - output(_output), filter(_filter) {} - - void operator()(Cell_handle c) { - if(filter(c)) - return; - *output++ = c; - } - CGAL::Emptyset_iterator facet_it() {return CGAL::Emptyset_iterator();} - OutputIterator result() { - return output; - } - }; - - // Visitor for visit_incident_cells: - // WARNING: 2D ONLY - // outputs the faces obtained as degenerated cells - template - class DegCell_as_Facet_extractor { - OutputIterator output; - Filter filter; - public: - DegCell_as_Facet_extractor(Vertex_handle, OutputIterator _output, const Tds*, Filter _filter): - output(_output), filter(_filter) {} - - void operator()(Cell_handle c) { - Facet f = Facet(c,3); - if(filter(f)) - return; - *output++ = f; - } - CGAL::Emptyset_iterator facet_it() {return CGAL::Emptyset_iterator();} - OutputIterator result() { - return output; - } - }; - - - // Visitor for visit_incident_cells: - // outputs the result of Treatment applied to the vertices - template - class Vertex_extractor { - Vertex_handle v; - std::set tmp_vertices; - Treatment treat; - const Tds* t; - Filter filter; - public: - Vertex_extractor(Vertex_handle _v, OutputIterator _output, const Tds* _t, Filter _filter): - v(_v), treat(_output), t(_t), filter(_filter) {} - void operator()(Cell_handle c) { - for (int j=0; j<= t->dimension(); ++j) { - Vertex_handle w = c->vertex(j); - if(filter(w)) - continue; - if (w != v) - if(tmp_vertices.insert(w).second) { - treat(c, v, j); - } - } - } - - CGAL::Emptyset_iterator facet_it() {return CGAL::Emptyset_iterator();} - OutputIterator result() { - return treat.result(); - } - }; - - // Treatment for Vertex_extractor: - // outputs the vertices - template - class Vertex_feeder_treatment { - OutputIterator output; - public: - Vertex_feeder_treatment(OutputIterator _output): output(_output) {}; - void operator()(Cell_handle c, Vertex_handle, int index) { - *output++ = c->vertex(index); - } - OutputIterator result() { - return output; - } - }; - - // Treatment for Vertex_extractor: - // outputs the edges corresponding to the vertices - template - class Edge_feeder_treatment { - OutputIterator output; - public: - Edge_feeder_treatment(OutputIterator _output): output(_output) {}; - void operator()(Cell_handle c, Vertex_handle v, int index) { - *output++ = Edge(c, c->index(v), index); - } - OutputIterator result() { - return output; - } - }; - - template - OutputIterator - incident_cells(Vertex_handle v, OutputIterator cells, Filter f = Filter()) const - { - return visit_incident_cells, - OutputIterator>(v, cells, f); - } - - template - OutputIterator - incident_cells(Vertex_handle v, OutputIterator cells) const - { - return incident_cells(v, cells); - } - - template - OutputIterator - incident_facets(Vertex_handle v, OutputIterator facets, Filter f = Filter()) const - { - CGAL_triangulation_precondition( dimension() > 1 ); - if(dimension() == 3) - return visit_incident_cells, OutputIterator>(v, facets, f); - else - return visit_incident_cells, OutputIterator>(v, facets, f); - } - - template - OutputIterator - incident_facets(Vertex_handle v, OutputIterator facets) const - { - return incident_facets(v, facets); - } - - template - OutputIterator - incident_edges(Vertex_handle v, OutputIterator edges, Filter f = Filter()) const - { - CGAL_triangulation_precondition( v != Vertex_handle() ); - CGAL_triangulation_precondition( dimension() >= 1 ); - CGAL_triangulation_expensive_precondition( is_vertex(v) ); - CGAL_triangulation_expensive_precondition( is_valid() ); - - if (dimension() == 1) { - CGAL_triangulation_assertion( number_of_vertices() >= 3); - Cell_handle n0 = v->cell(); - Cell_handle n1 = n0->neighbor(1-n0->index(v)); - *edges++ = Edge(n0, n0->index(v), 1-n0->index(v)); - *edges++ = Edge(n1, n1->index(v), 1-n1->index(v)); - return edges; - } - return visit_incident_cells, - OutputIterator, Filter>, - OutputIterator>(v, edges, f); - } - - template - OutputIterator - incident_edges(Vertex_handle v, OutputIterator edges) const - { - return incident_edges(v, edges); - } - - template - OutputIterator - adjacent_vertices(Vertex_handle v, OutputIterator vertices, Filter f = Filter()) const - { - CGAL_triangulation_precondition( v != Vertex_handle() ); - CGAL_triangulation_precondition( dimension() >= -1 ); - CGAL_triangulation_expensive_precondition( is_vertex(v) ); - CGAL_triangulation_expensive_precondition( is_valid() ); - - if (dimension() == -1) - return vertices; - - if (dimension() == 0) { - *vertices++ = v->cell()->neighbor(0)->vertex(0); - return vertices; - } - - if (dimension() == 1) { - CGAL_triangulation_assertion( number_of_vertices() >= 3); - Cell_handle n0 = v->cell(); - Cell_handle n1 = n0->neighbor(1-n0->index(v)); - *vertices++ = n0->vertex(1-n0->index(v)); - *vertices++ = n1->vertex(1-n1->index(v)); - return vertices; - } - return visit_incident_cells, - OutputIterator, Filter>, - OutputIterator>(v, vertices, f); - } - - // old name - kept for backwards compatibility but not documented - template - OutputIterator - incident_vertices(Vertex_handle v, OutputIterator vertices) const - { - return adjacent_vertices(v, vertices); - } - - // correct name - template - OutputIterator - adjacent_vertices(Vertex_handle v, OutputIterator vertices) const - { - return adjacent_vertices(v, vertices); - } - - template - OutputIterator - visit_incident_cells(Vertex_handle v, OutputIterator output, Filter f) const - { - CGAL_triangulation_precondition( v != Vertex_handle() ); - CGAL_triangulation_expensive_precondition( is_vertex(v) ); - - if ( dimension() < 2 ) - return output; - - Visitor visit(v, output, this, f); - - std::vector tmp_cells; - tmp_cells.reserve(64); - if ( dimension() == 3 ) - incident_cells_3(v, v->cell(), std::make_pair(std::back_inserter(tmp_cells), visit.facet_it())); - else - incident_cells_2(v, v->cell(), std::back_inserter(tmp_cells)); - - typename std::vector::iterator cit; - for(cit = tmp_cells.begin(); - cit != tmp_cells.end(); - ++cit) - { - (*cit)->tds_data().clear(); - visit(*cit); - } - return visit.result(); - } - - size_type degree(Vertex_handle v) const; - - // CHECKING - bool is_valid(bool verbose = false, int level = 0) const; - bool is_valid(Vertex_handle v, bool verbose = false, int level = 0) const; - bool is_valid(Cell_handle c, bool verbose = false, int level = 0) const; - - // Helping functions - Vertex_handle copy_tds(const Tds & tds, - Vertex_handle vert = Vertex_handle() ); - // returns the new vertex corresponding to vert in the new tds - - void swap(Tds & tds); - - void clear(); - - void set_adjacency(Cell_handle c0, int i0, - Cell_handle c1, int i1) const - { - CGAL_triangulation_assertion(i0 >= 0 && i0 <= dimension()); - CGAL_triangulation_assertion(i1 >= 0 && i1 <= dimension()); - CGAL_triangulation_assertion(c0 != c1); - c0->set_neighbor(i0,c1); - c1->set_neighbor(i1,c0); - } - - int mirror_index(Cell_handle c, int i) const - { - CGAL_triangulation_precondition ( i>=0 && i<4 ); - return c->neighbor(i)->index(c); - } - - Vertex_handle mirror_vertex(Cell_handle c, int i) const - { - return c->neighbor(i)->vertex(mirror_index(c, i)); - } - - Facet mirror_facet(Facet f) const - { - Cell_handle neighbor_cell = f.first->neighbor(f.second); - const int opposite_index = neighbor_cell->index(f.first); - return Facet(neighbor_cell, opposite_index); - } - - // We need the const_cast<>s because TDS is not const-correct. - Cell_range & cells() { return _cells; } - Cell_range & cells() const - { return const_cast(this)->_cells; } - - Vertex_range & vertices() {return _vertices;} - Vertex_range & vertices() const - { return const_cast(this)->_vertices; } - -private: - - // Change the orientation of the cell by swapping indices 0 and 1. - void change_orientation(Cell_handle c) const - { - Vertex_handle tmp_v = c->vertex(0); - c->set_vertex(0, c->vertex(1)); - c->set_vertex(1, tmp_v); - Cell_handle tmp_c = c->neighbor(0); - c->set_neighbor(0, c->neighbor(1)); - c->set_neighbor(1, tmp_c); - } - - // in dimension i, number of vertices >= i+2 - // ( the boundary of a simplex in dimension i+1 has i+2 vertices ) - int _dimension; - - Cell_range _cells; - Vertex_range _vertices; - - // used by is-valid : - bool count_vertices(size_type &i, bool verbose = false, int level = 0) const; - // counts AND checks the validity - bool count_facets(size_type &i, bool verbose = false, int level = 0) const; - // counts but does not check - bool count_edges(size_type &i, bool verbose = false, int level = 0) const; - // counts but does not check - bool count_cells(size_type &i, bool verbose = false, int level = 0) const; - // counts AND checks the validity -}; - -#ifdef CGAL_TDS_USE_OLD_CREATE_STAR_3 -template -typename Triangulation_data_structure_3::Cell_handle -Triangulation_data_structure_3:: -create_star_3(Vertex_handle v, Cell_handle c, int li, - int prev_ind2) -{ - CGAL_triangulation_precondition( dimension() == 3); - CGAL_triangulation_precondition( c->tds_data().is_in_conflict() ); - CGAL_triangulation_precondition( ! c->neighbor(li)->tds_data().is_in_conflict() ); - - Cell_handle cnew = create_cell(c->vertex(0), - c->vertex(1), - c->vertex(2), - c->vertex(3)); - cnew->set_vertex(li, v); - Cell_handle c_li = c->neighbor(li); - set_adjacency(cnew, li, c_li, c_li->index(c)); - - // Look for the other neighbors of cnew. - for (int ii=0; ii<4; ++ii) { - if (ii == prev_ind2 || cnew->neighbor(ii) != Cell_handle()) - continue; - cnew->vertex(ii)->set_cell(cnew); - - // Indices of the vertices of cnew such that ii,vj1,vj2,li positive. - Vertex_handle vj1 = c->vertex(next_around_edge(ii, li)); - Vertex_handle vj2 = c->vertex(next_around_edge(li, ii)); - Cell_handle cur = c; - int zz = ii; - Cell_handle n = cur->neighbor(zz); - // turn around the oriented edge vj1 vj2 - while ( n->tds_data().is_in_conflict() ) { - CGAL_triangulation_assertion( n != c ); - cur = n; - zz = next_around_edge(n->index(vj1), n->index(vj2)); - n = cur->neighbor(zz); - } - // Now n is outside region, cur is inside. - - n->tds_data().clear(); // Reset the flag for boundary cells. - - int jj1 = n->index(vj1); - int jj2 = n->index(vj2); - Vertex_handle vvv = n->vertex(next_around_edge(jj1, jj2)); - Cell_handle nnn = n->neighbor(next_around_edge(jj2, jj1)); - int zzz = nnn->index(vvv); - if (nnn == cur) { - // Neighbor relation is reciprocal, ie - // the cell we are looking for is not yet created. - nnn = create_star_3(v, nnn, zz, zzz); - } - - set_adjacency(nnn, zzz, cnew, ii); - } - - return cnew; -} -#else -//This function used to be recursive. -//This design resulted in call stack overflow in some cases. -//When we rewrote it, to emulate the class stack, we use a c++ stack. -//The stack used is a enriched std::vector that call reserve(N) when constructed -//(faster that testing capacity>N at each call of create_star_3). -//We use the class iAdjacency_info instead of a tuple because -//at the moment we made the change it was faster like this. -//The stack is a static variable of the function because it was also -//faster when we tested it. -template -typename Triangulation_data_structure_3::Cell_handle -Triangulation_data_structure_3:: -create_star_3(Vertex_handle v, Cell_handle c, int li, - int prev_ind2) -{ - CGAL_triangulation_precondition( dimension() == 3); - CGAL_triangulation_precondition( c->tds_data().is_in_conflict() ); - CGAL_triangulation_precondition( ! c->neighbor(li)->tds_data().is_in_conflict() ); - - Cell_handle cnew = create_cell(c->vertex(0), - c->vertex(1), - c->vertex(2), - c->vertex(3)); - cnew->set_vertex(li, v); - Cell_handle c_li = c->neighbor(li); - set_adjacency(cnew, li, c_li, c_li->index(c)); - -#ifdef CGAL_HAS_THREADS - static boost::thread_specific_ptr< std::vector > stack_safe_ptr; - if (stack_safe_ptr.get() == NULL) { - stack_safe_ptr.reset(new std::vector()); - stack_safe_ptr.get()->reserve(64); - } - std::vector& adjacency_info_stack=* stack_safe_ptr.get(); -#else - static std::vector adjacency_info_stack; - adjacency_info_stack.reserve(64); -#endif - - int ii=0; - do - { - // Look for the other neighbors of cnew. - if ( ! (ii == prev_ind2 || cnew->neighbor(ii) != Cell_handle()) ){ - cnew->vertex(ii)->set_cell(cnew); - - // Indices of the vertices of cnew such that ii,vj1,vj2,li positive. - Vertex_handle vj1 = c->vertex(next_around_edge(ii, li)); - Vertex_handle vj2 = c->vertex(next_around_edge(li, ii)); - Cell_handle cur = c; - int zz = ii; - Cell_handle n = cur->neighbor(zz); - // turn around the oriented edge vj1 vj2 - while ( n->tds_data().is_in_conflict() ) { - CGAL_triangulation_assertion( n != c ); - cur = n; - zz = next_around_edge(n->index(vj1), n->index(vj2)); - n = cur->neighbor(zz); - } - // Now n is outside region, cur is inside. - - n->tds_data().clear(); // Reset the flag for boundary cells. - - int jj1 = n->index(vj1); - int jj2 = n->index(vj2); - Vertex_handle vvv = n->vertex(next_around_edge(jj1, jj2)); - Cell_handle nnn = n->neighbor(next_around_edge(jj2, jj1)); - int zzz = nnn->index(vvv); - if (nnn == cur) { - // Neighbor relation is reciprocal, ie - // the cell we are looking for is not yet created. - //re-run the loop - adjacency_info_stack.push_back( iAdjacency_info(zzz,cnew,ii,c,li,prev_ind2) ); - c=nnn; li=zz; prev_ind2=zzz; ii=0; - //copy-pasted from beginning to avoid if ii==0 - CGAL_triangulation_precondition( c->tds_data().is_in_conflict() ); - CGAL_triangulation_precondition( ! c->neighbor(li)->tds_data().is_in_conflict() ); - cnew = create_cell(c->vertex(0),c->vertex(1),c->vertex(2),c->vertex(3)); - cnew->set_vertex(li, v); - c_li = c->neighbor(li); - set_adjacency(cnew, li, c_li, c_li->index(c)); - continue; - } - set_adjacency(nnn, zzz, cnew, ii); - } - while (++ii==4){ - if ( adjacency_info_stack.empty() ) return cnew; - Cell_handle nnn=cnew; - int zzz; - adjacency_info_stack.back().update_variables(zzz,cnew,ii,c,li,prev_ind2); - adjacency_info_stack.pop_back(); - set_adjacency(nnn, zzz, cnew, ii); - } - } - while (true); -} -#endif - -template -typename Triangulation_data_structure_3::Cell_handle -Triangulation_data_structure_3:: -create_star_2(Vertex_handle v, Cell_handle c, int li ) -{ - CGAL_triangulation_assertion( dimension() == 2 ); - Cell_handle cnew; - - // i1 i2 such that v,i1,i2 positive - int i1=ccw(li); - // traversal of the boundary of region in ccw order to create all - // the new facets - Cell_handle bound = c; - Vertex_handle v1 = c->vertex(i1); - int ind = c->neighbor(li)->index(c); // to be able to find the - // first cell that will be created - Cell_handle cur; - Cell_handle pnew = Cell_handle(); - do { - cur = bound; - // turn around v2 until we reach the boundary of region - while ( cur->neighbor(cw(i1))->tds_data().is_in_conflict() ) { - // neighbor in conflict - cur = cur->neighbor(cw(i1)); - i1 = cur->index( v1 ); - } - cur->neighbor(cw(i1))->tds_data().clear(); - // here cur has an edge on the boundary of region - cnew = create_face( v, v1, cur->vertex( ccw(i1) ) ); - set_adjacency(cnew, 0, cur->neighbor(cw(i1)), - cur->neighbor(cw(i1))->index(cur)); - cnew->set_neighbor(1, Cell_handle()); - cnew->set_neighbor(2, pnew); - // pnew is null at the first iteration - v1->set_cell(cnew); - //pnew->set_neighbor( cw(pnew->index(v1)), cnew ); - if (pnew != Cell_handle()) { pnew->set_neighbor( 1, cnew );} - - bound = cur; - i1 = ccw(i1); - v1 = bound->vertex(i1); - pnew = cnew; - //} while ( ( bound != c ) || ( li != cw(i1) ) ); - } while ( v1 != c->vertex(ccw(li)) ); - // missing neighbors between the first and the last created cells - cur = c->neighbor(li)->neighbor(ind); // first created cell - set_adjacency(cnew, 1, cur, 2); - return cnew; -} - -template < class Vb, class Cb> -std::istream& -operator>>(std::istream& is, Triangulation_data_structure_3& tds) - // reads : - // the dimension - // the number of vertices - // the number of cells - // the cells by the indices of their vertices - // the neighbors of each cell by their index in the preceding list of cells - // when dimension < 3 : the same with faces of maximal dimension -{ - typedef Triangulation_data_structure_3 Tds; - typedef typename Tds::Vertex_handle Vertex_handle; - typedef typename Tds::Cell_handle Cell_handle; - - tds.clear(); - - std::size_t n; - int d; - if(is_ascii(is)) - is >> d >> n; - else { - read(is, n); - read(is,d); - } - tds.set_dimension(d); - - if(n == 0) - return is; - - std::map V; - - // creation of the vertices - for (std::size_t i=0; i < n; i++) { - // is >> p; - // V[i] = tds.create_vertex(); - // V[i]->set_point(p); - V[i] = tds.create_vertex(); - } - - std::map< std::size_t, Cell_handle > C; - std::size_t m; - - tds.read_cells(is, V, m, C); - CGAL_triangulation_assertion( tds.is_valid() ); - return is; -} - -template < class Vb, class Cb> -std::ostream& -operator<<(std::ostream& os, const Triangulation_data_structure_3 &tds) - // writes : - // the dimension - // the number of vertices - // the number of cells - // the cells by the indices of their vertices - // the neighbors of each cell by their index in the preceding list of cells - // when dimension < 3 : the same with faces of maximal dimension -{ - typedef Triangulation_data_structure_3 Tds; - typedef typename Tds::size_type size_type; - typedef typename Tds::Vertex_handle Vertex_handle; - typedef typename Tds::Vertex_iterator Vertex_iterator; - - std::map V; - - // outputs dimension and number of vertices - size_type n = tds.number_of_vertices(); - - if (is_ascii(os)) - os << tds.dimension() << std::endl << n << std::endl; - else - { - write(os,tds.dimension()); - write(os,n); - } - - if (n == 0) - return os; - - // index the vertices - size_type i = 0; - for (Vertex_iterator it=tds.vertices_begin(); it != tds.vertices_end(); ++it) - V[it] = i++; - - CGAL_triangulation_assertion( i == n ); - - tds.print_cells(os, V); - - return os; -} - -template < class Vb, class Cb> -bool -Triangulation_data_structure_3:: -is_simplex( Cell_handle c ) const -{ - switch(dimension()) { - case 3 : return is_cell(c); - case 2 : return is_facet(c, 3); - case 1 : return is_edge(c, 0, 1); - case 0 : return is_vertex(c->vertex(0)); - case -1 : return c == cells().begin(); - } - return false; -} - -template < class Vb, class Cb> -bool -Triangulation_data_structure_3:: -is_vertex(Vertex_handle v) const -{ - return vertices().owns_dereferencable(v); -} - -template < class Vb, class Cb> -bool -Triangulation_data_structure_3:: -is_edge(Vertex_handle u, Vertex_handle v, - Cell_handle &c, int &i, int &j) const - // returns false when dimension <1 or when indices wrong -{ - CGAL_triangulation_expensive_precondition( is_vertex(u) && is_vertex(v) ); - - if (u==v) - return false; - - std::vector cells; - cells.reserve(64); - incident_cells(u, std::back_inserter(cells)); - - for (typename std::vector::iterator cit = cells.begin(); - cit != cells.end(); ++cit) - if ((*cit)->has_vertex(v, j)) { - c = *cit; - i = c->index(u); - return true; - } - return false; -} - -template < class Vb, class Cb> -bool -Triangulation_data_structure_3:: -is_edge(Vertex_handle u, Vertex_handle v) const -{ - Cell_handle c; - int i, j; - return is_edge(u, v, c, i, j); -} - -template < class Vb, class Cb> -bool -Triangulation_data_structure_3:: -is_edge(Cell_handle c, int i, int j) const -{ - if (dimension() < 1) - return false; - - if ( i==j ) return false; - if ( (i<0) || (j<0) ) return false; - if ( (dimension() == 1) && ((i>1) || (j>1)) ) return false; - if ( (dimension() == 2) && ((i>2) || (j>2)) ) return false; - if ((i>3) || (j>3)) return false; - - return cells().owns_dereferencable(c); -} - -template < class Vb, class Cb> -bool -Triangulation_data_structure_3:: -is_facet(Vertex_handle u, Vertex_handle v, - Vertex_handle w, - Cell_handle & c, int & i, int & j, int & k) const - // returns false when dimension <2 or when indices wrong -{ - CGAL_triangulation_expensive_precondition( is_vertex(u) && - is_vertex(v) && - is_vertex(w) ); - - if ( u==v || u==w || v==w ) - return false; - if (dimension() < 2) - return false; - - std::vector cells; - cells.reserve(64); - incident_cells(u, std::back_inserter(cells)); - - for (typename std::vector::iterator cit = cells.begin(); - cit != cells.end(); ++cit) - if ((*cit)->has_vertex(v, j) && (*cit)->has_vertex(w, k)) { - c = *cit; - i = c->index(u); - return true; - } - return false; -} - -template < class Vb, class Cb> -bool -Triangulation_data_structure_3:: -is_facet(Cell_handle c, int i) const -{ - CGAL_triangulation_precondition(i>=0 && i<4); - - if ( dimension() < 2 ) - return false; - - if ( (dimension() == 2) && (i!=3) ) - return false; - - return cells().owns_dereferencable(c); -} - -template < class Vb, class Cb> -bool -Triangulation_data_structure_3:: -is_cell( Cell_handle c ) const - // returns false when dimension <3 -{ - if (dimension() < 3) - return false; - - return cells().owns_dereferencable(c); -} - -template < class Vb, class Cb> -bool -Triangulation_data_structure_3:: -is_cell(Vertex_handle u, Vertex_handle v, - Vertex_handle w, Vertex_handle t, - Cell_handle & c, int & i, int & j, int & k, int & l) const - // returns false when dimension <3 -{ - CGAL_triangulation_expensive_precondition( is_vertex(u) && - is_vertex(v) && - is_vertex(w) && - is_vertex(t) ); - - if ( u==v || u==w || u==t || v==w || v==t || w==t ) - return false; - - std::vector cells; - cells.reserve(64); - incident_cells(u, std::back_inserter(cells)); - - for (typename std::vector::iterator cit = cells.begin(); - cit != cells.end(); ++cit) - if ((*cit)->has_vertex(v, j) && (*cit)->has_vertex(w, k) && - (*cit)->has_vertex(t, l)) { - c = *cit; - i = c->index(u); - return true; - } - return false; -} - -template < class Vb, class Cb> -bool -Triangulation_data_structure_3:: -is_cell(Vertex_handle u, Vertex_handle v, - Vertex_handle w, Vertex_handle t) - const - // returns false when dimension <3 -{ - Cell_handle c; - int i, j, k, l; - return is_cell(u, v, w, t, c, i, j, k, l); -} - -template < class Vb, class Cb> -inline -bool -Triangulation_data_structure_3:: -has_vertex(Cell_handle c, int i, Vertex_handle v, int & j) const - // computes the index j of the vertex in the cell c giving the query - // facet (c,i) - // j has no meaning if false is returned -{ - CGAL_triangulation_precondition( dimension() == 3 ); - return ( c->has_vertex(v,j) && (j != i) ); -} - -template < class Vb, class Cb> -inline -bool -Triangulation_data_structure_3:: -has_vertex(Cell_handle c, int i, Vertex_handle v) const - // checks whether the query facet (c,i) has vertex v -{ - CGAL_triangulation_precondition( dimension() == 3 ); - int j; - return ( c->has_vertex(v,j) && (j != i) ); -} - -template < class Vb, class Cb> -inline -bool -Triangulation_data_structure_3:: -has_vertex(const Facet & f, Vertex_handle v, int & j) const -{ - return has_vertex(f.first, f.second, v, j); -} - -template < class Vb, class Cb> -inline -bool -Triangulation_data_structure_3:: -has_vertex(const Facet & f, Vertex_handle v) const -{ - return has_vertex(f.first, f.second, v); -} - -template < class Vb, class Cb> -bool -Triangulation_data_structure_3:: -are_equal(Cell_handle c, int i, Cell_handle n, int j) const - // tests whether facets c,i and n,j, have the same 3 vertices - // the triangulation is supposed to be valid, the orientation of the - // facets is not checked here - // the neighbor relations between c and n are not tested either, - // which allows to use this method before setting these relations - // (see remove in Delaunay_3) - // if ( c->neighbor(i) != n ) return false; - // if ( n->neighbor(j) != c ) return false; -{ - CGAL_triangulation_precondition( dimension() == 3 ); - - if ( (c==n) && (i==j) ) return true; - - int j1,j2,j3; - return( n->has_vertex( c->vertex((i+1)&3), j1 ) && - n->has_vertex( c->vertex((i+2)&3), j2 ) && - n->has_vertex( c->vertex((i+3)&3), j3 ) && - ( j1+j2+j3+j == 6 ) ); -} - -template < class Vb, class Cb> -bool -Triangulation_data_structure_3:: -are_equal(const Facet & f, const Facet & g) const -{ - return are_equal(f.first, f.second, g.first, g.second); -} - -template < class Vb, class Cb> -bool -Triangulation_data_structure_3:: -are_equal(const Facet & f, Cell_handle n, int j) const -{ - return are_equal(f.first, f.second, n, j); -} - -template < class Vb, class Cb> -bool -Triangulation_data_structure_3:: -flip( Cell_handle c, int i ) - // returns false if the facet is not flippable - // true other wise and - // flips facet i of cell c - // c will be replaced by one of the new cells -{ - CGAL_triangulation_precondition( (dimension() == 3) && (0<=i) && (i<4) - && (number_of_vertices() >= 6) ); - CGAL_triangulation_expensive_precondition( is_cell(c) ); - - Cell_handle n = c->neighbor(i); - int in = n->index(c); - - // checks that the facet is flippable, - // ie the future edge does not already exist - if (is_edge(c->vertex(i), n->vertex(in))) - return false; - - flip_really(c,i,n,in); - return true; -} - -template < class Vb, class Cb> -void -Triangulation_data_structure_3:: -flip_flippable(Cell_handle c, int i ) - // flips facet i of cell c - // c will be replaced by one of the new cells -{ - CGAL_triangulation_precondition( (dimension() == 3) && (0<=i) && (i<4) - && (number_of_vertices() >= 6) ); - CGAL_triangulation_expensive_precondition( is_cell(c) ); - - Cell_handle n = c->neighbor(i); - int in = n->index(c); - - // checks that the facet is flippable, - // ie the future edge does not already exist - CGAL_triangulation_expensive_precondition( !is_edge(c->vertex(i), - n->vertex(in))); - flip_really(c,i,n,in); -} - -template < class Vb, class Cb> -inline -void -Triangulation_data_structure_3:: -flip_really( Cell_handle c, int i, Cell_handle n, int in ) - // private - used by flip and flip_flippable -{ - int i1 = (i+1)&3; - int i2 = (i+2)&3; - int i3 = (i+3)&3; - - int in1 = n->index(c->vertex(i1)); - int in2 = n->index(c->vertex(i2)); - int in3 = n->index(c->vertex(i3)); - - set_adjacency(c, i, n->neighbor(in3), n->neighbor(in3)->index(n)); - c->set_vertex( i3, n->vertex(in) ); - - set_adjacency(n, in, c->neighbor(i1), c->neighbor(i1)->index(c)); - n->set_vertex( in1, c->vertex(i) ); - - Cell_handle cnew = create_cell(c->vertex(i), c->vertex(i1), - n->vertex(in), n->vertex(in3)); - - set_adjacency(cnew, 0, n->neighbor(in2), n->neighbor(in2)->index(n)); - set_adjacency(cnew, 1, n, in2); - set_adjacency(cnew, 2, c->neighbor(i2), c->neighbor(i2)->index(c)); - set_adjacency(cnew, 3, c, i2); - set_adjacency(c, i1, n, in3); - - if ((i&1) != 0) - change_orientation(cnew); - - c->vertex(i1)->set_cell(cnew); - c->vertex(i2)->set_cell(c); - n->vertex(in3)->set_cell(n); - // to be implemented : 2d case - // CGAL_triangulation_precondition( (0<=i) && (i<3) ); -} - -template < class Vb, class Cb> -bool -Triangulation_data_structure_3:: -flip( Cell_handle c, int i, int j ) - // returns false if the edge is not flippable - // true otherwise and - // flips edge i,j of cell c - // c will be deleted -{ - CGAL_triangulation_precondition( (dimension() == 3) - && (0<=i) && (i<4) - && (0<=j) && (j<4) - && ( i != j ) - && (number_of_vertices() >= 6) ); - CGAL_triangulation_expensive_precondition( is_cell(c) ); - - // checks that the edge is flippable ie degree 3 - int degree = 0; - Cell_circulator ccir = incident_cells(c,i,j); - Cell_circulator cdone = ccir; - do { - ++degree; - ++ccir; - } while ( ccir != cdone ); - - if ( degree != 3 ) return false; - - int next = next_around_edge(i,j); - Cell_handle c1 = c->neighbor( next ); - Vertex_handle v1 = c->vertex( next ); // will become vertex of c1 - int i1 = c1->index( c->vertex(i) ); - int j1 = c1->index( c->vertex(j) ); - - int next1 = next_around_edge(i1,j1); - Cell_handle c2 = c1->neighbor( next1 ); - Vertex_handle v2 = c1->vertex( next1 ); // will become vertex of c2 - int i2 = c2->index( c->vertex(i) ); - int j2 = c2->index( c->vertex(j) ); - - int next2 = next_around_edge(i2,j2); - Vertex_handle v3 = c2->vertex( next2 ); - - // checks that the edge is flippable, - // is the future cells do not already exist - if ( is_cell(v1,v2,v3,c->vertex(i)) ) return false; - if ( is_cell(v1,v2,v3,c->vertex(j)) ) return false; - - flip_really(c,i,j,c1,v1,i1,j1,next1,c2,v2,i2,j2,next2,v3); - - return true; -} - -template < class Vb, class Cb> -void -Triangulation_data_structure_3:: -flip_flippable( Cell_handle c, int i, int j ) - // flips edge i,j of cell c - // c will be deleted -{ - CGAL_triangulation_precondition( (dimension() == 3) - && (0<=i) && (i<4) - && (0<=j) && (j<4) - && ( i != j ) - && (number_of_vertices() >= 6) ); - CGAL_triangulation_expensive_precondition( is_cell(c) ); - - // checks that the edge is flippable ie degree 3 - CGAL_triangulation_precondition_code( int degree = 0; ); - CGAL_triangulation_precondition_code - ( Cell_circulator ccir = incident_cells(c,i,j); ); - CGAL_triangulation_precondition_code( Cell_circulator cdone = ccir; ); - CGAL_triangulation_precondition_code( do { - ++degree; - ++ccir; - } while ( ccir != cdone ); ); - - CGAL_triangulation_precondition( degree == 3 ); - - int next = next_around_edge(i,j); - Cell_handle c1 = c->neighbor( next ); - Vertex_handle v1 = c->vertex( next ); // will become vertex of c1 - int i1 = c1->index( c->vertex(i) ); - int j1 = c1->index( c->vertex(j) ); - - int next1 = next_around_edge(i1,j1); - Cell_handle c2 = c1->neighbor( next1 ); - Vertex_handle v2 = c1->vertex( next1 ); // will become vertex of c2 - int i2 = c2->index( c->vertex(i) ); - int j2 = c2->index( c->vertex(j) ); - - int next2 = next_around_edge(i2,j2); - Vertex_handle v3 = c2->vertex( next2 ); - - // checks that the edge is flippable, - // is the future cells do not already exist - CGAL_triangulation_expensive_precondition( !is_cell(v1,v2,v3,c->vertex(i)) ); - CGAL_triangulation_expensive_precondition( !is_cell(v1,v2,v3,c->vertex(j)) ); - - flip_really(c,i,j,c1,v1,i1,j1,next1,c2,v2,i2,j2,next2,v3); -} - -template < class Vb, class Cb> -inline -void -Triangulation_data_structure_3:: -flip_really( Cell_handle c, int i, int j, - Cell_handle c1, Vertex_handle v1, - int i1, int j1, int next1, - Cell_handle c2, Vertex_handle v2, - int i2, int j2, int next2, - Vertex_handle v3 ) -{ - c->vertex(i)->set_cell(c1); - c->vertex(j)->set_cell(c2); - - c1->set_vertex( j1, v1 ); - v1->set_cell(c1); - c2->set_vertex( i2, v2 ); - v2->set_cell(c2); - - set_adjacency(c1, next1,c2->neighbor(j2), c2->neighbor(j2)->index(c2)); - set_adjacency(c2,c2->index(v1),c1->neighbor(i1),c1->neighbor(i1)->index(c1)); - - set_adjacency(c1, i1, c2, j2); - - set_adjacency(c1, 6-i1-j1-next1, c->neighbor(j), c->neighbor(j)->index(c)); - set_adjacency(c2, next2, c->neighbor(i), c->neighbor(i)->index(c)); - - v3->set_cell( c2 ); - - delete_cell( c ); -} - -template < class Vb, class Cb > -void -Triangulation_data_structure_3:: -read_cells(std::istream& is, std::map< std::size_t, Vertex_handle > &V, - std::size_t & m, std::map< std::size_t, Cell_handle > &C) -{ - // creation of the cells and neighbors - switch (dimension()) { - case 3: - case 2: - case 1: - { - if(is_ascii(is)) - is >> m; - else - read(is, m); - - for(std::size_t i = 0; i < m; i++) { - Cell_handle c = create_cell(); - for (int k=0; k<=dimension(); ++k) { - std::size_t ik; - if(is_ascii(is)) - is >> ik; - else - read(is, ik); - c->set_vertex(k, V[ik]); - V[ik]->set_cell(c); - } - C[i] = c; - } - for(std::size_t j = 0; j < m; j++) { - Cell_handle c = C[j]; - for (int k=0; k<=dimension(); ++k) { - std::size_t ik; - if(is_ascii(is)) - is >> ik; - else - read(is, ik); - c->set_neighbor(k, C[ik]); - } - } - break; - } - case 0: - { - m = 2; - - // CGAL_triangulation_assertion( n == 2 ); - for (int i=0; i < 2; i++) { - Cell_handle c = create_face(V[i], Vertex_handle(), Vertex_handle()); - C[i] = c; - V[i]->set_cell(c); - } - for (int j=0; j < 2; j++) { - Cell_handle c = C[j]; - c->set_neighbor(0, C[1-j]); - } - break; - } - case -1: - { - m = 1; - // CGAL_triangulation_assertion( n == 1 ); - Cell_handle c = create_face(V[0], Vertex_handle(), Vertex_handle()); - C[0] = c; - V[0]->set_cell(c); - break; - } - } -} - -template < class Vb, class Cb> -void -Triangulation_data_structure_3:: -print_cells(std::ostream& os, const std::map &V ) const -{ - std::map C; - std::size_t i = 0; - - switch ( dimension() ) { - case 3: - { - std::size_t m = number_of_cells(); - if(is_ascii(os)) - os << m << std::endl; - else - write(os, m); - - // write the cells - Cell_iterator it; - for(it = cells_begin(); it != cells_end(); ++it) { - C[it] = i++; - for(int j = 0; j < 4; j++){ - if(is_ascii(os)) { - os << V.find(it->vertex(j))->second; - if ( j==3 ) - os << std::endl; - else - os << ' '; - } - else - write(os, V.find(it->vertex(j))->second); - } - } - CGAL_triangulation_assertion( i == m ); - - // write the neighbors - for(it = cells_begin(); it != cells_end(); ++it) { - for (int j = 0; j < 4; j++) { - if(is_ascii(os)){ - os << C[it->neighbor(j)]; - if(j==3) - os << std::endl; - else - os << ' '; - } - else - write(os, C[it->neighbor(j)]); - } - } - break; - } - case 2: - { - size_type m = number_of_facets(); - if(is_ascii(os)) - os << m << std::endl; - else - write(os, m); - - // write the facets - Facet_iterator it; - for(it = facets_begin(); it != facets_end(); ++it) { - C[(*it).first] = i++; - for(int j = 0; j < 3; j++){ - if(is_ascii(os)) { - os << V.find((*it).first->vertex(j))->second; - if ( j==2 ) - os << std::endl; - else - os << ' '; - } - else { - write(os, V.find((*it).first->vertex(j))->second); - } - } - } - CGAL_triangulation_assertion( i == m ); - - // write the neighbors - for(it = facets_begin(); it != facets_end(); ++it) { - for (int j = 0; j < 3; j++) { - if(is_ascii(os)){ - os << C[(*it).first->neighbor(j)]; - if(j==2) - os << std::endl; - else - os << ' '; - } - else { - write(os, C[(*it).first->neighbor(j)]); - } - } - } - break; - } - case 1: - { - size_type m = number_of_edges(); - if(is_ascii(os)) - os << m << std::endl; - else - write(os, m); - // write the edges - Edge_iterator it; - for(it = edges_begin(); it != edges_end(); ++it) { - C[(*it).first] = i++; - for(int j = 0; j < 2; j++){ - if(is_ascii(os)) { - os << V.find((*it).first->vertex(j))->second; - if ( j==1 ) - os << std::endl; - else - os << ' '; - } - else { - write(os, V.find((*it).first->vertex(j))->second); - } - } - } - CGAL_triangulation_assertion( i == m ); - - // write the neighbors - for(it = edges_begin(); it != edges_end(); ++it) { - for (int j = 0; j < 2; j++) { - if(is_ascii(os)){ - os << C[(*it).first->neighbor(j)]; - if(j==1) - os << std::endl; - else - os << ' '; - } - else { - write(os, C[(*it).first->neighbor(j)]); - } - } - } - break; - } - } -} - -template -typename Triangulation_data_structure_3::Vertex_handle -Triangulation_data_structure_3:: -insert_in_cell(Cell_handle c) -{ - CGAL_triangulation_precondition( dimension() == 3 ); - CGAL_triangulation_precondition( c != Cell_handle() ); - CGAL_triangulation_expensive_precondition( is_cell(c) ); - - Vertex_handle v = create_vertex(); - - Vertex_handle v0 = c->vertex(0); - Vertex_handle v1 = c->vertex(1); - Vertex_handle v2 = c->vertex(2); - Vertex_handle v3 = c->vertex(3); - - Cell_handle n1 = c->neighbor(1); - Cell_handle n2 = c->neighbor(2); - Cell_handle n3 = c->neighbor(3); - - // c will be modified to have v,v1,v2,v3 as vertices - Cell_handle c3 = create_cell(v0,v1,v2,v); - Cell_handle c2 = create_cell(v0,v1,v,v3); - Cell_handle c1 = create_cell(v0,v,v2,v3); - - set_adjacency(c3, 0, c, 3); - set_adjacency(c2, 0, c, 2); - set_adjacency(c1, 0, c, 1); - - set_adjacency(c2, 3, c3, 2); - set_adjacency(c1, 3, c3, 1); - set_adjacency(c1, 2, c2, 1); - - set_adjacency(n1, n1->index(c), c1, 1); - set_adjacency(n2, n2->index(c), c2, 2); - set_adjacency(n3, n3->index(c), c3, 3); - - c->set_vertex(0,v); - - v0->set_cell(c1); - v->set_cell(c); - - return v; -} - -template -typename Triangulation_data_structure_3::Vertex_handle -Triangulation_data_structure_3:: -insert_in_facet(Cell_handle c, int i) -{ // inserts v in the facet opposite to vertex i of cell c - - CGAL_triangulation_precondition( c != Cell_handle() ); - CGAL_triangulation_precondition( dimension() >= 2 ); - - Vertex_handle v = create_vertex(); - - switch ( dimension() ) { - - case 3: - { - CGAL_triangulation_expensive_precondition( is_cell(c) ); - CGAL_triangulation_precondition( i == 0 || i == 1 || - i == 2 || i == 3 ); - // c will be modified to have v replacing vertex(i+3) - int i1,i2,i3; - - if ( (i&1) == 0 ) { - i1=(i+1)&3; i2=(i+2)&3; i3=6-i-i1-i2; - } - else { - i1=(i+1)&3; i2=(i+3)&3; i3=6-i-i1-i2; - } - // i,i1,i2,i3 is well oriented - // so v will "replace" the vertices in this order - // when creating the new cells one after another from c - - Vertex_handle vi=c->vertex(i); - Vertex_handle v1=c->vertex(i1); - Vertex_handle v2=c->vertex(i2); - Vertex_handle v3=c->vertex(i3); - - // new cell with v in place of i1 - Cell_handle nc = c->neighbor(i1); - Cell_handle cnew1 = create_cell(vi,v,v2,v3); - set_adjacency(cnew1, 1, nc, nc->index(c)); - set_adjacency(cnew1, 3, c, i1); - - v3->set_cell(cnew1); - - // new cell with v in place of i2 - nc = c->neighbor(i2); - Cell_handle cnew2 = create_cell(vi,v1,v,v3); - set_adjacency(cnew2, 2, nc, nc->index(c)); - set_adjacency(cnew2, 3, c, i2); - set_adjacency(cnew1, 2, cnew2, 1); - - // v replaces i3 in c - c->set_vertex(i3,v); - - // other side of facet containing v - Cell_handle d = c->neighbor(i); - int j = d->index(c); - int j1=d->index(v1);// triangulation supposed to be valid - int j2=d->index(v2); - int j3=6-j-j1-j2; - // then the orientation of j,j1,j2,j3 depends on the parity - // of i-j - - // new cell with v in place of j1 - Cell_handle nd = d->neighbor(j1); - Cell_handle dnew1 = create_cell(d->vertex(j),v,v3,v2); - set_adjacency(dnew1, 1, nd, nd->index(d)); - set_adjacency(dnew1, 2, d, j1); - set_adjacency(dnew1, 0, cnew1, 0); - - // new cell with v in place of j2 - nd = d->neighbor(j2); - Cell_handle dnew2 = create_cell(d->vertex(j),v1,v3,v); - - set_adjacency(dnew2, 3, nd, nd->index(d)); - set_adjacency(dnew2, 2, d, j2); - set_adjacency(dnew2, 0, cnew2, 0); - set_adjacency(dnew1, 3, dnew2, 1); - - // v replaces i3 in d - d->set_vertex(j3,v); - v->set_cell(d); - - break; - } - case 2: - { - CGAL_triangulation_expensive_precondition( is_facet(c,i) ); - Cell_handle n = c->neighbor(2); - Cell_handle cnew = create_face(c->vertex(0),c->vertex(1),v); - set_adjacency(cnew, 2, n, n->index(c)); - set_adjacency(cnew, 0, c, 2); - c->vertex(0)->set_cell(cnew); - - n = c->neighbor(1); - Cell_handle dnew = create_face(c->vertex(0),v,c->vertex(2)); - set_adjacency(dnew, 1, n, n->index(c)); - set_adjacency(dnew, 0, c, 1); - set_adjacency(dnew, 2, cnew, 1); - - c->set_vertex(0,v); - v->set_cell(c); - break; - } - } - - return v; -} - -template -typename Triangulation_data_structure_3::Vertex_handle -Triangulation_data_structure_3:: -insert_in_edge(Cell_handle c, int i, int j) - // inserts a vertex in the edge of cell c with vertices i and j -{ - CGAL_triangulation_precondition( c != Cell_handle() ); - CGAL_triangulation_precondition( i != j ); - CGAL_triangulation_precondition( dimension() >= 1 ); - - switch ( dimension() ) { - case 3: - { - CGAL_triangulation_expensive_precondition( is_cell(c) ); - CGAL_triangulation_precondition( i>=0 && i<=3 && j>=0 && j<=3 ); - - std::vector cells; - cells.reserve(32); - Cell_circulator ccir = incident_cells(c, i, j); - do { - Cell_handle cc = ccir; - cells.push_back(cc); - cc->tds_data().mark_in_conflict(); - ++ccir; - } while (c != ccir); - - return _insert_in_hole(cells.begin(), cells.end(), c, i); - } - case 2: - { - CGAL_triangulation_expensive_precondition( is_edge(c,i,j) ); - - Vertex_handle v = create_vertex(); - int k=3-i-j; // index of the third vertex of the facet - Cell_handle d = c->neighbor(k); - int kd = d->index(c); - int id = d->index(c->vertex(i)); - int jd = d->index(c->vertex(j)); - - Cell_handle cnew = create_cell(); - cnew->set_vertex(i,c->vertex(i)); - c->vertex(i)->set_cell(cnew); - cnew->set_vertex(j,v); - cnew->set_vertex(k,c->vertex(k)); - c->set_vertex(i,v); - - Cell_handle dnew = create_cell(); - dnew->set_vertex(id,d->vertex(id)); - // d->vertex(id)->cell() is cnew OK - dnew->set_vertex(jd,v); - dnew->set_vertex(kd,d->vertex(kd)); - d->set_vertex(id,v); - - Cell_handle nj = c->neighbor(j); - set_adjacency(cnew, i, c, j); - set_adjacency(cnew, j, nj, nj->index(c)); - - nj = d->neighbor(jd); - set_adjacency(dnew, id, d, jd); - set_adjacency(dnew, jd, nj, nj->index(d)); - - set_adjacency(cnew, k, dnew, kd); - - v->set_cell(cnew); - return v; - } - default: // case 1: - { - Vertex_handle v = create_vertex(); - CGAL_triangulation_expensive_precondition( is_edge(c,i,j) ); - Cell_handle cnew = create_face(v, c->vertex(1), Vertex_handle()); - c->vertex(1)->set_cell(cnew); - c->set_vertex(1,v); - set_adjacency(cnew, 0, c->neighbor(0), 1); - set_adjacency(cnew, 1, c, 0); - - v->set_cell(cnew); - return v; - } - } -} - -template -typename Triangulation_data_structure_3::Vertex_handle -Triangulation_data_structure_3:: -insert_increase_dimension(Vertex_handle star) - // star = vertex from which we triangulate the facet of the - // incremented dimension - // ( geometrically : star = infinite vertex ) - // = NULL only used to insert the 1st vertex (dimension -2 to dimension -1) - // changes the dimension -{ - CGAL_triangulation_precondition( dimension() < 3); - - Vertex_handle v = create_vertex(); - - int dim = dimension(); - if (dim != -2) { - CGAL_triangulation_precondition( star != Vertex_handle() ); - // In this case, this precondition is not relatively expensive. - CGAL_triangulation_precondition( is_vertex(star) ); - } - - // this is set now, so that it becomes allowed to reorient - // new facets or cells by iterating on them (otherwise the - // dimension is too small) - set_dimension( dimension()+1 ); - - switch ( dim ) { - case -2: - // insertion of the first vertex - // ( geometrically : infinite vertex ) - { - Cell_handle c = create_face(v, Vertex_handle(), Vertex_handle()); - v->set_cell(c); - break; - } - - case -1: - // insertion of the second vertex - // ( geometrically : first finite vertex ) - { - Cell_handle d = create_face(v, Vertex_handle(), Vertex_handle()); - v->set_cell(d); - set_adjacency(d, 0, star->cell(), 0); - break; - } - - case 0: - // insertion of the third vertex - // ( geometrically : second finite vertex ) - { - Cell_handle c = star->cell(); - Cell_handle d = c->neighbor(0); - - c->set_vertex(1,d->vertex(0)); - d->set_vertex(1,v); - d->set_neighbor(1,c); - Cell_handle e = create_face( v, star, Vertex_handle() ); - set_adjacency(e, 0, c, 1); - set_adjacency(e, 1, d, 0); - - v->set_cell(d); - break; - } - - case 1: - // general case : 4th vertex ( geometrically : 3rd finite vertex ) - // degenerate cases geometrically : 1st non collinear vertex - { - Cell_handle c = star->cell(); - int i = c->index(star); // i== 0 or 1 - int j = (1-i); - Cell_handle d = c->neighbor(j); - - c->set_vertex(2,v); - - Cell_handle e = c->neighbor(i); - Cell_handle cnew = c; - Cell_handle enew = Cell_handle(); - - while( e != d ){ - enew = create_cell(); - enew->set_vertex(i,e->vertex(j)); - enew->set_vertex(j,e->vertex(i)); - enew->set_vertex(2,star); - - set_adjacency(enew, i, cnew, j); - // false at the first iteration of the loop where it should - // be neighbor 2 - // it is corrected after the loop - set_adjacency(enew, 2, e, 2); - // neighbor j will be set during next iteration of the loop - - e->set_vertex(2,v); - - e = e->neighbor(i); - cnew = enew; - } - - d->set_vertex(2,v); - set_adjacency(enew, j, d, 2); - - // corrections for star->cell() : - c = star->cell(); - c->set_neighbor(2,c->neighbor(i)->neighbor(2)); - c->set_neighbor(j,d); - - v->set_cell(d); - - break; - } - - case 2: - // general case : 5th vertex ( geometrically : 4th finite vertex ) - // degenerate cases : geometrically 1st non coplanar vertex - { - // used to store the new cells, in order to be able to traverse only - // them to find the missing neighbors. - std::vector new_cells; - new_cells.reserve(16); - - Cell_iterator it = cells_begin(); - // allowed since the dimension has already been set to 3 - - v->set_cell(it); // ok since there is at least one ``cell'' - for(; it != cells_end(); ++it) { - // Here we must be careful since we create_cells in a loop controlled - // by an iterator. So we first take care of the cells newly created - // by the following test : - if (it->neighbor(0) == Cell_handle()) - continue; - it->set_neighbor(3, Cell_handle()); - it->set_vertex(3, v); - if ( ! it->has_vertex(star) ) { - Cell_handle cnew = create_cell( it->vertex(0), it->vertex(2), - it->vertex(1), star); - // The Intel compiler has a problem with passing "it" directly to - // function "set_adjacency": the adjacency is not changed. - Cell_handle ch_it = it; - set_adjacency(cnew, 3, ch_it, 3); - cnew->set_neighbor(0, Cell_handle()); - new_cells.push_back(cnew); - } - } - - // traversal of the new cells only, to add missing neighbors - for(typename std::vector::iterator ncit = new_cells.begin(); - ncit != new_cells.end(); ++ncit) { - Cell_handle n = (*ncit)->neighbor(3); // opposite to star - for ( int i=0; i<3; i++ ) { - int j; - if ( i==0 ) j=0; - else j=3-i; // vertex 1 and vertex 2 are always switched when - // creating a new cell (see above) - Cell_handle c = n->neighbor(i)->neighbor(3); - if ( c != Cell_handle() ) { - // i.e. star is not a vertex of n->neighbor(i) - (*ncit)->set_neighbor(j, c); - // opposite relation will be set when ncit arrives on c - // this avoids to look for the correct index - // and to test whether *ncit already has neighbor i - } - else { - // star is a vertex of n->neighbor(i) - set_adjacency(*ncit, j, n->neighbor(i), 3);//neighbor opposite to v - } - } - } - } - }// end switch - - return v; -} - -template -void -Triangulation_data_structure_3:: -remove_decrease_dimension(Vertex_handle v, Vertex_handle w) -{ - CGAL_triangulation_expensive_precondition( is_valid() ); - CGAL_triangulation_precondition( dimension() >= -1 ); - CGAL_triangulation_precondition( dimension() != 1 || - number_of_vertices() == 3); - CGAL_triangulation_precondition( number_of_vertices() > - (size_type) dimension() + 1 ); - CGAL_triangulation_precondition( degree(v) == number_of_vertices()-1 ); - - if (dimension() <= 0) { - delete_cell(v->cell()); - } - else { - // the cells incident to w are down graded one dimension - // the other cells are deleted - std::vector to_delete, to_downgrade; - - for (Cell_iterator ib = cells().begin(); - ib != cells().end(); ++ib) { - if ( ib->has_vertex(w) ) - to_downgrade.push_back(ib); - else - to_delete.push_back(ib); - } - - typename std::vector::iterator lfit=to_downgrade.begin(); - for( ; lfit != to_downgrade.end(); ++lfit) { - Cell_handle f = *lfit; - int j = f->index(w); - int k; if (f->has_vertex(v, k)) f->set_vertex(k, w); - if (j != dimension()) { - f->set_vertex(j, f->vertex(dimension())); - f->set_neighbor(j, f->neighbor(dimension())); - if (dimension() >= 1) - change_orientation(f); - } - f->set_vertex(dimension(), Vertex_handle()); - f->set_neighbor(dimension(), Cell_handle()); - - // Update vertex->cell() pointers. - for (int i = 0; i < dimension(); ++i) - f->vertex(i)->set_cell(f); - } - - delete_cells(to_delete.begin(), to_delete.end()); - } - delete_vertex(v); - set_dimension(dimension()-1); - CGAL_triangulation_postcondition(is_valid()); -} - -template -typename Triangulation_data_structure_3::Cell_handle -Triangulation_data_structure_3:: -remove_from_maximal_dimension_simplex(Vertex_handle v) -{ - CGAL_triangulation_precondition(dimension() >= 1); - CGAL_triangulation_precondition(degree(v) == (size_type) dimension() + 1); - CGAL_triangulation_precondition(number_of_vertices() > - (size_type) dimension() + 1); - - if (number_of_vertices() == (size_type) dimension() + 2) { - remove_decrease_dimension(v); - return Cell_handle(); - } - - if (dimension() == 3) - return remove_degree_4(v); - if (dimension() == 2) - return remove_degree_3(v); - - // dimension() == 1 - return remove_degree_2(v); -} - -template -typename Triangulation_data_structure_3::Cell_handle -Triangulation_data_structure_3:: -remove_degree_2(Vertex_handle v) -{ - CGAL_triangulation_precondition(dimension() == 1); - CGAL_triangulation_precondition(degree(v) == 2); - CGAL_triangulation_precondition(number_of_vertices() >= 4); - - // Cells to be killed. - Cell_handle c0, c1; - // Indices of v in these cells. - int i0, i1; - - c0 = v->cell(); - i0 = c0->index(v); - c1 = c0->neighbor(1-i0); - i1 = c1->index(v); - - // New cell : we copy the content of c0, so we keep the orientation. - Cell_handle newc = create_face(c0->vertex(0), - c0->vertex(1), - Vertex_handle()); - - newc->set_vertex(i0, c1->vertex(c1->index(c0))); - - set_adjacency(newc, i0, c0->neighbor(i0), mirror_index(c0, i0)); - set_adjacency(newc, 1-i0, c1->neighbor(i1), mirror_index(c1, i1)); - - newc->vertex(0)->set_cell(newc); - newc->vertex(1)->set_cell(newc); - - delete_cell(c0); - delete_cell(c1); - delete_vertex(v); - - return newc; -} - -template -typename Triangulation_data_structure_3::Cell_handle -Triangulation_data_structure_3:: -remove_degree_3(Vertex_handle v) -{ - CGAL_triangulation_precondition(dimension() == 2); - CGAL_triangulation_precondition(degree(v) == 3); - CGAL_triangulation_precondition(number_of_vertices() >= 5); - - // Cells to be killed. - Cell_handle c0, c1, c2; - // Indices of v in these cells. - int i0, i1, i2; - - c0 = v->cell(); - i0 = c0->index(v); - c1 = c0->neighbor(cw(i0)); - i1 = c1->index(v); - c2 = c0->neighbor(ccw(i0)); - i2 = c2->index(v); - - // New cell : we copy the content of c0, so we keep the orientation. - Cell_handle newc = create_face(c0->vertex(0), - c0->vertex(1), - c0->vertex(2)); - - newc->set_vertex(i0, c1->vertex(c1->index(c0))); - - set_adjacency(newc, i0, c0->neighbor(i0), mirror_index(c0, i0)); - set_adjacency(newc, cw(i0), c1->neighbor(i1), mirror_index(c1, i1)); - set_adjacency(newc, ccw(i0), c2->neighbor(i2), mirror_index(c2, i2)); - - newc->vertex(0)->set_cell(newc); - newc->vertex(1)->set_cell(newc); - newc->vertex(2)->set_cell(newc); - - delete_cell(c0); - delete_cell(c1); - delete_cell(c2); - delete_vertex(v); - - return newc; -} - -template -typename Triangulation_data_structure_3::Cell_handle -Triangulation_data_structure_3:: -remove_degree_4(Vertex_handle v) -{ - CGAL_triangulation_precondition(dimension() == 3); - CGAL_triangulation_precondition(degree(v) == 4); - CGAL_triangulation_precondition(number_of_vertices() >= 6); - - // Cells to be killed. - Cell_handle c0, c1, c2, c3; - // Indices of v in these cells. - int i0, i1, i2, i3; - - c0 = v->cell(); - i0 = c0->index(v); - c1 = c0->neighbor(i0^1); - i1 = c1->index(v); - c2 = c0->neighbor(i0^2); - i2 = c2->index(v); - c3 = c0->neighbor(i0^3); - i3 = c3->index(v); - - // New cell : we copy the content of c0, so we keep the orientation. - Cell_handle newc = create_cell(c0->vertex(0), - c0->vertex(1), - c0->vertex(2), - c0->vertex(3)); - - newc->set_vertex(i0, c1->vertex(c1->index(c0))); - - set_adjacency(newc, i0, c0->neighbor(i0), mirror_index(c0, i0)); - set_adjacency(newc, i0^1, c1->neighbor(i1), mirror_index(c1, i1)); - set_adjacency(newc, i0^2, c2->neighbor(i2), mirror_index(c2, i2)); - set_adjacency(newc, i0^3, c3->neighbor(i3), mirror_index(c3, i3)); - - newc->vertex(0)->set_cell(newc); - newc->vertex(1)->set_cell(newc); - newc->vertex(2)->set_cell(newc); - newc->vertex(3)->set_cell(newc); - - delete_cell(c0); - delete_cell(c1); - delete_cell(c2); - delete_cell(c3); - delete_vertex(v); - - return newc; -} - -template -void -Triangulation_data_structure_3:: -decrease_dimension(Cell_handle c, int i) -{ - CGAL_triangulation_expensive_precondition( is_valid() );; - CGAL_triangulation_precondition( dimension() >= 2); - CGAL_triangulation_precondition( number_of_vertices() > - (size_type) dimension() + 1 ); - CGAL_triangulation_precondition( degree(c->vertex(i)) == number_of_vertices()-1 ); - - Vertex_handle v = c->vertex(i); - Vertex_handle w = c->vertex(i); - - // the cells incident to w are down graded one dimension - // the other cells are deleted - std::vector to_delete, to_downgrade; - - for (Cell_iterator ib = cells().begin(); - ib != cells().end(); ++ib) { - if ( ib->has_vertex(w) ) - to_downgrade.push_back(ib); - else - to_delete.push_back(ib); - } - - typename std::vector::iterator lfit=to_downgrade.begin(); - for( ; lfit != to_downgrade.end(); ++lfit) { - Cell_handle f = *lfit; - int j = f->index(w); - int k; - if (f->has_vertex(v, k)) f->set_vertex(k, w); - if (j != dimension()) { - f->set_vertex(j, f->vertex(dimension())); - f->set_neighbor(j, f->neighbor(dimension())); - if (dimension() >= 1) - change_orientation(f); - } - f->set_vertex(dimension(), Vertex_handle()); - f->set_neighbor(dimension(), Cell_handle()); - - // Update vertex->cell() pointers. - for (int i = 0; i < dimension(); ++i) - f->vertex(i)->set_cell(f); - } - - delete_cells(to_delete.begin(), to_delete.end()); - - //delete_vertex(v); - set_dimension(dimension()-1); - - if(dimension() == 2) - { - Cell_handle n0 = c->neighbor(0); - Cell_handle n1 = c->neighbor(1); - Cell_handle n2 = c->neighbor(2); - Vertex_handle v0 = c->vertex(0); - Vertex_handle v1 = c->vertex(1); - Vertex_handle v2 = c->vertex(2); - - int i0 = 0, i1 = 0, i2 = 0; - - for(int i=0; i<3; i++) if(n0->neighbor(i) == c) { i0 = i; break; } - for(int i=0; i<3; i++) if(n1->neighbor(i) == c) { i1 = i; break; } - for(int i=0; i<3; i++) if(n2->neighbor(i) == c) { i2 = i; break; } - - Cell_handle c1 = create_cell(v, v0, v1, Vertex_handle()); - Cell_handle c2 = create_cell(v, v1, v2, Vertex_handle()); - - c->set_vertex(0, v); - c->set_vertex(1, v2); - c->set_vertex(2, v0); - c->set_vertex(3, Vertex_handle()); - - //Cell_handle c3 = create_cell(v, v2, v0, Vertex_handle()); - Cell_handle c3 = c; - - c1->set_neighbor(0, n2); n2->set_neighbor(i2, c1); - c1->set_neighbor(1, c2); - c1->set_neighbor(2, c3); - c1->set_neighbor(3, Cell_handle()); - - c2->set_neighbor(0, n0); n0->set_neighbor(i0, c2); - c2->set_neighbor(1, c3); - c2->set_neighbor(2, c1); - c2->set_neighbor(3, Cell_handle()); - - c3->set_neighbor(0, n1); n1->set_neighbor(i1, c3); - c3->set_neighbor(1, c1); - c3->set_neighbor(2, c2); - c3->set_neighbor(3, Cell_handle()); - - v->set_cell(c1); - v0->set_cell(c1); - v1->set_cell(c1); - v2->set_cell(c2); - } - - if(dimension() == 1) - { - Cell_handle n0 = c->neighbor(0); - Cell_handle n1 = c->neighbor(1); - Vertex_handle v0 = c->vertex(0); - Vertex_handle v1 = c->vertex(1); - - int i0 = 0 , i1 = 0; - - for(int i=0; i<2; i++) if(n0->neighbor(i) == c) { i0 = i; break; } - for(int i=0; i<2; i++) if(n1->neighbor(i) == c) { i1 = i; break; } - - Cell_handle c1 = create_cell(v0, v, Vertex_handle(), Vertex_handle()); - - c->set_vertex(0, v); - c->set_vertex(1, v1); - c->set_vertex(2, Vertex_handle()); - c->set_vertex(3, Vertex_handle()); - - //Cell_handle c2 = create_cell(v, v1, Vertex_handle(), Vertex_handle()); - Cell_handle c2 = c; - - c1->set_neighbor(0, c2); - c1->set_neighbor(1, n1); n1->set_neighbor(i1, c1); - c1->set_neighbor(2, Cell_handle()); - c1->set_neighbor(3, Cell_handle()); - - c2->set_neighbor(0, n0); n0->set_neighbor(i0, c2); - c2->set_neighbor(1, c1); - c2->set_neighbor(2, Cell_handle()); - c2->set_neighbor(3, Cell_handle()); - - v->set_cell(c1); - v0->set_cell(c1); - v1->set_cell(c2); - } - - CGAL_triangulation_postcondition(is_valid()); -} - - -template -typename Triangulation_data_structure_3::size_type -Triangulation_data_structure_3:: -degree(Vertex_handle v) const -{ - std::size_t res; - adjacent_vertices(v, Counting_output_iterator(&res)); - return res; -} - -template -bool -Triangulation_data_structure_3:: -is_valid(bool verbose, int level ) const -{ - switch ( dimension() ) { - case 3: - { - - if(number_of_vertices() <= 4) { - if (verbose) - std::cerr << "wrong number of vertices" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - - size_type vertex_count; - if ( ! count_vertices(vertex_count,verbose,level) ) - return false; - if ( number_of_vertices() != vertex_count ) { - if (verbose) - std::cerr << "wrong number of vertices" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - - size_type cell_count; - if ( ! count_cells(cell_count,verbose,level) ) - return false; - size_type edge_count; - if ( ! count_edges(edge_count,verbose,level) ) - return false; - size_type facet_count; - if ( ! count_facets(facet_count,verbose,level) ) - return false; - - // Euler relation - if ( cell_count - facet_count + edge_count - vertex_count != 0 ) { - if (verbose) - std::cerr << "Euler relation unsatisfied" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - - break; - } - case 2: - { - - if(number_of_vertices() <= 3) { - if (verbose) - std::cerr << "wrong number of vertices" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - - size_type vertex_count; - - if ( ! count_vertices(vertex_count,verbose,level) ) - return false; - if ( number_of_vertices() != vertex_count ) { - if (verbose) - std::cerr << "false number of vertices" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - - size_type edge_count; - if ( ! count_edges(edge_count,verbose,level) ) - return false; - // Euler for edges - if ( edge_count != 3 * vertex_count - 6 ) { - if (verbose) - std::cerr << "Euler relation unsatisfied - edges/vertices" - << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - - size_type facet_count; - if ( ! count_facets(facet_count,verbose,level) ) - return false; - // Euler for facets - if ( facet_count != 2 * vertex_count - 4 ) { - if (verbose) - std::cerr << "Euler relation unsatisfied - facets/vertices" - << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - break; - } - case 1: - { - - if(number_of_vertices() <= 1) { - if (verbose) - std::cerr << "wrong number of vertices" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - - size_type vertex_count; - if ( ! count_vertices(vertex_count,verbose,level) ) - return false; - if ( number_of_vertices() != vertex_count ) { - if (verbose) - std::cerr << "false number of vertices" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - size_type edge_count; - if ( ! count_edges(edge_count,verbose,level) ) - return false; - // Euler for edges - if ( edge_count != vertex_count ) { - if (verbose) - std::cerr << "false number of edges" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - break; - } - case 0: - { - if ( number_of_vertices() < 2 ) { - if (verbose) - std::cerr << "less than 2 vertices but dimension 0" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - // no break; continue - } - case -1: - { - if ( number_of_vertices() < 1 ) { - if (verbose) - std::cerr << "no vertex but dimension -1" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - // vertex count - size_type vertex_count; - if ( ! count_vertices(vertex_count,verbose,level) ) - return false; - if ( number_of_vertices() != vertex_count ) { - if (verbose) - std::cerr << "false number of vertices" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - } - } // end switch - if (verbose) - std::cerr << "valid data structure" << std::endl; - return true; -} - -template -bool -Triangulation_data_structure_3:: -is_valid(Vertex_handle v, bool verbose, int level) const -{ - bool result = v->is_valid(verbose,level); - result = result && v->cell()->has_vertex(v); - if ( ! result ) { - if ( verbose ) - std::cerr << "invalid vertex" << std::endl; - CGAL_triangulation_assertion(false); - } - return result; -} - -template -bool -Triangulation_data_structure_3:: -is_valid(Cell_handle c, bool verbose, int level) const -{ - if ( ! c->is_valid(verbose, level) ) - return false; - - switch (dimension()) { - case -2: - case -1: - { - if ( c->vertex(0) == Vertex_handle() ) { - if (verbose) - std::cerr << "vertex 0 NULL" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - is_valid(c->vertex(0),verbose,level); - if ( c->vertex(1) != Vertex_handle() || c->vertex(2) != Vertex_handle()) { - if (verbose) - std::cerr << "vertex 1 or 2 != NULL" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - if ( c->neighbor(0) != Cell_handle() || - c->neighbor(1) != Cell_handle() || - c->neighbor(2) != Cell_handle()) { - if (verbose) - std::cerr << "one neighbor != NULL" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - break; - } - - case 0: - { - if ( c->vertex(0) == Vertex_handle() ) { - if (verbose) - std::cerr << "vertex 0 NULL" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - is_valid(c->vertex(0),verbose,level); - if ( c->neighbor (0) == Cell_handle() ) { - if (verbose) - std::cerr << "neighbor 0 NULL" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - if ( c->vertex(1) != Vertex_handle() || - c->vertex(2) != Vertex_handle() ) { - if (verbose) - std::cerr << "vertex 1 or 2 != NULL" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - if ( c->neighbor(1) != Cell_handle() || - c->neighbor(2) != Cell_handle() ) { - if (verbose) - std::cerr << "neighbor 1 or 2 != NULL" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - - if ( ! c->neighbor(0)->has_vertex(c->vertex(0)) ) { - if (verbose) - std::cerr << "neighbor 0 does not have vertex 0" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - break; - } - - case 1: - { - Vertex_handle v0 = c->vertex(0); - Vertex_handle v1 = c->vertex(1); - Cell_handle n0 = c->neighbor(0); - Cell_handle n1 = c->neighbor(1); - - if ( v0 == Vertex_handle() || v1 == Vertex_handle() ) { - if (verbose) - std::cerr << "vertex 0 or 1 NULL" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - is_valid(c->vertex(0),verbose,level); - is_valid(c->vertex(1),verbose,level); - if ( n0 == Cell_handle() || n1 == Cell_handle() ) { - if (verbose) - std::cerr << "neighbor 0 or 1 NULL" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - - if ( v0 != n1->vertex(1) ) { - if (verbose) - std::cerr << "neighbor 1 does not have vertex 0 as vertex 1" - << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - if ( v1 != n0->vertex(0) ) { - if (verbose) - std::cerr << "neighbor 0 does not have vertex 1 as vertex 0" - << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - - if ( n0->neighbor(1) != c ) { - if (verbose) - std::cerr << "neighbor 0 does not have this as neighbor 1" - << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - if ( n1->neighbor(0) != c ) { - if (verbose) - std::cerr << "neighbor 1 does not have this as neighbor 0" - << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - - break; - } - - case 2: - { - if ( c->vertex(0) == Vertex_handle() || - c->vertex(1) == Vertex_handle() || - c->vertex(2) == Vertex_handle() ) { - if (verbose) - std::cerr << "vertex 0, 1, or 2 NULL" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - is_valid(c->vertex(0),verbose,level); - is_valid(c->vertex(1),verbose,level); - is_valid(c->vertex(2),verbose,level); - int in; - Cell_handle n; - for(int i = 0; i < 3; i++) { - n = c->neighbor(i); - if ( n == Cell_handle() ) { - if (verbose) - std::cerr << "neighbor " << i << " NULL" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - if ( ! n->has_vertex(c->vertex(cw(i)),in ) ) { - if (verbose) - std::cerr << "vertex " << cw(i) - << " not vertex of neighbor " << i << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - in = cw(in); - if ( n->neighbor(in) != c ) { - if (verbose) - std::cerr << "neighbor " << i - << " does not have this as neighbor " - << in << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - if ( c->vertex(ccw(i)) != n->vertex(cw(in)) ) { - if (verbose) - std::cerr << "vertex " << ccw(i) - << " is not vertex " << cw(in) - << " of neighbor " << i << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - } - break; - } - - case 3: - { - int i; - for(i = 0; i < 4; i++) { - if ( c->vertex(i) == Vertex_handle() ) { - if (verbose) - std::cerr << "vertex " << i << " NULL" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - is_valid(c->vertex(i),verbose,level); - } - - for(i = 0; i < 4; i++) { - Cell_handle n = c->neighbor(i); - if ( n == Cell_handle() ) { - if (verbose) - std::cerr << "neighbor " << i << " NULL" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - - int in = 5; - // if ( ! n->has_neighbor(handle(), in) ) { - if ( n->neighbor(0) == c) in = 0; - if ( n->neighbor(1) == c) in = 1; - if ( n->neighbor(2) == c) in = 2; - if ( n->neighbor(3) == c) in = 3; - if (in == 5) { - if (verbose) - std::cerr << "neighbor of c has not c as neighbor" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - - int j1n,j2n,j3n; - if ( ! n->has_vertex(c->vertex((i+1)&3),j1n) ) { - if (verbose) { std::cerr << "vertex " << ((i+1)&3) - << " not vertex of neighbor " - << i << std::endl; } - CGAL_triangulation_assertion(false); - return false; - } - if ( ! n->has_vertex(c->vertex((i+2)&3),j2n) ) { - if (verbose) { std::cerr << "vertex " << ((i+2)&3) - << " not vertex of neighbor " - << i << std::endl; } - CGAL_triangulation_assertion(false); - return false; - } - if ( ! n->has_vertex(c->vertex((i+3)&3),j3n) ) { - if (verbose) { std::cerr << "vertex " << ((i+3)&3) - << " not vertex of neighbor " - << i << std::endl; } - CGAL_triangulation_assertion(false); - return false; - } - - if ( in+j1n+j2n+j3n != 6) { - if (verbose) { std::cerr << "sum of the indices != 6 " - << std::endl; } - CGAL_triangulation_assertion(false); - return false; - } - - // tests whether the orientations of this and n are consistent - if ( ((i+in)&1) == 0 ) { // i and in have the same parity - if ( j1n == ((in+1)&3) ) { - if ( ( j2n != ((in+3)&3) ) || ( j3n != ((in+2)&3) ) ) { - if (verbose) - std::cerr << " pb orientation with neighbor " - << i << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - } - if ( j1n == ((in+2)&3) ) { - if ( ( j2n != ((in+1)&3) ) || ( j3n != ((in+3)&3) ) ) { - if (verbose) - std::cerr << " pb orientation with neighbor " - << i << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - } - if ( j1n == ((in+3)&3) ) { - if ( ( j2n != ((in+2)&3) ) || ( j3n != ((in+1)&3) ) ) { - if (verbose) - std::cerr << " pb orientation with neighbor " - << i << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - } - } - else { // i and in do not have the same parity - if ( j1n == ((in+1)&3) ) { - if ( ( j2n != ((in+2)&3) ) || ( j3n != ((in+3)&3) ) ) { - if (verbose) - std::cerr << " pb orientation with neighbor " - << i << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - } - if ( j1n == ((in+2)&3) ) { - if ( ( j2n != ((in+3)&3) ) || ( j3n != ((in+1)&3) ) ) { - if (verbose) - std::cerr << " pb orientation with neighbor " - << i << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - } - if ( j1n == ((in+3)&3) ) { - if ( ( j2n != ((in+1)&3) ) || ( j3n != ((in+2)&3) ) ) { - if (verbose) - std::cerr << " pb orientation with neighbor " - << i << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - } - } - } // end looking at neighbors - }// end case dim 3 - } // end switch - return true; -} - -template -typename Triangulation_data_structure_3::Vertex_handle -Triangulation_data_structure_3:: -copy_tds(const Tds & tds, Vertex_handle vert ) - // returns the new vertex corresponding to vert in the new tds -{ - CGAL_triangulation_expensive_precondition( vert == Vertex_handle() - || tds.is_vertex(vert) ); - - clear(); - - size_type n = tds.number_of_vertices(); - set_dimension(tds.dimension()); - - // Number of pointers to cell/vertex to copy per cell. - int dim = (std::max)(1, dimension() + 1); - - if (n == 0) - return vert; - - // Create the vertices. - std::vector TV(n); - size_type i = 0; - - for (Vertex_iterator vit = tds.vertices_begin(); - vit != tds.vertices_end(); ++vit) - TV[i++] = vit; - - CGAL_triangulation_assertion( i == n ); - - std::map< Vertex_handle, Vertex_handle > V; - std::map< Cell_handle, Cell_handle > F; - - for (size_type i=0; i <= n-1; ++i) - V[ TV[i] ] = create_vertex(TV[i]); - - // Create the cells. - for (Cell_iterator cit = tds.cells().begin(); - cit != tds.cells_end(); ++cit) { - F[cit] = create_cell(cit); - for (int j = 0; j < dim; j++) - F[cit]->set_vertex(j, V[cit->vertex(j)] ); - } - - // Link the vertices to a cell. - for (Vertex_iterator vit2 = tds.vertices_begin(); - vit2 != tds.vertices_end(); ++vit2) - V[vit2]->set_cell( F[vit2->cell()] ); - - // Hook neighbor pointers of the cells. - for (Cell_iterator cit2 = tds.cells().begin(); - cit2 != tds.cells_end(); ++cit2) { - for (int j = 0; j < dim; j++) - F[cit2]->set_neighbor(j, F[cit2->neighbor(j)] ); - } - - CGAL_triangulation_postcondition( is_valid() ); - - return (vert != Vertex_handle()) ? V[vert] : vert; -} - -template -void -Triangulation_data_structure_3:: -swap(Tds & tds) -{ - CGAL_triangulation_expensive_precondition(tds.is_valid() && is_valid()); - - std::swap(_dimension, tds._dimension); - cells().swap(tds.cells()); - vertices().swap(tds.vertices()); -} - -template -void -Triangulation_data_structure_3:: -clear() -{ - cells().clear(); - vertices().clear(); - set_dimension(-2); -} - -template -bool -Triangulation_data_structure_3:: -count_vertices(size_type & i, bool verbose, int level) const - // counts AND checks the validity -{ - i = 0; - - for (Vertex_iterator it = vertices_begin(); it != vertices_end(); ++it) { - if ( ! is_valid(it,verbose,level) ) { - if (verbose) - std::cerr << "invalid vertex" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - ++i; - } - return true; -} - -template -bool -Triangulation_data_structure_3:: -count_facets(size_type & i, bool verbose, int level) const - // counts but does not check -{ - i = 0; - - for (Facet_iterator it = facets_begin(); it != facets_end(); ++it) { - if ( ! is_valid((*it).first,verbose, level) ) { - if (verbose) - std::cerr << "invalid facet" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - ++i; - } - return true; -} - -template -bool -Triangulation_data_structure_3:: -count_edges(size_type & i, bool verbose, int level) const - // counts but does not check -{ - i = 0; - - for (Edge_iterator it = edges_begin(); it != edges_end(); ++it) { - if ( ! is_valid((*it).first,verbose, level) ) { - if (verbose) - std::cerr << "invalid edge" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - ++i; - } - return true; -} - -template -bool -Triangulation_data_structure_3:: -count_cells(size_type & i, bool verbose, int level) const - // counts AND checks the validity -{ - i = 0; - - for (Cell_iterator it = cells_begin(); it != cells_end(); ++it) { - if ( ! is_valid(it,verbose, level) ) { - if (verbose) - std::cerr << "invalid cell" << std::endl; - CGAL_triangulation_assertion(false); - return false; - } - ++i; - } - return true; -} - -} //namespace CGAL - -#endif // CGAL_TRIANGULATION_DATA_STRUCTURE_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/Triangulation_ds_cell_base_3.h b/Triangulation_3_copy_tds/include/CGAL/Triangulation_ds_cell_base_3.h deleted file mode 100644 index ce91f52da81..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/Triangulation_ds_cell_base_3.h +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright (c) 1999-2005 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// Author(s) : Monique Teillaud -// Sylvain Pion - -// cell of a triangulation data structure of any dimension <=3 - -#ifndef CGAL_TRIANGULATION_DS_CELL_BASE_3_H -#define CGAL_TRIANGULATION_DS_CELL_BASE_3_H - -#include -#include -#include - -namespace CGAL { - -template < typename TDS = void > -class Triangulation_ds_cell_base_3 -{ -public: - typedef TDS Triangulation_data_structure; - typedef typename TDS::Vertex_handle Vertex_handle; - typedef typename TDS::Cell_handle Cell_handle; - typedef typename TDS::Vertex Vertex; - typedef typename TDS::Cell Cell; - typedef typename TDS::Cell_data TDS_data; - - template - struct Rebind_TDS { typedef Triangulation_ds_cell_base_3 Other; }; - - Triangulation_ds_cell_base_3() {} - - Triangulation_ds_cell_base_3(Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3) -#ifndef CGAL_CFG_ARRAY_MEMBER_INITIALIZATION_BUG - : V((Vertex_handle[4]) {v0, v1, v2, v3} ) {} -#else - { set_vertices(v0, v1, v2, v3); } -#endif - - Triangulation_ds_cell_base_3(Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3, - Cell_handle n0, Cell_handle n1, - Cell_handle n2, Cell_handle n3) -#ifndef CGAL_CFG_ARRAY_MEMBER_INITIALIZATION_BUG - : N((Cell_handle[4]) {n0, n1, n2, n3}), V((Vertex_handle[4]) {v0, v1, v2, v3} ) {} -#else - { - set_neighbors(n0, n1, n2, n3); - set_vertices(v0, v1, v2, v3); - } -#endif - - // ACCESS FUNCTIONS - - Vertex_handle vertex(int i) const - { - CGAL_triangulation_precondition( i >= 0 && i <= 3 ); - return V[i]; - } - - bool has_vertex(Vertex_handle v) const - { - return (V[0] == v) || (V[1] == v) || (V[2]== v) || (V[3]== v); - } - - bool has_vertex(Vertex_handle v, int & i) const - { - if (v == V[0]) { i = 0; return true; } - if (v == V[1]) { i = 1; return true; } - if (v == V[2]) { i = 2; return true; } - if (v == V[3]) { i = 3; return true; } - return false; - } - - int index(Vertex_handle v) const - { - if (v == V[0]) { return 0; } - if (v == V[1]) { return 1; } - if (v == V[2]) { return 2; } - CGAL_triangulation_assertion( v == V[3] ); - return 3; - } - - Cell_handle neighbor(int i) const - { - CGAL_triangulation_precondition( i >= 0 && i <= 3); - return N[i]; - } - - bool has_neighbor(Cell_handle n) const - { - return (N[0] == n) || (N[1] == n) || (N[2] == n) || (N[3] == n); - } - - bool has_neighbor(Cell_handle n, int & i) const - { - if(n == N[0]){ i = 0; return true; } - if(n == N[1]){ i = 1; return true; } - if(n == N[2]){ i = 2; return true; } - if(n == N[3]){ i = 3; return true; } - return false; - } - - int index(Cell_handle n) const - { - if (n == N[0]) return 0; - if (n == N[1]) return 1; - if (n == N[2]) return 2; - CGAL_triangulation_assertion( n == N[3] ); - return 3; - } - - // SETTING - - void set_vertex(int i, Vertex_handle v) - { - CGAL_triangulation_precondition( i >= 0 && i <= 3); - V[i] = v; - } - - void set_neighbor(int i, Cell_handle n) - { - CGAL_triangulation_precondition( i >= 0 && i <= 3); - CGAL_triangulation_precondition( this != &*n ); - N[i] = n; - } - - void set_vertices() - { - V[0] = V[1] = V[2] = V[3] = Vertex_handle(); - } - - void set_vertices(Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3) - { - V[0] = v0; - V[1] = v1; - V[2] = v2; - V[3] = v3; - } - - void set_neighbors() - { - N[0] = N[1] = N[2] = N[3] = Cell_handle(); - } - - void set_neighbors(Cell_handle n0, Cell_handle n1, - Cell_handle n2, Cell_handle n3) - { - CGAL_triangulation_precondition( this != &*n0 ); - CGAL_triangulation_precondition( this != &*n1 ); - CGAL_triangulation_precondition( this != &*n2 ); - CGAL_triangulation_precondition( this != &*n3 ); - N[0] = n0; - N[1] = n1; - N[2] = n2; - N[3] = n3; - } - - // CHECKING - - // the following trivial is_valid allows - // the user of derived cell base classes - // to add their own purpose checking - bool is_valid(bool = false, int = 0) const - { return true; } - - // This is here in the *ds*_cell_base to ease its use as default - // template parameter, so that the .dual() functions of Delaunay_3 - // still work. - template < typename Traits > - typename Traits::Point_3 - circumcenter(const Traits& gt) const - { - return gt.construct_circumcenter_3_object()(this->vertex(0)->point(), - this->vertex(1)->point(), - this->vertex(2)->point(), - this->vertex(3)->point()); - } - - // For use by Compact_container. - void * for_compact_container() const { return N[0].for_compact_container(); } - void * & for_compact_container() { return N[0].for_compact_container(); } - - // TDS internal data access functions. - TDS_data& tds_data() { return _tds_data; } - const TDS_data& tds_data() const { return _tds_data; } - -private: - - Cell_handle N[4]; - Vertex_handle V[4]; - TDS_data _tds_data; -}; - -template < class TDS > -inline -std::istream& -operator>>(std::istream &is, Triangulation_ds_cell_base_3 &) - // non combinatorial information. Default = nothing -{ - return is; -} - -template < class TDS > -inline -std::ostream& -operator<<(std::ostream &os, const Triangulation_ds_cell_base_3 &) - // non combinatorial information. Default = nothing -{ - return os; -} - -// Specialization for void. -template <> -class Triangulation_ds_cell_base_3 -{ -public: - typedef internal::Dummy_tds_3 Triangulation_data_structure; - typedef Triangulation_data_structure::Vertex_handle Vertex_handle; - typedef Triangulation_data_structure::Cell_handle Cell_handle; - template - struct Rebind_TDS { typedef Triangulation_ds_cell_base_3 Other; }; -}; - -} //namespace CGAL - -#endif // CGAL_TRIANGULATION_DS_CELL_BASE_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/Triangulation_ds_vertex_base_3.h b/Triangulation_3_copy_tds/include/CGAL/Triangulation_ds_vertex_base_3.h deleted file mode 100644 index 79efe168772..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/Triangulation_ds_vertex_base_3.h +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright (c) 1999,2000,2001,2002,2003 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// Author(s) : Monique Teillaud - -#ifndef CGAL_TRIANGULATION_DS_VERTEX_BASE_3_H -#define CGAL_TRIANGULATION_DS_VERTEX_BASE_3_H - -#include -#include - -namespace CGAL { - -template < typename TDS = void > -class Triangulation_ds_vertex_base_3 -{ -public: - typedef TDS Triangulation_data_structure; - typedef typename TDS::Vertex_handle Vertex_handle; - typedef typename TDS::Cell_handle Cell_handle; - - template - struct Rebind_TDS { typedef Triangulation_ds_vertex_base_3 Other; }; - - Triangulation_ds_vertex_base_3() - : _c() {} - - Triangulation_ds_vertex_base_3(Cell_handle c) - : _c(c) {} - - Cell_handle cell() const - { return _c; } - - void set_cell(Cell_handle c) - { _c = c; } - - // the following trivial is_valid allows - // the user of derived cell base classes - // to add their own purpose checking - bool is_valid(bool = false, int = 0) const - { - return cell() != Cell_handle(); - } - - // For use by the Compact_container. - void * for_compact_container() const - { return _c.for_compact_container(); } - void * & for_compact_container() - { return _c.for_compact_container(); } - -private: - Cell_handle _c; -}; - -template < class TDS > -inline -std::istream& -operator>>(std::istream &is, Triangulation_ds_vertex_base_3 &) - // no combinatorial information. -{ - return is; -} - -template < class TDS > -inline -std::ostream& -operator<<(std::ostream &os, const Triangulation_ds_vertex_base_3 &) - // no combinatorial information. -{ - return os; -} - -// Specialization for void. -template <> -class Triangulation_ds_vertex_base_3 -{ -public: - typedef internal::Dummy_tds_3 Triangulation_data_structure; - typedef Triangulation_data_structure::Vertex_handle Vertex_handle; - typedef Triangulation_data_structure::Cell_handle Cell_handle; - template - struct Rebind_TDS { typedef Triangulation_ds_vertex_base_3 Other; }; -}; - -} //namespace CGAL - -#endif // CGAL_TRIANGULATION_DS_VERTEX_BASE_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/Triangulation_geom_traits_3.h b/Triangulation_3_copy_tds/include/CGAL/Triangulation_geom_traits_3.h deleted file mode 100644 index 54ea53c1bdf..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/Triangulation_geom_traits_3.h +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (c) 1999 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// Author(s) : Andreas Fabri -// Monique Teillaud - -// geometric traits for a <=3 D triangulation - -// OBSOLETE !!!!!!!!!!!!!!!!! - -#ifndef CGAL_TRIANGULATION_GEOM_TRAITS_3_H -#define CGAL_TRIANGULATION_GEOM_TRAITS_3_H - -#include - -#include - -namespace CGAL { - -template < class Repres > -class Triangulation_geom_traits_3 : public Repres -{ -public: - Triangulation_geom_traits_3() - { - bool The_class_Triangulation_geom_traits_3_is_obsolete; - } - - typedef Repres Rep; - - typedef typename Rep::Object_3 Object_3; - typedef typename Rep::Point_3 Point_3; - typedef typename Rep::Segment_3 Segment_3; - typedef typename Rep::Triangle_3 Triangle_3; - typedef typename Rep::Tetrahedron_3 Tetrahedron_3; - typedef typename Rep::Ray_3 Ray_3; - typedef typename Rep::Line_3 Line_3; - typedef typename Rep::Plane_3 Plane_3; - - // The next typedef is there for backward compatibility - // Some users take their point type from the traits class. - // Before this type was Point - typedef Point_3 Point; - - typedef typename Rep::Compare_x_3 Compare_x_3; - typedef typename Rep::Compare_y_3 Compare_y_3; - typedef typename Rep::Compare_z_3 Compare_z_3; - typedef typename Rep::Equal_3 Equal_3; - typedef typename Rep::Orientation_3 Orientation_3; - typedef typename Rep::Coplanar_orientation_3 Coplanar_orientation_3; - typedef typename Rep::Side_of_oriented_sphere_3 Side_of_oriented_sphere_3; - typedef typename Rep::Coplanar_side_of_bounded_circle_3 - Coplanar_side_of_bounded_circle_3; - - typedef typename Rep::Construct_segment_3 Construct_segment_3; - typedef typename Rep::Construct_triangle_3 Construct_triangle_3; - typedef typename Rep::Construct_tetrahedron_3 Construct_tetrahedron_3; - typedef typename Rep::Construct_object_3 Construct_object_3; - - // For the hierarchy : - typedef typename Rep::Compare_distance_3 Compare_distance_3; -}; - -} //namespace CGAL - -#endif // CGAL_TRIANGULATION_GEOM_TRAITS_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/Triangulation_hierarchy_3.h b/Triangulation_3_copy_tds/include/CGAL/Triangulation_hierarchy_3.h deleted file mode 100644 index 49575e0e4bf..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/Triangulation_hierarchy_3.h +++ /dev/null @@ -1,731 +0,0 @@ -// Copyright (c) 1998, 2001, 2003 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// Author(s) : Olivier Devillers -// Sylvain Pion - -#ifndef CGAL_TRIANGULATION_HIERARCHY_3_H -#define CGAL_TRIANGULATION_HIERARCHY_3_H - -#include -#include -#include -#include - -#include -#include -#include - -namespace CGAL { - -// This class is deprecated, but must be kept for backward compatibility. -// -// It would be better to move its content to the Delaunay_triangulation_3 -// specializations for Fast_location and make Triangulation_hierarchy_3 the -// empty nutshell instead. -// -// Then, later, maybe merge the Compact/Fast codes in a cleaner factorized way. - -template < class Tr > -class Triangulation_hierarchy_3 - : public Tr -{ - // parameterization of the hierarchy - // maximal number of points is 30^5 = 24 millions ! - enum { ratio = 30 }; - enum { minsize = 20}; - enum { maxlevel = 5}; - -public: - typedef Tr Tr_Base; - typedef Fast_location Location_policy; - typedef typename Tr_Base::Geom_traits Geom_traits; - typedef typename Tr_Base::Point Point; - typedef typename Tr_Base::size_type size_type; - typedef typename Tr_Base::Vertex_handle Vertex_handle; - typedef typename Tr_Base::Cell_handle Cell_handle; - typedef typename Tr_Base::Vertex_iterator Vertex_iterator; - typedef typename Tr_Base::Vertex Vertex; - typedef typename Tr_Base::Locate_type Locate_type; - typedef typename Tr_Base::Finite_vertices_iterator Finite_vertices_iterator; - typedef typename Tr_Base::Finite_cells_iterator Finite_cells_iterator; - typedef typename Tr_Base::Finite_facets_iterator Finite_facets_iterator; - typedef typename Tr_Base::Finite_edges_iterator Finite_edges_iterator; - - using Tr_Base::number_of_vertices; - using Tr_Base::geom_traits; - -private: - - // here is the stack of triangulations which form the hierarchy - Tr_Base* hierarchy[maxlevel]; - boost::rand48 random; - - void set_up_down(Vertex_handle up, Vertex_handle down) - { - up->set_down(down); - down->set_up(up); - } - -public: - - Triangulation_hierarchy_3(const Geom_traits& traits = Geom_traits()); - - Triangulation_hierarchy_3(const Triangulation_hierarchy_3& tr); - - template < typename InputIterator > - Triangulation_hierarchy_3(InputIterator first, InputIterator last, - const Geom_traits& traits = Geom_traits()) - : Tr_Base(traits) - { - hierarchy[0] = this; - for(int i=1; iinfinite_cell() : hint->cell()); - } - - Vertex_handle insert(const Point &p, Cell_handle start = Cell_handle ()); - - Vertex_handle insert(const Point &p, Locate_type lt, Cell_handle loc, - int li, int lj); - - template < class InputIterator > - std::ptrdiff_t insert(InputIterator first, InputIterator last) - { - size_type n = number_of_vertices(); - - std::vector points (first, last); - spatial_sort (points.begin(), points.end(), geom_traits()); - - // hints[i] is the vertex of the previously inserted point in level i. - // Thanks to spatial sort, they are better hints than what the hierarchy - // would give us. - Vertex_handle hints[maxlevel]; - for (typename std::vector::const_iterator p = points.begin(), end = points.end(); - p != end; ++p) - { - int vertex_level = random_level(); - - Vertex_handle v = hints[0] = hierarchy[0]->insert (*p, hints[0]); - Vertex_handle prev = v; - - for (int level = 1; level <= vertex_level; ++level) { - v = hints[level] = hierarchy[level]->insert (*p, hints[level]); - set_up_down(v, prev); - prev = v; - } - } - return number_of_vertices() - n; - } - - void remove(Vertex_handle v); - - template < typename InputIterator > - size_type remove(InputIterator first, InputIterator beyond) - { - size_type n = number_of_vertices(); - while (first != beyond) { - remove(*first); - ++first; - } - return n - number_of_vertices(); - } - - template < typename InputIterator > - size_type remove_cluster(InputIterator first, InputIterator beyond) - { - CGAL_triangulation_precondition(!this->does_repeat_in_range(first, beyond)); - CGAL_triangulation_precondition(!this->infinite_vertex_in_range(first, beyond)); - size_type n = this->number_of_vertices(); - std::vector vo(first, beyond), vc; - int l=0; - while(1) { - int n = vo.size(); - if(!n) break; - for(int i=0; iup() != Vertex_handle()) vc.push_back(vo[i]->up()); - } - hierarchy[l++]->remove_cluster(vo.begin(), vo.end()); - std::swap(vo,vc); - vc.clear(); - } - return n - this->number_of_vertices(); - } - -#ifndef CGAL_NO_DEPRECATED_CODE - CGAL_DEPRECATED Vertex_handle move_point(Vertex_handle v, const Point & p); -#endif - - Vertex_handle move_if_no_collision(Vertex_handle v, const Point &p); - Vertex_handle move(Vertex_handle v, const Point &p); - -public: // some internal methods - - // INSERT REMOVE DISPLACEMENT - // GIVING NEW FACES - - template - Vertex_handle insert_and_give_new_cells(const Point &p, - OutputItCells fit, - Cell_handle start = Cell_handle() ); - - template - Vertex_handle insert_and_give_new_cells(const Point& p, - OutputItCells fit, - Vertex_handle hint) - { - return insert_and_give_new_cells(p, hint == Vertex_handle() ? - this->infinite_cell() : hint->cell()); - } - - template - Vertex_handle insert_and_give_new_cells(const Point& p, - Locate_type lt, - Cell_handle c, int li, int lj, - OutputItCells fit); - - template - void remove_and_give_new_cells(Vertex_handle v, - OutputItCells fit); - - template - Vertex_handle move_if_no_collision_and_give_new_cells(Vertex_handle v, - const Point &p, OutputItCells fit); - -public: - - - //LOCATE - Cell_handle locate(const Point& p, Locate_type& lt, int& li, int& lj, - Vertex_handle hint) const - { - return locate(p, lt, li, lj, hint == Vertex_handle() ? this->infinite_cell() : hint->cell()); - } - - Cell_handle locate(const Point& p, Vertex_handle hint) const - { - return locate(p, hint == Vertex_handle() ? this->infinite_cell() : hint->cell()); - } - - Cell_handle locate(const Point& p, Locate_type& lt, int& li, int& lj, - Cell_handle start = Cell_handle ()) const; - - Cell_handle locate(const Point& p, Cell_handle start = Cell_handle ()) const; - - Vertex_handle - nearest_vertex(const Point& p, Cell_handle start = Cell_handle()) const; - -protected: - - struct locs { - Cell_handle pos; - int li, lj; - Locate_type lt; - }; - - void locate(const Point& p, Locate_type& lt, int& li, int& lj, - locs pos[maxlevel], Cell_handle start = Cell_handle ()) const; - - int random_level(); -}; - - -template -Triangulation_hierarchy_3:: -Triangulation_hierarchy_3(const Geom_traits& traits) - : Tr_Base(traits) -{ - hierarchy[0] = this; - for(int i=1;i -Triangulation_hierarchy_3:: -Triangulation_hierarchy_3(const Triangulation_hierarchy_3 &tr) - : Tr_Base(tr) -{ - hierarchy[0] = this; - for(int i=1; i V; - - for( Finite_vertices_iterator it = hierarchy[0]->finite_vertices_begin(), - end = hierarchy[0]->finite_vertices_end(); it != end; ++it) - if (it->up() != Vertex_handle()) - V[ it->up()->down() ] = it; - - for(int j=1; jfinite_vertices_begin(), - end = hierarchy[j]->finite_vertices_end(); it != end; ++it) { - // current it->down() pointer goes in original instead in copied triangulation - set_up_down(it, V[it->down()]); - // make map for next level - if (it->up() != Vertex_handle()) - V[ it->up()->down() ] = it; - } - } -} - -template -void -Triangulation_hierarchy_3:: -swap(Triangulation_hierarchy_3 &tr) -{ - Tr_Base::swap(tr); - for(int i=1; i -Triangulation_hierarchy_3:: -~Triangulation_hierarchy_3() -{ - clear(); - for(int i=1; i -void -Triangulation_hierarchy_3:: -clear() -{ - for(int i=0;iclear(); -} - -template -bool -Triangulation_hierarchy_3:: -is_valid(bool verbose, int level) const -{ - bool result = true; - - // verify correctness of triangulation at all levels - for(int i=0; iis_valid(verbose, level); - - // verify that lower level has no down pointers - for( Finite_vertices_iterator it = hierarchy[0]->finite_vertices_begin(), - end = hierarchy[0]->finite_vertices_end(); it != end; ++it) - result = result && (it->down() == Vertex_handle()); - - // verify that other levels has down pointer and reciprocal link is fine - for(int j=1; jfinite_vertices_begin(), - end = hierarchy[j]->finite_vertices_end(); it != end; ++it) - result = result && &*(it) == &*(it->down()->up()); - - // verify that other levels has down pointer and reciprocal link is fine - for(int k=0; kfinite_vertices_begin(), - end = hierarchy[k]->finite_vertices_end(); it != end; ++it) - result = result && ( it->up() == Vertex_handle() || - &*it == &*(it->up())->down() ); - - return result; -} - -template -typename Triangulation_hierarchy_3::Vertex_handle -Triangulation_hierarchy_3:: -insert(const Point &p, Cell_handle start) -{ - int vertex_level = random_level(); - Locate_type lt; - int i, j; - // locate using hierarchy - locs positions[maxlevel]; - locate(p, lt, i, j, positions, start); - // insert at level 0 - Vertex_handle vertex = hierarchy[0]->insert(p, - positions[0].lt, - positions[0].pos, - positions[0].li, - positions[0].lj); - Vertex_handle previous = vertex; - Vertex_handle first = vertex; - - int level = 1; - while (level <= vertex_level ){ - if (positions[level].pos == Cell_handle()) - vertex = hierarchy[level]->insert(p); - else - vertex = hierarchy[level]->insert(p, - positions[level].lt, - positions[level].pos, - positions[level].li, - positions[level].lj); - set_up_down(vertex, previous); - previous=vertex; - level++; - } - return first; -} - -template -template -typename Triangulation_hierarchy_3::Vertex_handle -Triangulation_hierarchy_3:: -insert_and_give_new_cells(const Point &p, OutputItCells fit, Cell_handle start) -{ - int vertex_level = random_level(); - Locate_type lt; - int i, j; - // locate using hierarchy - locs positions[maxlevel]; - locate(p, lt, i, j, positions, start); - // insert at level 0 - Vertex_handle vertex = hierarchy[0]->insert_and_give_new_cells(p, - positions[0].lt, - positions[0].pos, - positions[0].li, - positions[0].lj,fit); - Vertex_handle previous = vertex; - Vertex_handle first = vertex; - - int level = 1; - while (level <= vertex_level ){ - if (positions[level].pos == Cell_handle()) - vertex = hierarchy[level]->insert(p); - else - vertex = hierarchy[level]->insert(p, - positions[level].lt, - positions[level].pos, - positions[level].li, - positions[level].lj); - set_up_down(vertex, previous); - previous=vertex; - level++; - } - return first; -} - -template -typename Triangulation_hierarchy_3::Vertex_handle -Triangulation_hierarchy_3:: -insert(const Point &p, Locate_type lt, Cell_handle loc, int li, int lj) -{ - int vertex_level = random_level(); - // insert at level 0 - Vertex_handle vertex = hierarchy[0]->insert(p,lt,loc,li,lj); - Vertex_handle previous = vertex; - Vertex_handle first = vertex; - - if (vertex_level > 0) { - Locate_type lt; - int i, j; - // locate using hierarchy - locs positions[maxlevel]; - locate(p, lt, i, j, positions, vertex->cell()); - - int level = 1; - while (level <= vertex_level ){ - if (positions[level].pos == Cell_handle()) - vertex = hierarchy[level]->insert(p); - else - vertex = hierarchy[level]->insert(p, - positions[level].lt, - positions[level].pos, - positions[level].li, - positions[level].lj); - set_up_down(vertex, previous); - previous=vertex; - level++; - } - } - return first; -} - -template -template -typename Triangulation_hierarchy_3::Vertex_handle -Triangulation_hierarchy_3:: -insert_and_give_new_cells(const Point &p, Locate_type lt, Cell_handle loc, - int li, int lj, OutputItCells fit) -{ - int vertex_level = random_level(); - // insert at level 0 - Vertex_handle vertex = - hierarchy[0]->insert_and_give_new_cells(p,lt,loc,li,lj,fit); - Vertex_handle previous = vertex; - Vertex_handle first = vertex; - - if (vertex_level > 0) { - Locate_type lt; - int i, j; - // locate using hierarchy - locs positions[maxlevel]; - locate(p, lt, i, j, positions, vertex->cell()); - - int level = 1; - while (level <= vertex_level ){ - if (positions[level].pos == Cell_handle()) - vertex = hierarchy[level]->insert(p); - else - vertex = hierarchy[level]->insert(p, - positions[level].lt, - positions[level].pos, - positions[level].li, - positions[level].lj); - set_up_down(vertex, previous); - previous=vertex; - level++; - } - } - return first; -} - -template -void -Triangulation_hierarchy_3:: -remove(Vertex_handle v) -{ - CGAL_triangulation_precondition(v != Vertex_handle()); - for (int l = 0; l < maxlevel; ++l) { - Vertex_handle u = v->up(); - hierarchy[l]->remove(v); - if (u == Vertex_handle()) - break; - v = u; - } -} - -template -template -void -Triangulation_hierarchy_3:: -remove_and_give_new_cells(Vertex_handle v, OutputItCells fit) -{ - CGAL_triangulation_precondition(v != Vertex_handle()); - CGAL_triangulation_precondition(!is_infinite(v)); - for (int l = 0; l < maxlevel; ++l) { - Vertex_handle u = v->up(); - if(l) hierarchy[l]->remove(v); - else hierarchy[l]->remove_and_give_new_cells(v, fit); - if (u == Vertex_handle()) - break; - v = u; - } -} - -#ifndef CGAL_NO_DEPRECATED_CODE -template < class Tr > -typename Triangulation_hierarchy_3::Vertex_handle -Triangulation_hierarchy_3:: -move_point(Vertex_handle v, const Point & p) -{ - CGAL_triangulation_precondition(v != Vertex_handle()); - Vertex_handle old, ret; - - for (std::size_t l = 0; l < maxlevel; ++l) { - Vertex_handle u = v->up(); - Vertex_handle w = hierarchy[l]->move_point(v, p); - if (l == 0) { - ret = w; - } - else { - set_up_down(w, old); - } - if (u == Vertex_handle()) - break; - old = w; - v = u; - } - - return ret; -} -#endif - -template -typename Triangulation_hierarchy_3::Vertex_handle -Triangulation_hierarchy_3:: -move_if_no_collision(Vertex_handle v, const Point & p) -{ - CGAL_triangulation_precondition(!this->is_infinite(v)); - if(v->point() == p) return v; - Vertex_handle ans; - for (int l = 0; l < maxlevel; ++l) { - Vertex_handle u = v->up(); - if(l) hierarchy[l]->move_if_no_collision(v, p); - else ans = hierarchy[l]->move_if_no_collision(v, p); - if(ans != v) return ans; - if (u == Vertex_handle()) - break; - v = u; - } - return ans; -} - -template -typename Triangulation_hierarchy_3::Vertex_handle -Triangulation_hierarchy_3:: -move(Vertex_handle v, const Point & p) -{ - CGAL_triangulation_precondition(!this->is_infinite(v)); - if(v->point() == p) return v; - Vertex_handle w = move_if_no_collision(v,p); - if(w != v) { - remove(v); - return w; - } - return v; -} - -template -template -typename Triangulation_hierarchy_3::Vertex_handle -Triangulation_hierarchy_3:: -move_if_no_collision_and_give_new_cells( - Vertex_handle v, const Point & p, OutputItCells fit) -{ - CGAL_triangulation_precondition(!is_infinite(v)); - if(v->point() == p) return v; - Vertex_handle ans; - for (int l = 0; l < maxlevel; ++l) { - Vertex_handle u = v->up(); - if(l) hierarchy[l]->move_if_no_collision(v, p); - else ans = - hierarchy[l]->move_if_no_collision_and_give_new_cells(v, p, fit); - if(ans != v) return ans; - if (u == Vertex_handle()) - break; - v = u; - } - return ans; -} - -template -inline -typename Triangulation_hierarchy_3::Cell_handle -Triangulation_hierarchy_3:: -locate(const Point& p, Locate_type& lt, int& li, int& lj, Cell_handle start) const -{ - if (start != Cell_handle ()) - return Tr_Base::locate (p, lt, li, lj, start); - locs positions[maxlevel]; - locate(p, lt, li, lj, positions); - return positions[0].pos; -} - -template -inline -typename Triangulation_hierarchy_3::Cell_handle -Triangulation_hierarchy_3:: -locate(const Point& p, Cell_handle start) const -{ - if (start != Cell_handle ()) - return Tr_Base::locate (p, start); - Locate_type lt; - int li, lj; - return locate(p, lt, li, lj); -} - -template -void -Triangulation_hierarchy_3:: -locate(const Point& p, Locate_type& lt, int& li, int& lj, - locs pos[maxlevel], Cell_handle start) const -{ - int level = maxlevel; - - // find the highest level with enough vertices - while (hierarchy[--level]->number_of_vertices() < (size_type) minsize) { - if ( ! level) - break; // do not go below 0 - } - - for (int i=level+1; i 0) { - // locate at that level from "position" - // result is stored in "position" for the next level - pos[level].pos = position = hierarchy[level]->locate(p, - pos[level].lt, - pos[level].li, - pos[level].lj, - position); - // find the nearest vertex. - Vertex_handle nearest = hierarchy[level]->nearest_vertex_in_cell(p, position); - - // go at the same vertex on level below - nearest = nearest->down(); - position = nearest->cell(); // incident cell - --level; - } - - if (start != Cell_handle()) - position = start; - - pos[0].pos = hierarchy[0]->locate(p, lt, li, lj, position); // at level 0 - pos[0].lt = lt; - pos[0].li = li; - pos[0].lj = lj; -} - -template -typename Triangulation_hierarchy_3::Vertex_handle -Triangulation_hierarchy_3:: -nearest_vertex(const Point& p, Cell_handle start) const -{ - return Tr_Base::nearest_vertex(p, start != Cell_handle() ? start : locate(p)); -} - -template -int -Triangulation_hierarchy_3:: -random_level() -{ - boost::geometric_distribution<> proba(1.0/ratio); - boost::variate_generator > die(random, proba); - - return (std::min)(die(), (int)maxlevel)-1; -} - -} //namespace CGAL - -#endif // CGAL_TRIANGULATION_HIERARCHY_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/Triangulation_hierarchy_vertex_base_3.h b/Triangulation_3_copy_tds/include/CGAL/Triangulation_hierarchy_vertex_base_3.h deleted file mode 100644 index 8803067afe2..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/Triangulation_hierarchy_vertex_base_3.h +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) 1998, 2001, 2003 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// Author(s) : Olivier Devillers -// Sylvain Pion - -#ifndef CGAL_TRIANGULATION_HIERARCHY_VERTEX_BASE_3_H -#define CGAL_TRIANGULATION_HIERARCHY_VERTEX_BASE_3_H - -#include - -namespace CGAL { - -template < class Vbb > -class Triangulation_hierarchy_vertex_base_3 - : public Vbb -{ - typedef Vbb Base; - typedef typename Base::Triangulation_data_structure Tds; -public: - typedef typename Tds::Vertex_handle Vertex_handle; - typedef typename Tds::Cell_handle Cell_handle; - typedef typename Base::Point Point; - - template < typename TDS2 > - struct Rebind_TDS { - typedef typename Vbb::template Rebind_TDS::Other Vb2; - typedef Triangulation_hierarchy_vertex_base_3 Other; - }; - - Triangulation_hierarchy_vertex_base_3() - : Base(), _up(), _down() {} - - Triangulation_hierarchy_vertex_base_3(const Point & p, Cell_handle f) - : Base(p,f), _up(), _down() {} - - Triangulation_hierarchy_vertex_base_3(const Point & p) - : Base(p), _up(), _down() {} - - Vertex_handle up() const { return _up; } - Vertex_handle down() const { return _down; } - void set_up(Vertex_handle u) { _up=u; } - void set_down(Vertex_handle d) { _down=d; } - -private: - Vertex_handle _up; // same vertex one level above - Vertex_handle _down; // same vertex one level below -}; - -} //namespace CGAL - -#endif // CGAL_TRIANGULATION_HIERARCHY_VERTEX_BASE_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/Triangulation_simplex_3.h b/Triangulation_3_copy_tds/include/CGAL/Triangulation_simplex_3.h deleted file mode 100644 index cd26ac81d5c..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/Triangulation_simplex_3.h +++ /dev/null @@ -1,284 +0,0 @@ -// Copyright (c) 2005 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Nico Kruithof -// Developed at Rijksuniversiteit Groningen (Netherlands) - -#ifndef CGAL_TRIANGULATION_SIMPLEX_3_H -#define CGAL_TRIANGULATION_SIMPLEX_3_H - -namespace CGAL { - -template < class TriangulationDataStructure_3 > -class Triangulation_simplex_3 { - typedef TriangulationDataStructure_3 TDS; - typedef Triangulation_simplex_3 Self; -public: - typedef Self Simplex; - - typedef typename TDS::Vertex_handle Vertex_handle; - typedef typename TDS::Edge Edge; - typedef typename TDS::Facet Facet; - typedef typename TDS::Cell_handle Cell_handle; - - typedef typename TDS::Cell_circulator Cell_circulator; - typedef typename TDS::Facet_circulator Facet_circulator; - - typedef typename TDS::Edge_iterator Edge_iterator; - typedef typename TDS::Facet_iterator Facet_iterator; - - // Constructors - - // Default constructor initialises to undefined simplex: - Triangulation_simplex_3() : ref(-1), ch() { } - - Triangulation_simplex_3(Vertex_handle vh) { - set_vertex(vh); - } - Triangulation_simplex_3(const Edge &e) { - set_edge(e); - } - Triangulation_simplex_3(const Facet &f) { - set_facet(f); - } - Triangulation_simplex_3(Cell_handle ch_) { - set_cell(ch_); - } - - Triangulation_simplex_3(Cell_circulator ccir) { - set_cell(ccir); - } - Triangulation_simplex_3(Facet_circulator fcir) { - set_facet(*fcir); - } - - Triangulation_simplex_3(Edge_iterator eit) { - set_edge(*eit); - } - Triangulation_simplex_3(Facet_iterator fit) { - set_facet(*fit); - } - - // Conversions: - operator Vertex_handle () const - { - CGAL_assertion(dimension() == 0); - return ch->vertex(index(0)); - } - operator Edge () const - { - CGAL_assertion(dimension() == 1); - return Edge(ch,index(0),index(1)); - } - operator Facet () const - { - CGAL_assertion(dimension() == 2); - return Facet(ch,index(0)); - } - operator Cell_handle () const - { - CGAL_assertion(dimension() == 3); - return ch; - } - - // returns the dimension of the simplex - int dimension () const { - return (ref & 3); - } - // returns an incident cell: - Cell_handle incident_cell() { - return ch; - } - - template < class TDS2 > - friend bool operator==(Triangulation_simplex_3 s0, - Triangulation_simplex_3 s1); - template < class TDS2 > - friend bool operator< (Triangulation_simplex_3 s0, - Triangulation_simplex_3 s1); - -private: - void set_vertex(const Vertex_handle vh) { - ch = vh->cell(); - ref = (ch->index(vh) << 2); /* dim == 0 */ - CGAL_assertion (ch != Cell_handle()); - } - void set_edge(const Edge &e) { - ch = e.first; - ref = (((e.third<< 2) + e.second) << 2) + 1; /* dim */ - CGAL_assertion (ch != Cell_handle()); - } - void set_facet(const Facet &f) { - ch = f.first; - ref = (f.second << 2) + 2; /* dim */ - CGAL_assertion (ch != Cell_handle()); - } - void set_cell(Cell_handle ch_) { - ch = ch_; - ref = 3; /* dim */ - CGAL_assertion (ch != Cell_handle()); - } - - inline int index(int i) const { - CGAL_assertion (i==0 || ((i==1) && (dimension()==1))); - return (ref >> (2*(i+1))) & 3; - } - - int ref; // storage iijjdd (index i, index j, dimension of simplex) - Cell_handle ch; // Corresponding cell handle -}; - -/////////////////////////////// -// Simplex functions -/////////////////////////////// -template < class TriangulationDataStructure_3 > -bool -operator!=(Triangulation_simplex_3 s0, - Triangulation_simplex_3 s1) { - return !(s0==s1); -} - -template < class TriangulationDataStructure_3 > -bool -operator==(Triangulation_simplex_3 s0, - Triangulation_simplex_3 s1) { - typedef Triangulation_simplex_3 Sim; - if (s0.dimension() != s1.dimension()) return false; - - typename Sim::Cell_handle neighbor; - - switch (s0.dimension()) { - case (0): // Vertex - return (s0.ch->vertex(s0.index(0)) == s1.ch->vertex(s1.index(0))); - case (1): // Edge - return ((s0.ch->vertex(s0.index(0)) == s1.ch->vertex(s1.index(0)) && - s0.ch->vertex(s0.index(1)) == s1.ch->vertex(s1.index(1))) || - (s0.ch->vertex(s0.index(1)) == s1.ch->vertex(s1.index(0)) && - s0.ch->vertex(s0.index(0)) == s1.ch->vertex(s1.index(1)))); - case (2): - if (s0.ch == s1.ch && s0.index(0) == s1.index(0)) { - return true; - } - - neighbor = s0.ch->neighbor(s0.index(0)); - if (neighbor == s1.ch && - neighbor->index(s0.ch) == s1.index(0)) { - return true; - } - return false; - case (3): - return (&(*s0.ch) == &(*s1.ch)); - } - CGAL_error(); - return false; -} - -template < class TriangulationDataStructure_3 > -bool -operator<(Triangulation_simplex_3 s0, - Triangulation_simplex_3 s1) { - typedef Triangulation_simplex_3 Sim; - - if (s0 == s1) return false; - if (s0.dimension() < s1.dimension()) return true; - if (s0.dimension() > s1.dimension()) return false; - - // Dimensions are equal, compare the memory addresses of the simplices - typename Sim::Cell_handle ch1, ch2; - typename Sim::Vertex_handle vh1, vh2, vh3, vh4; - switch (s0.dimension()) { - case (0): // Vertex - // Vertextices are not equal - return (&(*s0.ch->vertex(s0.index(0))) < - &(*s1.ch->vertex(s1.index(0)))); - case (1): // Edge - vh1 = s0.ch->vertex(s0.index(0)); - vh2 = s0.ch->vertex(s0.index(1)); - vh3 = s1.ch->vertex(s1.index(0)); - vh4 = s1.ch->vertex(s1.index(1)); - - if ((std::min)(&(*vh1), &(*vh2)) < (std::min)(&(*vh3), &(*vh4))) - return true; - - if ((std::min)(&(*vh1), &(*vh2)) > (std::min)(&(*vh3), &(*vh4))) - return false; - - if ((std::max)(&(*vh1), &(*vh2)) < (std::max)(&(*vh3), &(*vh4))) - return true; - - return false; - case (2): // Facet - ch1 = s0.ch->neighbor(s0.index(0)); - ch2 = s1.ch->neighbor(s1.index(0)); - - if ((std::min)(&(*s0.ch), &(*ch1)) < (std::min)(&(*s1.ch), &(*ch2))) - return true; - - if ((std::min)(&(*s0.ch), &(*ch1)) > (std::min)(&(*s1.ch), &(*ch2))) - return false; - - if ((std::max)(&(*s0.ch), &(*ch1)) < (std::max)(&(*s1.ch), &(*ch2))) - return true; - - return false; - case (3): // Cell - return (&(*s0.ch) < &(*s1.ch)); - } - CGAL_error(); - return false; -} - -template < class TriangulationDataStructure_3 > -std::ostream & -operator<< (std::ostream& os, - const Triangulation_simplex_3 &s) -{ - typename TriangulationDataStructure_3::Vertex_handle vh; - typename TriangulationDataStructure_3::Edge e; - typename TriangulationDataStructure_3::Facet f; - typename TriangulationDataStructure_3::Cell_handle ch; - switch (s.dimension()) { - case 0: - vh = s; - os << &*vh; - break; - case 1: - e = s; - os << &*(e.first->vertex(e.second)) << " " - << &*(e.first->vertex(e.third)); - break; - case 2: - f = s; - os << &*(f.first->vertex((f.second+1)&3)) << " " - << &*(f.first->vertex((f.second+2)&3)) << " " - << &*(f.first->vertex((f.second+3)&3)); - break; - case 3: - ch = s; - os << &*(ch->vertex(0)) << " " - << &*(ch->vertex(1)) << " " - << &*(ch->vertex(2)) << " " - << &*(ch->vertex(3)); - break; - } - return os; -} - - -} //namespace CGAL - -#endif // CGAL_TRIANGULATION_SIMPLEX_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/Triangulation_utils_3.h b/Triangulation_3_copy_tds/include/CGAL/Triangulation_utils_3.h deleted file mode 100644 index ebee5f81a2c..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/Triangulation_utils_3.h +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (c) 1999 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// Author(s) : Monique Teillaud - -#ifndef CGAL_TRIANGULATION_UTILS_3_H -#define CGAL_TRIANGULATION_UTILS_3_H - -#include -#include -#include - -namespace CGAL { - -// We use the following template class in order to avoid having a static data - // member of a non-template class which would require src/Triangulation_3.C . -template < class T = void > -struct Triangulation_utils_base_3 -{ - static const char tab_next_around_edge[4][4]; - static const int tab_vertex_triple_index[4][3]; -}; - -template < class T > -const char Triangulation_utils_base_3::tab_next_around_edge[4][4] = { - {5, 2, 3, 1}, - {3, 5, 0, 2}, - {1, 3, 5, 0}, - {2, 0, 1, 5} }; - -template < class T > -const int Triangulation_utils_base_3::tab_vertex_triple_index[4][3] = { - {1, 3, 2}, - {0, 2, 3}, - {0, 3, 1}, - {0, 1, 2} -}; - -// We derive from Triangulation_cw_ccw_2 because we still use cw() and ccw() -// in the 2D part of the code. Ideally, this should go away when we re-use -// T2D entirely. - -struct Triangulation_utils_3 - : public Triangulation_cw_ccw_2, - public Triangulation_utils_base_3<> -{ - static int next_around_edge(const int i, const int j) - { - // index of the next cell when turning around the - // oriented edge vertex(i) vertex(j) in 3d - CGAL_triangulation_precondition( ( i >= 0 && i < 4 ) && - ( j >= 0 && j < 4 ) && - ( i != j ) ); - return tab_next_around_edge[i][j]; - } - - - static int vertex_triple_index(const int i, const int j) - { - // indexes of the jth vertex of the facet of a cell - // opposite to vertx i - CGAL_triangulation_precondition( ( i >= 0 && i < 4 ) && - ( j >= 0 && j < 3 ) ); - return tab_vertex_triple_index[i][j]; - } - -}; - -} //namespace CGAL - -#endif // CGAL_TRIANGULATION_UTILS_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/Triangulation_vertex_base_3.h b/Triangulation_3_copy_tds/include/CGAL/Triangulation_vertex_base_3.h deleted file mode 100644 index b4f4e94467c..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/Triangulation_vertex_base_3.h +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) 1999 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// Author(s) : Monique Teillaud - -#ifndef CGAL_TRIANGULATION_VERTEX_BASE_3_H -#define CGAL_TRIANGULATION_VERTEX_BASE_3_H - -#include -#include - -namespace CGAL { - -template < typename GT, typename DSVb = Triangulation_ds_vertex_base_3<> > -class Triangulation_vertex_base_3 - : public DSVb -{ -public: - - typedef typename DSVb::Cell_handle Cell_handle; - typedef GT Geom_traits; - typedef typename GT::Point_3 Point; - - template < typename TDS2 > - struct Rebind_TDS { - typedef typename DSVb::template Rebind_TDS::Other DSVb2; - typedef Triangulation_vertex_base_3 Other; - }; - - Triangulation_vertex_base_3() - : DSVb() {} - - Triangulation_vertex_base_3(const Point & p) - : DSVb(), _p(p) {} - - Triangulation_vertex_base_3(const Point & p, Cell_handle c) - : DSVb(c), _p(p) {} - - Triangulation_vertex_base_3(Cell_handle c) - : DSVb(c), _p() {} - - const Point & point() const - { return _p; } - - Point & point() - { return _p; } - - void set_point(const Point & p) - { _p = p; } - -private: - Point _p; -}; - -template < class GT, class DSVb > -std::istream& -operator>>(std::istream &is, Triangulation_vertex_base_3 &v) - // non combinatorial information. Default = point -{ - return is >> static_cast(v) >> v.point(); -} - -template < class GT, class DSVb > -std::ostream& -operator<<(std::ostream &os, const Triangulation_vertex_base_3 &v) - // non combinatorial information. Default = point -{ - return os << static_cast(v) << v.point(); -} - -} //namespace CGAL - -#endif // CGAL_TRIANGULATION_VERTEX_BASE_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/Triangulation_vertex_base_with_info_3.h b/Triangulation_3_copy_tds/include/CGAL/Triangulation_vertex_base_with_info_3.h deleted file mode 100644 index 04cd5517e98..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/Triangulation_vertex_base_with_info_3.h +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) 2003 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Sylvain Pion - -#ifndef CGAL_TRIANGULATION_VERTEX_BASE_WITH_INFO_3_H -#define CGAL_TRIANGULATION_VERTEX_BASE_WITH_INFO_3_H - -#include - -namespace CGAL { - -template < typename Info_, typename GT, - typename Vb = Triangulation_vertex_base_3 > -class Triangulation_vertex_base_with_info_3 - : public Vb -{ - Info_ _info; -public: - - typedef typename Vb::Cell_handle Cell_handle; - typedef typename Vb::Point Point; - typedef Info_ Info; - - template < typename TDS2 > - struct Rebind_TDS { - typedef typename Vb::template Rebind_TDS::Other Vb2; - typedef Triangulation_vertex_base_with_info_3 Other; - }; - - Triangulation_vertex_base_with_info_3() - : Vb() {} - - Triangulation_vertex_base_with_info_3(const Point & p) - : Vb(p) {} - - Triangulation_vertex_base_with_info_3(const Point & p, Cell_handle c) - : Vb(p, c) {} - - Triangulation_vertex_base_with_info_3(Cell_handle c) - : Vb(c) {} - - const Info& info() const { return _info; } - Info& info() { return _info; } -}; - -} //namespace CGAL - -#endif // CGAL_TRIANGULATION_VERTEX_BASE_WITH_INFO_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/constructions/constructions_on_weighted_points_cartesian_3.h b/Triangulation_3_copy_tds/include/CGAL/constructions/constructions_on_weighted_points_cartesian_3.h deleted file mode 100644 index 3abdd511039..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/constructions/constructions_on_weighted_points_cartesian_3.h +++ /dev/null @@ -1,498 +0,0 @@ -// Copyright (c) 2004 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Mariette Yvinec - -#ifndef CGAL_CONSTRUCTIONS_ON_WEIGHTED_POINTS_CARTESIAN_3_H -#define CGAL_CONSTRUCTIONS_ON_WEIGHTED_POINTS_CARTESIAN_3_H - -namespace CGAL { - -template -void -determinants_for_weighted_circumcenterC3( - const FT &px, const FT &py, const FT &pz, const FT &pw, - const FT &qx, const FT &qy, const FT &qz, const FT &qw, - const FT &rx, const FT &ry, const FT &rz, const FT &rw, - const FT &sx, const FT &sy, const FT &sz, const FT &sw, - FT &num_x, FT &num_y, FT &num_z, FT& den) -{ - // translate origin to p - // and compute determinants for weighted_circumcenter and - // circumradius - FT qpx = qx-px; - FT qpy = qy-py; - FT qpz = qz-pz; - FT qp2 = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) + - CGAL_NTS square(qpz) - qw + pw; - FT rpx = rx-px; - FT rpy = ry-py; - FT rpz = rz-pz; - FT rp2 = CGAL_NTS square(rpx) + CGAL_NTS square(rpy) + - CGAL_NTS square(rpz) - rw + pw; - FT spx = sx-px; - FT spy = sy-py; - FT spz = sz-pz; - FT sp2 = CGAL_NTS square(spx) + CGAL_NTS square(spy) + - CGAL_NTS square(spz) - sw + pw; - - num_x = determinant(qpy,qpz,qp2, - rpy,rpz,rp2, - spy,spz,sp2); - num_y = determinant(qpx,qpz,qp2, - rpx,rpz,rp2, - spx,spz,sp2); - num_z = determinant(qpx,qpy,qp2, - rpx,rpy,rp2, - spx,spy,sp2); - den = determinant(qpx,qpy,qpz, - rpx,rpy,rpz, - spx,spy,spz); -} - - -template < class FT> -void -weighted_circumcenterC3( - const FT &px, const FT &py, const FT &pz, const FT &pw, - const FT &qx, const FT &qy, const FT &qz, const FT &qw, - const FT &rx, const FT &ry, const FT &rz, const FT &rw, - const FT &sx, const FT &sy, const FT &sz, const FT &sw, - FT &x, FT &y, FT &z) -{ - // this function compute the weighted circumcenter point only - - // Translate p to origin and compute determinants - FT num_x, num_y, num_z, den; - determinants_for_weighted_circumcenterC3(px, py, pz, pw, - qx, qy, qz, qw, - rx, ry, rz, rw, - sx, sy, sz, sw, - num_x, num_y, num_z,den); - - CGAL_triangulation_assertion( ! CGAL_NTS is_zero(den) ); - FT inv = FT(1)/(FT(2) * den); - - x = px + num_x*inv; - y = py - num_y*inv; - z = pz + num_z*inv; -} - -template < class FT> -void -weighted_circumcenterC3( - const FT &px, const FT &py, const FT &pz, const FT &pw, - const FT &qx, const FT &qy, const FT &qz, const FT &qw, - const FT &rx, const FT &ry, const FT &rz, const FT &rw, - const FT &sx, const FT &sy, const FT &sz, const FT &sw, - FT &x, FT &y, FT &z, FT &w) -{ - // this function compute the weighted circumcenter point - // and the squared weighted circumradius - - // Translate p to origin and compute determinants - FT num_x, num_y, num_z, den; - determinants_for_weighted_circumcenterC3(px, py, pz, pw, - qx, qy, qz, qw, - rx, ry, rz, rw, - sx, sy, sz, sw, - num_x, num_y, num_z, den); - - CGAL_triangulation_assertion( ! CGAL_NTS is_zero(den) ); - FT inv = FT(1)/(FT(2) * den); - - x = px + num_x*inv; - y = py - num_y*inv; - z = pz + num_z*inv; - - w = (CGAL_NTS square(num_x)+CGAL_NTS square(num_y)+CGAL_NTS square(num_z)) - *CGAL_NTS square(inv) - pw; -} - - -template< class FT > -FT -squared_radius_orthogonal_sphereC3( - const FT &px, const FT &py, const FT &pz, const FT &pw, - const FT &qx, const FT &qy, const FT &qz, const FT &qw, - const FT &rx, const FT &ry, const FT &rz, const FT &rw, - const FT &sx, const FT &sy, const FT &sz, const FT &sw) -{ - - // this function compute the squared weighted circumradius only - - // Translate p to origin and compute determinants - FT num_x, num_y, num_z, den; - determinants_for_weighted_circumcenterC3(px, py, pz, pw, - qx, qy, qz, qw, - rx, ry, rz, rw, - sx, sy, sz, sw, - num_x, num_y, num_z,den); - - CGAL_triangulation_assertion( ! CGAL_NTS is_zero(den) ); - FT inv = FT(1)/(FT(2) * den); - - return - (CGAL_NTS square(num_x)+CGAL_NTS square(num_y)+CGAL_NTS square(num_z)) - *CGAL_NTS square(inv) - pw; -} - - -template -void -determinants_for_weighted_circumcenterC3( - const FT &px, const FT &py, const FT &pz, const FT &pw, - const FT &qx, const FT &qy, const FT &qz, const FT &qw, - const FT &rx, const FT &ry, const FT &rz, const FT &rw, - FT &num_x, FT &num_y, FT &num_z, FT &den) -{ - // translate origin to p - // and compute determinants for weighted_circumcenter and - // circumradius - - // Translate s to origin to simplify the expression. - FT qpx = qx-px; - FT qpy = qy-py; - FT qpz = qz-pz; - FT qp2 = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) + - CGAL_NTS square(qpz) - qw + pw; - FT rpx = rx-px; - FT rpy = ry-py; - FT rpz = rz-pz; - FT rp2 = CGAL_NTS square(rpx) + CGAL_NTS square(rpy) + - CGAL_NTS square(rpz) - rw + pw; - - FT sx = qpy*rpz-qpz*rpy; - FT sy = qpz*rpx-qpx*rpz; - FT sz = qpx*rpy-qpy*rpx; - - // The following determinants can be developped and simplified. - // - // FT num_x = determinant(qpy,qpz,qp2, - // rpy,rpz,rp2, - // sy,sz,FT(0)); - // FT num_y = determinant(qpx,qpz,qp2, - // rpx,rpz,rp2, - // sx,sz,FT(0)); - // FT num_z = determinant(qpx,qpy,qp2, - // rpx,rpy,rp2, - // sx,sy,FT(0)); - - num_x = qp2 * determinant(rpy,rpz,sy,sz) - - rp2 * determinant(qpy,qpz,sy,sz); - - num_y = qp2 * determinant(rpx,rpz,sx,sz) - - rp2 * determinant(qpx,qpz,sx,sz); - - num_z = qp2 * determinant(rpx,rpy,sx,sy) - - rp2 * determinant(qpx,qpy,sx,sy); - - den = determinant(qpx,qpy,qpz, - rpx,rpy,rpz, - sx,sy,sz); -} - -template < class FT > -void -weighted_circumcenterC3( - const FT &px, const FT &py, const FT &pz, const FT &pw, - const FT &qx, const FT &qy, const FT &qz, const FT &qw, - const FT &rx, const FT &ry, const FT &rz, const FT &rw, - FT &x, FT &y, FT &z) -{ - // this function compute the weighted circumcenter point only - -// Translate p to origin and compute determinants - FT num_x, num_y, num_z, den; - determinants_for_weighted_circumcenterC3(px, py, pz, pw, - qx, qy, qz, qw, - rx, ry, rz, rw, - num_x, num_y, num_z, den); - - CGAL_triangulation_assertion( den != FT(0) ); - FT inv = FT(1)/(FT(2) * den); - - x = px + num_x*inv; - y = py - num_y*inv; - z = pz + num_z*inv; -} - - -template < class FT > -void -weighted_circumcenterC3( - const FT &px, const FT &py, const FT &pz, const FT &pw, - const FT &qx, const FT &qy, const FT &qz, const FT &qw, - const FT &rx, const FT &ry, const FT &rz, const FT &rw, - FT &x, FT &y, FT &z, FT &w) -{ - // this function compute the weighted circumcenter and - // the weighted squared circumradius - -// Translate p to origin and compute determinants - FT num_x, num_y, num_z, den; - determinants_for_weighted_circumcenterC3(px, py, pz, pw, - qx, qy, qz, qw, - rx, ry, rz, rw, - num_x, num_y, num_z, den); - - CGAL_triangulation_assertion( den != FT(0) ); - FT inv = FT(1)/(FT(2) * den); - - x = px + num_x*inv; - y = py - num_y*inv; - z = pz + num_z*inv; - - w = (CGAL_NTS square(num_x)+CGAL_NTS square(num_y)+CGAL_NTS square(num_z)) - *CGAL_NTS square(inv) - pw; -} - - -template< class FT > -CGAL_MEDIUM_INLINE -FT -squared_radius_smallest_orthogonal_sphereC3( - const FT &px, const FT &py, const FT &pz, const FT &pw, - const FT &qx, const FT &qy, const FT &qz, const FT &qw, - const FT &rx, const FT &ry, const FT &rz, const FT &rw) -{ - // this function compute the weighted squared circumradius only - -// Translate p to origin and compute determinants - FT num_x, num_y, num_z, den; - determinants_for_weighted_circumcenterC3(px, py, pz, pw, - qx, qy, qz, qw, - rx, ry, rz, rw, - num_x, num_y, num_z, den); - - CGAL_triangulation_assertion( den != FT(0) ); - FT inv = FT(1)/(FT(2) * den); - - return - (CGAL_NTS square(num_x)+CGAL_NTS square(num_y)+CGAL_NTS square(num_z)) - *CGAL_NTS square(inv) - pw; -} - - - -template < class FT > -void -weighted_circumcenterC3( - const FT &px, const FT &py, const FT &pz, const FT &pw, - const FT &qx, const FT &qy, const FT &qz, const FT &qw, - FT &x, FT &y, FT &z) -{ -// this function compute the weighted circumcenter point only - FT qpx = qx-px; - FT qpy = qy-py; - FT qpz = qz-pz; - FT qp2 = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) + - CGAL_NTS square(qpz); - FT inv = FT(1)/(FT(2)*qp2); - FT alpha = 1/FT(2) + (pw-qw)*inv; - - x = px + alpha * qpx; - y = py + alpha * qpy; - z = pz + alpha * qpz; -} - - -template < class FT > -void -weighted_circumcenterC3( - const FT &px, const FT &py, const FT &pz, const FT &pw, - const FT &qx, const FT &qy, const FT &qz, const FT &qw, - FT &x, FT &y, FT &z, FT &w) -{ - // this function compute the weighted circumcenter point and - // the weighted circumradius - FT qpx = qx-px; - FT qpy = qy-py; - FT qpz = qz-pz; - FT qp2 = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) + - CGAL_NTS square(qpz); - FT inv = FT(1)/(FT(2)*qp2); - FT alpha = 1/FT(2) + (pw-qw)*inv; - - x = px + alpha * qpx; - y = py + alpha * qpy; - z = pz + alpha * qpz; - - w = CGAL_NTS square(alpha)*qp2 - pw; -} - - -template< class FT > -CGAL_MEDIUM_INLINE -FT -squared_radius_smallest_orthogonal_sphereC3( - const FT &px, const FT &py, const FT &pz, const FT &pw, - const FT &qx, const FT &qy, const FT &qz, const FT &qw) -{ - // this function computes - // the weighted circumradius only - FT qpx = qx-px; - FT qpy = qy-py; - FT qpz = qz-pz; - FT qp2 = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) + - CGAL_NTS square(qpz); - FT inv = FT(1)/(FT(2)*qp2); - FT alpha = 1/FT(2) + (pw-qw)*inv; - - return CGAL_NTS square(alpha)*qp2 - pw; -} - - -template< class FT > -FT -power_productC3( - const FT &px, const FT &py, const FT &pz, const FT &pw, - const FT &qx, const FT &qy, const FT &qz, const FT &qw) -{ - // computes the power product of two weighted points - FT qpx = qx-px; - FT qpy = qy-py; - FT qpz = qz-pz; - FT qp2 = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) + - CGAL_NTS square(qpz); - return qp2 - pw - qw ; -} - -template < class RT , class We> -void -radical_axisC3(const RT &px, const RT &py, const RT &pz, const We &pw, - const RT &qx, const RT &qy, const RT &qz, const We &qw, - const RT &rx, const RT &ry, const RT &rz, const We &rw, - RT &a, RT &b, RT& c ) -{ - RT dqx=qx-px, dqy=qy-py, dqz=qz-pz, drx=rx-px, dry=ry-py, drz=rz-pz; - - //il manque des tests... - - a= RT(1)*determinant(dqy, dqz, dry, drz); - b= - RT(1)*determinant(dqx, dqz, drx, drz); - c= RT(1)*determinant(dqx, dqy, drx, dry); -} - -// function used in critical_squared_radiusC3 -// power ( t, tw) with respect to -// circle orthogonal (p,pw), (q,qw), (r,rw), (s,sw) -template < class FT> -FT -power_to_orthogonal_sphereC3( - const FT &px, const FT &py, const FT &pz, const FT &pw, - const FT &qx, const FT &qy, const FT &qz, const FT &qw, - const FT &rx, const FT &ry, const FT &rz, const FT &rw, - const FT &sx, const FT &sy, const FT &sz, const FT &sw, - const FT &tx, const FT &ty, const FT &tz, const FT &tw) -{ - //to get the value of the determinant - // We translate the points so that t becomes the origin. - FT dpx = px - tx; - FT dpy = py - ty; - FT dpz = pz - tz; - FT dpt = CGAL_NTS square(dpx) + CGAL_NTS square(dpy) + - CGAL_NTS square(dpz) - pw + tw ; - FT dqx = qx - tx; - FT dqy = qy - ty; - FT dqz = qz - tz; - FT dqt = CGAL_NTS square(dqx) + CGAL_NTS square(dqy) + - CGAL_NTS square(dqz) - qw + tw; - FT drx = rx - tx; - FT dry = ry - ty; - FT drz = rz - tz; - FT drt = CGAL_NTS square(drx) + CGAL_NTS square(dry) + - CGAL_NTS square(drz) - rw + tw; - FT dsx = sx - tx; - FT dsy = sy - ty; - FT dsz = sz - tz; - FT dst = CGAL_NTS square(dsx) + CGAL_NTS square(dsy) + - CGAL_NTS square(dsz) - sw + tw; - - return determinant(dpx, dpy, dpz, dpt, - dqx, dqy, dqz, dqt, - drx, dry, drz, drt, - dsx, dsy, dsz, dst); - -} - - - -// compute the critical weight tw -// where weighted point t is orthogonal to weighted points p, q,r,s -template < class FT> -FT -critical_squared_radiusC3( - const FT &px, const FT &py, const FT &pz, const FT &pw, - const FT &qx, const FT &qy, const FT &qz, const FT &qw, - const FT &rx, const FT &ry, const FT &rz, const FT &rw, - const FT &sx, const FT &sy, const FT &sz, const FT &sw, - const FT &tx, const FT &ty, const FT &tz, const FT & ) -{ - // the 5x5 det is a linear function of tw ff(tw)= ff(0) + tw ff(1) - // the critical value for tw is - ff(0)/( ff(1) - ff(0)) - - - FT ff0 = power_to_orthogonal_sphereC3(px, py, pz, pw, - qx, qy, qz, qw, - rx, ry, rz, rw, - sx, sy, sz, sw, - tx, ty, tz, FT(0)); - - FT ff1 = power_to_orthogonal_sphereC3(px, py, pz, pw, - qx, qy, qz, qw, - rx, ry, rz, rw, - sx, sy, sz, sw, - tx, ty, tz, FT(1)); - - return -ff0/(ff1 - ff0); -} - - - - // I will use this to test if the radial axis of three spheres - // intersect the triangle formed by the centers. -// // resolution of the system (where we note c the center) -// // | dc^2 = cw + rw -// // | (dp-dc)^2 = pw + cw -// // | (dq-dc)^2 = qw + cw -// // | dc = Lamdba*dp + Mu*dq - -// FT FT2(2); -// FT dpx = px-rx; -// FT dpy = py-ry; -// FT dpz = pz-rz; -// FT dp = CGAL_NTS square(dpx)+CGAL_NTS square(dpy)+CGAL_NTS square(dpz); -// FT dpp = dp-pw+rw; -// FT dqx = qx-rx; -// FT dqy = qy-ry; -// FT dqz = qz-rz; -// FT dq = CGAL_NTS square(dqx)+CGAL_NTS square(dqy)+CGAL_NTS square(dqz); -// FT dqq = dq-qw+rw; -// FT dpdq = dpx*dqx+dpy*dqy+dpz*dqz; -// FT denom = FT2*(dp*dq-CGAL_NTS square(dpdq)); -// FT Lambda = (dpp*dq-dqq*dpdq)/denom; -// FT Mu = (dqq*dp-dpp*dpdq)/denom; - -// return (CGAL_NTS square(Lambda)*dp+CGAL_NTS square(Mu)*dq -// +FT2*Lambda*Mu*dpdq - rw); - - - - -} //namespace CGAL -#endif //CGAL_CONSTRUCTIONS_ON_WEIGHTED_POINTS_CARTESIAN_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/internal/Delaunay_triangulation_hierarchy_3.h b/Triangulation_3_copy_tds/include/CGAL/internal/Delaunay_triangulation_hierarchy_3.h deleted file mode 100644 index a4b8527a1c4..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/internal/Delaunay_triangulation_hierarchy_3.h +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright (c) 2009 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// Author(s) : Sylvain Pion - -#ifndef CGAL_INTERNAL_DELAUNAY_TRIANGULATION_HIERARCHY_3_H -#define CGAL_INTERNAL_DELAUNAY_TRIANGULATION_HIERARCHY_3_H - -#if !defined CGAL_DELAUNAY_TRIANGULATION_3_H -# error "Other header files need to be included first..." -#endif - -#include - -namespace CGAL { - -// Specializations of Delaunay_triangulation_3 for Fast_location, -// as 2nd as well as 3rd positions (deduced parameter). - -#define CGAL_TDS_3 \ -typename Default::Get,\ - Triangulation_cell_base_3 > >::type - -template < class Gt, class Tds_ > -class Delaunay_triangulation_3 - : public Triangulation_hierarchy_3 >::Other> > -{ - typedef Triangulation_hierarchy_3 >::Other> > Base; - -public: - - Delaunay_triangulation_3(const Gt& traits = Gt()) - : Base(traits) {} - - template < typename InputIterator > - Delaunay_triangulation_3(InputIterator first, InputIterator last, - const Gt& traits = Gt()) - : Base(first, last, traits) {} -}; - -#undef CGAL_TDS_3 - -template < class Gt, class Tds_ > -class Delaunay_triangulation_3 - : public Delaunay_triangulation_3 -{ - typedef Delaunay_triangulation_3 Base; - -public: - - Delaunay_triangulation_3(const Gt& traits = Gt()) - : Base(traits) {} - - template < typename InputIterator > - Delaunay_triangulation_3(InputIterator first, InputIterator last, - const Gt& traits = Gt()) - : Base(first, last, traits) {} -}; - -// 2 cases for Location_policy<> in 2nd position. - -template < class Gt > -class Delaunay_triangulation_3 - : public Triangulation_hierarchy_3 >, - Triangulation_cell_base_3 > > > -{ - typedef Triangulation_hierarchy_3 >, - Triangulation_cell_base_3 > > > Base; - -public: - - Delaunay_triangulation_3(const Gt& traits = Gt()) - : Base(traits) {} - - template < typename InputIterator > - Delaunay_triangulation_3(InputIterator first, InputIterator last, - const Gt& traits = Gt()) - : Base(first, last, traits) {} -}; - -template < class Gt > -class Delaunay_triangulation_3 - : public Delaunay_triangulation_3 -{ - typedef Delaunay_triangulation_3 Base; - -public: - - Delaunay_triangulation_3(const Gt& traits = Gt()) - : Base(traits) {} - - template < typename InputIterator > - Delaunay_triangulation_3(InputIterator first, InputIterator last, - const Gt& traits = Gt()) - : Base(first, last, traits) {} -}; - -} // namespace CGAL - -#endif // CGAL_INTERNAL_DELAUNAY_TRIANGULATION_HIERARCHY_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/internal/Dummy_tds_3.h b/Triangulation_3_copy_tds/include/CGAL/internal/Dummy_tds_3.h deleted file mode 100644 index bfd3c4e5dcf..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/internal/Dummy_tds_3.h +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) 2003 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Sylvain Pion - -#ifndef CGAL_INTERNAL_TRIANGULATION_DUMMY_TDS_3_H -#define CGAL_INTERNAL_TRIANGULATION_DUMMY_TDS_3_H - -namespace CGAL { namespace internal { - -// Dummy TDS which provides all types that a vertex_base or cell_base can use. -struct Dummy_tds_3 { - struct Vertex {}; - struct Cell {}; - struct Facet {}; - struct Edge {}; - - struct Vertex_handle {}; - struct Cell_handle {}; - - struct Vertex_iterator {}; - struct Cell_iterator {}; - struct Facet_iterator {}; - struct Edge_iterator {}; - - struct Cell_circulator {}; - struct Facet_circulator {}; -}; - -}} // namespace CGAL::internal - -#endif // CGAL_INTERNAL_TRIANGULATION_DUMMY_TDS_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/internal/Regular_triangulation_filtered_traits_3.h b/Triangulation_3_copy_tds/include/CGAL/internal/Regular_triangulation_filtered_traits_3.h deleted file mode 100644 index bb44079366d..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/internal/Regular_triangulation_filtered_traits_3.h +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright (c) 2004 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// Author(s) : Sylvain Pion - -#ifndef CGAL_INTERNAL_REGULAR_TRIANGULATION_FILTERED_TRAITS_3_H -#define CGAL_INTERNAL_REGULAR_TRIANGULATION_FILTERED_TRAITS_3_H - -#include -#include -#include -#include - -namespace CGAL{ - - -// The Weighted_converter is parametrized by a usual kernel converter, -// and adds the conversions for the Weighted_point. -template < typename Converter, - typename Source_traits= Regular_triangulation_euclidean_traits_base_3, - typename Target_traits= Regular_triangulation_euclidean_traits_base_3 - > -struct Weighted_converter_3 - : public Converter -{ - typedef typename Converter::Source_kernel Source_kernel; - typedef typename Converter::Target_kernel Target_kernel; - - typedef typename Source_traits::Weighted_point_3 Source_wp; - typedef typename Target_traits::Weighted_point_3 Target_wp; - - typedef typename Source_kernel::Point_3 Source_p; - typedef typename Target_kernel::Point_3 Target_p; - - using Converter::operator(); - - // Needed for MSVC 2005/2008 to avoid a matching ambiguity - Target_p - operator()(const Source_p &p) const - { - return Converter::operator()(p); - } - - Target_wp - operator()(const Source_wp &wp) const - { - return Target_wp(Converter::operator()(wp.point()), - Converter::operator()(wp.weight())); - } -}; - - -namespace internal{ - -// The argument is supposed to be a Filtered_kernel like kernel. -template < typename K> -class Regular_triangulation_filtered_traits_base_3 - : public Regular_triangulation_euclidean_traits_base_3 -{ - // Exact traits is based on the exact kernel. - typedef Regular_triangulation_euclidean_traits_3 - Exact_traits; - // Filtering traits is based on the filtering kernel. - typedef Regular_triangulation_euclidean_traits_3 - Filtering_traits; - - typedef typename K::C2E C2E; - typedef typename K::C2F C2F; - -public: - - typedef K Kernel; - - typedef Filtered_predicate< - typename Exact_traits::Power_test_3, - typename Filtering_traits::Power_test_3, - Weighted_converter_3, - Weighted_converter_3 > Power_test_3; - - typedef Filtered_predicate< - typename Exact_traits::Compare_power_distance_3, - typename Filtering_traits::Compare_power_distance_3, - Weighted_converter_3, - Weighted_converter_3 > Compare_power_distance_3; - - typedef Filtered_predicate< - typename Exact_traits::In_smallest_orthogonal_sphere_3, - typename Filtering_traits::In_smallest_orthogonal_sphere_3, - Weighted_converter_3, - Weighted_converter_3 > In_smallest_orthogonal_sphere_3; - - typedef Filtered_predicate< - typename Exact_traits::Side_of_bounded_orthogonal_sphere_3, - typename Filtering_traits::Side_of_bounded_orthogonal_sphere_3, - Weighted_converter_3, - Weighted_converter_3 > Side_of_bounded_orthogonal_sphere_3; - - typedef Filtered_predicate< - typename Exact_traits::Does_simplex_intersect_dual_support_3, - typename Filtering_traits::Does_simplex_intersect_dual_support_3, - Weighted_converter_3, - Weighted_converter_3 > Does_simplex_intersect_dual_support_3; - - typedef Filtered_predicate< - typename Exact_traits::Compare_weighted_squared_radius_3, - typename Filtering_traits::Compare_weighted_squared_radius_3, - Weighted_converter_3, - Weighted_converter_3 > Compare_weighted_squared_radius_3; - - enum { Has_filtered_predicates = true }; - - Power_test_3 power_test_3_object() const - { return Power_test_3();} - - Compare_power_distance_3 compare_power_distance_3_object() const - { return Compare_power_distance_3();} - - In_smallest_orthogonal_sphere_3 - in_smallest_orthogonal_sphere_3_object() const - { return In_smallest_orthogonal_sphere_3(); } - - Side_of_bounded_orthogonal_sphere_3 - side_of_bounded_orthogonal_sphere_3_object() const - { return Side_of_bounded_orthogonal_sphere_3(); } - - Does_simplex_intersect_dual_support_3 - does_simplex_intersect_dual_support_3_object() const - { return Does_simplex_intersect_dual_support_3(); } - - Compare_weighted_squared_radius_3 - compare_weighted_squared_radius_3_object() const - { return Compare_weighted_squared_radius_3(); } - // The following are inherited since they are constructions : - // Construct_weighted_circumcenter_3 - // Compute_squared_radius_smallest_orthogonal_sphere_3 - // Compute_power_product_3 -}; - -template < typename K,bool UseStaticFilters = K::Has_static_filters> -class Regular_triangulation_filtered_traits_3 - : public Regular_triangulation_filtered_traits_base_3 -{ -public: - enum { Has_static_filters = false }; -}; - -template < typename K> -class Regular_triangulation_filtered_traits_3 - : public internal::Regular_triangulation_static_filters_traits_3< Regular_triangulation_filtered_traits_base_3 > -{ -public: - enum { Has_static_filters = true }; -}; - - - -} } //namespace CGAL::internal - -#endif // CGAL_INTERNAL_REGULAR_TRIANGULATION_FILTERED_TRAITS_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/internal/Static_filters/Compare_weighted_squared_radius_3.h b/Triangulation_3_copy_tds/include/CGAL/internal/Static_filters/Compare_weighted_squared_radius_3.h deleted file mode 100644 index f3d01ab3f62..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/internal/Static_filters/Compare_weighted_squared_radius_3.h +++ /dev/null @@ -1,362 +0,0 @@ -// Copyright (c) 2009 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// Author(s) : Sebastien Loriot -// This predicates was generated using the fpg tool written by Andreas Meyer. -// - -#ifndef CGAL_INTERNAL_STATIC_FILTERS_COMPARE_WEIGHTED_SQUARED_RADIUS_3_H -#define CGAL_INTERNAL_STATIC_FILTERS_COMPARE_WEIGHTED_SQUARED_RADIUS_3_H - -#include -#include -#include - - -namespace CGAL { namespace internal { namespace Static_filters_predicates { - - - template - class Compare_weighted_squared_radius_3: - public K_base::Compare_weighted_squared_radius_3 - { - typedef typename K_base::Weighted_point_3 Weighted_point_3; - typedef typename K_base::FT FT; - typedef typename K_base::Compare_weighted_squared_radius_3 Base; - public: - typedef typename Base::result_type result_type; - - #ifndef CGAL_CFG_MATCHING_BUG_6 - using Base::operator(); - #else - result_type - operator()(const Weighted_point_3& p, const FT& w) const - { - return Base::operator()(p,w); - } - #endif - - - result_type operator() ( - const Weighted_point_3& p, - const Weighted_point_3& q, - const Weighted_point_3& r, - const Weighted_point_3& s, - const FT& w - ) const { - - CGAL_BRANCH_PROFILER_3("semi-static failures/attempts/calls to : Compare_weighted_squared_radius_3 with 4 wpoints", tmp); - using std::fabs; - - double px, py, pz, pw, qx, qy, qz, qw, rx, ry, rz, rw, sx, sy, sz, sw, alpha; - if( fit_in_double(p.x(), px) && fit_in_double(p.y(), py) && - fit_in_double(p.z(), pz) && fit_in_double(p.weight(), pw) && - fit_in_double(q.x(), qx) && fit_in_double(q.y(), qy) && - fit_in_double(q.z(), qz) && fit_in_double(q.weight(), qw) && - fit_in_double(r.x(), rx) && fit_in_double(r.y(), ry) && - fit_in_double(r.z(), rz) && fit_in_double(r.weight(), rw) && - fit_in_double(s.x(), sx) && fit_in_double(s.y(), sy) && - fit_in_double(s.z(), sz) && fit_in_double(s.weight(), sw) && - fit_in_double(w, alpha) - ) - { - CGAL_BRANCH_PROFILER_BRANCH_1(tmp); - - double qpx = (qx - px); - double qpy = (qy - py); - double qpz = (qz - pz); - double pw_qw = (pw - qw); - double qp2 = (((CGAL::square( qpx ) + CGAL::square( qpy )) + CGAL::square( qpz )) + pw_qw); - double rpx = (rx - px); - double rpy = (ry - py); - double rpz = (rz - pz); - double pw_rw = (pw - rw); - double rp2 = (((CGAL::square( rpx ) + CGAL::square( rpy )) + CGAL::square( rpz )) + pw_rw); - double spx = (sx - px); - double spy = (sy - py); - double spz = (sz - pz); - double pw_sw = (pw - sw); - double sp2 = (((CGAL::square( spx ) + CGAL::square( spy )) + CGAL::square( spz )) + pw_sw); - double num_x = CGAL::determinant( qpy, qpz, qp2, rpy, rpz, rp2, spy, spz, sp2 ); - double num_y = CGAL::determinant( qpx, qpz, qp2, rpx, rpz, rp2, spx, spz, sp2 ); - double num_z = CGAL::determinant( qpx, qpy, qp2, rpx, rpy, rp2, spx, spy, sp2 ); - double den = CGAL::determinant( qpx, qpy, qpz, rpx, rpy, rpz, spx, spy, spz ); - double alpha_pw = (alpha + pw); - CGAL::Sign int_tmp_result; - double eps; - double double_tmp_result = (((alpha_pw * 4.00000000000000000000e+00) * CGAL::square( den )) - ((CGAL::square( num_x ) + CGAL::square( num_y )) + CGAL::square( num_z ))); - double max4 = fabs(qpy); - if( (max4 < fabs(rpy)) ) max4 = fabs(rpy); - if( (max4 < fabs(spy)) ) max4 = fabs(spy); - double max2 = max4; - if( (max2 < fabs(qpx)) ) max2 = fabs(qpx); - if( (max2 < fabs(rpx)) ) max2 = fabs(rpx); - if( (max2 < fabs(spx)) ) max2 = fabs(spx); - double max1 = max2; - double max3 = max4; - double max5 = fabs(qpz); - if( (max5 < fabs(rpz)) ) max5 = fabs(rpz); - if( (max5 < fabs(spz)) ) max5 = fabs(spz); - if( (max3 < max5) ) max3 = max5; - if( (max1 < max3) ) max1 = max3; - if( (max1 < max4) ) max1 = max4; - if( (max1 < max5) ) max1 = max5; - double max6 = fabs(pw_qw); - if( (max6 < fabs(pw_rw)) ) max6 = fabs(pw_rw); - if( (max6 < fabs(pw_sw)) ) max6 = fabs(pw_sw); - double max7 = max6; - if( (max7 < fabs(alpha_pw)) ) max7 = fabs(alpha_pw); - double lower_bound_1; - double upper_bound_1; - lower_bound_1 = max1; - upper_bound_1 = max1; - if( (max2 < lower_bound_1) ) lower_bound_1 = max2; - if( (max3 < lower_bound_1) ) lower_bound_1 = max3; - if( (max4 < lower_bound_1) ) lower_bound_1 = max4; - if( (max5 < lower_bound_1) ) lower_bound_1 = max5; - double lower_bound_2; - double upper_bound_2; - lower_bound_2 = max6; - upper_bound_2 = max6; - if( (max7 < lower_bound_2) ) lower_bound_2 = max7; - else - { - if( (max7 > upper_bound_2) ) upper_bound_2 = max7; - } - if( ((lower_bound_1 < 8.99995159231796093217e-38) || (lower_bound_2 < 8.09991286640666077573e-75)) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,s,w); - } - else - { - if( ((upper_bound_1 > 2.59614842926741294957e+33) || (upper_bound_2 > 6.73998666678765545893e+66)) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,s,w); - } - eps = (5.16919651938288206243e-12 * (((((max2 * max3) * max1) * max1) * CGAL::max BOOST_PREVENT_MACRO_SUBSTITUTION ( max7, (max1 * max1) )) * CGAL::max BOOST_PREVENT_MACRO_SUBSTITUTION ( CGAL::max BOOST_PREVENT_MACRO_SUBSTITUTION ( max6, (max4 * max5) ), (max1 * max1) ))); - if( (double_tmp_result > eps) ) - { - int_tmp_result = CGAL::NEGATIVE; - } - else - { - if( (double_tmp_result < -eps) ) - { - int_tmp_result = CGAL::POSITIVE; - } - else - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,s,w); - } - } - } - return int_tmp_result; - } - else - return Base::operator()(p,q,r,s,w); - } - - result_type - operator() ( - const Weighted_point_3& p, - const Weighted_point_3& q , - const Weighted_point_3& r, - const FT& w - ) const { - - CGAL_BRANCH_PROFILER_3("semi-static failures/attempts/calls to : Compare_weighted_squared_radius_3 with 3 wpoints", tmp); - using std::fabs; - - double px, py, pz, pw, qx, qy, qz, qw, rx, ry, rz, rw, alpha; - if( fit_in_double(p.x(), px) && fit_in_double(p.y(), py) && - fit_in_double(p.z(), pz) && fit_in_double(p.weight(), pw) && - fit_in_double(q.x(), qx) && fit_in_double(q.y(), qy) && - fit_in_double(q.z(), qz) && fit_in_double(q.weight(), qw) && - fit_in_double(r.x(), rx) && fit_in_double(r.y(), ry) && - fit_in_double(r.z(), rz) && fit_in_double(r.weight(), rw) && - fit_in_double(w, alpha) - ) - { - CGAL_BRANCH_PROFILER_BRANCH_1(tmp); - - double qpx = (qx - px); - double qpy = (qy - py); - double qpz = (qz - pz); - double pw_qw = (pw - qw); - double qp2 = (((CGAL::square( qpx ) + CGAL::square( qpy )) + CGAL::square( qpz )) + pw_qw); - double rpx = (rx - px); - double rpy = (ry - py); - double rpz = (rz - pz); - double pw_rw = (pw - rw); - double rp2 = (((CGAL::square( rpx ) + CGAL::square( rpy )) + CGAL::square( rpz )) + pw_rw); - double sx = ((qpy * rpz) - (qpz * rpy)); - double sy = ((qpz * rpx) - (qpx * rpz)); - double sz = ((qpx * rpy) - (qpy * rpx)); - double num_x = ((qp2 * CGAL::determinant( rpy, rpz, sy, sz )) - (rp2 * CGAL::determinant( qpy, qpz, sy, sz ))); - double num_y = ((qp2 * CGAL::determinant( rpx, rpz, sx, sz )) - (rp2 * CGAL::determinant( qpx, qpz, sx, sz ))); - double num_z = ((qp2 * CGAL::determinant( rpx, rpy, sx, sy )) - (rp2 * CGAL::determinant( qpx, qpy, sx, sy ))); - double den = CGAL::determinant( qpx, qpy, qpz, rpx, rpy, rpz, sx, sy, sz ); - double alpha_pw = (alpha + pw); - CGAL::Sign int_tmp_result; - double eps; - double double_tmp_result = ((alpha_pw * CGAL::square( den )) - (2.50000000000000000000e-01 * ((CGAL::square( num_x ) + CGAL::square( num_y )) + CGAL::square( num_z )))); - double max2 = fabs(qpx); - if( (max2 < fabs(qpy)) ) max2 = fabs(qpy); - if( (max2 < fabs(rpx)) ) max2 = fabs(rpx); - if( (max2 < fabs(rpy)) ) max2 = fabs(rpy); - double max1 = max2; - if( (max1 < fabs(qpz)) ) max1 = fabs(qpz); - if( (max1 < fabs(rpz)) ) max1 = fabs(rpz); - double max3 = fabs(pw_qw); - if( (max3 < fabs(pw_rw)) ) max3 = fabs(pw_rw); - double max4 = max3; - if( (max4 < fabs(alpha_pw)) ) max4 = fabs(alpha_pw); - double lower_bound_1; - double upper_bound_1; - lower_bound_1 = max1; - upper_bound_1 = max1; - if( (max2 < lower_bound_1) ) lower_bound_1 = max2; - double lower_bound_2; - double upper_bound_2; - lower_bound_2 = max3; - upper_bound_2 = max3; - if( (max4 < lower_bound_2) ) lower_bound_2 = max4; - else - { - if( (max4 > upper_bound_2) ) upper_bound_2 = max4; - } - if( ((lower_bound_1 < 2.13354839219409151500e-30) || (lower_bound_2 < 4.55202874183399304187e-60)) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,w); - } - else - { - if( ((upper_bound_1 > 1.23794003928538000002e+27) || (upper_bound_2 > 1.53249554086588817779e+54)) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,w); - } - eps = (1.13846439714120896721e-11 * (((((((max1 * max2) * max1) * max1) * max1) * max1) * CGAL::max BOOST_PREVENT_MACRO_SUBSTITUTION ( max4, (max1 * max1) )) * CGAL::max BOOST_PREVENT_MACRO_SUBSTITUTION ( max3, (max1 * max1) ))); - if( (double_tmp_result > eps) ) - { - int_tmp_result = CGAL::NEGATIVE; - } - else - { - if( (double_tmp_result < -eps) ) - { - int_tmp_result = CGAL::POSITIVE; - } - else - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,w); - } - } - } - return int_tmp_result; - } - else - return Base::operator()(p,q,r,w); - } - - result_type - operator() ( - const Weighted_point_3& p, - const Weighted_point_3& q, - const FT& w - ) const { - - CGAL_BRANCH_PROFILER_3("semi-static failures/attempts/calls to : Compare_weighted_squared_radius_3 with 2 wpoints", tmp); - using std::fabs; - - double px, py, pz, pw, qx, qy, qz, qw, alpha; - if( fit_in_double(p.x(), px) && fit_in_double(p.y(), py) && - fit_in_double(p.z(), pz) && fit_in_double(p.weight(), pw) && - fit_in_double(q.x(), qx) && fit_in_double(q.y(), qy) && - fit_in_double(q.z(), qz) && fit_in_double(q.weight(), qw) && - fit_in_double(w, alpha) - ) - { - CGAL_BRANCH_PROFILER_BRANCH_1(tmp); - - double qpx = (qx - px); - double qpy = (qy - py); - double qpz = (qz - pz); - double qp2 = ((CGAL::square( qpx ) + CGAL::square( qpy )) + CGAL::square( qpz )); - double alpha_pw = (alpha + pw); - double pw_qw = (pw - qw); - CGAL::Sign int_tmp_result; - double eps; - double double_tmp_result = (((4.00000000000000000000e+00 * qp2) * alpha_pw) - CGAL::square( (qp2 + pw_qw) )); - double max1 = fabs(qpx); - if( (max1 < fabs(qpy)) ) max1 = fabs(qpy); - if( (max1 < fabs(qpz)) ) max1 = fabs(qpz); - double max2; - double max3 = fabs(pw_qw); - max2 = max3; - if( (max2 < fabs(alpha_pw)) ) max2 = fabs(alpha_pw); - double lower_bound_2; - double upper_bound_2; - lower_bound_2 = max2; - upper_bound_2 = max2; - if( (max3 < lower_bound_2) ) lower_bound_2 = max3; - if( ((max1 < 3.12497063152273477754e-74) || (lower_bound_2 < 9.76544144787960039738e-148)) ){ - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,w); - } - else - { - if( ((max1 > 6.42775217703595896130e+60) || (upper_bound_2 > 4.13159980493905099125e+121)) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,w); - } - eps = (2.33324675561911025753e-14 * (CGAL::max BOOST_PREVENT_MACRO_SUBSTITUTION ( max2, (max1 * max1) ) * CGAL::max BOOST_PREVENT_MACRO_SUBSTITUTION ( max3, (max1 * max1) ))); - if( (double_tmp_result > eps) ) - { - int_tmp_result = CGAL::NEGATIVE; - } - else - { - if( (double_tmp_result < -eps) ) - { - int_tmp_result = CGAL::POSITIVE; - } - else - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,w); - } - } - } - return int_tmp_result; - } - else - return Base::operator()(p,q,w); - } - - }; - - -} } }//namespace CGAL::internal::Static_filters_predicates - - -#endif //CGAL_INTERNAL_STATIC_FILTERS_COMPARE_WEIGHTED_SQUARED_RADIUS_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/internal/Static_filters/Power_test_3.h b/Triangulation_3_copy_tds/include/CGAL/internal/Static_filters/Power_test_3.h deleted file mode 100644 index 6ec1f177c4d..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/internal/Static_filters/Power_test_3.h +++ /dev/null @@ -1,664 +0,0 @@ -// Copyright (c) 2009 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// Author(s) : Sebastien Loriot -// This predicates was generated using the fpg tool written by Andreas Meyer. -// - -#ifndef CGAL_INTERNAL_STATIC_FILTERS_POWER_TEST_3_H -#define CGAL_INTERNAL_STATIC_FILTERS_POWER_TEST_3_H - -#include -#include -#include - - -namespace CGAL { namespace internal { namespace Static_filters_predicates { - - template - class Power_test_3: - public K_base::Power_test_3 - { - typedef typename K_base::Weighted_point_3 Weighted_point_3; - typedef typename K_base::FT FT; - typedef typename K_base::Power_test_3 Base; - public: - typedef typename Base::result_type result_type; - - #ifndef CGAL_CFG_MATCHING_BUG_6 - using Base::operator(); - #else - result_type - operator()(const Weighted_point_3& p, const Weighted_point_3& q) const - { - return Base::operator()(p,q); - } - #endif - - - result_type operator() ( const Weighted_point_3 & p, - const Weighted_point_3 & q, - const Weighted_point_3 & r, - const Weighted_point_3 & s, - const Weighted_point_3 & t) const - { - CGAL_BRANCH_PROFILER_3("semi-static failures/attempts/calls to : Power_test_3 with 4+1 wpoints", tmp); - using std::fabs; - - double px, py, pz, pwt, qx, qy, qz, qwt, rx, ry, rz, rwt, sx, sy, sz, swt, tx, ty, tz, twt; - if( fit_in_double(p.x(), px) && fit_in_double(p.y(), py) && - fit_in_double(p.z(), pz) && fit_in_double(p.weight(), pwt) && - fit_in_double(q.x(), qx) && fit_in_double(q.y(), qy) && - fit_in_double(q.z(), qz) && fit_in_double(q.weight(), qwt) && - fit_in_double(r.x(), rx) && fit_in_double(r.y(), ry) && - fit_in_double(r.z(), rz) && fit_in_double(r.weight(), rwt) && - fit_in_double(s.x(), sx) && fit_in_double(s.y(), sy) && - fit_in_double(s.z(), sz) && fit_in_double(s.weight(), swt) && - fit_in_double(t.x(), tx) && fit_in_double(t.y(), ty) && - fit_in_double(t.z(), tz) && fit_in_double(t.weight(), twt) - ) - { - CGAL_BRANCH_PROFILER_BRANCH_1(tmp); - using std::fabs; - - double dpx = (px - tx); - double dpy = (py - ty); - double dpz = (pz - tz); - double twt_pwt = (twt - pwt); - double dpt = (((square( dpx ) + square( dpy )) + square( dpz )) + twt_pwt); - double dqx = (qx - tx); - double dqy = (qy - ty); - double dqz = (qz - tz); - double twt_qwt = (twt - qwt); - double dqt = (((square( dqx ) + square( dqy )) + square( dqz )) + twt_qwt); - double drx = (rx - tx); - double dry = (ry - ty); - double drz = (rz - tz); - double twt_rwt = (twt - rwt); - double drt = (((square( drx ) + square( dry )) + square( drz )) + twt_rwt); - double dsx = (sx - tx); - double dsy = (sy - ty); - double dsz = (sz - tz); - double twt_swt = (twt - swt); - double dst = (((square( dsx ) + square( dsy )) + square( dsz )) + twt_swt); - result_type int_tmp_result; - double eps; - double RT_tmp_result = CGAL::determinant( dpx, dpy, dpz, dpt, dqx, dqy, dqz, dqt, drx, dry, drz, drt, dsx, dsy, dsz, dst ); - double max2 = fabs(dpx); - if( (max2 < fabs(dqx)) ) max2 = fabs(dqx); - if( (max2 < fabs(drx)) ) max2 = fabs(drx); - if( (max2 < fabs(dsx)) ) max2 = fabs(dsx); - double max1 = max2; - double max3 = fabs(dpy); - if( (max3 < fabs(dqy)) ) max3 = fabs(dqy); - if( (max3 < fabs(dry)) ) max3 = fabs(dry); - if( (max3 < fabs(dsy)) ) max3 = fabs(dsy); - if( (max1 < max3) ) max1 = max3; - double max4 = fabs(dpz); - if( (max4 < fabs(dqz)) ) max4 = fabs(dqz); - if( (max4 < fabs(drz)) ) max4 = fabs(drz); - if( (max4 < fabs(dsz)) ) max4 = fabs(dsz); - if( (max1 < max4) ) max1 = max4; - double max5 = fabs(twt_pwt); - if( (max5 < fabs(twt_qwt)) ) max5 = fabs(twt_qwt); - if( (max5 < fabs(twt_rwt)) ) max5 = fabs(twt_rwt); - if( (max5 < fabs(twt_swt)) ) max5 = fabs(twt_swt); - double lower_bound_1; - double upper_bound_1; - lower_bound_1 = max1; - upper_bound_1 = max1; - if( (max2 < lower_bound_1) ) lower_bound_1 = max2; - if( (max3 < lower_bound_1) ) lower_bound_1 = max3; - if( (max4 < lower_bound_1) ) lower_bound_1 = max4; - //handwritten workaround to handle case where all weights are equal - //if( ((lower_bound_1 < 1.05893684636332247212e-59) || (max5 < 1.12134724458589890404e-118)) ) - if( ((lower_bound_1 < 1.05893684636332247212e-59) || (max5 < 1.12134724458589890404e-118 && max5!=0)) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,s,t); - } - else - { - if( ((upper_bound_1 > 3.21387608851797948065e+60) || (max5 > 1.03289995123476274781e+121)) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,s,t); - } - eps = (1.67106803095990471147e-13 * (((max2 * max3) * max4) * CGAL::max BOOST_PREVENT_MACRO_SUBSTITUTION( max5, (max1 * max1) ))); - if( (RT_tmp_result > eps) ) - { - int_tmp_result = NEGATIVE; - } - else - { - if( (RT_tmp_result < -eps) ) - { - int_tmp_result = POSITIVE; - } - else - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,s,t); - } - } - } - return int_tmp_result; - } - else - return Base::operator()(p,q,r,s,t); - } - - result_type operator() ( const Weighted_point_3 & p, - const Weighted_point_3 & q, - const Weighted_point_3 & r, - const Weighted_point_3 & t) const - { - - CGAL_BRANCH_PROFILER_3("semi-static failures/attempts/calls to : Power_test_3 with 3+1 wpoints", tmp); - using std::fabs; - - double px, py, pz, pwt, qx, qy, qz, qwt, rx, ry, rz, rwt, tx, ty, tz, twt; - if( fit_in_double(p.x(), px) && fit_in_double(p.y(), py) && - fit_in_double(p.z(), pz) && fit_in_double(p.weight(), pwt) && - fit_in_double(q.x(), qx) && fit_in_double(q.y(), qy) && - fit_in_double(q.z(), qz) && fit_in_double(q.weight(), qwt) && - fit_in_double(r.x(), rx) && fit_in_double(r.y(), ry) && - fit_in_double(r.z(), rz) && fit_in_double(r.weight(), rwt) && - fit_in_double(t.x(), tx) && fit_in_double(t.y(), ty) && - fit_in_double(t.z(), tz) && fit_in_double(t.weight(), twt) - ) - { - CGAL_BRANCH_PROFILER_BRANCH_1(tmp); - using std::fabs; - - double dpx = (px - tx); - double dpy = (py - ty); - double dpz = (pz - tz); - double twt_pwt = (twt - pwt); - double dpt = (((square( dpx ) + square( dpy )) + square( dpz )) + twt_pwt); - double dqx = (qx - tx); - double dqy = (qy - ty); - double dqz = (qz - tz); - double twt_qwt = (twt - qwt); - double dqt = (((square( dqx ) + square( dqy )) + square( dqz )) + twt_qwt); - double drx = (rx - tx); - double dry = (ry - ty); - double drz = (rz - tz); - double twt_rwt = (twt - rwt); - double drt = (((square( drx ) + square( dry )) + square( drz )) + twt_rwt); - int cmp; - int int_tmp_result; - double eps; - double RT_tmp_result = CGAL::determinant( dpx, dpy, dpt, dqx, dqy, dqt, drx, dry, drt ); - double max7 = fabs(dpz); - if( (max7 < fabs(dqz)) ) max7 = fabs(dqz); - if( (max7 < fabs(drz)) ) max7 = fabs(drz); - double max1 = max7; - double max2 = fabs(dpx); - if( (max2 < fabs(dqx)) ) max2 = fabs(dqx); - if( (max2 < fabs(drx)) ) max2 = fabs(drx); - if( (max1 < max2) ) max1 = max2; - double max3 = fabs(dpy); - if( (max3 < fabs(dqy)) ) max3 = fabs(dqy); - if( (max3 < fabs(dry)) ) max3 = fabs(dry); - if( (max1 < max3) ) max1 = max3; - double max4 = fabs(twt_pwt); - if( (max4 < fabs(twt_qwt)) ) max4 = fabs(twt_qwt); - if( (max4 < fabs(twt_rwt)) ) max4 = fabs(twt_rwt); - double lower_bound_1; - double upper_bound_1; - lower_bound_1 = max1; - upper_bound_1 = max1; - if( (max2 < lower_bound_1) ) lower_bound_1 = max2; - if( (max3 < lower_bound_1) ) lower_bound_1 = max3; - //handwritten workaround to handle case where all weights are equal - //if( ((lower_bound_1 < 2.92391967062015793913e-74) || (max4 < 8.54930624023949352313e-148)) ) - if( ((lower_bound_1 < 2.92391967062015793913e-74) || (max4 < 8.54930624023949352313e-148 && max4!=0)) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,t); - } - else - { - if( ((upper_bound_1 > 7.23700557733225980357e+75) || (max4 > 5.23742497263382350320e+151)) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,t); - } - eps = (3.04426660386257731823e-14 * ((max2 * max3) * CGAL::max BOOST_PREVENT_MACRO_SUBSTITUTION( max4, (max1 * max1) ))); - if( (RT_tmp_result > eps) ) - { - int_tmp_result = 1; - } - else - { - if( (RT_tmp_result < -eps) ) - { - int_tmp_result = -1; - } - else - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,t); - } - } - } - cmp = int_tmp_result; - double px_rx = (px - rx); - double qy_ry = (qy - ry); - double qx_rx = (qx - rx); - double py_ry = (py - ry); - double max5 = fabs(px_rx); - if( (max5 < fabs(qx_rx)) ) max5 = fabs(qx_rx); - double max6 = fabs(qy_ry); - if( (max6 < fabs(py_ry)) ) max6 = fabs(py_ry); - if( (cmp != 0) ) - { - int int_tmp_result_FFWKCAA; - double double_tmp_result; - double_tmp_result = ((px_rx * qy_ry) - (qx_rx * py_ry)); - lower_bound_1 = max5; - upper_bound_1 = max5; - if( (max6 < lower_bound_1) ) lower_bound_1 = max6; - else - { - if( (max6 > upper_bound_1) ) upper_bound_1 = max6; - } - if( (lower_bound_1 < 5.00368081960964690982e-147) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,t); - } - else - { - if( (upper_bound_1 > 7.23700557733225980357e+75) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,t); - } - eps = (8.88720573725927976811e-16 * (max5 * max6)); - if( (double_tmp_result > eps) ) int_tmp_result_FFWKCAA = 1; - else - { - if( (double_tmp_result < -eps) ) - { - int_tmp_result_FFWKCAA = -1; - } - else - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,t); - } - } - } - return static_cast(cmp * int_tmp_result_FFWKCAA); - } - int int_tmp_result_k60Ocge; - double RT_tmp_result_3SPBwDj = CGAL::determinant( dpx, dpz, dpt, dqx, dqz, dqt, drx, drz, drt ); - lower_bound_1 = max1; - upper_bound_1 = max1; - if( (max7 < lower_bound_1) ) lower_bound_1 = max7; - if( (max2 < lower_bound_1) ) lower_bound_1 = max2; - //handwritten workaround to handle case where all weights are equal - //if( ((lower_bound_1 < 2.92391967062015793913e-74) || (max4 < 8.54930624023949352313e-148)) ) - if( ((lower_bound_1 < 2.92391967062015793913e-74) || (max4 < 8.54930624023949352313e-148 && max4!=0)) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,t); - } - else - { - if( ((upper_bound_1 > 7.23700557733225980357e+75) || (max4 > 5.23742497263382350320e+151)) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,t); - } - eps = (3.04426660386257731823e-14 * ((max2 * max7) * CGAL::max BOOST_PREVENT_MACRO_SUBSTITUTION( max4, (max1 * max1) ))); - if( (RT_tmp_result_3SPBwDj > eps) ) - { - int_tmp_result_k60Ocge = 1; - } - else - { - if( (RT_tmp_result_3SPBwDj < -eps) ) - { - int_tmp_result_k60Ocge = -1; - } - else - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,t); - } - } - } - cmp = int_tmp_result_k60Ocge; - double qz_rz = (qz - rz); - double pz_rz = (pz - rz); - double max8 = fabs(qz_rz); - if( (max8 < fabs(pz_rz)) ) max8 = fabs(pz_rz); - if( (cmp != 0) ) - { - int int_tmp_result_k3Lzf6g; - double double_tmp_result_Gx4H; - double_tmp_result_Gx4H = ((px_rx * qz_rz) - (qx_rx * pz_rz)); - lower_bound_1 = max5; - upper_bound_1 = max5; - if( (max8 < lower_bound_1) ) lower_bound_1 = max8; - else - { - if( (max8 > upper_bound_1) ) upper_bound_1 = max8; - } - if( (lower_bound_1 < 5.00368081960964690982e-147) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,t); - } - else - { - if( (upper_bound_1 > 7.23700557733225980357e+75) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,t); - } - eps = (8.88720573725927976811e-16 * (max5 * max8)); - if( (double_tmp_result_Gx4H > eps) ) - { - int_tmp_result_k3Lzf6g = 1; - } - else - { - if( (double_tmp_result_Gx4H < -eps) ) - { - int_tmp_result_k3Lzf6g = -1; - } - else - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,t); - } - } - } - return static_cast(cmp * int_tmp_result_k3Lzf6g); - } - int int_tmp_result_AvrrXBP; - double RT_tmp_result_feLwnHn = CGAL::determinant( dpy, dpz, dpt, dqy, dqz, dqt, dry, drz, drt ); - lower_bound_1 = max1; - upper_bound_1 = max1; - if( (max7 < lower_bound_1) ) lower_bound_1 = max7; - if( (max3 < lower_bound_1) ) lower_bound_1 = max3; - //handwritten workaround to handle case where all weights are equal - //if( ((lower_bound_1 < 2.92391967062015793913e-74) || (max4 < 8.54930624023949352313e-148)) ) - if( ((lower_bound_1 < 2.92391967062015793913e-74) || (max4 < 8.54930624023949352313e-148 && max4!=0)) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,t); - } - else - { - if( ((upper_bound_1 > 7.23700557733225980357e+75) || (max4 > 5.23742497263382350320e+151)) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,t); - } - eps = (3.04426660386257731823e-14 * ((max3 * max7) * CGAL::max BOOST_PREVENT_MACRO_SUBSTITUTION( max4, (max1 * max1) ))); - if( (RT_tmp_result_feLwnHn > eps) ) - { - int_tmp_result_AvrrXBP = 1; - } - else - { - if( (RT_tmp_result_feLwnHn < -eps) ) - { - int_tmp_result_AvrrXBP = -1; - } - else - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,t); - } - } - } - cmp = int_tmp_result_AvrrXBP; - int int_tmp_result_agX3WsT; - double double_tmp_result_Dw20Kqh = ((py_ry * qz_rz) - (qy_ry * pz_rz)); - lower_bound_1 = max8; - upper_bound_1 = max8; - if( (max6 < lower_bound_1) ) - { - lower_bound_1 = max6; - } - else - { - if( (max6 > upper_bound_1) ) upper_bound_1 = max6; - } - if( (lower_bound_1 < 5.00368081960964690982e-147) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,t); - } - else - { - if( (upper_bound_1 > 7.23700557733225980357e+75) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,t); - } - eps = (8.88720573725927976811e-16 * (max6 * max8)); - if( (double_tmp_result_Dw20Kqh > eps) ) - { - int_tmp_result_agX3WsT = 1; - } - else - { - if( (double_tmp_result_Dw20Kqh < -eps) ) - { - int_tmp_result_agX3WsT = -1; - } - else - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,r,t); - } - } - } - return static_cast(cmp * int_tmp_result_agX3WsT); - } - else - return Base::operator()(p,q,r,t); - } - - result_type operator() ( const Weighted_point_3 & p, - const Weighted_point_3 & q, - const Weighted_point_3 & t) const - { - - CGAL_BRANCH_PROFILER_3("semi-static failures/attempts/calls to : Power_test_3 with 2+1 wpoints", tmp); - using std::fabs; - - double px, py, pz, pwt, qx, qy, qz, qwt, tx, ty, tz, twt; - if( fit_in_double(p.x(), px) && fit_in_double(p.y(), py) && - fit_in_double(p.z(), pz) && fit_in_double(p.weight(), pwt) && - fit_in_double(q.x(), qx) && fit_in_double(q.y(), qy) && - fit_in_double(q.z(), qz) && fit_in_double(q.weight(), qwt) && - fit_in_double(t.x(), tx) && fit_in_double(t.y(), ty) && - fit_in_double(t.z(), tz) && fit_in_double(t.weight(), twt) - ) - { - CGAL_BRANCH_PROFILER_BRANCH_1(tmp); - - double dpx = (px - tx); - double dpy = (py - ty); - double dpz = (pz - tz); - double twt_pwt = (twt - pwt); - double dpt = (((square( dpx ) + square( dpy )) + square( dpz )) + twt_pwt); - double dqx = (qx - tx); - double dqy = (qy - ty); - double dqz = (qz - tz); - double twt_qwt = (twt - qwt); - double dqt = (((square( dqx ) + square( dqy )) + square( dqz )) + twt_qwt); - int cmp = ((px > qx) ? 1 : ((px < qx) ? -1 : 0)); - double eps; - double max1; - double max4 = fabs(dpy); - if( (max4 < fabs(dqy)) ) max4 = fabs(dqy); - max1 = max4; - double max5 = fabs(dpz); - if( (max5 < fabs(dqz)) ) max5 = fabs(dqz); - if( (max1 < max5) ) max1 = max5; - double max2 = fabs(dpx); - if( (max2 < fabs(dqx)) ) max2 = fabs(dqx); - if( (max1 < max2) ) max1 = max2; - double max3 = fabs(twt_pwt); - if( (max3 < fabs(twt_qwt)) ) max3 = fabs(twt_qwt); - double lower_bound_1; - double upper_bound_1; - if( (cmp != 0) ) - { - int int_tmp_result; - double double_tmp_result; - double_tmp_result = ((dpx * dqt) - (dqx * dpt)); - lower_bound_1 = max1; - upper_bound_1 = max1; - if( (max2 < lower_bound_1) ) lower_bound_1 = max2; - //handwritten workaround to handle case where all weights are equal - //if( ((lower_bound_1 < 4.89808663633813414271e-98) || (max3 < 2.39912526970742181620e-195)) ) - if( ((lower_bound_1 < 4.89808663633813414271e-98) || (max3 < 2.39912526970742181620e-195 && max3!=0)) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,t); - } - else - { - if( ((upper_bound_1 > 5.59936185544450928309e+101) || (max3 > 3.13528531882069776730e+203)) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,t); - } - eps = (6.88858782307641768480e-15 * (max2 * CGAL::max BOOST_PREVENT_MACRO_SUBSTITUTION( max3, (max1 * max1) ))); - if( (double_tmp_result > eps) ) - { - int_tmp_result = 1; - } - else - { - if( (double_tmp_result < -eps) ) - { - int_tmp_result = -1; - } - else - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,t); - } - } - } - return static_cast(cmp * int_tmp_result); - } - cmp = ((py > qy) ? 1 : ((py < qy) ? -1 : 0)); - if( (cmp != 0) ) - { - int int_tmp_result_FFWKCAA; - double double_tmp_result_k60Ocge; - double_tmp_result_k60Ocge = ((dpy * dqt) - (dqy * dpt)); - lower_bound_1 = max1; - upper_bound_1 = max1; - if( (max4 < lower_bound_1) ) lower_bound_1 = max4; - //handwritten workaround to handle case where all weights are equal - //if( ((lower_bound_1 < 4.89808663633813414271e-98) || (max3 < 2.39912526970742181620e-195)) ) - if( ((lower_bound_1 < 4.89808663633813414271e-98) || (max3 < 2.39912526970742181620e-195 && max3!=0)) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,t); - } - else - { - if( ((upper_bound_1 > 5.59936185544450928309e+101) || (max3 > 3.13528531882069776730e+203)) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,t); - } - eps = (6.88858782307641768480e-15 * (max4 * CGAL::max BOOST_PREVENT_MACRO_SUBSTITUTION( max3, (max1 * max1) ))); - if( (double_tmp_result_k60Ocge > eps) ) - { - int_tmp_result_FFWKCAA = 1; - } - else - { - if( (double_tmp_result_k60Ocge < -eps) ) - { - int_tmp_result_FFWKCAA = -1; - } - else - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,t); - } - } - } - return static_cast(cmp * int_tmp_result_FFWKCAA); - } - cmp = ((pz > qz) ? 1 : ((pz < qz) ? -1 : 0)); - int int_tmp_result_3SPBwDj; - double double_tmp_result_k3Lzf6g = ((dpz * dqt) - (dqz * dpt)); - lower_bound_1 = max1; - upper_bound_1 = max1; - if( (max5 < lower_bound_1) ) - { - lower_bound_1 = max5; - } - //handwritten workaround to handle case where all weights are equal - //if( ((lower_bound_1 < 4.89808663633813414271e-98) || (max3 < 2.39912526970742181620e-195)) ) - if( ((lower_bound_1 < 4.89808663633813414271e-98) || (max3 < 2.39912526970742181620e-195 && max3!=0)) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,t); - } - else - { - if( ((upper_bound_1 > 5.59936185544450928309e+101) || (max3 > 3.13528531882069776730e+203)) ) - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,t); - } - eps = (6.88858782307641768480e-15 * (max5 * CGAL::max BOOST_PREVENT_MACRO_SUBSTITUTION( max3, (max1 * max1) ))); - if( (double_tmp_result_k3Lzf6g > eps) ) - { - int_tmp_result_3SPBwDj = 1; - } - else - { - if( (double_tmp_result_k3Lzf6g < -eps) ) - { - int_tmp_result_3SPBwDj = -1; - } - else - { - CGAL_BRANCH_PROFILER_BRANCH_2(tmp); - return Base::operator()(p,q,t); - } - } - } - return static_cast(cmp * int_tmp_result_3SPBwDj); - } - else - return Base::operator()(p,q,t); - } - - }; - -} } }//namespace CGAL::internal::Static_filters_predicates - -#endif //CGAL_INTERNAL_STATIC_FILTERS_POWER_TEST_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/internal/Static_filters/Regular_triangulation_static_filters_traits_3.h b/Triangulation_3_copy_tds/include/CGAL/internal/Static_filters/Regular_triangulation_static_filters_traits_3.h deleted file mode 100644 index 6aef1e98a6c..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/internal/Static_filters/Regular_triangulation_static_filters_traits_3.h +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) 2009 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// Author(s) : Sebastien Loriot - -#ifndef CGAL_INTERNAL_STATIC_FILTERS_REGULAR_TRIANGULATION_STATIC_FILTERS_TRAITS_3_H -#define CGAL_INTERNAL_STATIC_FILTERS_REGULAR_TRIANGULATION_STATIC_FILTERS_TRAITS_3_H - -#include -#include -#include - -namespace CGAL{ namespace internal { - -template -class Regular_triangulation_static_filters_traits_3:public K_base{ - -public: - typedef Static_filters_predicates::Compare_weighted_squared_radius_3 Compare_weighted_squared_radius_3; - typedef Static_filters_predicates::Power_test_3 Power_test_3; - - - - Power_test_3 power_test_3_object() const - { return Power_test_3();} - - Compare_weighted_squared_radius_3 - compare_weighted_squared_radius_3_object() const - { return Compare_weighted_squared_radius_3(); } - - -}; - - - -} } //namespace CGAL::internal - -#endif //CGAL_INTERNAL_STATIC_FILTERS_REGULAR_TRIANGULATION_STATIC_FILTERS_TRAITS_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/internal/Triangulation_ds_circulators_3.h b/Triangulation_3_copy_tds/include/CGAL/internal/Triangulation_ds_circulators_3.h deleted file mode 100644 index 1b84881b137..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/internal/Triangulation_ds_circulators_3.h +++ /dev/null @@ -1,497 +0,0 @@ -// Copyright (c) 1999 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// Author(s) : Monique Teillaud - -#ifndef CGAL_INTERNAL_TRIANGULATION_DS_CIRCULATORS_3_H -#define CGAL_INTERNAL_TRIANGULATION_DS_CIRCULATORS_3_H - -#include -#include -#include - -namespace CGAL { namespace internal { - -template < class Tds_ > -class Triangulation_ds_cell_circulator_3 - : public Bidirectional_circulator_base -{ - // circulates on cells around a given edge - - typedef Tds_ Tds; - typedef typename Tds::Cell Cell; - typedef typename Tds::Edge Edge; - typedef typename Tds::Vertex_handle Vertex_handle; - typedef typename Tds::Cell_handle Cell_handle; - - typedef Triangulation_ds_cell_circulator_3 Cell_circulator; - -public: - - Triangulation_ds_cell_circulator_3() - : _s(), _t(), pos() - {} - - Triangulation_ds_cell_circulator_3(Cell_handle c, int s, int t) - : _s(c->vertex(s)), _t(c->vertex(t)), pos(c) - { - CGAL_triangulation_precondition( c != Cell_handle() && - s >= 0 && s < 4 && - t >= 0 && t < 4 ); - } - - Triangulation_ds_cell_circulator_3(const Edge & e) - : _s(e.first->vertex(e.second)), _t(e.first->vertex(e.third)), pos(e.first) - { - CGAL_triangulation_precondition( e.first != Cell_handle() && - e.second >=0 && e.second < 4 && - e.third >=0 && e.third < 4); - } - - Triangulation_ds_cell_circulator_3(Cell_handle c, int s, int t, - Cell_handle start) - : _s(c->vertex(s)), _t(c->vertex(t)), pos(start) - { - CGAL_triangulation_precondition( c != Cell_handle() && - s >= 0 && s < 4 && - t >= 0 && t < 4 && - start->has_vertex( _s ) && - start->has_vertex( _t ) ); - } - - Triangulation_ds_cell_circulator_3(const Edge & e, Cell_handle start) - : _s(e.first->vertex(e.second)), _t(e.first->vertex(e.third)), pos(start) - { - CGAL_triangulation_precondition( e.first != Cell_handle() && - e.second >=0 && e.second < 4 && - e.third >=0 && e.third < 4 && - start->has_vertex( _s ) && - start->has_vertex( _t ) ); - } - - Cell_circulator & operator++() - { - CGAL_triangulation_precondition( pos != Cell_handle() ); - //then dimension() cannot be < 3 - - pos = pos->neighbor(next_around_edge(pos->index(_s), pos->index(_t))); - return *this; - } - - Cell_circulator operator++(int) - { - Cell_circulator tmp(*this); - ++(*this); - return tmp; - } - - Cell_circulator & operator--() - { - CGAL_triangulation_precondition( pos != Cell_handle() ); - - pos = pos->neighbor(next_around_edge(pos->index(_t), pos->index(_s))); - return *this; - } - - Cell_circulator operator--(int) - { - Cell_circulator tmp(*this); - --(*this); - return tmp; - } - - Cell& operator*() const - { - return *pos; - } - - Cell* operator->() const - { - return &*pos; - } - - bool operator==(const Cell_circulator & ccir) const - { - return pos == ccir.pos && _s == ccir._s && _t == ccir._t; - } - - bool operator!=(const Cell_circulator & ccir) const - { - return ! (*this == ccir); - } - - bool operator==(Cell_handle ch) const - { - return ch == pos; - } - - bool operator!=(Cell_handle ch) const - { - return ch != pos; - } - - bool operator==(Nullptr_t CGAL_triangulation_assertion_code(n)) const - { - CGAL_triangulation_assertion( n == NULL); - return pos == Cell_handle(); - } - - bool operator!=(Nullptr_t n) const - { - return ! (*this == n); - } - - // For TDS's private use only. - Cell_handle base() const { return pos; } - operator Cell_handle() const { return pos; } - -private: - Vertex_handle _s; // source vertex of the edge - Vertex_handle _t; // target vertex of the edge - Cell_handle pos; // current cell - - static int next_around_edge(const int i, const int j) - { - return Triangulation_utils_3::next_around_edge(i,j); - } -}; - -template < class Tds_ > -inline -bool -operator==(typename Tds_::Cell_handle ch, Triangulation_ds_cell_circulator_3 cc) -{ - return (cc==ch); -} - -template < class Tds_ > -inline -bool -operator!=(typename Tds_::Cell_handle ch, Triangulation_ds_cell_circulator_3 cc) -{ - return !(cc==ch); -} - -template < class Tds_ > -class Triangulation_ds_facet_circulator_3 - : public Bidirectional_circulator_base -{ - // circulates on facets around a given edge - - typedef Tds_ Tds; - typedef typename Tds::Cell Cell; - typedef typename Tds::Cell_handle Cell_handle; - typedef typename Tds::Facet Facet; - typedef typename Tds::Edge Edge; - typedef typename Tds::Vertex_handle Vertex_handle; - - typedef Triangulation_ds_facet_circulator_3 Facet_circulator; - -public: - - Triangulation_ds_facet_circulator_3() - : _s(), _t(), pos() - {} - - Triangulation_ds_facet_circulator_3(Cell_handle c, int s, int t) - : _s(c->vertex(s)), _t(c->vertex(t)), pos(c) - { - CGAL_triangulation_precondition( c != Cell_handle() && - s >= 0 && s < 4 && - t >= 0 && t < 4 ); - } - - Triangulation_ds_facet_circulator_3(const Edge & e) - : _s(e.first->vertex(e.second)), _t(e.first->vertex(e.third)), pos(e.first) - { - CGAL_triangulation_precondition( e.first != Cell_handle() && - e.second >= 0 && e.second < 4 && - e.third >= 0 && e.third < 4); - } - - Triangulation_ds_facet_circulator_3(Cell_handle c, int s, int t, - Cell_handle start, int f) - : _s(c->vertex(s)), _t(c->vertex(t)) - { - CGAL_triangulation_precondition( c != Cell_handle() && - s >= 0 && s < 4 && - t >= 0 && t < 4 && - f >= 0 && f < 4 && - start->has_vertex( _s ) && - start->has_vertex( _t ) ); - - int i = start->index( _s ); - int j = start->index( _t ); - - CGAL_triangulation_precondition( f!=i && f!=j ); - - if ( f == next_around_edge(i,j) ) - pos = start; - else - pos = start->neighbor(f); // other cell with same facet - } - - Triangulation_ds_facet_circulator_3(Cell_handle c, int s, int t, - const Facet & start) - : _s(c->vertex(s)), _t(c->vertex(t)) - { - CGAL_triangulation_precondition( c != Cell_handle() && - s >= 0 && s < 4 && - t >= 0 && t < 4 && - start.first->has_vertex( _s ) && - start.first->has_vertex( _t ) ); - - int i = start.first->index( _s ); - int j = start.first->index( _t ); - - CGAL_triangulation_precondition( start.second !=i && start.second !=j ); - - if ( start.second == next_around_edge(i,j) ) - pos = start.first; - else - pos = start.first->neighbor(start.second); // other cell with same facet - } - - Triangulation_ds_facet_circulator_3(const Edge & e, Cell_handle start, int f) - : _s(e.first->vertex(e.second)), _t(e.first->vertex(e.third)) - { - CGAL_triangulation_precondition( e.first != Cell_handle() && - e.second >= 0 && e.second < 4 && - e.third >= 0 && e.third < 4 && - f >= 0 && f < 4 && - start->has_vertex( _s ) && - start->has_vertex( _t ) ); - - int i = start->index( _s ); - int j = start->index( _t ); - - CGAL_triangulation_precondition( f!=i && f!=j ); - - if ( f == next_around_edge(i,j) ) - pos = start; - else - pos = start->neighbor(f); // other cell with same facet - } - - Triangulation_ds_facet_circulator_3(const Edge & e, const Facet & start) - : _s(e.first->vertex(e.second)), _t(e.first->vertex(e.third)) - { - CGAL_triangulation_precondition( e.first != Cell_handle() && - e.second >= 0 && e.second < 4 && - e.third >= 0 && e.third < 4 && - start.first->has_vertex( _s ) && - start.first->has_vertex( _t ) ); - - int i = start.first->index( _s ); - int j = start.first->index( _t ); - - if ( start.second == next_around_edge(i,j) ) - pos = start.first; - else - pos = start.first->neighbor(start.second); - } - - Facet_circulator & operator++() - { - CGAL_triangulation_precondition( pos != Cell_handle() ); - //then dimension() cannot be < 3 - - pos = pos->neighbor( next_around_edge( pos->index(_s), pos->index(_t) ) ); - return *this; - } - - Facet_circulator operator++(int) - { - Facet_circulator tmp(*this); - ++(*this); - return tmp; - } - - Facet_circulator & operator--() - { - CGAL_triangulation_precondition( pos != Cell_handle() ); - - pos = pos->neighbor( next_around_edge( pos->index(_t), pos->index(_s) ) ); - return *this; - } - - Facet_circulator operator--(int) - { - Facet_circulator tmp(*this); - --(*this); - return tmp; - } - - Facet operator*() const - { - return Facet(pos, next_around_edge( pos->index(_s), pos->index(_t) ) ); - } - - struct Proxy_Facet { - Proxy_Facet(const Facet & ff) : f(ff) {} - Facet f; - const Facet* operator->() const { return &f; } - }; - - Proxy_Facet operator->() const - { - return Proxy_Facet(* *this); - } - - bool operator==(const Facet_circulator & ccir) const - { - return pos == ccir.pos && _s == ccir._s && _t == ccir._t; - } - - bool operator!=(const Facet_circulator & ccir) const - { - return ! (*this == ccir); - } - - bool operator==(Nullptr_t CGAL_triangulation_assertion_code(c)) const - { - CGAL_triangulation_assertion(c == NULL); - return pos == Cell_handle(); - } - - bool operator!=(Nullptr_t c) const - { - return ! (*this == c); - } - -private: - Vertex_handle _s; // source vertex of the edge - Vertex_handle _t; // target vertex of the edge - Cell_handle pos; // current cell - // the current facet is the facet of pos numbered - // next_around_edge( pos->index(_c->vertex(_s)), - // pos->index(_c->vertex(_t)) ) - - static int next_around_edge(const int i, const int j) - { - return Triangulation_utils_3::next_around_edge(i,j); - } -}; - -template < class Tds_ > -class Triangulation_ds_face_circulator_3 - : public Bidirectional_circulator_base -{ - // circulates on faces (Cell) around a given vertex, - // valid in dimension 2 only. - - typedef Tds_ Tds; - typedef typename Tds::Cell Cell; - typedef typename Tds::Vertex Vertex; - typedef typename Tds::Vertex_handle Vertex_handle; - typedef typename Tds::Cell_handle Cell_handle; - - typedef Triangulation_ds_face_circulator_3 Face_circulator; - -public: - - Triangulation_ds_face_circulator_3() - : _s(), pos() {} - - Triangulation_ds_face_circulator_3(Vertex_handle v, Cell_handle c) - : _s(v), pos(c) {} - - Face_circulator & operator++() - { - CGAL_triangulation_precondition( pos != Cell_handle() ); - //then dimension() cannot be < 3 - - pos = pos->neighbor(ccw(pos->index(_s))); - return *this; - } - - Face_circulator operator++(int) - { - Face_circulator tmp(*this); - ++(*this); - return tmp; - } - - Face_circulator & operator--() - { - CGAL_triangulation_precondition( pos != Cell_handle() ); - - pos = pos->neighbor(cw(pos->index(_s))); - return *this; - } - - Face_circulator operator--(int) - { - Face_circulator tmp(*this); - --(*this); - return tmp; - } - - Cell& operator*() const - { - return *pos; - } - - Cell* operator->() const - { - return &*pos; - } - - bool operator==(const Face_circulator & ccir) const - { - return pos == ccir.pos && _s == ccir._s; - } - - bool operator!=(const Face_circulator & ccir) const - { - return ! (*this == ccir); - } - - bool operator==(Nullptr_t CGAL_triangulation_assertion_code(c)) const - { - CGAL_triangulation_assertion(c == NULL); - return pos == Cell_handle(); - } - - bool operator!=(Nullptr_t c) const - { - return ! (*this == c); - } - - // For TDS's private use only. - Cell_handle base() const { return pos; } - operator Cell_handle() const { return pos; } - -private: - Vertex_handle _s; // source vertex - Cell_handle pos; // current cell - - static int cw(int i) - { - return Triangulation_utils_3::cw(i); - } - static int ccw(int i) - { - return Triangulation_utils_3::ccw(i); - } -}; - -}} // namespace CGAL::internal - -#endif // CGAL_INTERNAL_TRIANGULATION_DS_CIRCULATORS_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/internal/Triangulation_ds_iterators_3.h b/Triangulation_3_copy_tds/include/CGAL/internal/Triangulation_ds_iterators_3.h deleted file mode 100644 index 633c2879486..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/internal/Triangulation_ds_iterators_3.h +++ /dev/null @@ -1,458 +0,0 @@ -// Copyright (c) 1999 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// Author(s) : Monique Teillaud - -#ifndef CGAL_INTERNAL_TRIANGULATION_DS_ITERATORS_3_H -#define CGAL_INTERNAL_TRIANGULATION_DS_ITERATORS_3_H - -#include - -#include -#include - -namespace CGAL { namespace internal { - -template < class Tds > -class Triangulation_ds_facet_iterator_3 -{ -// traverses the list of cells and reports all facets. -public: - - typedef typename Tds::Facet value_type; - typedef const typename Tds::Facet * pointer; - typedef const typename Tds::Facet & reference; - typedef std::size_t size_type; - typedef std::ptrdiff_t difference_type; - typedef std::bidirectional_iterator_tag iterator_category; - - typedef typename Tds::Facet Facet; - typedef Triangulation_ds_facet_iterator_3 Facet_iterator; - typedef typename Tds::Cell_iterator Cell_iterator; - - Triangulation_ds_facet_iterator_3() - {} - - Triangulation_ds_facet_iterator_3(const Tds * tds) - : _tds(tds) - { - facet.second = 0; - switch ( _tds->dimension() ) { - case 2: - pos = _tds->cells().begin(); - facet.second = 3; - return; - case 3: - pos = _tds->cells().begin(); - while (// there must be at least one facet - pos->neighbor(facet.second) < pos ) { - increment(); - } - return; - default: - pos = _tds->cells().end(); - return; - } - } - - // used to initialize the past-the end iterator - Triangulation_ds_facet_iterator_3(const Tds* tds, int) - : _tds(tds) - { - facet.second = 0; - pos = _tds->cells().end(); - if (_tds->dimension() == 2) - facet.second = 3; - } - - Facet_iterator& operator++() - { - if (_tds->dimension() < 2) - return *this; - - if (_tds->dimension() == 3) { - do { - increment(); - } while ( pos != _tds->cells().end() - && pos->neighbor(facet.second) < pos ); - // reports a facet when the current cell has a pointer inferior - // to the pointer of the neighbor cell - return *this; - } - - ++pos; // dimension 2 - return *this; - } - - Facet_iterator& operator--() - { - if (_tds->dimension() < 2) - return *this; - - if ( _tds->dimension() == 2 ) { - --pos; // index remains 3 - return *this; - } - - // dimension 3 - do{ - if (facet.second == 0) { - // all the facets of the current cell have been examined - facet.second = 3; - --pos; - } - else - --facet.second; - } while ( pos != _tds->cells().end() - && pos->neighbor(facet.second) < pos ); - // reports a facet when the current cell has a pointer inferior - // to the pointer of the neighbor cell - return *this; - } - - Facet_iterator operator++(int) - { - Facet_iterator tmp(*this); - ++(*this); - return tmp; - } - - Facet_iterator operator--(int) - { - Facet_iterator tmp(*this); - --(*this); - return tmp; - } - - bool operator==(const Facet_iterator& fi) const - { - return _tds == fi._tds && pos == fi.pos && - facet.second == fi.facet.second; - } - - bool operator!=(const Facet_iterator& fi) const - { - return !(*this == fi); - } - - reference operator*() const - { - facet.first = pos; - return facet; - } - - pointer operator->() const - { - facet.first = pos; - return &facet; - } - -private: - const Tds* _tds; - Cell_iterator pos; // current "cell". - mutable Facet facet; // current facet. - - void increment() - { - if (facet.second == 3) { - // all the faces of the current cell have been examined - facet.second = 0; - ++pos; - } - // be careful : facet.second should always be 0 when pos = cells_end - else - ++facet.second; - } -}; - -template < class Tds > -class Triangulation_ds_edge_iterator_3 -{ -// traverses the list of cells and reports each edge. -public: - - typedef typename Tds::Edge value_type; - typedef const typename Tds::Edge * pointer; - typedef const typename Tds::Edge & reference; - typedef std::size_t size_type; - typedef std::ptrdiff_t difference_type; - typedef std::bidirectional_iterator_tag iterator_category; - - typedef typename Tds::Edge Edge; - typedef Triangulation_ds_edge_iterator_3 Edge_iterator; - typedef typename Tds::Cell_iterator Cell_iterator; - typedef typename Tds::Cell_handle Cell_handle; - typedef internal::Triangulation_ds_cell_circulator_3 Cell_circulator; - - Triangulation_ds_edge_iterator_3() - : _tds(NULL) - { - edge.second = 0; - edge.third = 1; - } - - Triangulation_ds_edge_iterator_3(const Tds * tds) - : _tds(tds) - { - edge.second = 0; - edge.third = 1; - switch ( _tds->dimension() ) { - case 1: - { - pos = _tds->cells().begin(); - return; - } - case 2: - { - pos = _tds->cells().begin(); - while ( // there must be at least one edge - pos->neighbor(3-edge.second-edge.third) < pos ) { - increment2(); - } - return; - } - case 3: - { - pos = _tds->cells().begin(); - bool notfound = true; - while ( // there must be at least one edge - notfound ) { - edge.first = pos; - Cell_circulator ccir = _tds->incident_cells(edge); - do { - ++ccir; - } while ( pos < ccir ); - // loop terminates since it stops at least when ccir = pos - if ( Cell_handle(ccir) == Cell_handle(pos) ) - // pos is the cell with minimal pointer - notfound = false; - else - increment3(); - } - return; - } - default: - { - pos = _tds->cells().end(); - return; - } - } - } - - // used to initialize the past-the end iterator - Triangulation_ds_edge_iterator_3(const Tds* tds, int) - : _tds(tds) - { - edge.second = 0; - edge.third = 1; - pos = _tds->cells().end(); - } - - Edge_iterator& operator++() - { - switch ( _tds->dimension() ) { - case 1: - { - ++pos; - break; - } - case 2: - { - do { - increment2(); - } while ( pos != _tds->cells().end() && - pos->neighbor(3-edge.second-edge.third) < pos ); - break; - } - case 3: - { - bool notfound = true; - do { - increment3(); - if (pos != _tds->cells().end()) { - edge.first = pos; - Cell_circulator ccir = _tds->incident_cells(edge); - do { - ++ccir; - } while ( Cell_handle(pos) < Cell_handle(ccir) ); - if ( Cell_handle(ccir) == Cell_handle(pos) ) - // pos is the cell with minimal pointer - notfound = false; - } - else { - edge.second=0; edge.third=1; - } - } while ( pos != _tds->cells().end() && notfound ); - break; - } - default: - { - return *this; - } - } - return *this; - } - - Edge_iterator& operator--() - { - switch ( _tds->dimension() ) { - case 1: - { - --pos; // edge.second, edge.third remain 0, 1 - break; - } - case 2: - { - do { - if (edge.second == 0) { - edge.second = 2; edge.third = 0; - --pos; - } - else { - --edge.second; - edge.third = edge.second+1; - // case edge.second==2, edge.third==0 forbids to write edge.third-- - } - } while ( pos != _tds->cells().end() && - pos->neighbor(3-edge.second-edge.third) < pos ); - break; - } - case 3: - { - bool notfound = true; - do { - if (edge.second == 0) { - if (edge.third == 1) { - // all the edges of the current cell have been examined - edge.second = 2; edge.third = 3; - --pos; - } - else - --edge.third; - } - else { - if (edge.third == edge.second+1) { - --edge.second; - edge.third = 3; - } - else - --edge.third; - } - if (pos != _tds->cells().end()) { - edge.first = pos; - Cell_circulator ccir = _tds->incident_cells(edge); - do { - ++ccir; - } while ( Cell_handle(pos) < Cell_handle(ccir) ); - if ( Cell_handle(pos) == Cell_handle(ccir) ) - // pos is the cell with minimum pointer - notfound = false; - } - else { - edge.second=0; edge.third=1; - } - } while ( pos != _tds->cells().end() && notfound ); - break; - } - default : - return *this; - } - // reports an edge when the current cell has a pointer inferior - // to the pointer of the neighbor cell - return *this; - } - - Edge_iterator operator++(int) - { - Edge_iterator tmp(*this); - ++(*this); - return tmp; - } - - Edge_iterator operator--(int) - { - Edge_iterator tmp(*this); - --(*this); - return tmp; - } - - bool operator==(const Edge_iterator& ei) const - { - return _tds == ei._tds && pos == ei.pos && - edge.second == ei.edge.second && edge.third == ei.edge.third; - } - - bool operator!=(const Edge_iterator& ei) const - { - return !(*this == ei); - } - - reference operator*() const - { - edge.first = pos; - return edge; - } - - pointer operator->() const - { - edge.first = pos; - return &edge; - } - -private: - const Tds* _tds; - Cell_iterator pos; // current "cell". Even if the dimension is <3 when - // there is no true cell yet. - mutable Edge edge; // keeps the indices of the current edge. - - void increment2() - { - if (edge.second == 2) { // edge.third == 0 - // all the edges of the current cell have been examined - edge.second = 0; edge.third = 1; - ++pos; - } - // be careful : index should always be 0 when pos = cells_end - else { - ++edge.second; - if ( edge.second == 2 ) - edge.third = 0; - else // edge.second==1 - edge.third = 2; - } - } - - void increment3() - { - if (edge.second == 2) { // then edge.third == 3 - // all the edges of the current cell have been examined - edge.second = 0; edge.third = 1; - ++pos; - } - else { - if (edge.third == 3) { - edge.second++; - edge.third = edge.second+1; - } - else - ++edge.third; - } - } -}; - -}} // namespace CGAL::internal - -#endif // CGAL_INTERNAL_TRIANGULATION_DS_ITERATORS_3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/internal/spatial_sorting_traits_with_indices.h b/Triangulation_3_copy_tds/include/CGAL/internal/spatial_sorting_traits_with_indices.h deleted file mode 100644 index dd08b4f7c8c..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/internal/spatial_sorting_traits_with_indices.h +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright (c) 2010 GeometryFactory (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Sebastien Loriot -// - -#ifndef CGAL_INTERNAL_SPATIAL_SORTING_TRAITS_WITH_INDICES -#define CGAL_INTERNAL_SPATIAL_SORTING_TRAITS_WITH_INDICES - -#include -#include - -namespace CGAL { - -namespace internal{ - -BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(Has_typedef_Info,Info,false) - -template ::value> - struct Info_check{ - struct type{}; -}; - -template -struct Info_check{ - typedef typename T::Info type; -}; - -template sizeof(int*))> -struct Arg_type_selection; - -template -struct Arg_type_selection{ - typedef T type; -}; - -template -struct Arg_type_selection{ - typedef const T& type; -}; - -template -class Vector_property_map{ - const std::vector& data; -public: - typedef std::size_t key_type; - Vector_property_map(const std::vector& input):data(input){} - - const T& operator[](key_type i) const{ - return data[i]; - } -}; - -template -class Spatial_sort_traits_with_property_map_3:public Base_traits{ - PointPropertyMap accessor_; -public: - Spatial_sort_traits_with_property_map_3(Base_traits base=Base_traits()):Base_traits(base){} - Spatial_sort_traits_with_property_map_3(const PointPropertyMap& accessor,Base_traits base=Base_traits()) - :Base_traits(base),accessor_(accessor){} - - typedef Base_traits Gt; - typedef typename PointPropertyMap::key_type Point_3; - typedef typename Arg_type_selection::type Arg_type; - - struct Less_x_3 : public Base_traits::Less_x_3{ - Less_x_3(const PointPropertyMap& accessor,const typename Base_traits::Less_x_3& base): - Base_traits::Less_x_3(base),accessor_(accessor){} - const PointPropertyMap& accessor_; - bool operator()(Arg_type p,Arg_type q) const { - return static_cast(this)->operator()(accessor_[p],accessor_[q]); - } - }; - - struct Less_y_3 : public Base_traits::Less_y_3{ - Less_y_3(const PointPropertyMap& accessor,const typename Base_traits::Less_y_3& base): - Base_traits::Less_y_3(base),accessor_(accessor){} - const PointPropertyMap& accessor_; - bool operator()(Arg_type p,Arg_type q) const { - return static_cast(this)->operator()(accessor_[p],accessor_[q]); - } - }; - - struct Less_z_3 : public Base_traits::Less_z_3{ - Less_z_3(const PointPropertyMap& accessor,const typename Base_traits::Less_z_3& base): - Base_traits::Less_z_3(base),accessor_(accessor){} - const PointPropertyMap& accessor_; - bool operator()(Arg_type p,Arg_type q) const { - return static_cast(this)->operator()(accessor_[p],accessor_[q]); - } - }; - - Less_x_3 less_x_3_object () const {return Less_x_3(accessor_,static_cast(this)->less_x_3_object() );} - Less_y_3 less_y_3_object () const {return Less_y_3(accessor_,static_cast(this)->less_y_3_object() );} - Less_z_3 less_z_3_object () const {return Less_z_3(accessor_,static_cast(this)->less_z_3_object() );} -}; - -template -class Spatial_sort_traits_with_property_map_2:public Base_traits{ - PointPropertyMap accessor_; -public: - Spatial_sort_traits_with_property_map_2(Base_traits base=Base_traits()):Base_traits(base){} - Spatial_sort_traits_with_property_map_2(const PointPropertyMap& accessor,Base_traits base=Base_traits()) - :Base_traits(base),accessor_(accessor){} - - typedef Base_traits Gt; - typedef typename PointPropertyMap::key_type Point_2; - typedef typename Arg_type_selection::type Arg_type; - - struct Less_x_2 : public Base_traits::Less_x_2{ - Less_x_2(const PointPropertyMap& accessor,const typename Base_traits::Less_x_2& base): - Base_traits::Less_x_2(base),accessor_(accessor){} - const PointPropertyMap& accessor_; - bool operator()(Arg_type p,Arg_type q) const { - return static_cast(this)->operator()(accessor_[p],accessor_[q]); - } - }; - - struct Less_y_2 : public Base_traits::Less_y_2{ - Less_y_2(const PointPropertyMap& accessor,const typename Base_traits::Less_y_2& base): - Base_traits::Less_y_2(base),accessor_(accessor){} - const PointPropertyMap& accessor_; - bool operator()(Arg_type p,Arg_type q) const { - return static_cast(this)->operator()(accessor_[p],accessor_[q]); - } - }; - - Less_x_2 less_x_2_object () const {return Less_x_2(accessor_,static_cast(this)->less_x_2_object() );} - Less_y_2 less_y_2_object () const {return Less_y_2(accessor_,static_cast(this)->less_y_2_object() );} - -}; -} } //namespace CGAL::internal - -#endif //CGAL_INTERNAL_SPATIAL_SORTING_TRAITS_WITH_INDICES diff --git a/Triangulation_3_copy_tds/include/CGAL/predicates/Regular_triangulation_ftC3.h b/Triangulation_3_copy_tds/include/CGAL/predicates/Regular_triangulation_ftC3.h deleted file mode 100644 index 2eeecc20abe..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/predicates/Regular_triangulation_ftC3.h +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright (c) 1999 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Sylvain Pion - -#ifndef CGAL_REGULAR_TRIANGULATION_FTC3_H -#define CGAL_REGULAR_TRIANGULATION_FTC3_H - -// This file contains the low level cartesian predicates -// used by the 3D regular triangulation. - -namespace CGAL { - -// return minus the sign of the 5x5 determinant [P,Q,R,S,T] -// where column [P] = transpose[px,py,pz,p^2 -wp,1] -template -Oriented_side -power_testC3( const FT &px, const FT &py, const FT &pz, const FT &pwt, - const FT &qx, const FT &qy, const FT &qz, const FT &qwt, - const FT &rx, const FT &ry, const FT &rz, const FT &rwt, - const FT &sx, const FT &sy, const FT &sz, const FT &swt, - const FT &tx, const FT &ty, const FT &tz, const FT &twt) -{ - // We translate the points so that T becomes the origin. - FT dpx = px - tx; - FT dpy = py - ty; - FT dpz = pz - tz; - FT dpt = CGAL_NTS square(dpx) + CGAL_NTS square(dpy) + - CGAL_NTS square(dpz) + (twt - pwt); - FT dqx = qx - tx; - FT dqy = qy - ty; - FT dqz = qz - tz; - FT dqt = CGAL_NTS square(dqx) + CGAL_NTS square(dqy) + - CGAL_NTS square(dqz) + (twt - qwt); - FT drx = rx - tx; - FT dry = ry - ty; - FT drz = rz - tz; - FT drt = CGAL_NTS square(drx) + CGAL_NTS square(dry) + - CGAL_NTS square(drz) + (twt - rwt); - FT dsx = sx - tx; - FT dsy = sy - ty; - FT dsz = sz - tz; - FT dst = CGAL_NTS square(dsx) + CGAL_NTS square(dsy) + - CGAL_NTS square(dsz) + (twt - swt); - - return - sign_of_determinant(dpx, dpy, dpz, dpt, - dqx, dqy, dqz, dqt, - drx, dry, drz, drt, - dsx, dsy, dsz, dst); -} - - -template -Oriented_side -power_testC3( const FT &px, const FT &py, const FT &pz, const FT &pwt, - const FT &qx, const FT &qy, const FT &qz, const FT &qwt, - const FT &rx, const FT &ry, const FT &rz, const FT &rwt, - const FT &tx, const FT &ty, const FT &tz, const FT &twt) -{ - // Same translation as above. - FT dpx = px - tx; - FT dpy = py - ty; - FT dpz = pz - tz; - FT dpt = CGAL_NTS square(dpx) + CGAL_NTS square(dpy) + - CGAL_NTS square(dpz) + (twt - pwt); - FT dqx = qx - tx; - FT dqy = qy - ty; - FT dqz = qz - tz; - FT dqt = CGAL_NTS square(dqx) + CGAL_NTS square(dqy) + - CGAL_NTS square(dqz) + (twt - qwt); - FT drx = rx - tx; - FT dry = ry - ty; - FT drz = rz - tz; - FT drt = CGAL_NTS square(drx) + CGAL_NTS square(dry) + - CGAL_NTS square(drz) + (twt - rwt); - Sign cmp; - - // Projection on the (xy) plane. - cmp = sign_of_determinant(dpx, dpy, dpt, - dqx, dqy, dqt, - drx, dry, drt); - if (cmp != ZERO) - return cmp * sign_of_determinant(px-rx, py-ry, - qx-rx, qy-ry); - - // Projection on the (xz) plane. - cmp = sign_of_determinant(dpx, dpz, dpt, - dqx, dqz, dqt, - drx, drz, drt); - if (cmp != ZERO) - return cmp * sign_of_determinant(px-rx, pz-rz, - qx-rx, qz-rz); - - // Projection on the (yz) plane. - cmp = sign_of_determinant(dpy, dpz, dpt, - dqy, dqz, dqt, - dry, drz, drt); - return cmp * sign_of_determinant(py-ry, pz-rz, - qy-ry, qz-rz); -} - - -template -Oriented_side -power_testC3( const FT &px, const FT &py, const FT &pz, const FT &pwt, - const FT &qx, const FT &qy, const FT &qz, const FT &qwt, - const FT &tx, const FT &ty, const FT &tz, const FT &twt) -{ - // Same translation as above. - FT dpx = px - tx; - FT dpy = py - ty; - FT dpz = pz - tz; - FT dpt = CGAL_NTS square(dpx) + CGAL_NTS square(dpy) + - CGAL_NTS square(dpz) + (twt - pwt); - FT dqx = qx - tx; - FT dqy = qy - ty; - FT dqz = qz - tz; - FT dqt = CGAL_NTS square(dqx) + CGAL_NTS square(dqy) + - CGAL_NTS square (dqz) + (twt - qwt); - Comparison_result cmp; - - // We do an orthogonal projection on the (x) axis, if possible. - cmp = CGAL_NTS compare(px, qx); - if (cmp != EQUAL) - return cmp * sign_of_determinant(dpx, dpt, dqx, dqt); - - // We do an orthogonal projection on the (y) axis, if possible. - cmp = CGAL_NTS compare(py, qy); - if (cmp != EQUAL) - return cmp * sign_of_determinant(dpy, dpt, dqy, dqt); - - // We do an orthogonal projection on the (z) axis. - cmp = CGAL_NTS compare(pz, qz); - return cmp * sign_of_determinant(dpz, dpt, dqz, dqt); -} - -template -Oriented_side -power_testC3(const FT &pwt, const FT &qwt) -{ - return CGAL_NTS compare(qwt, pwt); -} - -} //namespace CGAL - -#endif // CGAL_REGULAR_TRIANGULATION_FTC3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/predicates/Regular_triangulation_rtH3.h b/Triangulation_3_copy_tds/include/CGAL/predicates/Regular_triangulation_rtH3.h deleted file mode 100644 index 70d780a70f3..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/predicates/Regular_triangulation_rtH3.h +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) 1999 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Sylvain Pion - -#ifndef CGAL_REGULAR_TRIANGULATION_RTH3_H -#define CGAL_REGULAR_TRIANGULATION_RTH3_H - -// This file contains the low level homogeneous predicates -// used by the 3D regular triangulation. - -#include - -namespace CGAL { - -template -Oriented_side -power_testH3( - const RT &phx, const RT &phy, const RT &phz, const RT &phw, const RT &pwt, - const RT &qhx, const RT &qhy, const RT &qhz, const RT &qhw, const RT &qwt, - const RT &rhx, const RT &rhy, const RT &rhz, const RT &rhw, const RT &rwt, - const RT &shx, const RT ­, const RT &shz, const RT &shw, const RT &swt, - const RT &thx, const RT &thy, const RT &thz, const RT &thw, const RT &twt) -{ - RT dphx = phx*phw; - RT dphy = phy*phw; - RT dphz = phz*phw; - RT dphw = CGAL_NTS square(phw); - RT dpz = CGAL_NTS square(phx) + CGAL_NTS square(phy) + - CGAL_NTS square(phz) - pwt*dphw; - - RT dqhx = qhx*qhw; - RT dqhy = qhy*qhw; - RT dqhz = qhz*qhw; - RT dqhw = CGAL_NTS square(qhw); - RT dqz = CGAL_NTS square(qhx) + CGAL_NTS square(qhy) + - CGAL_NTS square(qhz) - qwt*dqhw; - - RT drhx = rhx*rhw; - RT drhy = rhy*rhw; - RT drhz = rhz*rhw; - RT drhw = CGAL_NTS square(rhw); - RT drz = CGAL_NTS square(rhx) + CGAL_NTS square(rhy) + - CGAL_NTS square(rhz) - rwt*drhw; - - RT dshx = shx*shw; - RT dshy = shy*shw; - RT dshz = shz*shw; - RT dshw = CGAL_NTS square(shw); - RT dsz = CGAL_NTS square(shx) + CGAL_NTS square(shy) + - CGAL_NTS square(shz) - swt*dshw; - - RT dthx = thx*thw; - RT dthy = thy*thw; - RT dthz = thz*thw; - RT dthw = CGAL_NTS square(thw); - RT dtz = CGAL_NTS square(thx) + CGAL_NTS square(thy) + - CGAL_NTS square(thz) - twt*dthw; - - return - sign_of_determinant(dphx, dphy, dphz, dpz, dphw, - dqhx, dqhy, dqhz, dqz, dqhw, - drhx, drhy, drhz, drz, drhw, - dshx, dshy, dshz, dsz, dshw, - dthx, dthy, dthz, dtz, dthw); -} - -// The 2 degenerate are not speed critical, and they are quite boring and error -// prone to write, so we use the Cartesian version, using FT. - -} //namespace CGAL - -#endif // CGAL_REGULAR_TRIANGULATION_RTH3_H diff --git a/Triangulation_3_copy_tds/include/CGAL/predicates/predicates_on_weighted_points_cartesian_3.h b/Triangulation_3_copy_tds/include/CGAL/predicates/predicates_on_weighted_points_cartesian_3.h deleted file mode 100644 index 22eeefeeebc..00000000000 --- a/Triangulation_3_copy_tds/include/CGAL/predicates/predicates_on_weighted_points_cartesian_3.h +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright (c) 1997 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ - -// $Id$ -// -// -// Author(s) : Tran Kai Frank DA - -#ifndef CGAL_PREDICATES_ON_WEIGHTED_POINTS_CARTESIAN_3 -#define CGAL_PREDICATES_ON_WEIGHTED_POINTS_CARTESIAN_3 - -#include -#include - -namespace CGAL { - -template < class FT > -Comparison_result -compare_power_distanceC3( - const FT &px, const FT &py, const FT &pz, - const FT &qx, const FT &qy, const FT &qz, const FT &qw, - const FT &rx, const FT &ry, const FT &rz, const FT &rw) -{ - FT dqx = qx - px; - FT dqy = qy - py; - FT dqz = qz - pz; - FT drx = rx - px; - FT dry = ry - py; - FT drz = rz - pz; - return CGAL_NTS compare(dqx*dqx + dqy*dqy + dqz*dqz - qw, - drx*drx + dry*dry + drz*drz - rw); -} - - -//return the sign of the power test of weighted point (sx,sy,sz,sw) -//with respect to the smallest sphere orthogonal to -//p,q,r -template< class FT > -CGAL_MEDIUM_INLINE -Sign -in_smallest_orthogonal_sphereC3( - const FT &px, const FT &py, const FT &pz, const FT &pw, - const FT &qx, const FT &qy, const FT &qz, const FT &qw, - const FT &rx, const FT &ry, const FT &rz, const FT &rw, - const FT &sx, const FT &sy, const FT &sz, const FT &sw) -{ - // Translate p to origin and compute determinants - FT qpx = qx-px; - FT qpy = qy-py; - FT qpz = qz-pz; - - FT rpx = rx-px; - FT rpy = ry-py; - FT rpz = rz-pz; - - FT qq = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) + CGAL_NTS square(qpz); - FT rr = CGAL_NTS square(rpx) + CGAL_NTS square(rpy) + CGAL_NTS square(rpz); - FT qr = qpx*rpx + qpy*rpy + qpz*rpz; - - FT qpw = qq - qw + pw ; - FT rpw = rr - rw + pw ; - - FT den = determinant(qq,qr, - qr,rr); - FT detq = determinant(qpw,qr, - rpw,rr); - FT detr = determinant(qq,qpw, - qr,rpw); - - // Smallest smallest orthogonal sphere center - // c = detq/2*den q + detr/2*den r (origin at p) - // square radius c^2 - pw - - FT spx = sx-px; - FT spy = sy-py; - FT spz = sz-pz; - FT ss = CGAL_NTS square(spx) + CGAL_NTS square(spy) + CGAL_NTS square(spz); - FT sq = spx*qpx + spy*qpy + spz*qpz; - FT sr = spx*rpx + spy*rpy + spz*rpz; - - CGAL_triangulation_assertion( ! CGAL_NTS is_zero(den) ); - // return sign of (c- s)^2 - (c^2 - pw) - sw note that den >= 0 - - return CGAL_NTS sign( den*(ss - sw + pw)- detq*sq - detr*sr); -} - - - -// return the sign of the power test of weighted point (rx,ry,rz,rw) - // with respect to the smallest sphere orthogoanal to -// p,q -template< class FT > -Sign -in_smallest_orthogonal_sphereC3( - const FT &px, const FT &py, const FT &pz, const FT &pw, - const FT &qx, const FT &qy, const FT &qz, const FT &qw, - const FT &rx, const FT &ry, const FT &rz, const FT &rw) -{ - FT FT2(2); - FT FT4(4); - FT dpx = px - qx; - FT dpy = py - qy; - FT dpz = pz - qz; - FT dpw = pw - qw; - FT dp2 = CGAL_NTS square(dpx) + CGAL_NTS square(dpy) + CGAL_NTS square(dpz); - FT drx = rx - (px + qx)/FT2; - FT dry = ry - (py + qy)/FT2; - FT drz = rz - (pz + qz)/FT2; - FT drw = rw - (pw + qw)/FT2; - FT dr2 = CGAL_NTS square(drx) + CGAL_NTS square(dry) + CGAL_NTS square(drz); - FT dpr = dpx*drx + dpy*dry +dpz*drz; - return CGAL_NTS sign (dr2 - dp2/FT4 + dpr*dpw/dp2 - drw ); -} - - - - -// return ON_UNBOUNDED_SIDE, ON_BOUNDARY or ON_BOUNDED_SIDE according -// to the position of the weighted circumcenter of pqrs -// with respect with the tertraedron formed by bare points in p, q,r,s -template -Bounded_side -does_simplex_intersect_weighted_dual_supportC3( - const FT &px, const FT &py, const FT &pz, const FT &pw, - const FT &qx, const FT &qy, const FT &qz, const FT &qw, - const FT &rx, const FT &ry, const FT &rz, const FT &rw, - const FT &sx, const FT &sy, const FT &sz, const FT &sw) -{ - FT qpx = qx-px; - FT qpy = qy-py; - FT qpz = qz-pz; - - FT rpx = rx-px; - FT rpy = ry-py; - FT rpz = rz-pz; - - FT spx = sx-px; - FT spy = sy-py; - FT spz = sz-pz; - - FT qq = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) + CGAL_NTS square(qpz); - FT rr = CGAL_NTS square(rpx) + CGAL_NTS square(rpy) + CGAL_NTS square(rpz); - FT ss = CGAL_NTS square(spx) + CGAL_NTS square(spy) + CGAL_NTS square(spz); - FT qr = qpx*rpx + qpy*rpy + qpz*rpz; - FT rs = rpx*spx + rpy*spy + rpz*spz; - FT qs = spx*qpx + spy*qpy + spz*qpz; - FT qpw = qq - qw + pw ; - FT rpw = rr - rw + pw ; - FT spw = ss - sw + pw ; - - FT den = determinant(qq,qr,qs, - qr,rr,rs, - qs,rs,ss); - FT detq = determinant(qpw,qr,qs, - rpw,rr,rs, - spw,rs,ss); - FT detr = determinant(qq,qpw,qs, - qr,rpw,rs, - qs,spw,ss); - FT dets = determinant(qq,qr,qpw, - qr,rr,rpw, - qs,rs,spw); - CGAL_triangulation_assertion( ! CGAL_NTS is_zero(den) ); - - - // The barycentrique coordinate of the smallest orthogonal sphere center - // are detq/2*den detr/2*den dets/2*den - // and 1-(detq+ detr+dets)/2*den - - CGAL::Sign sign1 = CGAL_NTS sign(FT(2)*den - detq -detr -dets); - if ( - (CGAL_NTS sign(detq) == CGAL_NTS sign(den) || CGAL_NTS sign(detq)== ZERO) && - (CGAL_NTS sign(detr) == CGAL_NTS sign(den) || CGAL_NTS sign(detr)== ZERO) && - (CGAL_NTS sign(dets) == CGAL_NTS sign(den) || CGAL_NTS sign(dets)== ZERO) && - ( sign1 == POSITIVE || sign1 == ZERO )) { // inside or on boundary - if (CGAL_NTS sign(detq) != ZERO && - CGAL_NTS sign(detr) != ZERO && - CGAL_NTS sign(dets) != ZERO && - sign1 != ZERO) - return ON_BOUNDED_SIDE; - else return ON_BOUNDARY ; - } - return ON_UNBOUNDED_SIDE; -} - -// return ON_UNBOUNDED_SIDE, ON_BOUNDARY or ON_BOUNDED_SIDE according -// to the position of the intersection if the radialaxis -// of weighted circumcenter of pqr with affine hull of bare p,q,r -// with respect with the triangle formed by bare points in p, q,r. -template -Bounded_side -does_simplex_intersect_weighted_dual_supportC3( - const FT &px, const FT &py, const FT &pz, const FT &pw, - const FT &qx, const FT &qy, const FT &qz, const FT &qw, - const FT &rx, const FT &ry, const FT &rz, const FT &rw) -{ - // returns true if weighted circumcenter of pqr is in - // triangle pqr or on boundary - FT qpx = qx-px; - FT qpy = qy-py; - FT qpz = qz-pz; - - FT rpx = rx-px; - FT rpy = ry-py; - FT rpz = rz-pz; - - FT qq = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) + CGAL_NTS square(qpz); - FT rr = CGAL_NTS square(rpx) + CGAL_NTS square(rpy) + CGAL_NTS square(rpz); - FT qr = qpx*rpx + qpy*rpy + qpz*rpz; - - FT qpw = qq - qw + pw ; - FT rpw = rr - rw + pw ; - - FT den = determinant(qq,qr, - qr,rr); - FT detq = determinant(qpw,qr, - rpw,rr); - FT detr = determinant(qq,qpw, - qr,rpw); - - CGAL_triangulation_assertion( ! CGAL_NTS is_zero(den) ); - - // The barycentrique coordinate of the smallest orthogonal sphere center - // are detq/2*den detr/2*den - // and 1-(detq+ detr)/2*den - - CGAL::Sign sign1 = CGAL_NTS sign(FT(2)*den - detq - detr); - if ( - (CGAL_NTS sign(detq) == CGAL_NTS sign(den) || CGAL_NTS sign(detq)== ZERO) && - (CGAL_NTS sign(detr) == CGAL_NTS sign(den) || CGAL_NTS sign(detr)== ZERO) && - ( sign1 == POSITIVE || sign1 == ZERO )) { // inside or on boundary - if ( CGAL_NTS sign(detq) != ZERO && - CGAL_NTS sign(detr) != ZERO && - sign1 != ZERO) - return ON_BOUNDED_SIDE; - else return ON_BOUNDARY; - } - return ON_UNBOUNDED_SIDE; -} - - -template -Bounded_side -does_simplex_intersect_weighted_dual_supportC3( - const FT &px, const FT &py, const FT &pz, const FT &pw, - const FT &qx, const FT &qy, const FT &qz, const FT &qw) -{ - // returns true if weighted circumcenter of pq is in - // segment pq or on boundary - FT qpx = qx-px; - FT qpy = qy-py; - FT qpz = qz-pz; - - FT qq = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) + CGAL_NTS square(qpz); - FT dw = pw - qw; - - CGAL::Sign sign1 = CGAL_NTS sign( qq + dw); - CGAL::Sign sign2 = CGAL_NTS sign( qq - dw); - - if( ( sign1 == POSITIVE || sign1 == ZERO ) && - ( sign2 == POSITIVE || sign2 == ZERO )) { // inside or on boundary - if (sign1 != ZERO && sign2 != ZERO) return ON_BOUNDED_SIDE; - else return ON_BOUNDARY; - } - return ON_UNBOUNDED_SIDE; -} - -//------------------------------------------------------------------- -} //namespace CGAL -//------------------------------------------------------------------- - -#endif //CGAL_PREDICATES_ON_WEIGHTED_POINTS_CARTESIAN_3 diff --git a/Triangulation_3_copy_tds/package_info/Triangulation_3/description.txt b/Triangulation_3_copy_tds/package_info/Triangulation_3/description.txt deleted file mode 100644 index ac759ef683c..00000000000 --- a/Triangulation_3_copy_tds/package_info/Triangulation_3/description.txt +++ /dev/null @@ -1,3 +0,0 @@ -Package Triangulation_3 : -triangulation data structure, triangulation, Delaunay triangulation and -regular triangulation for dimension <= 3 diff --git a/Triangulation_3_copy_tds/package_info/Triangulation_3/maintainer b/Triangulation_3_copy_tds/package_info/Triangulation_3/maintainer deleted file mode 100644 index fec7225a53c..00000000000 --- a/Triangulation_3_copy_tds/package_info/Triangulation_3/maintainer +++ /dev/null @@ -1 +0,0 @@ -Monique Teillaud diff --git a/Triangulation_3_copy_tds/test/Triangulation_3/data/regular_remove_3 b/Triangulation_3_copy_tds/test/Triangulation_3/data/regular_remove_3 deleted file mode 100644 index 2787c31e16d..00000000000 --- a/Triangulation_3_copy_tds/test/Triangulation_3/data/regular_remove_3 +++ /dev/null @@ -1,83 +0,0 @@ -5 -0 0 0 1 -1 0 0 1 -0 1 0 1 -0 0 0 0 -0 0 1 1 - -4 -0 0 0 1 -1 0 0 0 -0 0 0 1 -0 1 0 1 - -3 -0 0 0 1 -0 0 0 0 -1 0 0 0 - -5 -9 8 1 6 -3 9 4 8 -1 4 0 2 -0 3 0 9 -0 3 0 5 - -6 -0 3 0 5 -6 9 6 1 -0 8 0 1 -2 1 9 5 -0 3 0 9 -3 5 1 9 - -2 -7 9 9 4 -7 9 9 1 - -13 -0 6 5 1 -6 0 3 2 -7 1 3 2 -3 8 5 7 -7 7 1 0 -7 1 4 3 -1 7 7 3 -9 2 1 7 -8 8 5 6 -7 7 0 6 -1 8 5 2 -0 9 4 9 -9 2 5 7 - -5 -3 2 0 0 -1 4 7 5 -4 4 1 5 -3 3 0 1 -4 0 1 5 - -4 -0 1 0 0 -0 0 0 0 -1 0 0 0 -0 2 0 2 - -5 -6 0 0 0 -1 0 0 1 -2 0 0 8 -1 0 0 0 -5 0 0 3 - -5 -4 2 0 9 -1 2 0 8 -0 0 0 9 -2 0 0 3 -2 0 0 4 - -2 -0 3 0 5 -0 3 0 9 - diff --git a/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_circulator.h b/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_circulator.h deleted file mode 100644 index 4fadb97528d..00000000000 --- a/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_circulator.h +++ /dev/null @@ -1,230 +0,0 @@ -// Copyright (c) 1998 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Francois Rebufat (Francois.Rebufat@sophia.inria.fr) -// Monique Teillaud - -#ifndef CGAL_TEST_CLS_CIRCULATOR_C -#define CGAL_TEST_CLS_CIRCULATOR_C - -#include - -template < class Triangulation > -int -_test_circulator( const Triangulation &T ) -{ - typedef typename Triangulation::Finite_edges_iterator Finite_edges_iterator; - typedef typename Triangulation::Edge_iterator Edge_iterator; - typedef typename Triangulation::Vertex_iterator Vertex_iterator; - typedef typename Triangulation::Facet_circulator Facet_circulator; - typedef typename Triangulation::Cell_circulator Cell_circulator; - typedef typename Triangulation::Cell Cell; - typedef typename Triangulation::Vertex Vertex; - typedef typename Triangulation::Vertex_handle Vertex_handle; - typedef typename Triangulation::Cell_handle Cell_handle; - typedef typename Triangulation::Facet Facet; - - int n = 0; - Cell_circulator cc, cc0; - Edge_iterator eit; - Finite_edges_iterator feit; - - // testing incident_cells(edge *); -// for (eit=T.edges_begin(); eit!=T.edges_end(); eit++) - eit=T.edges_begin(); - { - cc0=cc=T.incident_cells(*eit); - - Cell_circulator i = cc0; - CGAL_For_all(i, cc0) { *i; } - - Cell_handle ch = cc0; // Test the conversion. - (void) ch; - do { - assert(cc->has_vertex(eit->first->vertex(eit->second))); - assert(cc->has_vertex(eit->first->vertex(eit->third))); - cc++; n++; - } while (cc != cc0); - } - // test of incident_cells(cellhandle,int,int) and -- - feit=T.finite_edges_begin(); - { - cc0=cc=T.incident_cells(feit->first, feit->second, feit->third); - do { - assert(cc->has_vertex(feit->first->vertex(feit->second))); - assert(cc->has_vertex(feit->first->vertex(feit->third))); - cc--; n++; - } while (cc != cc0); - } - // testing incident_cells(edge *,cell *); and ++ -// for (eit=T.edges_begin(); eit!=T.edges_end(); eit++) - eit=T.edges_begin(); - { - cc0=cc=T.incident_cells(*eit, eit->first); - do { - assert(cc->has_vertex(eit->first->vertex(eit->second))); - assert(cc->has_vertex(eit->first->vertex(eit->third))); - cc++; n++; - } while (cc != cc0); - } - // test of incident_cells(cellhandle,int,int,cellhandle) and -- - feit=T.finite_edges_begin(); - { - cc0=cc=T.incident_cells(feit->first, feit->second, feit->third, - feit->first); - do { - assert(cc->has_vertex(feit->first->vertex(feit->second))); - assert(cc->has_vertex(feit->first->vertex(feit->third))); - cc--; n++; - } while (cc != cc0); - } - // the following is not useful here, it tests iterators more than - // circulators -// for (eit=T.finite_edges_begin(); eit!=T.edges_end(); eit++) -// { -// cc0=cc=T.incident_cells(*eit); -// do { -// cc++; n++; -// } while (cc != cc0); -// } -// for (eit=T.finite_edges_begin(); eit!=T.edges_end(); eit++) -// { -// cc0=cc=T.incident_cells(*eit, eit->first); -// do { -// cc++; n++; -// } while (cc != cc0); -// } - - std::vector cells; - std::vector vertices_old; - std::vector vertices; - std::vector facets; - - Vertex_handle vh = T.vertices_begin(); - - T.incident_cells(vh, std::back_inserter(cells)); - // old name (up to CGAL 3.4) - // kept for backwards compatibility but not documented - T.incident_vertices(vh, std::back_inserter(vertices_old)); - // correct name - T.adjacent_vertices(vh, std::back_inserter(vertices)); - T.incident_facets(vh, std::back_inserter(facets)); - - for(typename std::vector::const_iterator cit = cells.begin(), - end = cells.end(); - cit != end; ++cit) - assert((*cit)->has_vertex(vh)); - - for(typename std::vector::const_iterator fit = facets.begin(), - end = facets.end(); - fit != end; ++fit) - { - assert( (fit->first)->has_vertex(vh) ); - assert( fit->second != (fit->first)->index(vh) ); - } - - Facet_circulator fc, fc0, fc1; - assert(fc1 == 0); - int i,j; - // for (eit=T.edges_begin(); eit!=T.edges_end(); eit++) - eit=T.edges_begin(); // test (edge) - { - fc0=fc=T.incident_facets(*eit); - do { - assert(fc->first->has_vertex(eit->first->vertex(eit->second), i)); - assert(fc->first->has_vertex(eit->first->vertex(eit->third), j)); - assert(fc->second == T.next_around_edge(i, j) ); - fc++; n++; - } while (fc != fc0); - } - // for (eit=T.edges_begin(); eit!=T.edges_end(); eit++) - feit=T.finite_edges_begin(); // test (cell*,int,int) - { - fc0=fc=T.incident_facets(feit->first, feit->second, feit->third); - do { - assert(fc->first->has_vertex(feit->first->vertex(feit->second), i)); - assert(fc->first->has_vertex(feit->first->vertex(feit->third), j)); - assert(fc->second == T.next_around_edge(i, j) ); - fc--; n++; - } while (fc != fc0); - } -// int fi; - // for (eit=T.edges_begin(); eit!=T.edges_end(); eit++) - eit=T.edges_begin(); // test (edge, Cell*,int) - { -// for (fi=0; fi!=4 ; fi++) -// { -// if (t.dimension()==2) {fi=3;} - fc0=fc=T.incident_facets(*eit, eit->first, - T.next_around_edge(eit->second, eit->third)); - do { - assert(fc->first->has_vertex(eit->first->vertex(eit->second), i)); - assert(fc->first->has_vertex(eit->first->vertex(eit->third), j)); - assert(fc->second == T.next_around_edge(i, j) ); - fc++; n++; - } while (fc != fc0); -// } - } - // for (eit=T.edges_begin(); eit!=T.edges_end(); eit++) - feit=T.finite_edges_begin(); // test (Cell*,int,int,cell*,int) - { - fc0=fc=T.incident_facets(feit->first, feit->second, feit->third, - feit->first, - T.next_around_edge(feit->second, feit->third)); - do { - assert(fc->first->has_vertex(feit->first->vertex(feit->second), i)); - assert(fc->first->has_vertex(feit->first->vertex(feit->third), j)); - assert(fc->second == T.next_around_edge(i, j) ); - fc--; n++; - } while (fc != fc0); - } - - eit=T.edges_begin(); // test (edge, Facet) - { -// for (fi=0; fi!=4 ; fi++) -// { -// if (t.dimension()==2) {fi=3;} - fc0=fc=T.incident_facets(*eit, std::make_pair( eit->first, - T.next_around_edge(eit->second, - eit->third)) ); - do { - assert(fc->first->has_vertex(eit->first->vertex(eit->second), i)); - assert(fc->first->has_vertex(eit->first->vertex(eit->third), j)); - assert(fc->second == T.next_around_edge(i, j) ); - fc++; n++; - } while (fc != fc0); -// } - } - // for (eit=T.edges_begin(); eit!=T.edges_end(); eit++) - feit=T.finite_edges_begin(); // test (Cell*,int,int,Facet) - { - fc0=fc=T.incident_facets(feit->first, feit->second, feit->third, - std::make_pair( feit->first, - T.next_around_edge(feit->second, - feit->third)) ); - do { - assert(fc->first->has_vertex(feit->first->vertex(feit->second), i)); - assert(fc->first->has_vertex(feit->first->vertex(feit->third), j)); - assert(fc->second == T.next_around_edge(i, j) ); - fc--; n++; - } while (fc != fc0); - } - - return n; -} - -#endif // CGAL_TEST_CLS_CIRCULATOR_C diff --git a/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_delaunay_3.h b/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_delaunay_3.h deleted file mode 100644 index c2d403fb754..00000000000 --- a/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_delaunay_3.h +++ /dev/null @@ -1,1196 +0,0 @@ -// Copyright (c) 1998-2004 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Francois Rebufat, Monique Teillaud, Sylvain Pion -// Mariette Yvinec - -#ifndef CGAL_TEST_CLS_DELAUNAY_C -#define CGAL_TEST_CLS_DELAUNAY_C - -#include -#include -#include -#include -#include - -#include "_test_cls_iterator.h" -#include "_test_cls_circulator.h" -#include "_test_remove_cluster.h" - -#include - -// Accessory set of functions to differentiate between -// Delaunay::nearest_vertex[_in_cell] and -// Regular::nearest_power_vertex[_in_cell]. - -template < typename T, typename Weighted_tag = typename T::Weighted_tag > -struct Test_location_policy { - typedef typename T::Location_policy Location_policy; -}; - -template < typename T > -struct Test_location_policy { - struct Location_policy{}; -}; - -template < typename T, typename P > -typename T::Vertex_handle -nearest_vertex(const T&t, const P&p, CGAL::Tag_true) -{ - return t.nearest_power_vertex(p); -} - -template < typename T, typename P > -typename T::Vertex_handle -nearest_vertex(const T&t, const P&p, CGAL::Tag_false) -{ - return t.nearest_vertex(p); -} - -template < typename T, typename P > -typename T::Vertex_handle -nearest_vertex(const T&t, const P&p) -{ - return nearest_vertex(t, p, typename T::Weighted_tag()); -} - -template < typename T, typename P > -typename T::Vertex_handle -nearest_vertex_in_cell(const T&t, const P&p, const typename T::Cell_handle c, CGAL::Tag_true) -{ - return t.nearest_power_vertex_in_cell(p, c); -} - -template < typename T, typename P > -typename T::Vertex_handle -nearest_vertex_in_cell(const T&t, const P&p, const typename T::Cell_handle c, CGAL::Tag_false) -{ - return t.nearest_vertex_in_cell(p, c); -} - -template < typename T, typename P > -typename T::Vertex_handle -nearest_vertex_in_cell(const T&t, const P&p, const typename T::Cell_handle c) -{ - return nearest_vertex_in_cell(t, p, c, typename T::Weighted_tag()); -} - -// Template meta programming if. -template < typename Cond, typename Then, typename Else > -struct If; - -template < typename Then, typename Else > -struct If -{ - typedef Then type; -}; - -template < typename Then, typename Else > -struct If -{ - typedef Else type; -}; - -template < typename T, typename P > -void test_conflicts(T& T3_13, const P *q) -{ - typedef T Cls; - typedef typename Cls::Locate_type Locate_type; - typedef typename Cls::Vertex_handle Vertex_handle; - typedef typename Cls::Cell_handle Cell_handle; - typedef typename Cls::Facet Facet; - - for (int i=0; i<22; ++i) { - if (T3_13.dimension() < 2) - T3_13.insert(q[i]); - else { - // First locate the point. - Locate_type lt; - int li, lj; - Cell_handle c = T3_13.locate(q[i], lt, li, lj); - if (lt == Cls::VERTEX) // Already exist, skip. - continue; - if (lt == Cls::OUTSIDE_AFFINE_HULL) { // Increases dimension. - T3_13.insert_outside_affine_hull(q[i]); - continue; - } - // Get the stuff in conflicts. - std::vector C; - std::vector F; - std::vector V; - - T3_13.vertices_on_conflict_zone_boundary(q[i], c, std::back_inserter(V)); -#ifndef CGAL_NO_DEPRECATED_CODE - // test deprecated vertices_in_conflict - std::vector V2; - T3_13.vertices_in_conflict(q[i], c, std::back_inserter(V2)); - assert(V2.size() == V.size()); -#endif - - T3_13.find_conflicts(q[i], c, std::back_inserter(F), - std::back_inserter(C)); - - if (T3_13.dimension() == 3) - assert(F.size() == 2*V.size() - 4); // Euler relation. - if (T3_13.dimension() == 2) - assert(F.size() == V.size()); - - if (i%2 == 0) - T3_13.insert_in_hole(q[i], C.begin(), C.end(), - F.begin()->first, F.begin()->second); - else { - // alternately test the overload which takes a Vertex_handle. - Vertex_handle v = T3_13.tds().create_vertex(); - T3_13.insert_in_hole(q[i], C.begin(), C.end(), - F.begin()->first, F.begin()->second, v); - } - } - } -} - -template -void -_test_cls_delaunay_3(const Triangulation &) -{ - typedef Triangulation Cls; - - typedef typename Test_location_policy::Location_policy Location_policy; - - // We assume the traits class has been tested already - // actually, any traits is good if it has been tested - - // typedef typename Cls::Point Point; // Delaunay - // typedef typename Cls::Point::Point Point; // Regular - typedef typename If::type::Point Point; - - typedef typename Cls::Segment Segment; - typedef typename Cls::Triangle Triangle; - typedef typename Cls::Tetrahedron Tetrahedron; - - typedef typename Cls::Vertex Vertex; - typedef typename Cls::Cell Cell; - typedef typename Cls::Facet Facet; - typedef typename Cls::Edge Edge; - - typedef typename Cls::size_type size_type; - - typedef typename Cls::Vertex_handle Vertex_handle; - typedef typename Cls::Cell_handle Cell_handle; - typedef typename Cls::Vertex_iterator Vertex_iterator; - typedef typename Cls::Cell_iterator Cell_iterator; - typedef typename Cls::Locate_type Locate_type; - typedef std::list list_point; - - typedef typename Cls::Finite_vertices_iterator Finite_vertices_iterator; - typedef typename Cls::Finite_cells_iterator Finite_cells_iterator; - - - // +++ We define now some points for building triangulations +++++// - -// list of Points for T1_0 , T1_1, T1_2 : - - - Point p[5]= - { Point(0,0,0),Point(0,0,1),Point(0,0,2),Point(0,0,3),Point(0,0,4)}; - list_point l1; - int i; - for (i=0;i<5;i++) - l1.push_back(p[i]); - - Point pp[5] = { Point(0,0,0),Point(0,0,4),Point(0,0,1),Point(0,0,2),Point(0,0,3)}; - list_point l2; - for (i=0;i<5;i++) - l2.push_back(pp[i]); - - Point ppp[5] ={Point(0,0,1),Point(0,0,2),Point(0,0,3),Point(0,0,0),Point(0,0,4)}; - list_point l3; - for (i=0;i<5;i++) - l3.push_back(ppp[i]); - -// Points for T2_0 : - Point p1=Point(5,5,0); - Point p2=Point(4,4,0); - Point p3=Point(6,6,0); // 1- dimensional until this point - Point p4=Point(5,3,0); // 2-dimensional - Point p5=Point(5,7,0); - Point p6=Point(5,4,0); - Point p7=Point(5,6,0); - Point p8=Point(0,0,0); - Point p9=Point(5,5,0); - - // Points for T3_1 : - Point q[22] = - { - Point(0,0,0), Point(4,4,0), Point(0,4,0), Point(4,0,0), - Point(1,3,1), Point(3,1,1), Point(3,3,1), Point(1,1,1), Point(2,2,2), - Point(1,3,3), Point(3,1,3), Point(3,3,3), Point(1,1,3), - Point(0,0,4), Point(4,4,4), Point(0,4,4), Point(4,0,4), - Point(1,3,5), Point(3,1,5), Point(3,3,5), Point(1,1,5), Point(2,2,6)}; - - // Points for T3_2 : - - list_point lp; - int a, b, d; -// for (a=0;a!=10;a++) -// for (b=0;b!=10;b++) -// for (d=0;d!=10;d++) -// lp.push_back(Point(a*b-d*a + (a-b)*10 +a ,a-b+d +5*b, -// a*a-d*d+b)); - - for (a=0;a!=10;a++) - for (b=0;b!=10;b++) - for (d=0;d!=5;d++) - lp.push_back(Point(a*b-d*a + (a-b)*10 +a ,a-b+d +5*b, - a*a-d*d+b)); - - // Points for T3_2 : - - list_point lp2; - for (a=0;a!=4;a++) - for (b=0;b!=4;b++) - for (d=0;d!=4;d++) - lp2.push_back(Point((a*b-d*a)*10 +a ,(a-b+d +5*b)*100, - a*a-d*d-b)); - - //######################################################################## - - - /**************CONSTRUCTORS (1)*********************/ - /************** and I/O ****************************/ - - std::cout << " Constructor " << std::endl; - // Begining with an empty triangulation and adding point until reaching - // 3-dimentional triangulation. - Cls T0; - assert(T0.dimension() == -1); - assert(T0.number_of_vertices() == 0); - assert(T0.is_valid()); - - { - Cls Tfromfile; - std::cout << " I/O" << std::endl; - { - std::ofstream oFileT1("Test1_triangulation_IO_3",std::ios::out); - oFileT1 << T0; - } - std::ifstream iFileT1("Test1_triangulation_IO_3",std::ios::in); - iFileT1 >> Tfromfile; - assert(Tfromfile.is_valid()); - assert(Tfromfile.dimension() == -1); - assert(Tfromfile.number_of_vertices() == 0); - } - - std::cout << " Constructor1 " << std::endl; - Point p10(0,0,0); - Vertex_handle v0=T0.insert(p10); - assert(T0.dimension() == 0); - assert(T0.number_of_vertices() == 1); - assert(T0.is_valid()); - - { - Cls Tfromfile; - std::cout << " I/O" << std::endl; - { - std::ofstream oFileT2("Test2_triangulation_IO_3",std::ios::out); - oFileT2 << T0; - } - std::ifstream iFileT2("Test2_triangulation_IO_3",std::ios::in); - iFileT2 >> Tfromfile; - assert(Tfromfile.is_valid()); - assert(Tfromfile.dimension() == 0); - assert(Tfromfile.number_of_vertices() == 1); - } - - std::cout << " Constructor2 " << std::endl; - - Point p11(100,100,0); - v0=T0.insert(p11); - assert(T0.dimension() == 1); - assert(T0.number_of_vertices() == 2); - assert(T0.is_valid()); - - { - Cls Tfromfile; - std::cout << " I/O" << std::endl; - { - std::ofstream oFileT3("Test3_triangulation_IO_3",std::ios::out); - oFileT3 << T0; - } - std::ifstream iFileT3("Test3_triangulation_IO_3",std::ios::in); - iFileT3 >> Tfromfile; - assert(Tfromfile.is_valid()); - assert(Tfromfile.dimension() == 1); - assert(Tfromfile.number_of_vertices() == 2); - } - - std::cout << " Constructor3 " << std::endl; - - Point p12(100,-100,0); - v0=T0.insert(p12); - assert(T0.dimension() == 2); - assert(T0.number_of_vertices() == 3); - assert(T0.is_valid()); - - { - Cls Tfromfile; - std::cout << " I/O" << std::endl; - { - std::ofstream oFileT4("Test4_triangulation_IO_3",std::ios::out); - oFileT4 << T0; - } - std::ifstream iFileT4("Test4_triangulation_IO_3",std::ios::in); - iFileT4 >> Tfromfile; - assert(Tfromfile.is_valid()); - assert(Tfromfile.dimension() == 2); - assert(Tfromfile.number_of_vertices() == 3); - } - - std::cout << " Constructor4 " << std::endl; - - Point p13(50,0,100); - v0=T0.insert(p13); - assert(T0.dimension() == 3); - assert(T0.number_of_vertices() == 4); - assert(T0.is_valid()); - - { - Cls Tfromfile; - std::cout << " I/O" << std::endl; - { - std::ofstream oFileT5("Test5_triangulation_IO_3",std::ios::out); - oFileT5 << T0; - } - std::ifstream iFileT5("Test5_triangulation_IO_3",std::ios::in); - iFileT5 >> Tfromfile; - assert(Tfromfile.is_valid()); - assert(Tfromfile.dimension() == 3); - assert(Tfromfile.number_of_vertices() == 4); - } - - std::cout << " Constructor5 " << std::endl; - - Point p14(50,0,100); - v0=T0.insert(p14); - assert(T0.dimension() == 3); - assert(T0.number_of_vertices() == 4); - assert(T0.is_valid()); - - // copy constructor - Cls T1(T0); - assert(T1.dimension() == 3); - assert(T1.number_of_vertices() == 4); - assert(T1.is_valid()); - - T1.clear(); - assert(T1.dimension() == -1); - assert(T1.number_of_vertices() == 0); - assert(T1.is_valid()); - - - - // Affectation : - T1=T0; - assert(T1.dimension() == 3); - assert(T1.number_of_vertices() == 4); - assert(T1.is_valid()); - T1.clear(); - - - T1.swap(T0); - assert(T1.dimension() == 3); - assert(T1.number_of_vertices() == 4); - assert(T1.is_valid()); - assert(T0.dimension() == -1); - assert(T0.number_of_vertices() == 0); - assert(T0.is_valid()); - T0.swap(T1); - - assert(T0.dimension() == 3); - assert(T0.number_of_vertices() == 4); - assert(T0.is_valid()); - assert(T1.dimension() == -1); - - // Building some psychotics triangulations : - std::cout << " Constructor6 " << std::endl; - // triangulation 1-dimensional : vertical line. - Cls T1_0; - size_type n = T1_0.insert(l1.begin(),l1.end()); - assert(n==5); - assert(T1_0.dimension()==1); - assert(T1_0.number_of_vertices()==n); - assert(T1_0.is_valid()); - std::cout << " Constructor7 " << std::endl; - Cls T1_1; - n = T1_1.insert(l2.begin(),l2.end()); - assert(n==5); - assert(T1_1.dimension()==1); - assert(T1_1.number_of_vertices()==n); - assert(T1_1.is_valid()); - std::cout << " Constructor8 " << std::endl; - Cls T1_2; - n = T1_2.insert(l3.begin(),l3.end()); - assert(n==5); - assert(T1_2.dimension()==1); - assert(T1_2.number_of_vertices()==n); - assert(T1_2.is_valid()); - - { - Cls Tfromfile; - std::cout << " I/O" << std::endl; - { - std::ofstream oFileT6("Test6_triangulation_IO_3",std::ios::out); - oFileT6 << T1_2; - } - std::ifstream iFileT6("Test6_triangulation_IO_3",std::ios::in); - iFileT6 >> Tfromfile; - assert(Tfromfile.is_valid()); - assert(Tfromfile.dimension() == 1); - assert(Tfromfile.number_of_vertices() == n); - } - - std::cout << " Constructor9 " << std::endl; - // 2-dimensional triangulations - - Cls T2_0; - v0=T2_0.insert(p1); - - v0=T2_0.insert(p2); - - v0=T2_0.insert(p3); - - assert(T2_0.is_valid()); - assert(T2_0.dimension()==1); - assert(T2_0.number_of_vertices()==3); - - - v0=T2_0.insert(p4); - assert(T2_0.is_valid()); - assert(T2_0.dimension()==2); - assert(T2_0.number_of_vertices()==4); - - - v0=T2_0.insert(p5); - v0=T2_0.insert(p6); - v0=T2_0.insert(p7); - v0=T2_0.insert(p8); - v0=T2_0.insert(p9); - - assert(T2_0.is_valid()); - assert(T2_0.dimension()==2); - assert(T2_0.number_of_vertices()==8); - - { - Cls Tfromfile; - std::cout << " I/O" << std::endl; - { - std::ofstream oFileT7("Test7_triangulation_IO_3",std::ios::out); - oFileT7 << T2_0; - } - std::ifstream iFileT7("Test7_triangulation_IO_3",std::ios::in); - iFileT7 >> Tfromfile; - assert(Tfromfile.is_valid()); - assert(Tfromfile.dimension() == 2); - assert(Tfromfile.number_of_vertices() == 8); - } - - std::cout << " Constructor10 " << std::endl; - // test grid insert - Cls T2_1; - int m; - int px=1, py=1; - int qx=-1, qy=2; - Point qq[400]; - for (m=0; m<20; m++) - for (n=0; n<20; n++) - { - qq[m+20*n] = Point(m*px+(int)n*qx, m*py+(int)n*qy, 1); - T2_1.insert( qq[m+20*n] ); - } - assert( T2_1.number_of_vertices() == m*n ); - assert( T2_1.dimension()==2 ); - assert( T2_1.is_valid() ); - - std::cout << " Constructor11 " << std::endl; - // 3-dimensional triangulations - // This is a simple grid : - int x,y,z; - Cls T3_0; - Point r[225]; - for (z=0 ; z<5 ; z++) - for (y=0 ; y<5 ; y++) - for (x=0 ; x<5 ; x++) - { - r[x+5*y+25*z] = Point(x,y,z); - v0=T3_0.insert(r[x+5*y+25*z]); - } - assert(T3_0.is_valid()); - assert(T3_0.number_of_vertices()==125); - assert(T3_0.dimension()==3); - - if (del) { - std::cout << " deletion in Delaunay - grid case - (dim 3) " << - std::endl; - Cls Tdel( T3_0 ); - - std::vector vertices; - for (Finite_vertices_iterator vi = Tdel.finite_vertices_begin(); - vi != Tdel.finite_vertices_end(); ++vi) - vertices.push_back(vi); - - size_type n = Tdel.number_of_vertices(); - size_type m = Tdel.remove(vertices.begin(), vertices.end()); - assert(m == n - Tdel.number_of_vertices()); - assert(Tdel.is_valid(false)); - std::cout << " successfull" << std::endl; - } - - - std::cout << " Constructor12 " << std::endl; - Cls T3_1; - for (i=0;i<22;i++) - T3_1.insert(q[i]); - assert(T3_1.is_valid()); - assert(T3_1.number_of_vertices()==22); - assert(T3_1.dimension()==3); - - { - Cls Tfromfile; - std::cout << " I/O" << std::endl; - { - std::ofstream oFileT8("Test8_triangulation_IO_3",std::ios::out); - oFileT8 << T3_1; - } - std::ifstream iFileT8("Test8_triangulation_IO_3",std::ios::in); - iFileT8 >> Tfromfile; - assert(Tfromfile.is_valid()); - assert(Tfromfile.dimension() == 3); - assert(Tfromfile.number_of_vertices() == 22); - } - - // Testing find_conflicts(), vertices_on_conflict_zone_boundary(), insert_in_hole() - // FIXME : Note that we do not test the version of find_conflicts() - // which returns the internal facets too... - std::cout << " Testing find_conflicts/vertices_on_conflict_zone_boundary/insert_in_hole" - << std::endl; - Cls T3_13; - - test_conflicts(T3_13, q); - - assert(T3_13.is_valid()); - assert(T3_13.number_of_vertices()==22); - assert(T3_13.dimension()==3); - -#ifndef CGAL_NO_DEPRECATED_CODE - { - std::cout << " Testing move_point()" << std::endl; - Cls T; - std::list L; - for (i=0; i<22; ++i) - L.push_back(T.insert(q[i])); - assert(T.is_valid()); - assert(T.number_of_vertices()==22); - assert(T.dimension()==3); - - for (i=0; i<100; ++i) { - assert(!L.empty()); - Vertex_handle v = L.front(); - L.pop_front(); - size_type nbv = T.number_of_vertices(); - L.push_back(T.move_point(v, q[(3*i)%22])); - - if (nbv != T.number_of_vertices()) - L.pop_back(); // it means we move onto an already existing point. - - assert(T.is_valid()); - assert(T.number_of_vertices()<=22); - } - } -#endif - - { - std::cout << " Testing move()" << std::endl; - Cls T; - std::list L; - for (i=0; i<22; ++i) - L.push_back(T.insert(q[i])); - assert(T.is_valid()); - assert(T.number_of_vertices()==22); - assert(T.dimension()==3); - - for (i=0; i<100; ++i) { - assert(!L.empty()); - Vertex_handle v = L.front(); - L.pop_front(); - size_type nbv = T.number_of_vertices(); - L.push_back(T.move(v, q[(3*i)%22])); - - if (nbv != T.number_of_vertices()) - L.pop_back(); // it means we move onto an already existing point. - - assert(T.is_valid()); - assert(T.number_of_vertices()<=22); - } - } - - { - std::cout << " Testing nearest_vertex()" << std::endl; - // We do a nearest_vertex() and two nearest_vertex_in_cell() - // queries on all points with integer coordinate - // in the cube [-1;6]^3. In each case we check explicitely that the - // output is correct by comparing distance to other vertices. - Cell_handle c1 = T3_13.finite_cells_begin(); - Cell_handle c2 = T3_13.infinite_vertex()->cell(); - for (int x = -1; x < 7; ++x) - for (int y = -1; y < 7; ++y) - for (int z = -1; z < 7; ++z) { - Point p(x, y, z); - Vertex_handle v = nearest_vertex(T3_13, p); - for (typename Cls::Finite_vertices_iterator - fvit = T3_13.finite_vertices_begin(); - fvit != T3_13.finite_vertices_end(); ++fvit) - assert(CGAL::squared_distance(p, v->point()) <= - CGAL::squared_distance(p, fvit->point())); - Vertex_handle v1 = nearest_vertex_in_cell(T3_13, p, c1); - int i1 = c1->index(v1); - for(int i=0; i<4; ++i) { - if (i != i1) - assert(CGAL::squared_distance(p, v1->point()) <= - CGAL::squared_distance(p, c1->vertex(i)->point())); - } - Vertex_handle v2 = nearest_vertex_in_cell(T3_13, p, c2); - int i2 = c2->index(v2); - for(int i=0; i<4; ++i) { - if (i != i2 && c2->vertex(i) != T3_13.infinite_vertex()) - assert(CGAL::squared_distance(p, v2->point()) <= - CGAL::squared_distance(p, c2->vertex(i)->point())); - } - } - } - - { - Cls Tfromfile; - std::cout << " I/O" << std::endl; - { - std::ofstream oFileT8("Test13_triangulation_IO_3",std::ios::out); - oFileT8 << T3_13; - } - std::ifstream iFileT8("Test13_triangulation_IO_3",std::ios::in); - iFileT8 >> Tfromfile; - assert(Tfromfile.is_valid()); - assert(Tfromfile.dimension() == 3); - assert(Tfromfile.number_of_vertices() == 22); - } - - - //####################################################################### - std::cout << " list insertion"<< std::endl; - Cls T3_2_1; - T3_2_1.insert(lp2.begin(),lp2.end()); - assert(T3_2_1.is_valid()); - - assert(T3_2_1.dimension()==3); - // assert(T3_2.number_of_vertices()==1000); - std::cout << " end of insertion " << std::endl; - - std::cout << " insertion of located point"<< std::endl; - Locate_type lt; - int li, lj; - Cell_handle ch = T3_2_1.locate(p7,lt,li,lj); - T3_2_1.insert(p7,lt,ch,li,lj); - - assert(T3_2_1.is_valid()); - assert(T3_2_1.dimension()==3); - - // Same as above but using the template ctor. - std::cout << " template constructor"<< std::endl; - Cls T3_2_2(lp2.begin(), lp2.end()); - assert(T3_2_2.is_valid()); - - assert(T3_2_2.dimension()==3); - std::cout << " end of insertion " << std::endl; - - //######################################################################## - - - std::cout << " 500 points insertion"<< std::endl; - Cls T3_2; - typename list_point::iterator it; - int count = 0 ; - std::cout << " number of inserted points : " ; - for (it=lp.begin(); it!=lp.end();it++){ - count++; - T3_2.insert(*it); - if (count <10) - std::cout << count << '\b' ; - else - if (count < 100) - std::cout << count << '\b' << '\b' ; - else - if (count < 1000) - std::cout << count << '\b' << '\b' << '\b' ; - else - std::cout << count << std::endl; - std::cout.flush(); - } - std::cout << std::endl; - assert(T3_2.is_valid()); - assert(T3_2.dimension()==3); - assert(T3_2.number_of_vertices()==500); - - - - Point p110(-5,5,0), p111(-2,-5,2), p112(-2,-9,6), p113(4,8,9), p114(5,-6,0), - p115(3,0,5), p116(-9,0,-10), p117(1,6,-2), p118(-3,2,-4), p119(3,-3,-1); - Cls T3_5; - v0=T3_5.insert(p110); - v0=T3_5.insert(p111); - v0=T3_5.insert(p112); - v0=T3_5.insert(p113); - v0=T3_5.insert(p114); - v0=T3_5.insert(p115); - v0=T3_5.insert(p116); - v0=T3_5.insert(p117); - v0=T3_5.insert(p118); - v0=T3_5.insert(p119); - - assert(T3_5.is_valid()); - assert(T3_5.number_of_vertices()==10); - - // %%%%%%%%%% deletion in Delaunay - if (del) { - std::cout << " deletion in a 10 points Delaunay triangulation"; - Vertex_handle v; - while ( T3_5.number_of_vertices() >= 1 ) { - if ( T3_5.dimension() == 3 ) - v = T3_5.infinite_cell()->vertex - ( (T3_5.infinite_cell()->index( T3_5.infinite_vertex() ) +1 )&3 ); - else if ( T3_5.dimension() == 2 ) - v = T3_5.infinite_cell()->vertex - ( (T3_5.infinite_cell()->index( T3_5.infinite_vertex() ) +1 )%3 ); - else if ( T3_5.dimension() == 1 ) - v = T3_5.infinite_cell()->vertex - ( (T3_5.infinite_cell()->index( T3_5.infinite_vertex() ) +1 )%2 ); - else - v = T3_5.infinite_cell()->neighbor(0)->vertex(0); - - T3_5.remove( v ); - } - assert(T3_5.is_valid(false)); - } - std::cout << " done" << std::endl; - -// // Test random triangulation : - -// Cls T3_4; -// CGAL::Random random; -// for (n=1;n<50;n++) { -// x=random.get_int(-500,500); -// y=random.get_int(-500,500); -// z=random.get_int(-500,500); -// v0=T3_4.insert(Point(x,y,z)); -// } -// assert(T3_4.is_valid()); -// assert(T3_4.dimension()==3); -// assert(T3_4.is_valid()); - -// // %%%%%%%%%% deletion in Delaunay -// bool success(true); -// if (del) { -// std::cout << " deletion in a Delaunay of " -// << T3_4.number_of_vertices() << " random points"; -// Vertex_handle v; -// while ( T3_4.number_of_vertices() >= 1 ) { -// if ( T3_4.dimension() > 1 ) -// v = T3_4.infinite_cell()->vertex -// ( (T3_4.infinite_cell()->index( T3_4.infinite_vertex() ) +1 )&3 ); -// else -// if ( T3_4.dimension() == 1 ) -// v = T3_4.infinite_cell()->vertex -// ( (T3_4.infinite_cell()->index( T3_4.infinite_vertex() ) +1 )%2 ); -// else -// v = T3_4.infinite_cell()->neighbor(0)->vertex(0); - -// success = T3_4.remove( v ); -// } -// if (success) assert(T3_4.is_valid(false)); -// } -// std::cout << " done" << std::endl; - - // Iterator and circulator test - - Cls T0_1; - Point p28(1,3,5); - v0=T0_1.insert(p28); - - { - std::cout << " Testing Iterator "<< std::endl; - _test_vertex_iterator(T0_1); - _test_triangulation_iterator(T0_1); - _test_vertex_iterator(T0); - _test_triangulation_iterator(T0); - _test_vertex_iterator(T2_0); - _test_triangulation_iterator(T2_0); - _test_vertex_iterator(T1_0); - _test_triangulation_iterator(T1_0); - _test_vertex_iterator(T3_1); - _test_triangulation_iterator(T3_1); - _test_vertex_iterator(T3_0); - _test_triangulation_iterator(T3_0); - _test_vertex_iterator(T3_2); - _test_triangulation_iterator(T3_2); - - - std::cout << " Testing Circulator "<< std::endl; - _test_circulator(T0); - _test_circulator(T3_1); - _test_circulator(T3_0); - _test_circulator(T3_2); - } - - - std::cout << " Test is_Gabriel " << std::endl; - Point q0(0.,0.,0.); - Point q1(2.,0.,0.); - Point q2(0.,2.,0.); - Point q3(0.,0.,2.); - Cls T4; - v0 = T4.insert(q0); - Vertex_handle v1 = T4.insert(q1); - Vertex_handle v2 = T4.insert(q2, v1); // testing with the hint - Vertex_handle v3 = T4.insert(q3, v2->cell()); // testing with the hint - Cell_handle c; - int j,k,l; - assert(T4.is_facet(v0,v1,v2,c,j,k,l)); - i = 6 - (j+k+l); - Facet f = std::make_pair(c,i); - assert(T4.is_Gabriel(c,i)); - assert(T4.is_Gabriel(f)); - assert(T4.is_facet(v1,v2,v3,c,j,k,l)); - i = 6 - (j+k+l); - assert(!T4.is_Gabriel(c,i)); - assert(T4.is_edge(v0,v1,c,i,j)); - assert(T4.is_Gabriel(c,i,j)); - Edge e = make_triple(c,i,j); - assert(T4.is_Gabriel(e)); - assert(T4.is_edge(v2,v3,c,i,j)); - assert(T4.is_Gabriel(c,i,j)); - - std::cout <<" Test dual (minimal test for now)" << std::endl; - - // We only test return types and instantiation, basically. - { - Cell_handle c = T4.finite_cells_begin(); - Point p = T4.dual(c); - Facet f = Facet(c, 2); - CGAL::Object o = T4.dual(f); - o = T4.dual(f.first, f.second); - } - - std::cout <<" Test destructors and quit "<< std::endl; - - T0.clear(); - assert(T0.is_valid()); - T3_0.clear(); - assert(T3_0.is_valid()); - assert(T3_0.dimension()==-1); - assert(T3_0.number_of_vertices()==0); - - // "Determinism" test : - // Triangulations built with the same order of input points - // must have the same order of the vertex and cell iterator. - { - Cls Ta (q, q+22), Tb(q, q+22); - assert(Ta == Tb); - for (Finite_vertices_iterator ita = Ta.finite_vertices_begin(), - itb = Tb.finite_vertices_begin(), - end = Ta.finite_vertices_end(); - ita != end; ++ita, ++itb) - assert(ita->point() == itb->point()); - for (Finite_cells_iterator ita = Ta.finite_cells_begin(), - itb = Tb.finite_cells_begin(), - end = Ta.finite_cells_end(); - ita != end; ++ita, ++itb) { - assert(ita->vertex(0)->point() == itb->vertex(0)->point()); - assert(ita->vertex(1)->point() == itb->vertex(1)->point()); - assert(ita->vertex(2)->point() == itb->vertex(2)->point()); - assert(ita->vertex(3)->point() == itb->vertex(3)->point()); - } - } - - /**********************/ - /******* MOVE *********/ - std::cout << " displacements" << std::endl; - - std::cout << " degenerate cases: " << std::endl; - - Cls TM_0; - Vertex_handle tmv1 = TM_0.insert(Point(0,0,0)); - Vertex_handle tmv2 = TM_0.insert(Point(0,1,0)); - - TM_0.move_if_no_collision(tmv1, Point(0, 2, 1)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 1); - - TM_0.move_if_no_collision(tmv1, Point(0, 0, 0)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 1); - - Vertex_handle tmv3 = TM_0.insert(Point(0,2,1)); - - assert(TM_0.dimension() == 2); - - TM_0.move_if_no_collision(tmv3, Point(0, 2, 2)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 2); - - TM_0.move_if_no_collision(tmv3, Point(0, 2, 0)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 1); - - Vertex_handle tmv4 = TM_0.insert(Point(0,1,1)); - assert(TM_0.dimension() == 2); - - TM_0.move_if_no_collision(tmv3, Point(1, 1, 1)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 3); - - TM_0.move_if_no_collision(tmv3, Point(4, 2, 1)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 3); - - TM_0.move_if_no_collision(tmv3, Point(0, 2, 0)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 2); - - TM_0.move_if_no_collision(tmv4, Point(0, 2, 1)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 2); - - TM_0.move_if_no_collision(tmv4, Point(0, 2, -1)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 2); - - TM_0.move_if_no_collision(tmv4, Point(0, 3, 0)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 1); - - TM_0.move_if_no_collision(tmv3, Point(0, 1, 1)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 2); - - TM_0.move_if_no_collision(tmv3, Point(0, -1, 0)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 1); - - TM_0.move_if_no_collision(tmv2, Point(0, -1, 0, 2)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 1); - - TM_0.move_if_no_collision(tmv2, Point(0, -1, 0, 4)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 1); - - TM_0.move_if_no_collision(tmv2, Point(0, -1, 0, 2)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 1); - - TM_0.move_if_no_collision(tmv2, Point(0, -1, 1, 2)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 2); - - TM_0.move_if_no_collision(tmv1, Point(0, 0, 2)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 2); - - TM_0.move_if_no_collision(tmv1, Point(0, 0, 1)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 2); - - TM_0.move_if_no_collision(tmv1, Point(0, 0, 0)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 2); - - assert(TM_0.move_if_no_collision(tmv1, Point(0, 3, 0)) != tmv1); - - TM_0.move_if_no_collision(tmv1, Point(0, 0, 1)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 2); - - TM_0.move_if_no_collision(tmv4, Point(0, 1, 2)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 1); - - TM_0.move_if_no_collision(tmv4, Point(0, 3, 0)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 2); - - TM_0.move_if_no_collision(tmv1, Point(0, 2, 3)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 2); - - TM_0.move_if_no_collision(tmv4, Point(0, 1, 2)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 1); - - Vertex_handle tmv5 = TM_0.insert(Point(0,2,0)); - Vertex_handle tmv6 = TM_0.insert(Point(1,0,0)); - assert(TM_0.dimension() == 3); - - TM_0.move_if_no_collision(tmv6, Point(0, 0, 0)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 2); - - TM_0.move_if_no_collision(tmv6, Point(2, 0, 0)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 3); - - TM_0.move_if_no_collision(tmv6, Point(2, 1, 0)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 3); - - TM_0.move_if_no_collision(tmv6, Point(0, 99, 99)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 2); - - TM_0.move_if_no_collision(tmv6, Point(2, 1, 0)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 3); - - TM_0.move_if_no_collision(tmv6, Point(2, 2, 0)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 3); - - TM_0.move_if_no_collision(tmv6, Point(-2, 2, 0)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 3); - - TM_0.move_if_no_collision(tmv6, Point(0, 1, 1)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 2); - - TM_0.move_if_no_collision(tmv6, Point(-2, 2, 0)); - assert(TM_0.tds().is_valid()); - assert(TM_0.is_valid()); - assert(TM_0.dimension() == 3); - - std::cout << " random 1D: " << std::endl; - Cls TM_1; - // non-degenerate cases - std::list points; - for(int count=0; count<50; count++) { - points.push_back(Point(0, 0, rand()%30000)); - } - TM_1.insert(points.begin(), points.end()); - Vertex_handle vTM_1; - for(int i=0; i<2; i++) { - for(typename Cls::Finite_vertices_iterator - fvi = TM_1.finite_vertices_begin(); - fvi != TM_1.finite_vertices_end(); fvi++) { - Point p = Point(0, 0, rand()%30000); - vTM_1 = TM_1.move_if_no_collision(fvi, p); - assert(TM_1.is_valid()); - } - } - assert(TM_1.is_valid()); - - std::cout << " random 2D: " << std::endl; - Cls TM_2; - // non-degenerate cases - points.clear(); TM_2.clear(); - for(int count=0; count<10; count++) { - points.push_back(Point(0, rand()%30000, rand()%30000)); - } - TM_2.insert(points.begin(), points.end()); - Vertex_handle vTM_2; - for(int i=0; i<2; i++) { - for(typename Cls::Finite_vertices_iterator - fvi = TM_2.finite_vertices_begin(); - fvi != TM_2.finite_vertices_end(); fvi++) { - Point p = Point(0, rand()%30000, rand()%30000); - vTM_2 = TM_2.move_if_no_collision(fvi, p); - assert(TM_2.is_valid()); - } - } - assert(TM_2.is_valid()); - - std::cout << " random 3D: " << std::endl; - Cls TM_3; - // non-degenerate cases - points.clear(); TM_3.clear(); - for(int count=0; count<50; count++) { - points.push_back(Point(rand()%30000, rand()%30000, rand()%30000)); - } - TM_3.insert(points.begin(), points.end()); - - assert(TM_3.is_valid()); - - Vertex_handle vTM_3; - for(int i=0; i<2; i++) { - for(typename Cls::Finite_vertices_iterator - fvi = TM_3.finite_vertices_begin(); - fvi != TM_3.finite_vertices_end(); fvi++) { - Point p = Point(rand()%30000, rand()%30000, rand()%30000); - vTM_3 = TM_3.move_if_no_collision(fvi, p); - assert(TM_3.is_valid()); - } - } - - // A simple test to see if move return the good vertex - // when there is a collision - assert(TM_3.move(TM_3.finite_vertices_begin(), vTM_3->point()) == vTM_3); - - // Test remove cluster - { - _test_remove_cluster(); - } - -} - -#endif // CGAL_TEST_CLS_DELAUNAY_C diff --git a/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_iterator.h b/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_iterator.h deleted file mode 100644 index 015c8f845eb..00000000000 --- a/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_iterator.h +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright (c) 1998 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Francois Rebufat (Francois.Rebufat@sophia.inria.fr) - -#ifndef CGAL_TEST_CLS_ITERATOR_C -#define CGAL_TEST_CLS_ITERATOR_C - -template < class Triangulation > -typename Triangulation::size_type -_test_vertex_iterator( const Triangulation &T ) -{ - typedef typename Triangulation::size_type size_type; - typedef typename Triangulation::Vertex Vertex; - typedef typename Triangulation::Vertex_handle Vertex_handle; - typedef typename Triangulation::Cell_handle Cell_handle; - typedef typename Triangulation::Vertex_iterator Vertex_iterator; - typedef typename Triangulation::Finite_vertices_iterator - Finite_vertices_iterator; - size_type n = 0; - - for (Vertex_iterator vit = T.vertices_begin(); vit != T.vertices_end(); ++vit) - { - Vertex_handle vh = vit; // Test the conversion. - n++; - const Vertex & v = *vit; // Test operator*; - Cell_handle c = vit->cell(); // Test operator->; - (void) vh; - (void) v; - (void) c; - } - assert( n-1 == T.number_of_vertices() ); - n=0; - for (Finite_vertices_iterator fvit = T.finite_vertices_begin(); - fvit != T.finite_vertices_end(); ++fvit) - { - Vertex_handle vh = fvit; // Test the conversion. - const Vertex & v = *fvit; // Test operator*; - Cell_handle c = fvit->cell(); // Test operator->; - n++; - (void) vh; - (void) v; - (void) c; - } - assert( n == T.number_of_vertices() ); - - // Test Backward-ness of the iterators. - n=0; - for (Vertex_iterator vit = T.vertices_end(); vit != T.vertices_begin(); --vit) - { - Vertex_handle vh = vit; // Test the conversion. - (void) vh; - n++; - } - assert( n-1 == T.number_of_vertices() ); - n=0; - for (Finite_vertices_iterator fvit = T.finite_vertices_end(); - fvit != T.finite_vertices_begin(); --fvit) - { - Vertex_handle vh = fvit; // Test the conversion. - (void) vh; - n++; - } - assert( n == T.number_of_vertices() ); - - return n; -} - -template < class Triangulation > -int -_test_triangulation_iterator( const Triangulation &T ) -{ - typedef typename Triangulation::Finite_cells_iterator Finite_cells_iterator; - typedef typename Triangulation::Finite_facets_iterator Finite_facets_iterator; - typedef typename Triangulation::Finite_edges_iterator Finite_edges_iterator; - typedef typename Triangulation::Finite_vertices_iterator Finite_vertices_iterator; - - typedef typename Triangulation::Cell_iterator Cell_iterator; - typedef typename Triangulation::Facet_iterator Facet_iterator; - typedef typename Triangulation::Edge_iterator Edge_iterator; - typedef typename Triangulation::Vertex_iterator Vertex_iterator; - - typedef typename Triangulation::Cell Cell; - typedef typename Triangulation::Facet Facet; - typedef typename Triangulation::Edge Edge; - typedef typename Triangulation::Vertex Vertex; - typedef typename Triangulation::Cell_handle Cell_handle; - - int n=0 , m=0 , f=0 , t=0; - Cell_iterator Cit; - Facet_iterator Fit; - Edge_iterator Eit; - Vertex_iterator Vit; - Finite_cells_iterator FCit; - Finite_facets_iterator FFit; - Finite_edges_iterator FEit; - Finite_vertices_iterator FVit; - for (Cit = T.tds().raw_cells_begin(); Cit != T.tds().raw_cells_end(); ++Cit) { - Cell_handle ch = Cit; - (void) ch; - } - if (T.dimension()==3) { - for (FCit = T.finite_cells_begin(); FCit != T.finite_cells_end(); ++FCit) - { - Cell_handle ch = FCit; // Test the conversion. - const Cell & c = *FCit; // Test operator*. - Cell_handle ch2 = FCit->neighbor(0); // Test operator->. - (void) ch; - (void) c; - (void) ch2; - t++; - } - for (FFit = T.finite_facets_begin(); FFit != T.finite_facets_end(); ++FFit) { - const Facet & f2 = *FFit; // Test operator*. - Cell_handle ch = FFit->first; // Test operator->. - (void) f2; - (void) ch; - f++; - } - for (FEit = T.finite_edges_begin(); FEit != T.finite_edges_end(); ++FEit) { - const Edge & e = *FEit; // Test operator*. - Cell_handle ch = FEit->first; // Test operator->. - (void) e; - (void) ch; - m++; - } - for (FVit = T.finite_vertices_begin(); FVit != T.finite_vertices_end(); ++FVit) { - const Vertex & v = *FVit; // Test operator*. - Cell_handle ch = FVit->cell(); // Test operator->. - (void) v; - (void) ch; - n++; - } - // Test Backward-ness of the iterators. - for (FCit = T.finite_cells_end(); FCit != T.finite_cells_begin(); --FCit) ; - for (FFit = T.finite_facets_end(); FFit != T.finite_facets_begin(); --FFit) ; - for (FEit = T.finite_edges_end(); FEit != T.finite_edges_begin(); --FEit) ; - for (FVit = T.finite_vertices_end(); FVit != T.finite_vertices_begin(); --FVit) ; - - assert((n-m+f-t)==1); - n=0 ; m=0 ; f=0 ; t=0; - for (Cit = T.cells_begin(); Cit != T.cells_end(); ++Cit) - { - Cell_handle ch = Cit; // Test the conversion. - (void) ch; - t++; - } - for (Fit = T.facets_begin(); Fit != T.facets_end(); ++Fit) - f++; - for (Eit = T.edges_begin(); Eit != T.edges_end(); ++Eit) - m++; - for (Vit = T.vertices_begin(); Vit != T.vertices_end(); ++Vit) - n++; - assert((n-m+f-t)==0); - } - if (T.dimension()==3) - { - Finite_cells_iterator Cit2; - FCit = T.finite_cells_begin(); - Cit2=FCit; - assert(T.tetrahedron(FCit)==T.tetrahedron(Cit2)); - FCit++ ; FCit-- ; ++FCit ; --FCit ; - assert(FCit==Cit2); - assert(T.tetrahedron(FCit)==T.tetrahedron(Cit2)); - } - if (T.dimension() >=2) - { - Finite_facets_iterator Fit2; - FFit = T.finite_facets_begin(); - Fit2=FFit; - assert(*FFit==*Fit2); - FFit++ ; FFit-- ; ++FFit ; --FFit ; - assert(FFit==Fit2); - assert(*FFit==*Fit2); - } - if (T.dimension() >=1) - { - Finite_edges_iterator Eit2; - FEit = T.finite_edges_begin(); - Eit2=FEit; - assert(*FEit==*Eit2); - FEit++ ; FEit-- ; ++FEit ; --FEit ; - assert(FEit==Eit2); - assert(*FEit==*Eit2); - } - Finite_vertices_iterator Vit2; - FVit = T.finite_vertices_begin(); - Vit2=FVit; - assert(FVit->point()==Vit2->point()); - FVit++ ; FVit-- ; ++FVit ; --FVit ; - assert(FVit==Vit2); - assert(FVit->point()==Vit2->point()); - return(n-m+f-t); -} - -#endif // CGAL_TEST_CLS_ITERATOR_C diff --git a/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_regular_3.h b/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_regular_3.h deleted file mode 100644 index 13f0f0a3b1a..00000000000 --- a/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_regular_3.h +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright (c) 1998 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Monique Teillaud (Monique.Teillaud@sophia.inria.fr) - -// This stuff is not used (obsolete) at the moment. -#if 0 -#include -#include -#include - -template -void -_test_cls_regular_3(const Triangulation &) -{ - typedef Triangulation Cls; - typedef typename Triangulation::Traits Tr; - typedef typename Tr::Traits_base Tb; - - typedef typename Tb::Point Bare_point; - // We assume the traits class has been tested already - // actually, any traits is good if it has been tested - // typedef typename Cls::Bare_point Point; - typedef typename Cls::Weighted_point Weighted_point; - - typedef std::list list_point; - - // temporary version - - int n,m; - int count = 0 ; - - std::cout << " test dimension 1 " << std::endl; - Cls T1; - std::cout << " number of inserted points : " ; - for ( m=0; m<5; m++) { - if ( (m%2)== 0 ) - T1.insert( Weighted_point( Point( 2*m,0,0 ), 2 ) ); - else T1.insert( Weighted_point( Point( -2*m+1,0,0 ), 2 ) ); - count++; - if (count <10) - std::cout << count << '\b' ; - else - if (count < 100) - std::cout << count << '\b' << '\b' ; - else - std::cout << count << '\b' << '\b' << '\b' ; - std::cout.flush(); - } - assert( T1.is_valid() ); - std::cout << std::endl << " number of vertices : " - << T1.number_of_vertices() << std::endl; - - std::cout << " number of inserted points : " ; - for ( m=0; m<5; m++) { - if ( (m%2)== 0 ) - T1.insert( Weighted_point( Point( 2*m+1,0,0 ), 5 ) ); - else T1.insert( Weighted_point( Point( -2*m+1,0,0 ), 5 ) ); - count++; - if (count <10) - std::cout << count << '\b' ; - else - if (count < 100) - std::cout << count << '\b' << '\b' ; - else - std::cout << count << '\b' << '\b' << '\b' ; - std::cout.flush(); - } - assert( T1.is_valid() ); - std::cout << std::endl << " number of vertices : " - << T1.number_of_vertices() << std::endl; - - std::cout << " number of inserted points : " ; - for ( m=0; m<10; m++) { - if ( (m%2)== 0 ) - T1.insert( Weighted_point( Point( m,0,0 ), 1 ) ); - else T1.insert( Weighted_point( Point( -m,0,0 ), 1 ) ); - count++; - if (count <10) - std::cout << count << '\b' ; - else - if (count < 100) - std::cout << count << '\b' << '\b' ; - else - std::cout << count << '\b' << '\b' << '\b' ; - std::cout.flush(); - } - assert( T1.is_valid() ); - std::cout << std::endl << " number of vertices : " - << T1.number_of_vertices() << std::endl; - assert( T1.dimension()==1 ); - - std::cout << " test dimension 2 " << std::endl; - std::cout << " number of inserted points : " ; - Cls T2; - - count = 0 ; - int px=1, py=1; - int qx=-1, qy=2; - for (m=0; m<10; m++) - for (n=0; n<10; n++) { - T2.insert( Weighted_point( Point(m*px+n*qx, m*py+n*qy, 0), 1 ) ); - count++; - if (count <10) - std::cout << count << '\b' ; - else - if (count < 100) - std::cout << count << '\b' << '\b' ; - else - std::cout << count << '\b' << '\b' << '\b' ; - std::cout.flush(); - } - for (m=10; m<20; m++) - for (n=0; n<10; n++) { - T2.insert( Weighted_point( Point(m*px+n*qx, m*py+n*qy, 0), -1 ) ); - count++; - if (count <10) - std::cout << count << '\b' ; - else - if (count < 100) - std::cout << count << '\b' << '\b' ; - else - std::cout << count << '\b' << '\b' << '\b' ; - std::cout.flush(); - } - for (m=0; m<10; m++) - for (n=10; n<20; n++) { - T2.insert( Weighted_point( Point(m*px+n*qx, m*py+n*qy, 0), -2 ) ); - count++; - if (count <10) - std::cout << count << '\b' ; - else - if (count < 100) - std::cout << count << '\b' << '\b' ; - else - std::cout << count << '\b' << '\b' << '\b' ; - std::cout.flush(); - } - for (m=10; m<20; m++) - for (n=10; n<20; n++) { - T2.insert( Weighted_point( Point(m*px+n*qx, m*py+n*qy, 0), 5 ) ); - count++; - if (count <10) - std::cout << count << '\b' ; - else - if (count < 100) - std::cout << count << '\b' << '\b' ; - else - std::cout << count << '\b' << '\b' << '\b' ; - std::cout.flush(); - } - - std::cout << std::endl << " number of vertices : " - << T2.number_of_vertices() << std::endl; - assert( T2.dimension()==2 ); - assert( T2.is_valid() ); - - // dimension 3 - std::cout << " test dimension 3" << std::endl; - Cls T; - - list_point lp; - int a, b, d; - for (a=0;a!=10;a++) - for (b=0;b!=10;b++) - for (d=0;d!=10;d++) - lp.push_back(Weighted_point( Point(a*b-d*a + (a-b)*10 +a , - a-b+d +5*b, - a*a-d*d+b), - a*b-a*d) ); - list_point::iterator it; - count = 0 ; - std::cout << " number of inserted points : " ; - for (it=lp.begin(); it!=lp.end();it++){ - count++; - T.insert(*it); - if (count <10) - std::cout << count << '\b' ; - else - if (count < 100) - std::cout << count << '\b' << '\b' ; - else - if (count < 1000) - std::cout << count << '\b' << '\b' << '\b' ; - else - std::cout << count << std::endl; - std::cout.flush(); - } - - std::cout << " number of vertices : " - << T.number_of_vertices() << std::endl; - assert(T.is_valid()); - assert(T.dimension()==3); -} - -#endif diff --git a/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_regular_euclidean_traits_3.h b/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_regular_euclidean_traits_3.h deleted file mode 100644 index 710cbe43d35..00000000000 --- a/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_regular_euclidean_traits_3.h +++ /dev/null @@ -1,241 +0,0 @@ -// Copyright (c) 1998 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// $Date$ - -// Author(s) : Mariette Yvinec - -template -void -_test_cls_regular_euclidean_traits_3 (const Traits & ) -{ - typedef typename Traits::Weighted_point Weighted_point; - typedef typename Traits::Bare_point Bare_point; - typedef typename Traits::Power_test_3 Power_test_3; - typedef typename Traits::Compare_power_distance_3 - Compare_power_distance_3; - typedef typename Traits::In_smallest_orthogonal_sphere_3 - In_smallest_orthogonal_sphere_3; - typedef typename Traits::Side_of_bounded_orthogonal_sphere_3 - Side_of_bounded_orthogonal_sphere_3; - typedef typename Traits::Does_simplex_intersect_dual_support_3 - Does_simplex_intersect_dual_support_3; - typedef typename Traits::Construct_weighted_circumcenter_3 - Construct_weighted_circumcenter_3; - typedef typename Traits::Compute_power_product_3 - Compute_power_product_3; - typedef typename Traits:: - Compute_squared_radius_smallest_orthogonal_sphere_3 - Compute_squared_radius_smallest_orthogonal_sphere_3; - - typedef typename Traits:: - Compute_critical_squared_radius_3 - Compute_critical_squared_radius_3; - - Traits traits; - Power_test_3 power_test = traits.power_test_3_object(); - Compare_power_distance_3 compare_power_distance = - traits.compare_power_distance_3_object(); - In_smallest_orthogonal_sphere_3 in_smallest_orthogonal_sphere = - traits.in_smallest_orthogonal_sphere_3_object(); - Side_of_bounded_orthogonal_sphere_3 side_of_bounded_orthogonal_sphere = - traits.side_of_bounded_orthogonal_sphere_3_object(); - Does_simplex_intersect_dual_support_3 does_simplex_intersect_dual_support = - traits.does_simplex_intersect_dual_support_3_object(); - Construct_weighted_circumcenter_3 weighted_circumcenter = - traits.construct_weighted_circumcenter_3_object(); - Compute_power_product_3 power_product = - traits.compute_power_product_3_object(); - Compute_squared_radius_smallest_orthogonal_sphere_3 - squared_radius_smallest_orthogonal_sphere = - traits.compute_squared_radius_smallest_orthogonal_sphere_3_object(); - Compute_critical_squared_radius_3 critical_squared_radius = - traits.compute_critical_squared_radius_3_object(); - - - // test of Does_simplex_intersect_dual_support_3 - std::cout << "test of Does_simplex_intersect_dual_support_3" << std::endl; - Bare_point p0(0.,0.,0.); - Bare_point p1(3.,0.,0.); - Bare_point p2(0.,3.,0.); - Bare_point p3(0.,0.,3.); - - Weighted_point wp0(p0,9.); - Weighted_point wp1(p1,9.); - Weighted_point wp2(p2,9.); - Weighted_point wp3(p3,9.); - Weighted_point wp01(p0,6.); - Weighted_point wp02(p0,3.); - Weighted_point wp03(p0,12.); - Weighted_point wp04(p0,18.); - Weighted_point wp05(p0,24.); - - assert(does_simplex_intersect_dual_support(wp0,wp1,wp2,wp3) - == CGAL::ON_UNBOUNDED_SIDE); - assert(does_simplex_intersect_dual_support(wp1,wp0,wp2,wp3) - == CGAL::ON_UNBOUNDED_SIDE); - assert(does_simplex_intersect_dual_support(wp01,wp1,wp2,wp3) - == CGAL::ON_BOUNDARY); - assert(does_simplex_intersect_dual_support(wp01,wp2,wp1,wp3) - == CGAL::ON_BOUNDARY); - assert(does_simplex_intersect_dual_support(wp02,wp1,wp2,wp3) - == CGAL::ON_BOUNDED_SIDE); - assert(does_simplex_intersect_dual_support(wp2,wp1,wp02,wp3) - == CGAL::ON_BOUNDED_SIDE); - - assert(does_simplex_intersect_dual_support(wp0,wp1,wp2) - == CGAL::ON_BOUNDARY); - assert(does_simplex_intersect_dual_support(wp1,wp0,wp2) - == CGAL::ON_BOUNDARY); - assert(does_simplex_intersect_dual_support(wp01,wp1,wp2) - == CGAL::ON_BOUNDED_SIDE); - assert(does_simplex_intersect_dual_support(wp01,wp2,wp1) - == CGAL::ON_BOUNDED_SIDE); - assert(does_simplex_intersect_dual_support(wp03,wp1,wp2) - == CGAL::ON_UNBOUNDED_SIDE); - assert(does_simplex_intersect_dual_support(wp2,wp1,wp03) - == CGAL::ON_UNBOUNDED_SIDE); - - assert(does_simplex_intersect_dual_support(wp0,wp1) - == CGAL::ON_BOUNDED_SIDE); - assert(does_simplex_intersect_dual_support(wp1,wp0) - == CGAL::ON_BOUNDED_SIDE); - assert(does_simplex_intersect_dual_support(wp04,wp1) - == CGAL::ON_BOUNDARY); - assert(does_simplex_intersect_dual_support(wp1,wp04) - == CGAL::ON_BOUNDARY); - assert(does_simplex_intersect_dual_support(wp05,wp1) - == CGAL::ON_UNBOUNDED_SIDE); - assert(does_simplex_intersect_dual_support(wp1,wp05) - == CGAL::ON_UNBOUNDED_SIDE); - - // test of Construct_weighted_circumcenter_3 and compare_power_distance - std::cout << "test of Construct_weighted_circumcenter_3" << std::endl; - std::cout << "test Of Compare_power_distance_3" << std::endl; - Bare_point c ; - c = weighted_circumcenter(wp0,wp1,wp2,wp3); - assert (compare_power_distance(c,wp0,wp1) == CGAL::EQUAL); - assert (compare_power_distance(c,wp01,wp1) == CGAL::LARGER); - assert (compare_power_distance(c,wp03,wp1) == CGAL::SMALLER); - - c = weighted_circumcenter(wp01,wp1,wp2,wp3); - assert (compare_power_distance(c,wp01,wp2) == CGAL::EQUAL); - - c = weighted_circumcenter(wp02,wp1,wp2,wp3); - assert (compare_power_distance(c,wp02,wp3) == CGAL::EQUAL); - - // test In_smallest_orthogonal_sphere_3 - // test Side_of_bounded_orthogonal_sphere_3 - std::cout << " test In_smallest_orthogonal_sphere_3" << std::endl; - std::cout << " test Side_of_bounded_orthogonal_sphere_3" << std::endl; - Bare_point q0(0.,0.,0.); - Bare_point q1(2.,0.,0.); - Bare_point q2(0.,2.,0.); - Bare_point q3(0.,0.,2.); - Bare_point q4(2.,2.,2.); - - Weighted_point wq0(q0,0.); - Weighted_point wq1(q1,0.); - Weighted_point wq2(q2,0.); - Weighted_point wq3(q3,0.); - Weighted_point wq4(q4,0.); - Weighted_point wq01(q0,2.); - Weighted_point wq11(q1,2.); - Weighted_point wq21(q2,2.); - Weighted_point wq31(q3,2.); - Weighted_point wq41(q4,2.); - - typedef typename Traits::FT FT; - FT ww02 = FT(2)/FT(3); - Weighted_point wq02(q0, ww02); - - - assert(in_smallest_orthogonal_sphere(wq0, wq1, wq2) - == CGAL::POSITIVE); - assert(in_smallest_orthogonal_sphere(wq1, wq0, wq2) - == CGAL::POSITIVE); - assert(in_smallest_orthogonal_sphere(wq1, wq2, wq0) - == CGAL::ZERO); - assert(in_smallest_orthogonal_sphere(wq1, wq2, wq01) - == CGAL::NEGATIVE); - assert(in_smallest_orthogonal_sphere(wq2, wq1, wq01) - == CGAL::NEGATIVE); - assert(in_smallest_orthogonal_sphere(wq11, wq21, wq0) - == CGAL::POSITIVE); - assert(in_smallest_orthogonal_sphere(wq21, wq11, wq0) - == CGAL::POSITIVE); - assert(side_of_bounded_orthogonal_sphere(wq21, wq11, wq0) - == CGAL::ON_UNBOUNDED_SIDE); - - - assert(in_smallest_orthogonal_sphere(wq0, wq1, wq2, wq3) - == CGAL::POSITIVE); - assert(in_smallest_orthogonal_sphere(wq1, wq0, wq2, wq3) - == CGAL::POSITIVE); - assert(side_of_bounded_orthogonal_sphere(wq1, wq0, wq2, wq3) - == CGAL::ON_UNBOUNDED_SIDE); - assert(in_smallest_orthogonal_sphere(wq1, wq2, wq3, wq0) - == CGAL::NEGATIVE); - assert(in_smallest_orthogonal_sphere(wq1, wq3, wq2, wq0) - == CGAL::NEGATIVE); - assert(in_smallest_orthogonal_sphere(wq11, wq21, wq31, wq02) - == CGAL::ZERO); - assert(in_smallest_orthogonal_sphere(wq31, wq21, wq11, wq02) - == CGAL::ZERO); - - - assert(in_smallest_orthogonal_sphere(wq0, wq1, wq2, wq3, wq4) - == CGAL::ZERO); - assert(in_smallest_orthogonal_sphere(wq1, wq0, wq2, wq3, wq4) - == CGAL::ZERO); - assert(in_smallest_orthogonal_sphere(wq01, wq11, wq21, wq31, wq4) - == CGAL::POSITIVE); - assert(in_smallest_orthogonal_sphere(wq01, wq21, wq11, wq31, wq4) - == CGAL::POSITIVE); - assert(in_smallest_orthogonal_sphere(wq0, wq1, wq2, wq3, wq41) - == CGAL::NEGATIVE); - assert(in_smallest_orthogonal_sphere(wq0, wq1, wq3, wq2, wq41) - == CGAL::NEGATIVE); - assert(side_of_bounded_orthogonal_sphere(wq0, wq1, wq3, wq2, wq41) - == CGAL::ON_BOUNDED_SIDE); - - - // test weighted_circumcenter - // test squared_radius_smallest_orthogonal_sphere - // test critical_squared_radius - std::cout << "test of squared_radius_smallest_orthogonal_sphere" - << std::endl; - std::cout << "test of critical_squared_radius" << std::endl; - Weighted_point wc( - weighted_circumcenter(wq11,wq21,wq31,wq41), - squared_radius_smallest_orthogonal_sphere(wq11,wq21,wq31,wq41)); - Weighted_point wt(Bare_point(1.,1.,1.), 0.); - // this test requires a weighted point with a zero weight - assert( power_product(wc,wt) == - critical_squared_radius(wq11,wq21,wq31,wq41,wt)); - - wc = Weighted_point( - weighted_circumcenter(wp0,wp1,wp2,wp3), - squared_radius_smallest_orthogonal_sphere(wp0,wp1,wp2,wp3)); - assert( power_product(wc,wt) == - critical_squared_radius(wp0,wp1,wp2,wp3,wt)); - - wc = Weighted_point( - weighted_circumcenter(wp01,wp1,wp2,wp3), - squared_radius_smallest_orthogonal_sphere(wp01,wp1,wp2,wp3)); - assert( power_product(wc,wt) == - critical_squared_radius(wp01,wp1,wp2,wp3,wt)); - -} diff --git a/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_tds_3.h b/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_tds_3.h deleted file mode 100644 index 21a2663f2e9..00000000000 --- a/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_tds_3.h +++ /dev/null @@ -1,323 +0,0 @@ -// Copyright (c) 1998 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Francois Rebufat -// Monique Teillaud - -#include -#include -#include - -#include "_test_cls_tds_vertex.h" -#include "_test_cls_tds_cell.h" - -#include -#include - -template -void -_test_cls_tds_3( const Tds &) -{ - typedef typename Tds::Vertex_range Vertex_range; - typedef typename Tds::Cell_range Cell_range; - - typedef typename Tds::Vertex Vertex; - typedef typename Tds::Cell Cell; - typedef typename Tds::Edge Edge; - typedef typename Tds::Facet Facet; - - typedef typename Tds::Vertex_handle Vertex_handle; - typedef typename Tds::Vertex_iterator Vertex_iterator; - typedef typename Tds::Facet_iterator Facet_iterator; - typedef typename Tds::Edge_iterator Edge_iterator; - typedef typename Tds::Cell_handle Cell_handle; - typedef typename Tds::Cell_iterator Cell_iterator; - - // test rebinds : - typedef CGAL::Triangulation_cell_base_with_info_3 New_cell_base; - // I can't rebind the vertex that easily as the with_info needs a Point... :( - // so let's fake a rebind vertex. - // typedef CGAL::Triangulation_vertex_base_with_info_3 New_vertex_base; - - typedef typename Tds::template Rebind_vertex::Other New_TDS_1; - typedef typename New_TDS_1::template Rebind_cell::Other New_TDS; - - // test Vertex and cell : - std::cout << " Test Vertex " << std::endl; - _test_vertex_tds_3(Vertex()); - - std::cout << " Test Cell " << std::endl; - _test_cell_tds_3(Tds()); - - std::cout << " Testing TDS " << std::endl; - - // Test constructors - std::cout << " constructors" << std::endl; - Tds tds1; - Tds tds2; - - // Test I/O for dimension -2 - // the other dimensions are not tested here - // (they are implicitely tested in triangulation) - Tds tdsfromfile; - std::cout << " I/O" << std::endl; - { - std::ofstream oFileT("Test_tds_IO_3", std::ios::out); - oFileT << tds1; - } - std::ifstream iFileT("Test_tds_IO_3", std::ios::in); - iFileT >> tdsfromfile; - assert(tdsfromfile.is_valid()); - assert(tdsfromfile.dimension() == -2); - assert(tdsfromfile.number_of_vertices() == 0); - - std::cout << " copy" << std::endl; - tds2.insert_increase_dimension(); - assert( tds2.number_of_vertices() == 1 ); - Tds tds3(tds2); - - Vertex_iterator vit; - vit=tds3.vertices_begin(); - tds3.insert_increase_dimension(vit); - std::cout << "ok" << std::endl; - assert(tds3.is_valid()); - Tds tds4 = tds3; - vit=tds4.vertices_begin(); - tds4.insert_increase_dimension(vit); - std::cout << "ok" << std::endl; - assert(tds4.is_valid()); - Tds tds5; - tds5.swap(tds4); - tds4=tds5; - vit=tds5.vertices_begin(); - tds5.insert_increase_dimension(vit); - std::cout << "ok" << std::endl; - assert(tds5.is_valid()); - Tds tds6; - tds6.swap(tds5); - tds5=tds6; - vit=tds6.vertices_begin(); - tds6.insert_increase_dimension(vit); - std::cout << "ok" << std::endl; - assert(tds6.is_valid()); - - std::cout << " Insert are tested in test_triangulation_3 " << std::endl; - - std::cout << " Iterator and circulator are tested in test_triangulation_3 " << std::endl; - - // Access functions - - assert(tds1.dimension()==-2); - assert(tds2.dimension()==-1); - assert(tds3.dimension()==0); - assert(tds4.dimension()==1); - assert(tds5.dimension()==2); - assert(tds6.dimension()==3); - - assert(tds3.number_of_vertices()==2); - - // Containers - Vertex_range & vertex_c = tds3.vertices(); - Cell_range & cell_c = tds3.cells(); - - assert(vertex_c.size() == 2); - assert(cell_c.size() == 2); - - // Flips - std::cout << " Test flip " << std::endl; - assert(tds6.is_valid()); - Cell_iterator cit, cdone; - int nbflips=0; - int i; - cit = tds6.cells_begin(); - tds6.insert_in_cell(cit); - cit = tds6.cells_begin(); - tds6.insert_in_cell(cit); - cit = tds6.cells_begin(); - tds6.insert_in_cell(cit); - assert(tds6.number_of_vertices()==8); -// std::cout << tds6.number_of_cells()<< " cells" << std::endl; - - // We can't use the Cell_iterator while we modify the TDS. - // However, we can store all Cell_handles beforehand, - // since 2-3 flips do not affect the validity of existing cells. - std::vector Cell_v; - for (cit = tds6.cells_begin(); cit != tds6.cells_end(); ++cit) - Cell_v.push_back(cit); - - for (typename std::vector::const_iterator ccit = Cell_v.begin(); - ccit != Cell_v.end(); ++ccit) { - for ( i=0; i<4; i++ ) { - assert(tds6.is_valid()); - assert(tds6.is_cell(*ccit)); - // old name (up to CGAL 3.4) - // kept for backwards compatibility but not documented - std::set< Vertex_handle > set_of_vertices_old; - tds6.incident_vertices( (*ccit)->vertex(i), - std::inserter(set_of_vertices_old, - set_of_vertices_old.begin() ) ); - if ( set_of_vertices_old.find(tds6.mirror_vertex(*ccit, i)) - == set_of_vertices_old.end() ) { - nbflips++; - tds6.flip_flippable( *ccit, i ); - assert(tds6.is_valid()); -// if ( tds6.flip( cit, i ) ) { -// tds6.is_valid(true); -// nbflips++; -// } - } - // correct name - std::set< Vertex_handle > set_of_vertices; - tds6.adjacent_vertices( (*ccit)->vertex(i), - std::inserter(set_of_vertices, - set_of_vertices.begin() ) ); - if ( set_of_vertices.find(tds6.mirror_vertex(*ccit, i)) - == set_of_vertices.end() ) { - nbflips++; - tds6.flip_flippable( *ccit, i ); - assert(tds6.is_valid()); -// if ( tds6.flip( cit, i ) ) { -// tds6.is_valid(true); -// nbflips++; -// } - } - } - } - - for (typename std::vector::const_iterator ccit = Cell_v.begin(); - ccit != Cell_v.end(); ++ccit) { - for ( i=0; i<4; i++ ) { - std::vector< Vertex_handle > vector_of_vertices_old; - std::vector< Vertex_handle > vector_of_vertices; - std::vector< Edge > vector_of_edges; - - // old name (up to CGAL 3.4) - // kept for backwards compatibility but not documented - tds6.incident_vertices - ( (*ccit)->vertex(i), std::back_inserter(vector_of_vertices_old)); - // correct name - tds6.adjacent_vertices - ( (*ccit)->vertex(i), std::back_inserter(vector_of_vertices)); - - tds6.incident_edges - ( (*ccit)->vertex(i), std::back_inserter(vector_of_edges)); - - assert(vector_of_edges.size() == vector_of_vertices_old.size()); - assert(vector_of_edges.size() == vector_of_vertices.size()); - } - } - - - std::cout << nbflips << " flips 2-3" << std::endl; - assert(tds6.number_of_vertices()==8); -// std::cout << tds6.number_of_cells()<< " cells" << std::endl; - - nbflips=0; - bool flipped; - int j; - cit = tds6.cells_begin(); - cdone = tds6.cells_end(); - Cell_iterator next_cell; - while ( cit != cdone ) { - // NOTE : cells are deleted during loop - // the cell_iterator is modified "by hand" (not using ++) - flipped = false; i=0; j=1; - next_cell = ++cit; --cit; - while ( (! flipped) && (i<4) ) { - if ( (i!=j) ) { - // The Intel compiler has a bug and needs the explicit handle. - Cell_handle ch = cit; - flipped = tds6.flip( ch, i, j ) ; - if (flipped) { - nbflips++; - assert(tds6.is_valid()); - } - } - if ( j==3 ) { i++; j=0; } - else j++; - } - cit = next_cell; - } - std::cout << nbflips << " flips 3-2" << std::endl; - assert(tds6.number_of_vertices()==8); - - // test destructor and return - std::cout << " test destructors and return" << std::endl; - - assert(tds1.is_valid()); - assert(tds2.is_valid()); - assert(tdsfromfile.is_valid()); - assert(tds3.is_valid()); - assert(tds4.is_valid()); - assert(tds5.is_valid()); - assert(tds6.is_valid()); - - std::cout << " test decrease dimension" << std::endl; - Tds tds7; - Vertex_handle v7_0 = tds7.insert_increase_dimension(); - Vertex_handle v7_1 = tds7.insert_increase_dimension(v7_0); - Vertex_handle v7_2 = tds7.insert_increase_dimension(v7_1); - Vertex_handle v7_3 = tds7.insert_increase_dimension(v7_2); - Cell_handle fa = v7_3->cell(); - int i7 = fa->index(v7_3); - tds7.decrease_dimension(fa, i7); - assert(tds7.dimension() == 1); - assert(tds7.is_valid()); - Vertex_handle v7_4 = tds7.insert_increase_dimension(v7_3); - Cell_handle fb = v7_4->cell(); - i7 = fb->index(v7_4); - tds7.decrease_dimension(fb, i7); - assert(tds7.dimension() == 1); - assert(tds7.is_valid()); - Vertex_handle v7_5 = tds7.insert_increase_dimension(v7_4); - assert(tds7.dimension() == 2); - assert(tds7.is_valid()); - Vertex_handle v7_6 = tds7.insert_increase_dimension(v7_5); - assert(tds7.dimension() == 3); - assert(tds7.is_valid()); - Cell_handle fc = v7_6->cell(); - i7 = fc->index(v7_6); - tds7.decrease_dimension(fc, i7); - assert(tds7.dimension() == 2); - assert(tds7.is_valid()); - Vertex_handle v7_7 = tds7.insert_increase_dimension(v7_6); - assert(tds7.dimension() == 3); - assert(tds7.is_valid()); - Cell_handle fd = v7_7->cell(); - i7 = fd->index(v7_7); - tds7.decrease_dimension(fd, i7); - assert(tds7.dimension() == 2); - assert(tds7.is_valid()); - Cell_handle fe = v7_7->cell(); - i7 = fe->index(v7_7); - tds7.insert_in_facet(fe, i7); - assert(tds7.dimension() == 2); - assert(tds7.is_valid()); - Vertex_handle v7_8 = tds7.insert_increase_dimension(v7_7); - assert(tds7.dimension() == 3); - assert(tds7.is_valid()); - Cell_handle ff = v7_8->cell(); - i7 = ff->index(v7_8); - tds7.decrease_dimension(ff, i7); - assert(tds7.dimension() == 2); - assert(tds7.is_valid()); - -// tds1.clear(); -// tds2.clear(); -// tds3.clear(); - -} diff --git a/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_tds_cell.h b/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_tds_cell.h deleted file mode 100644 index ad73e73351c..00000000000 --- a/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_tds_cell.h +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright (c) 1998 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Rebufat Francois (Francois.Rebufat@sophia.inria.fr) - -#include - -template -void -_test_cell_tds_3(const Tds &) -{ - typedef typename Tds::Vertex_handle Vertex_handle; - typedef typename Tds::Cell_handle Cell_handle; - - std::cout << " Cells Tds Constructors " << std::endl; - int ind; - Tds tds; - tds.set_dimension(3); - Vertex_handle v0= tds.create_vertex(); - Vertex_handle v1= tds.create_vertex(); - Vertex_handle v2= tds.create_vertex(); - Vertex_handle v3= tds.create_vertex(); - Cell_handle c1 = tds.create_cell(v0, v1, v2, v3); - assert(c1->has_vertex(v0)); - assert(c1->has_vertex(v1)); - assert(c1->has_vertex(v2)); - assert(c1->has_vertex(v3)); - Cell_handle n0=tds.create_cell(); - Cell_handle n1=tds.create_cell(); - Cell_handle n2=tds.create_cell(); - Cell_handle n3=tds.create_cell(); - Cell_handle c2 = tds.create_cell(v0, v1, v2, v3, n0, n1, n2, n3); - - std::cout << " Access cell's functions " << std::endl; - assert(c2->has_vertex(v0)); - ind=c2->index(v0); - assert(c2->vertex(ind)==v0); - assert(c2->has_vertex(v0, ind)); - - assert(c2->has_vertex(v1)); - ind=c2->index(v1); - assert(c2->vertex(ind)==v1); - assert(c2->has_vertex(v1, ind)); - - assert(c2->has_vertex(v2)); - ind=c2->index(v2); - assert(c2->vertex(ind)==v2); - assert(c2->has_vertex(v2, ind)); - - assert(c2->has_vertex(v3)); - ind=c2->index(v3); - assert(c2->vertex(ind)==v3); - assert(c2->has_vertex(v3, ind)); - - assert(c2->has_neighbor(n0)); - ind=c2->index(n0); - assert(c2->neighbor(ind)==n0); - assert(c2->has_neighbor(n0,ind)); - - assert(c2->has_neighbor(n1)); - ind=c2->index(n1); - assert(c2->neighbor(ind)==n1); - assert(c2->has_neighbor(n1,ind)); - - assert(c2->has_neighbor(n2)); - ind=c2->index(n2); - assert(c2->neighbor(ind)==n2); - assert(c2->has_neighbor(n2,ind)); - - assert(c2->has_neighbor(n3)); - ind=c2->index(n3); - assert(c2->neighbor(ind)==n3); - assert(c2->has_neighbor(n3,ind)); - - std::cout << " setting cell's functions " << std::endl; - c2->set_vertex(0,v1); - c2->set_vertex(1,v2); - c2->set_vertex(2,v3); - c2->set_vertex(3,v0); - assert(c2->index(v0)==3); - assert(c2->index(v1)==0); - assert(c2->index(v2)==1); - assert(c2->index(v3)==2); - // c2->set_vertices(); - // assert(c2->vertex(0)==NULL); - // assert(c2->vertex(1)==NULL); - // assert(c2->vertex(2)==NULL); - // assert(c2->vertex(3)==NULL); - c2->set_vertices(v0, v1, v2, v3); - assert(c2->index(v0)==0); - assert(c2->index(v1)==1); - assert(c2->index(v2)==2); - assert(c2->index(v3)==3); - - c2->set_neighbor(0,n1); - c2->set_neighbor(1,n2); - c2->set_neighbor(2,n3); - c2->set_neighbor(3,n0); - assert(c2->index(n0)==3); - assert(c2->index(n1)==0); - assert(c2->index(n2)==1); - assert(c2->index(n3)==2); - // c2->set_neighbors(); - // assert(c2->neighbor(0)==NULL); - // assert(c2->neighbor(1)==NULL); - // assert(c2->neighbor(2)==NULL); - // assert(c2->neighbor(3)==NULL); - c2->set_neighbors(n0, n1, n2, n3); - assert(c2->index(n0)==0); - assert(c2->index(n1)==1); - assert(c2->index(n2)==2); - assert(c2->index(n3)==3); - - std::cout << " Tds Destructors " << std::endl; - tds.delete_vertex(v0); - tds.delete_vertex(v1); - tds.delete_vertex(v2); - tds.delete_vertex(v3); -} diff --git a/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_tds_vertex.h b/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_tds_vertex.h deleted file mode 100644 index 484e4ff08ed..00000000000 --- a/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_tds_vertex.h +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) 1998 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Rebufat Francois - -#include - -template -void -_test_vertex_tds_3(const Vertex &) -{ - typedef typename Vertex::Triangulation_data_structure Tds; - typedef typename Tds::Cell_handle Cell_handle; - typedef typename Tds::Vertex_handle Vertex_handle; - - Tds tds; - - Cell_handle c1 = tds.create_cell(); - Vertex_handle v1 = tds.create_vertex(); - v1->set_cell(c1); - assert(v1->cell() == c1); - c1->set_vertex(0, v1); - assert(tds.is_valid(v1)); - - Cell_handle c2 = tds.create_cell(); - v1->set_cell(c2); - c2->set_vertex(0, v1); - assert(tds.is_valid(v1)); - - // Unicity of the default constructed handle. - Vertex_handle v = Vertex_handle(); - v = Vertex_handle(); - assert(v == Vertex_handle()); - assert(v1 != Vertex_handle()); - - Cell_handle c = Cell_handle(); - c = Cell_handle(); - assert(c == Cell_handle()); - assert(c1 != Cell_handle()); - - // We want the following comparisons to work for use in std::set<>... - bool b1 = v -#include -#include -#include -#include - -#include "_test_cls_iterator.h" -#include "_test_cls_circulator.h" - -#include - -template -void -_test_cls_triangulation_3_input_output(const Triangulation & T, - const char* filename) -{ - const int dim = T.dimension(); - const typename Triangulation::size_type n = T.number_of_vertices(); - std::cout << " I/O" << std::endl; - { - std::ofstream oFile(filename, std::ios::out); - oFile << T; - } - std::ifstream iFile(filename, std::ios::in); - Triangulation Tfromfile; - iFile >> Tfromfile; - assert(Tfromfile.is_valid()); - assert(Tfromfile.dimension() == dim); - assert(Tfromfile.number_of_vertices() == n); - - - std::string filename_bin = filename; - filename_bin = filename_bin + "_binary"; - - const char* filename2 = filename_bin.c_str(); - std::cout << " I/O (binary)" << std::endl; - { - std::ofstream oFileBin(filename2, std::ios::out|std::ios::binary); - CGAL::set_binary_mode(oFileBin); - oFileBin << T; - } - std::ifstream iFileBin(filename2, std::ios::in|std::ios::binary); - CGAL::set_binary_mode(iFileBin); - Triangulation Tfromfile_binary; - iFileBin >> Tfromfile_binary; - assert(Tfromfile_binary.is_valid()); - assert(Tfromfile_binary.dimension() == dim); - assert(Tfromfile_binary.number_of_vertices() == n); -} - -template -void -_test_cls_triangulation_3(const Triangulation &) -{ - typedef Triangulation Cls; - - // We assume the traits class has been tested already - // actually, any traits is good if it has been tested - - typedef typename Cls::Point Point; - typedef typename Cls::Segment Segment; - typedef typename Cls::Triangle Triangle; - typedef typename Cls::Tetrahedron Tetrahedron; - - typedef typename Cls::Vertex Vertex; - typedef typename Cls::Cell Cell; - typedef typename Cls::Facet Facet; - typedef typename Cls::Edge Edge; - - typedef typename Cls::size_type size_type; - typedef typename Cls::difference_type difference_type; - - typedef typename Cls::Vertex_handle Vertex_handle; - typedef typename Cls::Cell_handle Cell_handle; - typedef typename Cls::Vertex_iterator Vertex_iterator; - typedef typename Cls::Cell_iterator Cell_iterator; - // typedef typename Cls::Point_iterator Point_iterator; - typedef typename Cls::Locate_type Locate_type; - typedef std::list list_point; - - typedef typename Cls::Finite_vertices_iterator Finite_vertices_iterator; - typedef typename Cls::Finite_edges_iterator Finite_edges_iterator; - typedef typename Cls::Finite_facets_iterator Finite_facets_iterator; - typedef typename Cls::Finite_cells_iterator Finite_cells_iterator; - - - // +++ We define now some points for building triangulations +++++// - -// list of Points for T1_0 , T1_1, T1_2 : - - - Point p[5]= - { Point(0,0,0),Point(0,0,1),Point(0,0,2),Point(0,0,3),Point(0,0,4)}; - list_point l1; - int i; - for (i=0;i<5;i++) - l1.push_back(p[i]); - - Point pp[5] = { Point(0,0,0),Point(0,0,4),Point(0,0,1),Point(0,0,2),Point(0,0,3)}; - list_point l2; - for (i=0;i<5;i++) - l2.push_back(pp[i]); - - Point ppp[5] ={Point(0,0,1),Point(0,0,2),Point(0,0,3),Point(0,0,0),Point(0,0,4)}; - list_point l3; - for (i=0;i<5;i++) - l3.push_back(ppp[i]); - -// Points for T2_0 : - Point p1=Point(5,5,0); - Point p2=Point(4,4,0); - Point p3=Point(6,6,0); // 1- dimensional until this point - Point p4=Point(5,3,0); // 2-dimensional - Point p5=Point(5,7,0); - Point p6=Point(5,4,0); - Point p7=Point(5,6,0); - Point p8=Point(0,0,0); - Point p9=Point(5,5,0); - - // Points for T3_1 : - Point q[22] = - { - Point(0,0,0), Point(4,4,0), Point(0,4,0), Point(4,0,0), - Point(1,3,1), Point(3,1,1), Point(3,3,1), Point(1,1,1), Point(2,2,2), - Point(1,3,3), Point(3,1,3), Point(3,3,3), Point(1,1,3), - Point(0,0,4), Point(4,4,4), Point(0,4,4), Point(4,0,4), - Point(1,3,5), Point(3,1,5), Point(3,3,5), Point(1,1,5), Point(2,2,6)}; - - // Points for T3_2 : - - list_point lp; - int a, b, d; -// for (a=0;a!=10;a++) -// for (b=0;b!=10;b++) -// for (d=0;d!=10;d++) -// lp.push_back(Point(a*b-d*a + (a-b)*10 +a ,a-b+d +5*b, -// a*a-d*d+b)); - - for (a=0;a!=10;a++) - for (b=0;b!=10;b++) - for (d=0;d!=5;d++) - lp.push_back(Point(a*b-d*a + (a-b)*10 +a ,a-b+d +5*b, - a*a-d*d+b)); - - // Points for T3_2 : - - list_point lp2; - for (a=0;a!=4;a++) - for (b=0;b!=4;b++) - for (d=0;d!=4;d++) - lp2.push_back(Point((a*b-d*a)*10 +a ,(a-b+d +5*b)*100, - a*a-d*d-b)); - - //######################################################################## - - - /**************CONSTRUCTORS (1)*********************/ - /************** and I/O ****************************/ - - std::cout << " Constructor " << std::endl; - // Beginning with an empty triangulation and adding points until reaching - // 3-dimensional triangulation. - Cls T0; - assert(T0.dimension() == -1); - assert(T0.number_of_vertices() == 0); - assert(T0.is_valid()); - - if (! del) // to avoid doing the following tests for both Delaunay - // and non Delaunay triangulations - { - _test_cls_triangulation_3_input_output(T0, "Test1_triangulation_IO_3"); - } - - std::cout << " Constructor1 " << std::endl; - Point p10(0,0,0); - Vertex_handle v0=T0.insert(p10); - assert(T0.dimension() == 0); - assert(T0.number_of_vertices() == 1); - assert(T0.is_valid()); - - if (! del) // to avoid doing the following tests for both Delaunay - // and non Delaunay triangulations - { - _test_cls_triangulation_3_input_output(T0, "Test2_triangulation_IO_3"); - } - - std::cout << " Constructor2 " << std::endl; - - Point p11(100,100,0); - v0=T0.insert(p11); - assert(T0.dimension() == 1); - assert(T0.number_of_vertices() == 2); - assert(T0.is_valid()); - - if (! del) // to avoid doing the following tests for both Delaunay - // and non Delaunay triangulations - { - _test_cls_triangulation_3_input_output(T0, "Test3_triangulation_IO_3"); - } - - std::cout << " Constructor3 " << std::endl; - - Point p12(100,-100,0); - v0=T0.insert(p12); - assert(T0.dimension() == 2); - assert(T0.number_of_vertices() == 3); - assert(T0.is_valid()); - - if (! del) // to avoid doing the following tests for both Delaunay - // and non Delaunay triangulations - { - _test_cls_triangulation_3_input_output(T0, "Test4_triangulation_IO_3"); - } - - std::cout << " Constructor4 " << std::endl; - - Point p13(50,0,100); - v0=T0.insert(p13); - assert(T0.dimension() == 3); - assert(T0.number_of_vertices() == 4); - assert(T0.is_valid()); - - if (! del) // to avoid doing the following tests for both Delaunay - // and non Delaunay triangulations - { - _test_cls_triangulation_3_input_output(T0, "Test5_triangulation_IO_3"); - } - - std::cout << " Constructor5 " << std::endl; - - Point p14(50,0,100); - v0=T0.insert(p14); - assert(T0.dimension() == 3); - assert(T0.number_of_vertices() == 4); - assert(T0.is_valid()); - - // copy constructor - Cls T1(T0); - assert(T1.dimension() == 3); - assert(T1.number_of_vertices() == 4); - assert(T1.is_valid()); - - std::cout << " Testing operator==" << std::endl; - assert(T0 == T0); - assert(T0 == T1); - assert(T1 == T0); - assert(T1 == T1); - - T1.clear(); - assert(T1.dimension() == -1); - assert(T1.number_of_vertices() == 0); - assert(T1.is_valid()); - - - - // Assignment - T1=T0; - assert(T1.dimension() == 3); - assert(T1.number_of_vertices() == 4); - assert(T1.is_valid()); - T1.clear(); - - - T1.swap(T0); - assert(T1.dimension() == 3); - assert(T1.number_of_vertices() == 4); - assert(T1.is_valid()); - assert(T0.dimension() == -1); - assert(T0.number_of_vertices() == 0); - assert(T0.is_valid()); - T0.swap(T1); - - assert(T0.dimension() == 3); - assert(T0.number_of_vertices() == 4); - assert(T0.is_valid()); - assert(T1.dimension() == -1); - - // Building some psychotic triangulations : - std::cout << " Constructor6 " << std::endl; - // triangulation 1-dimensional : vertical line. - Cls T1_0; - size_type n = T1_0.insert(l1.begin(),l1.end()); - assert(n==5); - assert(T1_0.dimension()==1); - assert(T1_0.number_of_vertices()==n); - assert(T1_0.is_valid()); - std::cout << " Constructor7 " << std::endl; - Cls T1_1; - n = T1_1.insert(l2.begin(),l2.end()); - assert(n==5); - assert(T1_1.dimension()==1); - assert(T1_1.number_of_vertices()==n); - assert(T1_1.is_valid()); - std::cout << " Constructor8 " << std::endl; - Cls T1_2; - n = T1_2.insert(l3.begin(),l3.end()); - assert(n==5); - assert(T1_2.dimension()==1); - assert(T1_2.number_of_vertices()==n); -// // test for point_iterator -// Point_iterator pit; -// Point pppp; -// int nbpt=0; -// for (pit = T1_2.points_begin(); pit != T1_2.points_end(); ++pit) { -// nbpt++; -// pppp = *pit; -// } -// assert(nbpt==n); - assert(T1_2.is_valid()); - - if (! del) // to avoid doing the following tests for both Delaunay - // and non Delaunay triangulations - { - _test_cls_triangulation_3_input_output(T1_2, "Test6_triangulation_IO_3"); - } - - std::cout << " Constructor9 " << std::endl; - // 2-dimensional triangulations - - Cls T2_0; - v0=T2_0.insert(p1); - - v0=T2_0.insert(p2); - - v0=T2_0.insert(p3); - - assert(T2_0.is_valid()); - assert(T2_0.dimension()==1); - assert(T2_0.number_of_vertices()==3); - - - v0=T2_0.insert(p4); - assert(T2_0.is_valid()); - assert(T2_0.dimension()==2); - assert(T2_0.number_of_vertices()==4); - - - v0=T2_0.insert(p5); - v0=T2_0.insert(p6); - v0=T2_0.insert(p7); - v0=T2_0.insert(p8); - v0=T2_0.insert(p9); - - assert(T2_0.is_valid()); - assert(T2_0.dimension()==2); - assert(T2_0.number_of_vertices()==8); - - if (! del) // to avoid doing the following tests for both Delaunay - // and non Delaunay triangulations - { - _test_cls_triangulation_3_input_output(T2_0, "Test7_triangulation_IO_3"); - } - - std::cout << " Constructor10 " << std::endl; - // test grid insert - Cls T2_1; - int m; - int px=1, py=1; - int qx=-1, qy=2; - Point qq[400]; - for (m=0; m<20; m++) - for (n=0; n<20; n++) - { - qq[m+20*n] = Point(m*px+(int)n*qx, m*py+(int)n*qy, 1); - T2_1.insert( qq[m+20*n] ); - } - assert( T2_1.number_of_vertices() == m*n ); - assert( T2_1.dimension()==2 ); - assert( T2_1.is_valid() ); - - std::cout << " Constructor11 " << std::endl; - // 3-dimensional triangulations - // This is a simple grid : - int x,y,z; - Cls T3_0; - Point r[225]; - for (z=0 ; z<5 ; z++) - for (y=0 ; y<5 ; y++) - for (x=0 ; x<5 ; x++) - { - r[x+5*y+25*z] = Point(x,y,z); - v0=T3_0.insert(r[x+5*y+25*z]); - } - assert(T3_0.is_valid()); - assert(T3_0.number_of_vertices()==125); - assert(T3_0.dimension()==3); - - - std::cout << " Constructor12 " << std::endl; - Cls T3_1; - for (i=0;i<22;i++) - T3_1.insert(q[i]); - assert(T3_1.is_valid()); - assert(T3_1.number_of_vertices()==22); - assert(T3_1.dimension()==3); - - if (! del) // to avoid doing the following tests for both Delaunay - // and non Delaunay triangulations - { - _test_cls_triangulation_3_input_output(T3_1, "Test8_triangulation_IO_3"); - } - - - //####################################################################### - std::cout << " list insertion"<< std::endl; - Cls T3_2_1; - T3_2_1.insert(lp2.begin(),lp2.end()); - assert(T3_2_1.is_valid()); - - assert(T3_2_1.dimension()==3); - // assert(T3_2.number_of_vertices()==1000); - std::cout << " end of insertion " << std::endl; - - // The same using the template constructor. - std::cout << " template ctor"<< std::endl; - Cls T3_2_2(lp2.begin(), lp2.end()); - assert(T3_2_2.is_valid()); - - assert(T3_2_2.dimension()==3); - std::cout << " end of insertion " << std::endl; - - //######################################################################## - - - std::cout << " 500 points insertion"<< std::endl; - Cls T3_2; - typename list_point::iterator it; - int count = 0 ; - std::cout << " number of inserted points : " ; - for (it=lp.begin(); it!=lp.end();it++){ - count++; - T3_2.insert(*it); - if (count <10) - std::cout << count << '\b' ; - else - if (count < 100) - std::cout << count << '\b' << '\b' ; - else - if (count < 1000) - std::cout << count << '\b' << '\b' << '\b' ; - else - std::cout << count << std::endl; - std::cout.flush(); - } - std::cout << std::endl; - assert(T3_2.is_valid()); - assert(T3_2.dimension()==3); - assert(T3_2.number_of_vertices()==500); - - - - Point p110(-5,5,0), p111(-2,-5,2), p112(-2,-9,6), p113(4,8,9), p114(5,-6,0), - p115(3,0,5), p116(-9,0,-10), p117(1,6,-2), p118(-3,2,-4), p119(3,-3,-1); - Cls T3_5; - v0=T3_5.insert(p110); - v0=T3_5.insert(p111); - v0=T3_5.insert(p112); - v0=T3_5.insert(p113); - v0=T3_5.insert(p114); - v0=T3_5.insert(p115); - v0=T3_5.insert(p116); - v0=T3_5.insert(p117); - v0=T3_5.insert(p118, v0->cell()); // testing with the hint - v0=T3_5.insert(p119, v0); // testing with the hint - - assert(T3_5.is_valid()); - assert(T3_5.number_of_vertices()==10); - -// // Test random triangulation : - -// Cls T3_4; -// CGAL::Random random; -// for (n=1;n<50;n++) { -// x=random.get_int(-500,500); -// y=random.get_int(-500,500); -// z=random.get_int(-500,500); -// v0=T3_4.insert(Point(x,y,z)); -// } -// assert(T3_4.is_valid()); -// assert(T3_4.dimension()==3); -// assert(T3_4.is_valid()); - -// // %%%%%%%%%% deletion in Delaunay -// bool success(true); -// if (del) { -// std::cout << " deletion in a Delaunay of " -// << T3_4.number_of_vertices() << " random points"; -// Vertex_handle v; -// while ( T3_4.number_of_vertices() >= 1 ) { -// if ( T3_4.dimension() > 1 ) -// v = T3_4.infinite_cell()->vertex -// ( (T3_4.infinite_cell()->index( T3_4.infinite_vertex() ) +1 )&3 ); -// else -// if ( T3_4.dimension() == 1 ) -// v = T3_4.infinite_cell()->vertex -// ( (T3_4.infinite_cell()->index( T3_4.infinite_vertex() ) +1 )%2 ); -// else -// v = T3_4.infinite_cell()->neighbor(0)->vertex(0); - -// success = T3_4.remove( v ); -// } -// if (success) assert(T3_4.is_valid(false)); -// } -// std::cout << " done" << std::endl; - - - // Test inserts function separatelly. - - std::cout << " Testing insertions " << std::endl; - Locate_type lt; - int li,lj,i1,i2; - Cls Ti = T0; - Point p20(50,0,50); - v0=Ti.insert_in_cell(p20,Ti.locate(Point(50,0,50))); - assert(Ti.is_valid()); - assert(Ti.number_of_vertices() == 5); - Ti=T0; - Point p120(50,0,0); - v0=Ti.insert_in_facet(p120,Ti.locate(Point(50,0,1)),3); - assert(Ti.is_valid()); - assert(Ti.number_of_vertices() == 5); - Ti=T0; - Point p21(50,0,0); - v0=Ti.insert_in_facet(p21,Facet(Ti.locate(Point(50,0,1)),3)); - assert(Ti.is_valid()); - assert(Ti.number_of_vertices() == 5); - Ti=T0; - Cell_handle c= Ti.locate(Point(0,0,0),lt,li,lj); - assert(lt==Cls::VERTEX); - i1=li; - c= Ti.locate(Point(100,100,0),lt,li,lj); - assert(lt==Cls::VERTEX); - i2=li; - - // testing the locate with hint. - Cell_handle ccc = Ti.locate(Point(100,100,0),c); - assert(c == ccc); - ccc = Ti.locate(Point(100,100,0),c->vertex(0)); - - Point p22(50,50,0); - v0=Ti.insert_in_edge(p22,Ti.locate(Point(50,40,1)),i1,i2); - assert(Ti.is_valid()); - assert(Ti.number_of_vertices() == 5); - - Ti=T0; - c= Ti.locate(Point(0,0,0),lt,li,lj); - assert(lt==Cls::VERTEX); - i1=li; - c= Ti.locate(Point(100,100,0),lt,li,lj); - assert(lt==Cls::VERTEX); - i2=li; - Point p23(50,50,0); - v0=Ti.insert_in_edge(p23,Edge(Ti.locate(Point(50,50,0)),i1,i2)); - assert(Ti.is_valid()); - assert(Ti.number_of_vertices() == 5); - - Ti=T0; - - assert(T0.dimension() == 3); - assert(T0.number_of_vertices() == 4); - assert(T0.is_valid()); - - - c= Ti.locate(Point(50,50,50),lt,li,lj); - - Point p24(50,50,50); - v0= Ti.insert_outside_convex_hull(p24,c); - assert(Ti.is_valid()); - - assert(Ti.number_of_vertices() == 5); - - Cls T3_3=T1_0; - Point p25(2,0,0); - v0=T3_3.insert_outside_affine_hull(p25); - assert(T3_3.is_valid()); - assert(T3_3.dimension()==2); - c= T3_3.locate(Point(4,0,0),lt,li,lj); - Point p26(4,0,0); - v0=T3_3.insert_outside_convex_hull(p26,c); - assert(T3_3.is_valid()); - assert(T3_3.dimension()==2); - Point p27(0,5,0); - v0=T3_3.insert_outside_affine_hull(p27); - assert(T3_3.is_valid()); - assert(T3_3.dimension()==3); - - // ################## Operations + newly created cells ################ - // Small test for inserting and returning the newly created cells - // (the code is mainly the usual insert + incident_{edges,facets,cells} - // depending on the dimension) - - std::cout << " Test insertion + newly created cells: " << std::endl; - - std::cout << " 1 dimension" << std::endl; - // dimension 1 - Cls TAI1; - for(int i=0; i<50; i++) - { - double x = (double) (2*i); - TAI1.insert(Point(x, x, x)); - } - std::list lis_tai1; - for(int i=0; i<51; i++) - { - lis_tai1.clear(); - double x = (double) (2*i - 1); - Vertex_handle taiv = - TAI1.insert_and_give_new_cells( - Point(x, x, x), - std::back_inserter(lis_tai1)); - assert(TAI1.is_valid()); - assert(TAI1.dimension() == 1); - assert(lis_tai1.size() == 2); - while(!lis_tai1.empty()) - { - Cell_handle c = lis_tai1.front(); - lis_tai1.pop_front(); - assert(TAI1.tds().is_simplex(c)); - } - } - TAI1.clear(); - - std::cout << " 2 dimensions" << std::endl; - CGAL::Random grand; - for(int i=0; i<50; i++) - { - double x = grand.get_double(); - double y = grand.get_double(); - TAI1.insert(Point(x, y, 0)); - } - for(int i=0; i<50; i++) - { - lis_tai1.clear(); - double x = grand.get_double(); - double y = grand.get_double(); - Vertex_handle taiv = - TAI1.insert_and_give_new_cells( - Point(x, y, 0), - std::back_inserter(lis_tai1)); - assert(TAI1.is_valid()); - assert(TAI1.dimension() == 2); - while(!lis_tai1.empty()) - { - Cell_handle c = lis_tai1.front(); - lis_tai1.pop_front(); - assert(TAI1.tds().is_simplex(c)); - } - } - TAI1.clear(); - - std::cout << " 3 dimensions" << std::endl; - for(int i=0; i<50; i++) - { - double x = grand.get_double(); - double y = grand.get_double(); - double z = grand.get_double(); - TAI1.insert(Point(x, y, z)); - } - for(int i=0; i<50; i++) - { - lis_tai1.clear(); - double x = grand.get_double(); - double y = grand.get_double(); - double z = grand.get_double(); - Vertex_handle taiv = - TAI1.insert_and_give_new_cells( - Point(x, y, z), - std::back_inserter(lis_tai1)); - assert(TAI1.is_valid()); - assert(TAI1.dimension() == 3); - while(!lis_tai1.empty()) - { - Cell_handle c = lis_tai1.front(); - lis_tai1.pop_front(); - assert(TAI1.tds().is_simplex(c)); - } - } - TAI1.clear(); - - // the other two insertion methods is exactly the same - // with different version of the basic insert method - // Vertex_handle insert_and_give_new_cells(const Point& p, - // OutputItCells fit, - // Vertex_handle hint) - // Vertex_handle insert_and_give_new_cells(const Point& p, - // Locate_type lt, Cell_handle c, int li, int lj, - // OutputItCells fit - - - // ################################################################## - - - // testing some simple basic methods (access functions) - - std::cout << " Boolean and query functions " <index(T0.infinite_vertex()); - - Facet f ; - for (i=0;i<4;i++) - if (i!=ind) { - assert(T0.is_infinite(c,i)); - f=Facet(c,i); - assert(T0.is_infinite(f)); - } - int j; - - for (i=0;i<4;i++) - for (j=0;i<4;i++) - if ((i!=j) && ((i==ind) || (j==ind))) { - assert(T0.is_infinite(c,i,j)); - assert(T0.is_infinite(Edge(c,i,j))); - } - - - v0=T0.infinite_vertex(); - assert(T0.is_infinite(v0)); - - Finite_vertices_iterator vit; - Vertex_handle w; - for (vit=T3_1.finite_vertices_begin();vit!=T3_1.finite_vertices_end();vit++) - assert(T3_1.is_vertex(vit->point(), w)); - - // test mirrors - c = T0.infinite_cell(); - for (i=0;i<4;i++) { - Cell_handle d = c->neighbor(i); - int j = T0.mirror_index(c,i); - assert(d->vertex(j) == T0.mirror_vertex(c,i)); - assert(Facet(d,j) == T0.mirror_facet(Facet(c,i))); - } - - - - // geometric functions - std::cout << "Geometric functions " << std::endl; - c= T0.locate(Point(50,0,1),lt,li,lj); - Tetrahedron tr1=T0.tetrahedron(c); - c= T0.locate(Point(10,0,1),lt,li,lj); - Tetrahedron tr2=T0.tetrahedron(c); - assert(tr1==tr2); - c= T0.locate(Point(50,0,5),lt,li,lj); - Triangle tri1=T0.triangle(c,1); - c= T0.locate(Point(10,0,1),lt,li,lj); - Triangle tri2=T0.triangle(Facet(c,1)); - assert(tri1==tri2); - c= T0.locate(Point(10,0,1),lt,li,lj); - Segment s1 = T0.segment(c,0,1); - c= T0.locate(Point(50,0,5),lt,li,lj); - Segment s2 = T0.segment(Edge(c,0,1)); - assert(s1==s2); - c= T0.locate(Point(50,0,5),lt,li,lj); - Point pt1 = T0.point(c,0); - c= T0.locate(Point(10,0,1),lt,li,lj); - Point pt2 = T0.point(c->vertex(0)); - assert(pt1==pt2); - c= T0.locate(Point(20,0,2),lt,li,lj); - Point pt3 = c->vertex(0)->point(); - assert(pt2==pt3); - - if (! del) { // Delaunay should not be flipped - // or it will not be Delaunay any longer --> not valid - std::cout << " Test flip " << std::endl; - assert( T3_1.is_valid()); - Finite_cells_iterator cit, cdone = T3_1.finite_cells_end(); - int nbflips=0; - bool flipped; - cit = T3_1.finite_cells_begin(); - Finite_cells_iterator next_cell; - while ( cit != cdone ) { - // NOTE : cells are deleted during loop - // the cell_iterator is modified "by hand" (not using ++) - flipped = false; i=0; j=1; - next_cell = ++cit; --cit; - while ( (! flipped) && (i<4) ) { - if ( (i!=j) ) { - flipped = T3_1.flip( cit, i, j ) ; - if (flipped) { - nbflips++; - assert(T3_1.is_valid()); - } - } - if ( j==3 ) { i++; j=0; } - else j++; - } - cit = next_cell; - } - std::cout << nbflips << " flips 3-2" << std::endl; - - nbflips=0; - for ( cit = T3_1.finite_cells_begin(); cit != cdone; cit++ ) { - // NOTE : the triangulation is modified during loop - // --> the cell_iterator does not mean a lot - for ( i=0; i<4; i++ ) { - flipped = T3_1.flip( cit, i ); - if (flipped) { - nbflips++; - assert(T3_1.is_valid()); - } - } - } - std::cout << nbflips << " flips 2-3" << std::endl; - } - - // Finite incident_* in dimension 2 test - std::cout << " Testing finite_incident_* in dim 2 "<< std::endl; - Cls* T2[2]; - T2[0] = &T2_0; - T2[1] = &T2_1; - - for(int k = 0; k < 2; ++k) { - std::cout << " with triangulation " << k + 1 << ": "; - - std::vector f_vertices_old; - std::vector f_vertices; - std::vector f_edges; - std::vector f_facets; - std::vector f_cells; - - f_vertices.clear(); - f_edges.clear(); - f_facets.clear(); - f_cells.clear(); - - for(Finite_vertices_iterator i = T2[k]->finite_vertices_begin(); - i != T2[k]->finite_vertices_end(); ++i) { - // old name (up to CGAL 3.4) - // kept for backwards compatibility but not documented - T2[k]->finite_incident_vertices(i, std::back_inserter(f_vertices_old)); - // correct name - T2[k]->finite_adjacent_vertices(i, std::back_inserter(f_vertices)); - T2[k]->finite_incident_edges(i, std::back_inserter(f_edges)); - T2[k]->finite_incident_facets(i, std::back_inserter(f_facets)); - T2[k]->finite_incident_cells(i, std::back_inserter(f_cells)); - } - unsigned int nb_f_edges = 0; - Finite_edges_iterator feit = T2[k]->finite_edges_begin(); - while(feit != T2[k]->finite_edges_end()) { - ++nb_f_edges; - ++feit; - } - unsigned int nb_f_facets = 0; - Finite_facets_iterator ffait = T2[k]->finite_facets_begin(); - while(ffait != T2[k]->finite_facets_end()) { - ++nb_f_facets; - ++ffait; - } - - // incidences - assert(f_edges.size() == f_vertices_old.size()); - assert(f_edges.size() == f_vertices.size()); - assert(2*nb_f_edges == f_edges.size()); - assert(3*nb_f_facets == f_facets.size()); - assert(3*nb_f_facets == f_cells.size()); - - typename Cls::size_type nb_f_vertices = T2[k]->number_of_vertices(); - - // Euler relation - assert(nb_f_vertices - nb_f_edges + nb_f_facets == 1); - std::cout << "ok\n"; - } - - // Finite incident_* to vertex test - std::cout << " Testing finite_incident_* in dim 3 "<< std::endl; - - Cls* T3[6]; - T3[0] = &T3_0; - T3[1] = &T3_1; - T3[2] = &T3_2_1; - T3[3] = &T3_2_2; - T3[4] = &T3_2; - T3[5] = &T3_3; - - for(int k = 0; k < 6; ++k) { - std::cout << " with triangulation " << k + 1 << ": "; - - std::vector f_vertices_old; - std::vector f_vertices; - std::vector f_edges; - std::vector f_facets; - std::vector f_cells; - - f_vertices.clear(); - f_edges.clear(); - f_facets.clear(); - f_cells.clear(); - - for(Finite_vertices_iterator i = T3[k]->finite_vertices_begin(); - i != T3[k]->finite_vertices_end(); ++i) { - // old name (up to CGAL 3.4) - // kept for backwards compatibility but not documented - T3[k]->finite_incident_vertices(i, std::back_inserter(f_vertices_old)); - // correct name - T3[k]->finite_adjacent_vertices(i, std::back_inserter(f_vertices)); - T3[k]->finite_incident_edges(i, std::back_inserter(f_edges)); - T3[k]->finite_incident_facets(i, std::back_inserter(f_facets)); - T3[k]->finite_incident_cells(i, std::back_inserter(f_cells)); - } - unsigned int nb_f_edges = 0; - Finite_edges_iterator feit = T3[k]->finite_edges_begin(); - while(feit != T3[k]->finite_edges_end()) { - ++nb_f_edges; - ++feit; - } - unsigned int nb_f_facets = 0; - Finite_facets_iterator ffait = T3[k]->finite_facets_begin(); - while(ffait != T3[k]->finite_facets_end()) { - ++nb_f_facets; - ++ffait; - } - unsigned int nb_f_cells = 0; - Finite_cells_iterator fcit = T3[k]->finite_cells_begin(); - while(fcit != T3[k]->finite_cells_end()) { - ++nb_f_cells; - ++fcit; - } - - // incidences - assert(f_edges.size() == f_vertices_old.size()); - assert(f_edges.size() == f_vertices.size()); - assert(2*nb_f_edges == f_edges.size()); - assert(3*nb_f_facets == f_facets.size()); - assert(4*nb_f_cells == f_cells.size()); - - typename Cls::size_type nb_f_vertices = T3[k]->number_of_vertices(); - - // Euler relation - assert(nb_f_vertices - nb_f_edges + nb_f_facets - nb_f_cells == 1); - std::cout << "ok\n"; - } - // Iterator and circulator test - - Cls T0_1; - Point p28(1,3,5); - v0=T0_1.insert(p28); - - std::cout << " Testing Iterator "<< std::endl; - _test_vertex_iterator(T0_1); - _test_triangulation_iterator(T0_1); - _test_vertex_iterator(T0); - _test_triangulation_iterator(T0); - _test_vertex_iterator(T2_0); - _test_triangulation_iterator(T2_0); - _test_vertex_iterator(T1_0); - _test_triangulation_iterator(T1_0); - _test_vertex_iterator(T3_1); - _test_triangulation_iterator(T3_1); - _test_vertex_iterator(T3_0); - _test_triangulation_iterator(T3_0); - _test_vertex_iterator(T3_2); - _test_triangulation_iterator(T3_2); - _test_vertex_iterator(T3_3); - _test_triangulation_iterator(T3_3); - - std::cout << " Testing Circulator "<< std::endl; - _test_circulator(T0); - _test_circulator(T3_1); - _test_circulator(T3_0); - _test_circulator(T3_2); - _test_circulator(T3_3); - - std::cout <<" Test destructors and quit "<< std::endl; - - T0.clear(); - assert(T0.is_valid()); - T3_0.clear(); - assert(T3_0.is_valid()); - assert(T3_0.dimension()==-1); - assert(T3_0.number_of_vertices()==0); -} diff --git a/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_triangulation_simplex_3.h b/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_triangulation_simplex_3.h deleted file mode 100644 index 69ba75e7e78..00000000000 --- a/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_cls_triangulation_simplex_3.h +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright (c) 1998 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Nico Kruithof - -#include -#include - -template -void -_test_cls_triangulation_simplex_3(const Triangulation &) -{ - typedef Triangulation Cls; - - typedef typename Cls::Simplex Simplex; - - typedef typename Cls::Point Point; - - typedef typename Cls::Vertex Vertex; - typedef typename Cls::Cell Cell; - typedef typename Cls::Facet Facet; - typedef typename Cls::Edge Edge; - - typedef typename Cls::size_type size_type; - typedef typename Cls::difference_type difference_type; - - typedef typename Cls::Vertex_handle Vertex_handle; - typedef typename Cls::Cell_handle Cell_handle; - - typedef typename Cls::Cell_circulator Cell_circulator; - typedef typename Cls::Facet_circulator Facet_circulator; - - typedef typename Cls::Cell_iterator Cell_iterator; - typedef typename Cls::Facet_iterator Facet_iterator; - typedef typename Cls::Edge_iterator Edge_iterator; - typedef typename Cls::Vertex_iterator Vertex_iterator; - - typedef typename Cls::Finite_vertices_iterator Finite_vertices_iterator; - typedef typename Cls::Finite_edges_iterator Finite_edges_iterator; - typedef typename Cls::Finite_facets_iterator Finite_facets_iterator; - typedef typename Cls::Finite_cells_iterator Finite_cells_iterator; - - //######################################################################## - Cls t; - - // Initialise to a 3D triangulation: - t.insert(Point(0,0,0)); - t.insert(Point(1,0,0)); - t.insert(Point(0,1,0)); - t.insert(Point(0,0,1)); - - { // Check vertices: - Finite_vertices_iterator vit = t.finite_vertices_begin(); - Vertex_handle vh = vit; - - Simplex s1 = vh; - - Simplex s2(vit); - Simplex s3(vh); - - Simplex s4(s1); - - CGAL_assertion(s1.dimension() == 0); - CGAL_assertion(s1 == s2); - CGAL_assertion(s1 == s3); - CGAL_assertion(s1 == s4); - Vertex_handle vh2 = s1; - CGAL_assertion(vh == vh2); - } - - { // Check edges - Finite_edges_iterator eit = t.finite_edges_begin(); - Edge e = *eit; - - Simplex s1 = *eit; - Simplex s2 = e; - - Simplex s3(*eit); - Simplex s4(e); - - Simplex s5(s1); - - CGAL_assertion(s1.dimension() == 1); - CGAL_assertion(s1 == s2); - CGAL_assertion(s1 == s3); - CGAL_assertion(s1 == s4); - CGAL_assertion(s1 == s5); - Edge e2 = s1; - CGAL_assertion(e == e2); - } - - { // Check facets - Finite_facets_iterator fit = t.finite_facets_begin(); - Facet f = *fit; - - Simplex s1 = *fit; - Simplex s2 = f; - - Simplex s3(*fit); - Simplex s4(f); - - Simplex s5(s1); - - CGAL_assertion(s1.dimension() == 2); - CGAL_assertion(s1 == s2); - CGAL_assertion(s1 == s3); - CGAL_assertion(s1 == s4); - CGAL_assertion(s1 == s5); - Facet f2 = s1; - CGAL_assertion(f == f2); - } - - { // Check cells - Finite_cells_iterator cit = t.finite_cells_begin(); - Cell_handle ch = cit; - - Simplex s1 = Simplex(cit); - Simplex s2 = ch; - - Simplex s3(cit); - Simplex s4(ch); - - Simplex s5(s1); - - CGAL_assertion(s1.dimension() == 3); - CGAL_assertion(s1 == s2); - CGAL_assertion(s1 == s3); - CGAL_assertion(s1 == s4); - CGAL_assertion(s1 == s5); - Cell_handle ch2 = s1; - CGAL_assertion(ch == ch2); - } -} diff --git a/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_remove_cluster.h b/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_remove_cluster.h deleted file mode 100644 index e8e2edf0b2d..00000000000 --- a/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_remove_cluster.h +++ /dev/null @@ -1,758 +0,0 @@ -#include - -#include -#include -#include - -template -void _test_rc_random_1() -{ - typedef T D3; - typedef typename D3::Point Point; - typedef typename D3::Vertex_handle Vertex_handle; - typedef typename D3::Cell_handle Cell_handle; - typedef typename D3::Finite_vertices_iterator Finite_vertices_iterator; - typedef typename D3::Locate_type Locate_type; - typedef typename D3::Geom_traits::Sphere_3 Sphere_3; - typedef Point Point_3; - - std::cout << "_test_rc_random_1" << std::endl; - - std::vector to_insert; - std::vector to_remove; - D3 dt; - - CGAL::Random_points_in_cube_3 cube_insert(1.0); - - const int number_of_points = (1<<14); - - for(int i=0; ipoint()) && - s2.has_on_unbounded_side(fit->point())) to_remove.push_back(fit); - } - - std::size_t s1 = dt.number_of_vertices(); - std::size_t s2 = to_remove.size(); - std::size_t ns = dt.remove_cluster(to_remove.begin(), to_remove.end()); - assert(dt.is_valid()); - assert(ns == s2); - assert(dt.number_of_vertices() + s2 == s1); -} - -template -void _test_rc_random_2() -{ - typedef T D3; - typedef typename D3::Point Point; - typedef typename D3::Vertex_handle Vertex_handle; - typedef typename D3::Cell_handle Cell_handle; - typedef typename D3::Finite_vertices_iterator Finite_vertices_iterator; - typedef typename D3::Locate_type Locate_type; - typedef typename D3::Geom_traits::Sphere_3 Sphere_3; - typedef Point Point_3; - - std::cout << "_test_rc_random_2" << std::endl; - - std::vector to_insert; - std::vector to_remove; - D3 dt; - - CGAL::Random_points_in_cube_3 cube_insert(1.0); - - const int number_of_points = (1<<14); - - for(int i=0; ipoint())) to_remove.push_back(fit); - if(s2.has_on_bounded_side(fit->point())) to_remove.push_back(fit); - } - - std::size_t s1 = dt.number_of_vertices(); - std::size_t s2 = to_remove.size(); - std::size_t ns = dt.remove_cluster(to_remove.begin(), to_remove.end()); - assert(dt.is_valid()); - assert(ns == s2); - assert(dt.number_of_vertices() + s2 == s1); -} - -template -void _test_rc_random_3() -{ - typedef T D3; - typedef typename D3::Point Point; - typedef typename D3::Vertex_handle Vertex_handle; - typedef typename D3::Cell_handle Cell_handle; - typedef typename D3::Finite_vertices_iterator Finite_vertices_iterator; - typedef typename D3::Locate_type Locate_type; - typedef typename D3::Geom_traits::Sphere_3 Sphere_3; - typedef Point Point_3; - - std::cout << "_test_rc_random_3" << std::endl; - - std::vector to_insert; - std::vector to_remove; - D3 dt; - - CGAL::Random random; - CGAL::Random_points_in_cube_3 cube_insert(1.0); - - const int number_of_points = (1<<14); - - for(int i=0; i -void _test_rc_random_4() -{ - typedef T D3; - typedef typename D3::Point Point; - typedef typename D3::Vertex_handle Vertex_handle; - typedef typename D3::Cell_handle Cell_handle; - typedef typename D3::Finite_vertices_iterator Finite_vertices_iterator; - typedef typename D3::Locate_type Locate_type; - typedef typename D3::Geom_traits::Sphere_3 Sphere_3; - typedef Point Point_3; - - std::cout << "_test_rc_random_4" << std::endl; - - std::vector to_insert; - std::vector to_remove; - D3 dt; - - CGAL::Random random; - CGAL::Random_points_in_cube_3 cube_insert(1.0); - - const int number_of_points = (1<<14); - - for(int i=0; i -void _test_rc_trivial() -{ - typedef T D3; - typedef typename D3::Point Point; - typedef typename D3::Vertex_handle Vertex_handle; - typedef typename D3::Cell_handle Cell_handle; - typedef typename D3::Finite_vertices_iterator Finite_vertices_iterator; - typedef typename D3::Locate_type Locate_type; - typedef typename D3::Geom_traits::Sphere_3 Sphere_3; - typedef Point Point_3; - - std::cout << "_test_rc_trivial" << std::endl; - - std::vector to_insert; - std::vector to_remove; - D3 dt; - - Vertex_handle a1, a2, a3, a4, a5; - - a1 = dt.insert(Point(0,0,0)); - a2 = dt.insert(Point(0,0,1)); - a3 = dt.insert(Point(0,1,1)); - a4 = dt.insert(Point(0,1,0)); - a5 = dt.insert(Point(1,0,0)); - - to_remove.push_back(a5); - - std::size_t s1 = dt.number_of_vertices(); - std::size_t s2 = to_remove.size(); - std::size_t ns = dt.remove_cluster(to_remove.begin(), to_remove.end()); - assert(dt.is_valid()); - assert(ns == s2); - assert(dt.number_of_vertices() + s2 == s1); -} - -template -void _test_rc_specific_cases_1() -{ - typedef T D3; - typedef typename D3::Point Point; - typedef typename D3::Vertex_handle Vertex_handle; - typedef typename D3::Cell_handle Cell_handle; - typedef typename D3::Finite_vertices_iterator Finite_vertices_iterator; - typedef typename D3::Locate_type Locate_type; - typedef typename D3::Geom_traits::Sphere_3 Sphere_3; - typedef Point Point_3; - - std::cout << "_test_rc_specific_cases_1" << std::endl; - - std::vector to_insert; - std::vector to_remove; - D3 dt; - - Vertex_handle a1, a2, a3, a4, a5, a6, a7, a8; - Vertex_handle b1, b2, b3, b4, b5, b6, b7, b8; - - a1 = dt.insert(Point(0,0,0)); - a2 = dt.insert(Point(0,0,1)); - a3 = dt.insert(Point(0,1,1)); - a4 = dt.insert(Point(0,1,0)); - a5 = dt.insert(Point(1,0,0)); - a6 = dt.insert(Point(1,0,1)); - a7 = dt.insert(Point(1,1,1)); - a8 = dt.insert(Point(1,1,0)); - - b1 = dt.insert(Point(0.25,0.25,0.25)); - b2 = dt.insert(Point(0.25,0.25,0.75)); - b3 = dt.insert(Point(0.25,0.75,0.75)); - b4 = dt.insert(Point(0.25,0.75,0.25)); - b5 = dt.insert(Point(0.75,0.25,0.25)); - b6 = dt.insert(Point(0.75,0.25,0.75)); - b7 = dt.insert(Point(0.75,0.75,0.75)); - b8 = dt.insert(Point(0.75,0.75,0.25)); - - to_remove.push_back(a1); - to_remove.push_back(a2); - to_remove.push_back(a3); - to_remove.push_back(a4); - to_remove.push_back(a5); - to_remove.push_back(a6); - to_remove.push_back(a7); - to_remove.push_back(a8); - - std::size_t s1 = dt.number_of_vertices(); - std::size_t s2 = to_remove.size(); - std::size_t ns = dt.remove_cluster(to_remove.begin(), to_remove.end()); - assert(dt.is_valid()); - assert(ns == s2); - assert(dt.number_of_vertices() + s2 == s1); -} - -template -void _test_rc_specific_cases_2() -{ - typedef T D3; - typedef typename D3::Point Point; - typedef typename D3::Vertex_handle Vertex_handle; - typedef typename D3::Cell_handle Cell_handle; - typedef typename D3::Finite_vertices_iterator Finite_vertices_iterator; - typedef typename D3::Locate_type Locate_type; - typedef typename D3::Geom_traits::Sphere_3 Sphere_3; - typedef Point Point_3; - - std::cout << "_test_rc_specific_cases_2" << std::endl; - - std::vector to_insert; - std::vector to_remove; - D3 dt; - - Vertex_handle a1, a2, a3, a4, a5, a6, a7, a8; - Vertex_handle b1, b2, b3, b4, b5, b6, b7, b8; - - a1 = dt.insert(Point(0,0,0)); - a2 = dt.insert(Point(0,0,1)); - a3 = dt.insert(Point(0,1,1)); - a4 = dt.insert(Point(0,1,0)); - a5 = dt.insert(Point(1,0,0)); - a6 = dt.insert(Point(1,0,1)); - a7 = dt.insert(Point(1,1,1)); - a8 = dt.insert(Point(1,1,0)); - - b1 = dt.insert(Point(0.25,0.25,0.25)); - b2 = dt.insert(Point(0.25,0.25,0.75)); - b3 = dt.insert(Point(0.25,0.75,0.75)); - b4 = dt.insert(Point(0.25,0.75,0.25)); - b5 = dt.insert(Point(0.75,0.25,0.25)); - b6 = dt.insert(Point(0.75,0.25,0.75)); - b7 = dt.insert(Point(0.75,0.75,0.75)); - b8 = dt.insert(Point(0.75,0.75,0.25)); - - to_remove.push_back(a1); - to_remove.push_back(a2); - to_remove.push_back(a3); - to_remove.push_back(a4); - to_remove.push_back(a5); - to_remove.push_back(a6); - - std::size_t s1 = dt.number_of_vertices(); - std::size_t s2 = to_remove.size(); - std::size_t ns = dt.remove_cluster(to_remove.begin(), to_remove.end()); - assert(dt.is_valid()); - assert(ns == s2); - assert(dt.number_of_vertices() + s2 == s1); -} - -template -void _test_rc_specific_cases_3() -{ - typedef T D3; - typedef typename D3::Point Point; - typedef typename D3::Vertex_handle Vertex_handle; - typedef typename D3::Cell_handle Cell_handle; - typedef typename D3::Finite_vertices_iterator Finite_vertices_iterator; - typedef typename D3::Locate_type Locate_type; - typedef typename D3::Geom_traits::Sphere_3 Sphere_3; - typedef Point Point_3; - - std::cout << "_test_rc_specific_cases_3" << std::endl; - - std::vector to_insert; - std::vector to_remove; - D3 dt; - - Vertex_handle a1, a2, a3, a4, a5, a6, a7, a8; - Vertex_handle b1, b2, b3, b4, b5, b6, b7, b8; - - a1 = dt.insert(Point(0,0,0)); - a2 = dt.insert(Point(0,0,1)); - a3 = dt.insert(Point(0,1,1)); - a4 = dt.insert(Point(0,1,0)); - a5 = dt.insert(Point(1,0,0)); - a6 = dt.insert(Point(1,0,1)); - a7 = dt.insert(Point(1,1,1)); - a8 = dt.insert(Point(1,1,0)); - - b1 = dt.insert(Point(0.25,0.25,0.25)); - b2 = dt.insert(Point(0.25,0.25,0.75)); - b3 = dt.insert(Point(0.25,0.75,0.75)); - b4 = dt.insert(Point(0.25,0.75,0.25)); - b5 = dt.insert(Point(0.75,0.25,0.25)); - b6 = dt.insert(Point(0.75,0.25,0.75)); - b7 = dt.insert(Point(0.75,0.75,0.75)); - b8 = dt.insert(Point(0.75,0.75,0.25)); - - to_remove.push_back(b1); - to_remove.push_back(b2); - to_remove.push_back(b3); - to_remove.push_back(a4); - to_remove.push_back(a5); - to_remove.push_back(a6); - - std::size_t s1 = dt.number_of_vertices(); - std::size_t s2 = to_remove.size(); - std::size_t ns = dt.remove_cluster(to_remove.begin(), to_remove.end()); - assert(dt.is_valid()); - assert(ns == s2); - assert(dt.number_of_vertices() + s2 == s1); -} - -template -void _test_rc_specific_cases_4() -{ - typedef T D3; - typedef typename D3::Point Point; - typedef typename D3::Vertex_handle Vertex_handle; - typedef typename D3::Cell_handle Cell_handle; - typedef typename D3::Finite_vertices_iterator Finite_vertices_iterator; - typedef typename D3::Locate_type Locate_type; - typedef typename D3::Geom_traits::Sphere_3 Sphere_3; - typedef Point Point_3; - - std::cout << "_test_rc_specific_cases_4" << std::endl; - - std::vector to_insert; - std::vector to_remove; - D3 dt; - - Vertex_handle a1, a2, a3, a4, a5, a6, a7, a8; - Vertex_handle b1, b2, b3, b4, b5, b6, b7, b8; - - a1 = dt.insert(Point(0,0,0)); - a2 = dt.insert(Point(0,0,1)); - a3 = dt.insert(Point(0,1,1)); - a4 = dt.insert(Point(0,1,0)); - a5 = dt.insert(Point(1,0,0)); - a6 = dt.insert(Point(1,0,1)); - a7 = dt.insert(Point(1,1,1)); - a8 = dt.insert(Point(1,1,0)); - - b1 = dt.insert(Point(0.25,0.25,0.25)); - b2 = dt.insert(Point(0.25,0.25,0.75)); - b3 = dt.insert(Point(0.25,0.75,0.75)); - b4 = dt.insert(Point(0.25,0.75,0.25)); - b5 = dt.insert(Point(0.75,0.25,0.25)); - b6 = dt.insert(Point(0.75,0.25,0.75)); - b7 = dt.insert(Point(0.75,0.75,0.75)); - b8 = dt.insert(Point(0.75,0.75,0.25)); - - to_remove.push_back(b1); - - std::size_t s1 = dt.number_of_vertices(); - std::size_t s2 = to_remove.size(); - std::size_t ns = dt.remove_cluster(to_remove.begin(), to_remove.end()); - assert(dt.is_valid()); - assert(ns == s2); - assert(dt.number_of_vertices() + s2 == s1); -} - -template -void _test_rc_specific_cases_5() -{ - typedef T D3; - typedef typename D3::Point Point; - typedef typename D3::Vertex_handle Vertex_handle; - typedef typename D3::Cell_handle Cell_handle; - typedef typename D3::Finite_vertices_iterator Finite_vertices_iterator; - typedef typename D3::Locate_type Locate_type; - typedef typename D3::Geom_traits::Sphere_3 Sphere_3; - typedef Point Point_3; - - std::cout << "_test_rc_specific_cases_5" << std::endl; - - std::vector to_insert; - std::vector to_remove; - D3 dt; - - dt.insert(Point(-1000,-1000,-1000)); - dt.insert(Point(-1000,-1000,1000)); - dt.insert(Point(-1000,1000,1000)); - dt.insert(Point(-1000,1000,-1000)); - dt.insert(Point(1000,-1000,-1000)); - dt.insert(Point(1000,-1000,1000)); - dt.insert(Point(1000,1000,1000)); - dt.insert(Point(1000,1000,-1000)); - - Vertex_handle a1, a2, a3, a4, a5, a6, a7, a8; - Vertex_handle b1, b2, b3, b4, b5, b6, b7, b8; - Vertex_handle c1; - - a1 = dt.insert(Point(0,0,0)); - a2 = dt.insert(Point(0,0,1)); - a3 = dt.insert(Point(0,1,1)); - a4 = dt.insert(Point(0,1,0)); - a5 = dt.insert(Point(1,0,0)); - a6 = dt.insert(Point(1,0,1)); - a7 = dt.insert(Point(1,1,1)); - a8 = dt.insert(Point(1,1,0)); - - b1 = dt.insert(Point(0.25,0.25,0.25)); - b2 = dt.insert(Point(0.25,0.25,0.75)); - b3 = dt.insert(Point(0.25,0.75,0.75)); - b4 = dt.insert(Point(0.25,0.75,0.25)); - b5 = dt.insert(Point(0.75,0.25,0.25)); - b6 = dt.insert(Point(0.75,0.25,0.75)); - b7 = dt.insert(Point(0.75,0.75,0.75)); - b8 = dt.insert(Point(0.75,0.75,0.25)); - - c1 = dt.insert(Point(0.5,0.51,0.52)); - - to_remove.push_back(b1); - to_remove.push_back(b2); - to_remove.push_back(b3); - to_remove.push_back(b4); - to_remove.push_back(b5); - to_remove.push_back(b6); - to_remove.push_back(b7); - to_remove.push_back(b8); - to_remove.push_back(a2); - to_remove.push_back(a4); - to_remove.push_back(a6); - to_remove.push_back(a8); - - std::size_t s1 = dt.number_of_vertices(); - std::size_t s2 = to_remove.size(); - std::size_t ns = dt.remove_cluster(to_remove.begin(), to_remove.end()); - assert(dt.is_valid()); - assert(ns == s2); - assert(dt.number_of_vertices() + s2 == s1); -} - -template -void _test_rc_specific_cases_6() -{ - typedef T D3; - typedef typename D3::Point Point; - typedef typename D3::Vertex_handle Vertex_handle; - typedef typename D3::Cell_handle Cell_handle; - typedef typename D3::Finite_vertices_iterator Finite_vertices_iterator; - typedef typename D3::Locate_type Locate_type; - typedef typename D3::Geom_traits::Sphere_3 Sphere_3; - typedef Point Point_3; - - std::cout << "_test_rc_specific_cases_6" << std::endl; - - std::size_t s1, s2, ns; - - std::vector to_insert; - std::vector to_remove; - D3 dt; - - Vertex_handle a1, a2, a3, a4, a5, a6, a7, a8; - Vertex_handle v1, v2; - - dt.insert(Point(-1000,-1000,-1000)); - dt.insert(Point(-1000,-1000,1000)); - dt.insert(Point(-1000,1000,1000)); - dt.insert(Point(-1000,1000,-1000)); - dt.insert(Point(1000,-1000,-1000)); - dt.insert(Point(1000,-1000,1000)); - dt.insert(Point(1000,1000,1000)); - dt.insert(Point(1000,1000,-1000)); - - a1 = dt.insert(Point(0,0,0)); - a2 = dt.insert(Point(0,0,1)); - a3 = dt.insert(Point(0,1,1)); - a4 = dt.insert(Point(0,1,0)); - a5 = dt.insert(Point(1,0,0)); - a6 = dt.insert(Point(1,0,1)); - a7 = dt.insert(Point(2,2,2)); - a8 = dt.insert(Point(1,1,0)); - - v1 = dt.insert(Point(0.25,0.25,0.25)); - v2 = dt.insert(Point(0.75,0.75,0.75)); - - ////////////////////////// - - to_remove.push_back(v1); - s1 = dt.number_of_vertices(); - s2 = to_remove.size(); - ns = dt.remove_cluster(to_remove.begin(), to_remove.end()); - assert(dt.is_valid()); - assert(ns == s2); - assert(dt.number_of_vertices() + s2 == s1); - - /////////////////////// - - v1 = dt.insert(Point(0.25,0.25,0.25)); - to_remove.clear(); - to_remove.push_back(v1); - to_remove.push_back(v2); - s1 = dt.number_of_vertices(); - s2 = to_remove.size(); - ns = dt.remove_cluster(to_remove.begin(), to_remove.end()); - assert(dt.is_valid()); - assert(ns == s2); - assert(dt.number_of_vertices() + s2 == s1); - - /////////////////////// - - v1 = dt.insert(Point(0.25,0.25,0.25)); - v2 = dt.insert(Point(0.75,0.75,0.75)); - - to_remove.clear(); - to_remove.push_back(a1); - s1 = dt.number_of_vertices(); - s2 = to_remove.size(); - ns = dt.remove_cluster(to_remove.begin(), to_remove.end()); - assert(dt.is_valid()); - assert(ns == s2); - assert(dt.number_of_vertices() + s2 == s1); - - /////////////////////// - - a1 = dt.insert(Point(0,0,0)); - - to_remove.clear(); - to_remove.push_back(a1); - to_remove.push_back(a2); - s1 = dt.number_of_vertices(); - s2 = to_remove.size(); - ns = dt.remove_cluster(to_remove.begin(), to_remove.end()); - assert(dt.is_valid()); - assert(ns == s2); - assert(dt.number_of_vertices() + s2 == s1); - - /////////////////////// - - a1 = dt.insert(Point(0,0,0)); - a2 = dt.insert(Point(0,0,1)); - - to_remove.clear(); - to_remove.push_back(a1); - to_remove.push_back(a2); - to_remove.push_back(a3); - to_remove.push_back(a4); - to_remove.push_back(a7); - to_remove.push_back(a8); - - s1 = dt.number_of_vertices(); - s2 = to_remove.size(); - ns = dt.remove_cluster(to_remove.begin(), to_remove.end()); - assert(dt.is_valid()); - assert(ns == s2); - assert(dt.number_of_vertices() + s2 == s1); -} - -template -void _test_rc_grid_1() -{ - typedef T D3; - typedef typename D3::Point Point; - typedef typename D3::Vertex_handle Vertex_handle; - typedef typename D3::Cell_handle Cell_handle; - typedef typename D3::Finite_vertices_iterator Finite_vertices_iterator; - typedef typename D3::Locate_type Locate_type; - typedef typename D3::Geom_traits::Sphere_3 Sphere_3; - typedef Point Point_3; - - std::cout << "_test_rc_grid_1" << std::endl; - - CGAL::Random random; - - std::vector to_insert; - std::vector to_remove; - D3 dt; - - for(int i=1; i<=(1<<10); i<<=1) - for(int j=1; j<=(1<<10); j<<=1) - for(int k=1; k<=(1<<10); k<<=1) - to_insert.push_back(Point_3(i,j,k)); - - dt.insert(to_insert.begin(), to_insert.end()); - - for(Finite_vertices_iterator fit = dt.finite_vertices_begin(); - fit != dt.finite_vertices_end(); fit++) { - if(random.get_double() < 0.9) to_remove.push_back(fit); - } - - std::size_t s1 = dt.number_of_vertices(); - std::size_t s2 = to_remove.size(); - std::size_t ns = dt.remove_cluster(to_remove.begin(), to_remove.end()); - assert(dt.is_valid()); - assert(ns == s2); - assert(dt.number_of_vertices() + s2 == s1); -} - -template -void _test_rc_grid_2() -{ - typedef T D3; - typedef typename D3::Point Point; - typedef typename D3::Vertex_handle Vertex_handle; - typedef typename D3::Cell_handle Cell_handle; - typedef typename D3::Finite_vertices_iterator Finite_vertices_iterator; - typedef typename D3::Locate_type Locate_type; - typedef typename D3::Geom_traits::Sphere_3 Sphere_3; - typedef Point Point_3; - - std::cout << "_test_rc_grid_2" << std::endl; - - CGAL::Random random; - - std::vector to_insert; - std::vector to_remove; - D3 dt; - - for(int i=1; i<=(1<<10); i<<=1) - for(int j=1; j<=(1<<10); j<<=1) - for(int k=1; k<=(1<<10); k<<=1) - to_insert.push_back(Point_3(i,j,k)); - - dt.insert(to_insert.begin(), to_insert.end()); - - for(Finite_vertices_iterator fit = dt.finite_vertices_begin(); - fit != dt.finite_vertices_end(); fit++) { - if(random.get_double() < 0.05) to_remove.push_back(fit); - } - - std::size_t s1 = dt.number_of_vertices(); - std::size_t s2 = to_remove.size(); - std::size_t ns = dt.remove_cluster(to_remove.begin(), to_remove.end()); - assert(dt.is_valid()); - assert(ns == s2); - assert(dt.number_of_vertices() + s2 == s1); -} - -template -void _test_rc_grid_3() -{ - typedef T D3; - typedef typename D3::Point Point; - typedef typename D3::Vertex_handle Vertex_handle; - typedef typename D3::Cell_handle Cell_handle; - typedef typename D3::Finite_vertices_iterator Finite_vertices_iterator; - typedef typename D3::Locate_type Locate_type; - typedef typename D3::Geom_traits::Sphere_3 Sphere_3; - typedef Point Point_3; - - std::cout << "_test_rc_grid_3" << std::endl; - - CGAL::Random random; - - std::vector to_insert; - std::vector to_remove; - D3 dt; - - for(int i=1; i<=(1<<10); i<<=1) - for(int j=1; j<=(1<<10); j<<=1) - for(int k=1; k<=(1<<10); k<<=1) - to_insert.push_back(Point_3(i,j,k)); - - dt.insert(to_insert.begin(), to_insert.end()); - - for(Finite_vertices_iterator fit = dt.finite_vertices_begin(); - fit != dt.finite_vertices_end(); fit++) { - if(fit->point().x() == (1<<5)) to_remove.push_back(fit); - } - - std::size_t s1 = dt.number_of_vertices(); - std::size_t s2 = to_remove.size(); - std::size_t ns = dt.remove_cluster(to_remove.begin(), to_remove.end()); - assert(dt.is_valid()); - assert(ns == s2); - assert(dt.number_of_vertices() + s2 == s1); -} - - -template -void _test_remove_cluster() { - std::cout << "Removing clusters of points from triangulations..." << std::endl; - - // small cases - { - _test_rc_trivial(); - _test_rc_specific_cases_1(); - _test_rc_specific_cases_2(); - _test_rc_specific_cases_3(); - _test_rc_specific_cases_4(); - _test_rc_specific_cases_5(); - _test_rc_specific_cases_6(); - } - - // big cases - { - // random - _test_rc_random_1(); - _test_rc_random_2(); - _test_rc_random_3(); - _test_rc_random_4(); - - // grid - _test_rc_grid_1(); - _test_rc_grid_2(); - _test_rc_grid_3(); - } -} - - -// Local Variables: -// tab-width: 2 -// End: diff --git a/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_types.h b/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_types.h deleted file mode 100644 index a533778d0a1..00000000000 --- a/Triangulation_3_copy_tds/test/Triangulation_3/include/CGAL/_test_types.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) 1998, 2004 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Francois Rebufat, Sylvain Pion - -#ifndef CGAL_TEST_TYPES_H -#define CGAL_TEST_TYPES_H - -#include -#include - -#include -#include - -typedef CGAL::Exact_predicates_inexact_constructions_kernel EPIC; -typedef EPIC K; -typedef CGAL::Exact_predicates_exact_constructions_kernel EPEC; - -#endif diff --git a/Triangulation_3_copy_tds/test/Triangulation_3/test_delaunay_3.cpp b/Triangulation_3_copy_tds/test/Triangulation_3/test_delaunay_3.cpp deleted file mode 100644 index 5ccf2de42fa..00000000000 --- a/Triangulation_3_copy_tds/test/Triangulation_3/test_delaunay_3.cpp +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 1998 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Francois Rebufat - -#include -#include - -bool del=true; - -#include -#include - -// Explicit instantiation of the whole class : -template class CGAL::Delaunay_triangulation_3; - -int main() -{ - typedef CGAL::Delaunay_triangulation_3 Cls; - typedef CGAL::Delaunay_triangulation_3 Cls_with_epec; - - _test_cls_delaunay_3( Cls() ); - _test_cls_delaunay_3( Cls_with_epec() ); - - // Second version for the circumcenter storing cell base class. - typedef CGAL::Triangulation_vertex_base_3 Vb; - typedef CGAL::Triangulation_cell_base_with_circumcenter_3 Cb; - typedef CGAL::Triangulation_data_structure_3 TDS; - typedef CGAL::Delaunay_triangulation_3 Cls_circumcenter; - - _test_cls_delaunay_3( Cls_circumcenter() ); - - return 0; -} diff --git a/Triangulation_3_copy_tds/test/Triangulation_3/test_delaunay_hierarchy_3.cpp b/Triangulation_3_copy_tds/test/Triangulation_3/test_delaunay_hierarchy_3.cpp deleted file mode 100644 index 125e74a8540..00000000000 --- a/Triangulation_3_copy_tds/test/Triangulation_3/test_delaunay_hierarchy_3.cpp +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 1998,2001 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Mariette Yvinec, Sylvain Pion - -#include - -bool del=true; - -#include -#include - -int main() -{ - typedef CGAL::Delaunay_triangulation_3 Dh; - typedef CGAL::Delaunay_triangulation_3 Dh_with_epec; - - _test_cls_delaunay_3( Dh() ); - _test_cls_delaunay_3( Dh_with_epec() ); - - return 0; -} diff --git a/Triangulation_3_copy_tds/test/Triangulation_3/test_delaunay_hierarchy_3_old.cpp b/Triangulation_3_copy_tds/test/Triangulation_3/test_delaunay_hierarchy_3_old.cpp deleted file mode 100644 index 368bbed225b..00000000000 --- a/Triangulation_3_copy_tds/test/Triangulation_3/test_delaunay_hierarchy_3_old.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) 1998,2001 INRIA Sophia-Antipolis (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org); you may redistribute it under -// the terms of the Q Public License version 1.0. -// See the file LICENSE.QPL distributed with CGAL. -// -// Licensees holding a valid commercial license may use this file in -// accordance with the commercial license agreement provided with the software. -// -// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -// -// $URL$ -// $Id$ -// -// -// Author(s) : Mariette Yvinec, Sylvain Pion - -#include -#include - -bool del=true; - -#include -#include - -int main() -{ - typedef CGAL::Triangulation_vertex_base_3 Vbb; - typedef CGAL::Triangulation_hierarchy_vertex_base_3 Vb; - typedef CGAL::Triangulation_data_structure_3 Tds; - typedef CGAL::Delaunay_triangulation_3 Dt; - typedef CGAL::Triangulation_hierarchy_3

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 F{||6EwbTFr diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/insert_outside_affine_hull.xml b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/insert_outside_affine_hull.xml deleted file mode 100644 index 2f21f23ca2f..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/insert_outside_affine_hull.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - --162.5 99.1616 m --201.5 20.32 l --95.875 20.32 l - - - - - - - - --151.125 47.9552 m --103.188 76.4032 l --97.5 57.7088 l --151.125 47.9552 l --99.9375 34.1376 l --97.5 57.7088 l --47.125 39.0144 l --99.9375 34.1376 l --97.5 57.7088 l --103.188 76.4032 l --30.0625 73.152 l --97.5 57.7088 l --13.8125 55.2704 l --30.0625 73.152 l -21.9375 52.0192 l --13.8125 55.2704 l --47.125 39.0144 l -21.9375 52.0192 l -21.9375 52.0192 l - - -$p$ - --28.4375 163.373 m --151.125 47.9552 l - - --28.4375 163.373 m --103.188 76.4032 l - - --28.4375 163.373 m --30.0625 73.152 l - - --28.4375 163.373 m --97.5 57.7088 l - - --28.4375 163.373 m --99.9375 34.1376 l - - --28.4375 163.373 m --47.125 39.0144 l - - --28.4375 163.373 m --13.8125 55.2704 l - - --28.4375 163.373 m -21.9375 52.0192 l - -The infinite cells are not shown - - diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/insert_outside_convex_hull.gif b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/insert_outside_convex_hull.gif deleted file mode 100644 index 3e21752d3ff6da8042e6f87c5c994ab771e8d228..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1893 zcmV-r2b%atNk%w1VKxD=0Du4h00030|NkNR1OWg50RSuj0000s0kHr80{)DTsmtvT zqnxzbi?iOm`wxcVNS5Y_rs~SJ?hD8AOxN~}=lag~{tpZahs2`sh)gP%%%<}RjY_A~ zs`ZM^YPa03_X`e-$K)~&fCiY?>_!^hj)ULyy8J$^rxp7*{%@qW_b|u@cz7cSSK&vf zh6rh*__$FRK^d8ep-5s$@rbD@8ZfEic@aALb&605!U;0z@+brB!~{$nC0QbcI+;)zsn z+Bq5sVwcB{1SM`9>2jO5cpNLS9HR1N36ZJ)OGIl#tpF;ZPP7R?X{Kv=iEz6*f(*(v-O7(q(uz zu+2;TVsa}h^Y5!mO*JfZ>&9=`fx#pz*1A?ODn<&OCcAezS>4f_86_?k`E%CLj!8E* z9kg@iPWdd;eGJ>RY1vgppJpBPQ*Oqaej7Ke4|v+)uV+UiNqDF7jaf5Z_3qOjH+!yme8QCenLf5{n{q#C4&hoYNm4hm_VgkqYaLfEaCDWiXi`Y5UPVOS%Zp-TFurdhIj zo+=_%dZ(VPMz?CDfOb05hPxJOs->>Jdg+7BJOlnFchX&t20{t~>s_ZWsh22_u%jo@9}y*N#W!s|+`hFvjwRJFGbJw)uv z+C44Mz2%wvGSI-p5wo8sU5RzgMr+A)ffp~jEZA#D?Qz9DAB{DrF?+?(#%0JAD3bbq zxih}0k#sd%XE~%d5q1GfR>Z;{{tn}Yn*N+Ezcq(E*T>?jXftn%8VCvCdOyhI3VWCmBgdQsLX9(xc!)vnayxaS@d%ePl_FK3t2VBNN?OAfu) z;?*5<*cnS>OtP&tk`C3sG?0iepJQ=g|`nH-hE2 z4u9P1Oi44#;HGUp6BZE6vpbFfFn;$FU)?^p1oS~o3E0sb$leA#`E@A|^t!@R8nHa- zeacN6?1ku{@F`T;PkL`VUIy23LVifhQ-{MK=*VV6-XSZ5=A+d^&gVe3;Vp*;>{sfx zXFEUnWr)G*oxkKqhNXBdD@{`${1 z$V39gcnXqP5rSW29t+#>yCBYldfd9>eViB#fyGN~P>fCt=QKb+{zHqJNTeP|#K1z% z2#`)wq_p~0$KZ9aQhDUx6Dx@gIzDobG-PDd-k3?7ZK;9zgAJEr*pp^a5^Xmr;rir; zEm)KUiA3?Iox<^??|DVbTZo&NZs#OztfdLC(s zU=-)+hz8I)waiQc{h5{iq?XX_7*t8-?4Ilp2Fhnelu2rY=LmHbOMaenqv{C|*DPsF zf+drr|G+14Y+22*0f?PYIceiyYCxH?6dftGUFAl~AA;_*MkaNpOFy_onzBZYq0`0n zk{8UO_Hrry2`TZYdQYj&2Sla2jorNAAsea})<9MXpKcLB z9+_B0q`$qHi?&0d*y8T?Z(mg|9*pW-Sxq*&W+*LnuZ!L6YInQb?XGvf3*PXGcf8~+ fuX)dl-t?+>z3gqTd*2J+_{w*_^sO%i3IG5*e&nkc diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/insert_outside_convex_hull.pdf b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/insert_outside_convex_hull.pdf deleted file mode 100644 index df40343b31e65c59f16aeda580160b2df35c5c6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6929 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 diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/insert_outside_convex_hull.xml b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/insert_outside_convex_hull.xml deleted file mode 100644 index 8758c3facee..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/insert_outside_convex_hull.xml +++ /dev/null @@ -1,114 +0,0 @@ - - - - - -$p$ - - - - - - - - - - - - - - - - - - --43.7921 83.208 m --126.372 74.758 l --159.535 29.908 l --128.973 -26.642 l --75.6539 -40.942 l --43.7921 -18.8419 l --15.1816 26.6581 l --22.9844 55.908 l --35.339 72.158 l -h - - --75.6539 -40.942 m --98.4124 -20.7919 l --128.973 -26.642 l --125.722 8.45801 l --159.535 29.908 l --130.274 26.6581 l --97.762 18.2081 l --125.722 8.45801 l --98.4124 -20.7919 l --91.91 -3.24199 l --61.9988 -8.44195 l --75.6539 -40.942 l --91.91 -3.24199 l --125.722 8.45801 l --97.762 18.2081 l --91.91 -3.24199 l --62.6491 29.908 l --61.9988 -8.44195 l --38.5902 17.5581 l --62.6491 29.908 l --97.762 18.2081 l --102.314 42.908 l --130.274 26.6581 l --126.372 49.408 l --159.535 29.908 l --126.372 74.758 l --126.372 49.408 l --102.314 42.908 l --73.7031 50.058 l --97.762 18.2081 l --62.6491 29.908 l --73.7031 50.058 l --81.506 70.858 l --38.5902 17.5581 l --62.6491 29.908 l --81.506 70.858 l --43.7921 83.208 l --126.372 74.758 l --102.314 42.908 l --81.506 70.858 l --126.372 74.758 l - - - --61.9988 -8.44195 m --43.7921 -18.8419 l --38.5902 17.5581 l --15.1816 26.6581 l --81.506 70.858 l --22.9844 55.908 l - - --75.6539 -40.942 m -49.8426 6.50801 l - - --43.7921 -18.8419 m -49.8426 6.50801 l - - --15.1816 26.6581 m -49.8426 6.50801 l - - --22.9844 55.908 m -49.8426 6.50801 l --43.7921 83.208 l - - --130.274 26.6581 m --125.722 8.45801 l - - - - -$c$ - - diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/main.tex b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/main.tex deleted file mode 100644 index 9839d0a9e50..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/main.tex +++ /dev/null @@ -1,9 +0,0 @@ -\ccUserChapter{3D Triangulations\label{chapter-Triangulation3}} -\ccChapterAuthor{Sylvain Pion \and Monique Teillaud} - -\input{Triangulation_3/PkgDescription} - -\minitoc - -\input{Triangulation_3/Triang3} - diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/orient.gif b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/orient.gif deleted file mode 100644 index 2d565e0e61592703976e59d7e9955fd8a9816431..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 992 zcmV<610VcHNk%w1VGsev0Du4h00030|NkNR1OWg50RSuj0000G0mc9T0{)DTsmtvT zqnxzbi?iOm`wxcVNS5Y_rs~SJ?hD8AOxN~}=lag~{tpZahs2`sh)gP%%%<}RjY_A~ zs`ZM^YPa03_X`e-$KgrcW0SgUTGLf}&BONKYtjL9nTZ zj!SJxEkV^#RhL;|Z2c(mt0=JwQIfTKb)bl|w%C?q=@xC;3O3{N{5dy3T^#4?T-|Ax z=Q2itCjpj0jGErUk%E%-BkCvPTuv9olPuLJ;HVxWFlxF~Ddz_FMuARIv}Rt z*BosfQg`nYz>^<4b-d#8VV_l}>q|*7^BMXwhadk3w(ynyA28pp2z_4R*4BGi2?vaU z{^cSdRB`O498(Db7+{0CJqXNo{E#ZB{u$p8FxKW^5b_kW~j`LjhTbden=*HNs%2q^(2W4MyZ8`8+K+T zlvr+|C6_Ihw~7~Gl7@klZh&!SmuhUH=5teyNhgtGXvy1yqs6)AH7ki}Vwq;NNn3W( z)Q8t}Y~ZP6CVXDlPN1AT>foDRDvC#;RbrZ{K${x6$DW^pip*ecmO^PxXx2IDiJPWs zP-D&jsS2!o{X%Q4KDK0QtUhActFN@6sH>yaP!+mtUdVo^9v%NZ3vIMG`sqqo&mM|u zZ74#PY^0&U<=DBCjh!I=wfr8|#F282_`!B%o z3Oq2uSsHvW!tf}(FvC`m>u_82Ml4&K6u%Vj#qz;}Fd6JhblCZCLQ$||qS za?36k#PQ2M04wv25RWWl&3SyRbI(5i40O;!4^4E@MjwrI(n>GQbkj~h4RzE~Pfc~z OR$q;E)>=DK0028pKWPead2#x$nK(Z(}8iMKI@DwZweDN3xRvYU` zbizWas%&Hm35)Sy^XVQpKdo?dOrYi>s^rpZZo4E@sDpFwfkThlKgQRfjrfpTBU7xA zucK;KIb;j0K?28wh)8@XDC^W=Xy~X2>i21i>+{8%Hn(|1&^p)a{X_bMc)&7Z< z{@EqfsLbfRR0NOr9}O5*TlRvB15C*_oKp%61s7kWWWaeXm_-T&lQBBZ!KWF@D=S$~ zag=5u^=Vpb6rmSxM__>-j(fC->;nF|^zc$2{vdJp$tvz&gLPM~P!8VyO z2!EFPG+Bq~!fQ$YO+ufx3Y~$D@rS--I(p$bYp;gsg`np$x^}a%C~b4X?N#stRQPo02Szf} z8`Qk)>QmEmFFrFZDlI-+%P(?Km*UWa5B3atmM*4BN`(ePP;dq5?Y!|ykP5WQ83^sp z%1BoU6=zkRC>l*TAh zJ4s}J!;^qjyB??f=m#l%^P{^X7#n2HbfzMGl}b&9_n?+;59EJsJ}P2xv(O;3IFr>x z@4z)X^dux(b;w|*CVvF!sp7JtneJ-RD&ML27C9z1Yl{vS&XKK}3b3eNIAR{pW0*&) zij^pT=OWHg@vvBR#f0)qQgOA}LjkD&y~RK1kgavmeY0@vgiY zw_qm90GmR*w(nP9E{-mN`HIInCThrX$jltpxM9AvUsNJeFs!fB;NipZV&8=5#{6yv zT#JFWaF_Iy4iaYkVdc&1FuSWB0xvl`t)*2TJlM(R_WbUCt3L`dxAAdCu3~IG{1GC{ z$9!Zj(@yqi1wmyn`Mo#&%%x)SXX8VW`y_XYC*A9Z1?`%e-kV#NoqE5bXth(4KWG!{ zK*aVZZ=TGB5=KbHmFT796MWR!q3KuOiqdJBJ-7Ig70fv&zle|I^>yyL9`&heZ}PoA zw3R4zO=k6JJVrfnr+ekQ#My)d~Gu%)Gt zr@4=13}(U(2i%`=VHF-RP^x&ahqb z+iO#UM~)VEKuTKeXST||c|!~HviR3cdH6sN6XAFYBuP8 za?TmsI#ngO5WI;>6&6Mmy>~Z`_8b2!Fx!_@)|7hl6kn#yd=Z0uU$&##RngN~iQcxZ z2X!ZeY9D(-b5Yjei;C7%ySKve#xGrz^{Z}3?Y^XPUa*|0y=hlVQ>&XD6H|`l@#wJh zK*D%bhjOA1Ew?$q)Vy%ELt~^#v6Q2si~ZHBrk-Nm37utuln-jPnEGvav zW&4oLCs|TW9@3f2I~`W#HmMp)jIVMDZhVt8(i5QCn)kNFVx()AOk&%q6jeRx>`xJK z_1OpeK1zR#jyHZb&)97)u9SKGRMyiRi`;=TUV|6gZ&Erkd(3A88^FUAc9*L!hMX13F%f`uOe}5+NZbr0fapGHb}&Q;%)0aNU)av{~-I zD?{@s>?$AbEIDW?e7Z$H?5IVdi5%zI&&kE&?r?uL5#7~j@Pi$&#QE%}A4wL~!OSv0@? zfw9rJ8!G8#pPGZ(-r5H&zuJ?QZary$^>pfz2NzxJ@~amz`ktmp{NT+5^D11>X#SrhEZO%QPL*9vm60) zyI@`2)&(6d$w&4)8|yX@%D2ohbX%MCx&6pYsvJJu5!=Diav(>B@TFQQ|4qrq)(2i4 zO{}GjVx!#XD5dizV4|s_ zr!M@_H*X_{#&{)NGD2|A_H*0I&-Z+oQLfQx6j-5-YPw&$#}%O4RYJSP;@Ynz*h!(u z)I<@x^U5NJ0<4+l+%!Uama5D|l3hdxm+llF8k32+*qcIg$A6>_uDGTLLm_wwKX+~K9H@nEE)lU7aT&s;fj!=oT44b#$#N_5Pb-)7?K5+0*S%=up}ak zNWj7eLcY_>Ei{%p*m33NjejZ<1hiZ zpg4jH@MvKh<$iKt+Bj!tED1|+#F8OfI0Vzhcz9qSAO<`Ie2%(e=^rDEhl3ONTHzp= z8F(ykF7!gjJjpmbkpOtE^b9h1nR;MdK#sFBcmU~)r>E%&ddi7N!DGqvV&7A45X^;y z@dg9OI8rI#A+jAgc=}Zrd<2p&Aj~(WSb;9BCpm7&0$pb@ha=?>8Jy48Df5>&PrhuaK9~phA!MF)v@L;jQi@w@GP(&&ifisRie=^PoynrY`?F|)$5peVhj>L7b zld&GS@5znXIT2~}qFz)CkhT{UOQzt6K>O*;9~2N77`6rk(}ZAJV4We@VW2i(-65DB z1k;CL1`x~;tT+TShF~T@kYHgU*bxY34wfA#1Xy(lb{v9P0&Rd`))35wzFZhbcPv<2 zxaoiB|dXq;fKU`SLC zJcbI&Q*d|y%wSG9p#NkXXyd1{AY>IGm<)kPal$%72syAV$etKSQ1-vKI}q}SUz(Li z{wHsjpHe|6%Ksd+9YC=F-IB-@y2*l23IGKItzRe5z|dIYoG7lqj-cUi=$8lBI!z22 zOE*rx8&W!tZgNRDPYMyV_?v~3`^CcjgyL|}(*^;cxSXu~59&84E(-?(|MyVbT_JId zFUhgy0r>=Hk|`SdAUXI2@5_BJaUDrs*}TXBc#4Ii&I@SBYFA0beUaDV`XR^S3(bYn zc0F*A5W2xd5<3vCaG{D2U_T<}dJA(N>7-Hbc5bR^S&grl;o(Sd`^Vv>60WG1o>g z>$C0<;ew7_z(dU2ZZ-=}vYR$iWSP{@$|NY%7v$;1@(9YZd?Iv*Y!XTkVZF-7600uD zyt-2h#m?=!KVhiI1wYO=!3kP?FR%LnyF@$Vl4C3ZIJT~_Ao&1Y^ zpR`%SHMg^v)rc|#RSRirXvgS8HGy2ssqG|1OuJ)Gj?2qN>ah|C5LmA%lI)B@m~OPc4*sP@wUSp-c=}>~onEOJsAs zwBZ+=aZUqTK3M>5$>-EJ-?wuaa|EG31;42oq&DWqVj{FR=1%9^D$1XelUbN*6JH*y z7RB=VeO^kFu|Ag1`o4J-EhoU3yETW|D@t_BlG1e^8XPM#7Hp{=ExaZ2I!xe<-_G4< z?$V5)xvjWPk^Q858Ly=G&YW35P4AaPTIp=jGV3l@ne2`KGgZAJzzJFo_m>gPV>mda zn?IBz#aMG7W==EK_kB0xz)6IRPhnoFXmEdMNnjU;;nfo-bIt7&$<-HqSt ze(Old3XX=G%X{g_m*f=)8;ISC>~Fd6L|ZvtGZ`}O%`b^HCLd!- zQ@?(2N0Q)U^wWkbTinBs$l5Pt9K$%rtKD-`T{tw5J6(fM2|s?N-RYc;&-rIjBdY12 z-NTP}*1fx}+E(X&b*^$CP3zC77PZ)&_D8UvE%SJ|w z({7##kB%z0qZf~yv9oskY-9LQ*u?V8LwpiSF*GHH@6R{|UDYoY;kO+_FbW_%=US!`dCLROHQSF zXJ_5=Y(c0Jwpf;6Z)u(n2^jqRk^h^elEpQ4JMqLle5um$0sWq*=MPM7+Z*X>FWQ@Y zTc*cOttMuqPW{~Ch+x=cuCAfh)`wNMIvxnbkG1!(8p9~u8tsp|9n>_!coLE_gI}U0 z+V{a0L?bLXzkbP&q|K)mZEt?iMK>rydLzPV{zkR+J$zA9GxWYEJIXy+`U1kK zC-oBg(AW!%ctO%x_x5^$q1@4rjr1tU^`0?YdbPySI@!J7*DUWwzG zWUs-x>dF$SxN9?E#j7N$iM}7FPo?=^FL*W&%r(^H|jmu;W4 z>E8>tPw*#Kh<&Mct**S3aaXm5vpIG}^zrglN#6Wq+snl+Mx^rA5AxAjfmK)aikfEB zQ%;;M#8kjhUx7 ztn8m4R{j@%=>G%6>KoZ;8yEu+Ypnk}ij_tHAi9BL<-vKze}!X_vOi!fN&%8b!~Zpm z^?~`q{C-8QbU*G_k&GN?ZQv?m=vJJMf(1F+2o zivHdq9UFqaK);?i@B*!X_j)sQmMfiyA(4nQI)b7Q!SL|_HvQx{5GlWK)`8gH3$3&M zUdok7bpMXW=nd1!?+A`U!eQu9kKf3R!gNSW#DlntF9=r9q3vG;fVjU9bg26mNr$|@ zPyqV=MF9x>3qgm%f065u_%D(UjsK#4pzZG3ECvm!|BwI>ha{T-iV0f z@%p6vW#&ty*W7!HuBxzQUJHL9CF=1P`)W5E`j}kdy4lMq9XTfMQgVc#QWub!@H{^u>N>5cDL)}z9~~T*Do!gfzr8#9 zoZB8F;}VPxp?P+`Ph7ZCh2=Ks;u>?BNp0ae~4R*7WS8xM5?dd zX(&eR3A-TTlN_sAHFjS()n9+#17-iB!RjC>l}6j6BN@HrrKgFfzxq9LjBL65W_OMf z(>3Qc&u-zL&IZuEzb-;-{7ai* zT(BTs4T3fxeoh9#Y`Si;!OXE_V8iJlWN>E!0ue(J(UBg|wgpLT9T4-u`cNP{dd_+b zh_37AfTBl}j6qZvvk@alDxhT$bO!^0M#{*^%0aSlMHvM-1rV55kU`3$!0yr_5j{5w zgF6^9a%dzd1Fmeq-JcPocJ zZ`OQX@9N{@t1pwP8mT4l&6s9s7}S#GT;uJ&J7~De?kU}8($eEi{Y~$zh)cEl;W^fh&f zxCgbG&>l8J$0HmI_xSoSA!50EdVBG@ayxjdol0PeHA-0zOE3?P$zSZdSWOTpVYzz-kIcU^WQ9#s7fjQTw+II-?DMq2W zZ7qCio)NJ|o~vIdJ<)iE$(MbV?Vo#+uB1QiCjGS~$@D!*1v(5OqlP#q5P=2zfv(PA z)BU2*|E#Qq0S8$`7d9AuW0U{61%AB>rA7CefTJJ=wgDt31BbxDiZ>2RgJhAw)dySN ziRuV$J^kzK^~&HdLK`? - - - - - --90.2995 268.418 m --37.487 238.345 l --2.5495 287.113 l --62.6745 327.752 l --37.487 238.345 l --90.2995 268.418 l --62.6745 327.752 l - - --90.2995 268.418 m --2.5495 287.113 l - -0 -1 -2 -3 - --51.2994 269.231 m -10.1915 0 0 10.1915 -42.7169 263.735 -37.487 272.482 a - - --153.216 235.443 m --176.778 211.872 l - - --153.216 235.443 m --120.716 235.443 l - - --153.216 235.443 m --153.216 270.394 l - -$x$ -$y$ -$z$ - - diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/ortho.gif b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/ortho.gif deleted file mode 100644 index c37e3ad5b059cc5675c96090408581fe210b638e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 840 zcmV-O1GoG~Nk%w1VFm%H0Du4h00030|NkNR1OWg50RSuj000060jK}~0{)DTsmtvT zqnxzbi?iOm`wxcVNS5Y_rs~SJ?hD8AOxN~}=lag~{tpZahs2`sh)gP%%%<}RjY_A~ zs`ZM^YPa03_Y2Md!sO<-j82}@?BTi%_r2rv+`Nvb-Sd3dz7MGK7f4t#ScnL6n8>)X z*a&&?7)cp1S&7MTnaO#u*~$3{iYYo;S!!AXu*%x%%Bq^0_3DBu%jAk;dkfV{vdb&w z>j4~G1*=hPe1&YGyo|M4@eDn?NnLHdh@HJ9t=Zl9jldn=^;T|vKCI3t{hHoRg-k2o z=R1~bpO z2!=FCQp?B(YbvfxDG;Lqg)nVobnxd6&6+1#k{fhrC(jo;_iP*53miF150L`#+2ET@ zr%N8aREm}A4uC?nj!?L*tJkOrXo?-nLFiPpL{q4J*YK>mu5a_9WLq|`pp(uVR{IxM zk>0)2PQoQ9cjIBOwM^9WE34qI#x1Un%4ZiMFr95Bm69B}A80W#65Gp6th6K3ksv3N z!FulN!G2Q1v@A(ahuH0S)5gof_tFo-FK3-moN98AB9@zSeiyh~JBFYW0;}TXh0r-xnlT!ZT4kxF z7p^@e<&=tjnO>M;elZY!Tt0~=Jo@P)l|OMJ=82qj(urrBb_SMbOM6PdBnED}S0#~s z?kUorbM}cCqJHAZXQGEPN@-kcs$%Au7m;aEpu1&C;gQUUIx4Bhn0hKng`T(FJDwUS z5vRdnM#rm;@TnU_wFc?jrKnPb8gjp;<*Qq^4vQjevdS*YY_rZj3vIO0PD^dI)?SNk Sw%TsXZMWWj3+@gD0029!7@*4l diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/ortho.pdf b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/ortho.pdf deleted file mode 100644 index 61acccb70ecfe5c5031e6cc8c7ef18e0b8e5b4b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9683 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 - - - - - --38.1753 133.65 m --82.0373 56.7 l - - --38.1753 133.65 m -97.47 55.89 l - - -5.68567 46.17 m -88.3527 0 0 88.3527 -82.0373 56.7 -88.5224 144.814 a - - --13.8076 162.81 m -154.32 0 0 154.32 97.47 55.89 -55.8662 73.2873 a - - --82.0373 56.7 m -97.47 55.89 l - - - -$p$ -$z$ -$w_p$ -$w_z$ - --43.8615 122.31 m --31.6777 115.02 l --23.5553 125.55 l - - - diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/remimpos.gif b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/remimpos.gif deleted file mode 100644 index 671807d1fbc6ed8601fcf007dd09230527d3dff1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2002 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 Awg3PC diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/remimpos.xml b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/remimpos.xml deleted file mode 100644 index 01ca1096d56..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/remimpos.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - --144 96 m --104 88 l --64 96 l -h - - --144 96 m --144 -8 l --104 -24 l --104 88 l --144 96 l --64 96 l --104 88 l - - --64 96 m --64 -8 l --104 -24 l - - --144 96 m --104 -24 l - - --104 88 m --64 -8 l - - --64 96 m --144 -8 l - - - --104 -24 m --64 96 l - -any tetrahedron formed with the upper facet -and any other vertex of the hole would violate -a facet of the polyhedron - --144 -8 m --64 -8 l - - -9.6455 0 0 9.6455 -83.2593 38.2222 e - - - diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/sidedim2.gif b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/sidedim2.gif deleted file mode 100644 index d0e019929faca07058497087c4b9ccae2b4dc292..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3086 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 diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/sidedim2.xml b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/sidedim2.xml deleted file mode 100644 index 8118c7b98cd..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/sidedim2.xml +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - --31.0962 133.009 m --43.112 106.876 l - - --31.0962 133.009 m -6.06326 106.6 l - - --43.112 106.876 m -6.06326 106.6 l - - -27.9852 53.9124 m -18.2924 62.1975 l - -orthocircle of $f$ - - -$p$ -$w_p$ - -28.7636 0 0 28.7636 -43.112 106.876 e - - - - -$w_z$ - -45.5878 0 0 45.5878 6.06326 106.6 e - -$z$ - - -$w_z$ - -45.5878 0 0 45.5878 -142.956 106.6 e - -$z$ - --142.956 106.6 m --113.474 141.372 l - - --173.009 106.876 m --150.983 125.374 l - - -$p$ -$w_p$ - -28.7636 0 0 28.7636 -173.009 106.876 e - - -$w_z$ - -45.5878 0 0 45.5878 177.071 106.6 e - -$z$ - -$p$ -$w_p$ - -28.7636 0 0 28.7636 106.405 106.876 e - - -177.071 106.6 m -186.14 151.277 l - - -106.405 106.876 m -114.313 134.531 l - - --178.534 135.104 m --216.871 127.17 l - - --178.534 135.104 m --157.577 157.95 l - - -132.931 117.999 m -116.964 149.04 l - - -132.931 117.999 m -144.581 153.09 l - - --165.323 149.506 m -19.5434 0 0 19.5434 -178.534 135.104 -197.672 131.144 a - - -140.383 140.445 m -23.6511 0 0 23.6511 132.931 117.999 122.113 139.031 a - -$>\pi/2$ -$<\pi/2$ -ON\_BOUNDED\_SIDE -ON\_BOUNDARY -ON\_UNBOUNDED\_SIDE - --31.0962 133.009 m --13.8082 159.57 l - - --31.0962 133.009 m --56.8575 148.23 l - - --20.4275 149.4 m -19.5573 0 0 19.5573 -31.0962 133.009 -47.9342 142.957 a - -$\pi/2$ - - diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/topo-insert_outside_affine_hull.gif b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/topo-insert_outside_affine_hull.gif deleted file mode 100644 index 823ab67901012d7d320d6c27b4f85537d6ebd046..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2752 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 G0029QGk*{O diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/topo-insert_outside_affine_hull.pdf b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/topo-insert_outside_affine_hull.pdf deleted file mode 100644 index a3363a51b070150cce2e840313a4993adaccd497..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16890 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 a{P+n50N(g9CJ+JOj7h}GDyJ?_^uGXZu}A&@ diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/topo-insert_outside_affine_hull.xml b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/topo-insert_outside_affine_hull.xml deleted file mode 100644 index 0ccf9839fbd..00000000000 --- a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/topo-insert_outside_affine_hull.xml +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - -107.61 0 0 107.61 -40.625 164.186 e - - --124.313 99.1617 m -207.578 0 0 207.578 -173.875 300.736 26.8636 247.89 a - - - - - -$star$ - -$p$ - -26.8649 247.891 m -229.736 0 0 229.736 89.375 26.8224 -128.231 100.486 a - - - - -1.99683 190.472 m -199.37 0 0 199.37 -179.562 108.102 -62.6197 269.573 a - - --62.6203 269.574 m -184.379 0 0 184.379 116.188 314.554 -40.0821 216.701 a - - -1.99599 190.472 m -237.076 0 0 237.076 -99.9375 -23.5712 -137.855 210.453 a - - --137.854 210.451 m -216.518 0 0 216.518 59.3125 299.923 -101.29 154.71 a - - -1.99447 190.471 m -299.051 0 0 299.051 196.625 -36.576 -46.8552 137.058 a - - -1.99517 190.472 m -212.518 0 0 212.518 89.375 -3.2512 -88.8091 112.569 a - - -19.5037 225.283 m -128.804 0 0 128.804 127.783 155.526 3.67918 190.004 a - - -55.3277 181.491 m -166.471 0 0 166.471 4.28317 23.0393 2.00913 189.495 a - - -58.5 176.378 m -3.17764e-14 0 0 3.17764e-14 58.5 176.378 58.5 176.378 a - - -55.3277 181.492 m -40.2425 0 0 40.2425 15.0896 182.089 17.2504 222.273 a - - --46.5197 136.818 m -119.341 0 0 119.341 -38.0125 255.855 55.3277 181.492 a - - --86.9377 111.354 m -96.6885 0 0 96.6885 -40.2616 196.03 55.3277 181.492 a - - -55.3276 181.492 m -46.9863 0 0 46.9863 10.922 196.849 54.3626 214.755 a - - -53.6751 216.026 m -85.4916 0 0 85.4916 6.36227 144.82 -40.5658 216.28 a - - -2.74432 65.7027 m -139.962 0 0 139.962 -84.4909 175.153 55.3275 181.492 a - - --101.29 154.71 m -83.4958 0 0 83.4958 -18.196 146.529 2.74495 65.7019 a - - --150.904 49.8617 m --113.891 102.014 l - -triangulation of $S^1$ - -23.7832 44.9849 m -1.03317 127.89 l - -triangulation of $S^2$ - - diff --git a/Triangulation_3_copy_tds/doc_tex/Triangulation_3/triangulation3.png b/Triangulation_3_copy_tds/doc_tex/Triangulation_3/triangulation3.png deleted file mode 100644 index 74c4ed59dc9f4d4595dcc93c975f82a464100177..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 248716 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℘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%0A5wbF0(Lx#Z1<_r#Tz)nHKJ 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