oops bad place
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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...
|
||||
|
|
@ -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<Fast_location>
|
||||
// - Regular
|
||||
// - Regular<hidden points discarded>
|
||||
//
|
||||
// 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 <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
||||
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
|
||||
#include <CGAL/Delaunay_triangulation_3.h>
|
||||
#include <CGAL/Regular_triangulation_3.h>
|
||||
#include <CGAL/Regular_triangulation_euclidean_traits_3.h>
|
||||
#include <CGAL/Timer.h>
|
||||
#include <CGAL/Memory_sizer.h>
|
||||
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <cstdlib> // 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<double> K;
|
||||
#elif defined(EPEC)
|
||||
# ifdef CGAL_DONT_USE_LAZY_KERNEL
|
||||
typedef Epeck K;
|
||||
# else
|
||||
typedef Simple_cartesian<Gmpq> SK;
|
||||
typedef Lazy_kernel<SK> K;
|
||||
# endif
|
||||
#else // EPIC
|
||||
typedef Exact_predicates_inexact_constructions_kernel K;
|
||||
#endif
|
||||
typedef Regular_triangulation_euclidean_traits_3<K> WK;
|
||||
typedef K::Point_3 Point;
|
||||
|
||||
vector<Point> 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<Vertex_handle> 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<Tr>();
|
||||
if (input_file_selected)
|
||||
return;
|
||||
benchmark_location<Tr>();
|
||||
benchmark_remove<Tr>();
|
||||
}
|
||||
|
||||
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_triangulation_3<K> >("Delaunay [Compact_location]");
|
||||
if (input_file_selected)
|
||||
return 0;
|
||||
do_benchmarks<Delaunay_triangulation_3<K, Fast_location> >("Delaunay with Fast_location");
|
||||
do_benchmarks<Regular_triangulation_3<WK> >("Regular [with hidden points kept, except there's none in the data sets]");
|
||||
do_benchmarks<Regular_triangulation_3<WK, Triangulation_data_structure_3<Triangulation_vertex_base_3<WK>, Triangulation_cell_base_3<WK> > > >("Regular with hidden points discarded");
|
||||
}
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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 )
|
||||
|
|
@ -1,243 +0,0 @@
|
|||
#include "MainWindow.h"
|
||||
#include <string>
|
||||
|
||||
#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_<action_name>_<signal_name>"
|
||||
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("<!--CGAL_VERSION-->",
|
||||
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<QLabel*>("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();
|
||||
}
|
||||
|
|
@ -1,55 +0,0 @@
|
|||
#ifndef MAIN_WINDOW_H
|
||||
#define MAIN_WINDOW_H
|
||||
|
||||
#include "ui_MainWindow.h"
|
||||
#include <CGAL/Qt/DemosMainWindow.h>
|
||||
#include <QFileDialog>
|
||||
#include <QInputDialog>
|
||||
#include <QMessageBox>
|
||||
|
||||
#include <QtGui>
|
||||
|
||||
#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
|
||||
|
|
@ -1,577 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MainWindow</class>
|
||||
<widget class="QMainWindow" name="MainWindow">
|
||||
<property name="windowModality">
|
||||
<enum>Qt::NonModal</enum>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>1100</width>
|
||||
<height>500</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Arial</family>
|
||||
</font>
|
||||
</property>
|
||||
<property name="cursor">
|
||||
<cursorShape>PointingHandCursor</cursorShape>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Triangulation_demo_3</string>
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset resource="T3_demo.qrc">
|
||||
<normaloff>:/T3_demo/icons/icons/cgal_logo.xpm</normaloff>:/T3_demo/icons/icons/cgal_logo.xpm</iconset>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="Viewer" name="viewer" native="true">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="cursor">
|
||||
<cursorShape>PointingHandCursor</cursorShape>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QMenuBar" name="menubar">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>1010</width>
|
||||
<height>22</height>
|
||||
</rect>
|
||||
</property>
|
||||
<widget class="QMenu" name="menuFile">
|
||||
<property name="title">
|
||||
<string>&File</string>
|
||||
</property>
|
||||
<addaction name="actionLoad_Points"/>
|
||||
<addaction name="actionSave_Points"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionQuit"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuEdit">
|
||||
<property name="title">
|
||||
<string>Edit</string>
|
||||
</property>
|
||||
<addaction name="actionGenerate_Points"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionIncremental_Construct"/>
|
||||
<addaction name="actionStop_Animation"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionClear_Scene"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuMode">
|
||||
<property name="title">
|
||||
<string>Mode</string>
|
||||
</property>
|
||||
<addaction name="actionNormal_View"/>
|
||||
<addaction name="actionInsert_Vertex"/>
|
||||
<addaction name="actionInsert_Point"/>
|
||||
<addaction name="actionSelect_Vertex"/>
|
||||
<addaction name="actionMove_Vertex"/>
|
||||
<addaction name="actionFind_NearestNb"/>
|
||||
<addaction name="actionEmpty_Sphere"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuShow">
|
||||
<property name="title">
|
||||
<string>Show</string>
|
||||
</property>
|
||||
<addaction name="actionShow_Axis"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionShow_Vertex"/>
|
||||
<addaction name="actionShow_DEdge"/>
|
||||
<addaction name="actionShow_VEdge"/>
|
||||
<addaction name="actionShow_Facet"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionFlat"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionPreferences"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuHelp">
|
||||
<property name="title">
|
||||
<string>Help</string>
|
||||
</property>
|
||||
<addaction name="actionDemo_Help"/>
|
||||
<addaction name="actionAbout_T3_demo"/>
|
||||
</widget>
|
||||
<addaction name="menuFile"/>
|
||||
<addaction name="menuEdit"/>
|
||||
<addaction name="menuMode"/>
|
||||
<addaction name="menuShow"/>
|
||||
<addaction name="menuHelp"/>
|
||||
</widget>
|
||||
<widget class="QStatusBar" name="statusbar"/>
|
||||
<widget class="QToolBar" name="toolBar">
|
||||
<property name="windowTitle">
|
||||
<string>toolBar</string>
|
||||
</property>
|
||||
<attribute name="toolBarArea">
|
||||
<enum>TopToolBarArea</enum>
|
||||
</attribute>
|
||||
<attribute name="toolBarBreak">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<addaction name="actionLoad_Points"/>
|
||||
<addaction name="actionSave_Points"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionGenerate_Points"/>
|
||||
<addaction name="actionClear_Scene"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionIncremental_Construct"/>
|
||||
<addaction name="actionStop_Animation"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionShow_Axis"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionFlat"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionShow_Vertex"/>
|
||||
<addaction name="actionShow_DEdge"/>
|
||||
<addaction name="actionShow_VEdge"/>
|
||||
<addaction name="actionShow_Facet"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionNormal_View"/>
|
||||
<addaction name="actionInsert_Vertex"/>
|
||||
<addaction name="actionInsert_Point"/>
|
||||
<addaction name="actionSelect_Vertex"/>
|
||||
<addaction name="actionMove_Vertex"/>
|
||||
<addaction name="actionFind_NearestNb"/>
|
||||
<addaction name="actionEmpty_Sphere"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionPreferences"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionQuit"/>
|
||||
</widget>
|
||||
<action name="actionGenerate_Points">
|
||||
<property name="icon">
|
||||
<iconset resource="T3_demo.qrc">
|
||||
<normaloff>:/T3_demo/icons/icons/pointRandom.png</normaloff>:/T3_demo/icons/icons/pointRandom.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Generate Points</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Generate Points</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Generate Points</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+G</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionLoad_Points">
|
||||
<property name="icon">
|
||||
<iconset resource="T3_demo.qrc">
|
||||
<normaloff>:/T3_demo/icons/icons/fileOpen.png</normaloff>:/T3_demo/icons/icons/fileOpen.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Load Points...</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Load Points from a file</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Load Points from a file</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+O</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionSave_Points">
|
||||
<property name="icon">
|
||||
<iconset resource="T3_demo.qrc">
|
||||
<normaloff>:/T3_demo/icons/icons/fileSave.png</normaloff>:/T3_demo/icons/icons/fileSave.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Save Points...</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Save points to a file</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Save points to a file</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+S</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionShow_Axis">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="T3_demo.qrc">
|
||||
<normaloff>:/T3_demo/icons/icons/coordinates.jpeg</normaloff>:/T3_demo/icons/icons/coordinates.jpeg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Show Axis</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Show/Hide Axis</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Show/Hide Axis</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionQuit">
|
||||
<property name="icon">
|
||||
<iconset resource="T3_demo.qrc">
|
||||
<normaloff>:/T3_demo/icons/icons/quit.jpeg</normaloff>:/T3_demo/icons/icons/quit.jpeg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Quit</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Quit</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Quit</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionClear_Scene">
|
||||
<property name="icon">
|
||||
<iconset resource="T3_demo.qrc">
|
||||
<normaloff>:/T3_demo/icons/icons/clear.jpeg</normaloff>:/T3_demo/icons/icons/clear.jpeg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Clear Scene</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Clear Scene</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Clear Scene</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionShow_Vertex">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="T3_demo.qrc">
|
||||
<normaloff>:/T3_demo/icons/icons/show_point.jpeg</normaloff>:/T3_demo/icons/icons/show_point.jpeg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Show Vertices</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Show Vertices</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Show Vertices</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionShow_DEdge">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="T3_demo.qrc">
|
||||
<normaloff>:/T3_demo/icons/icons/show_delaunay.jpeg</normaloff>:/T3_demo/icons/icons/show_delaunay.jpeg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Show Delaunay Edges</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Show Delaunay edges</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Show Delaunay edges</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionShow_VEdge">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="T3_demo.qrc">
|
||||
<normaloff>:/T3_demo/icons/icons/show_voronoi.jpeg</normaloff>:/T3_demo/icons/icons/show_voronoi.jpeg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Show Voronoi Edges</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Show Voronoi edges</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Show Voronoi edges</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionShow_Facet">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="T3_demo.qrc">
|
||||
<normaloff>:/T3_demo/icons/icons/show_facet.jpeg</normaloff>:/T3_demo/icons/icons/show_facet.jpeg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Show Facets</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Show Delaunay Facets</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Show Delaunay Facets</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionFlat">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="T3_demo.qrc">
|
||||
<normaloff>:/T3_demo/icons/icons/flat.png</normaloff>
|
||||
<normalon>:/T3_demo/icons/icons/stereo.png</normalon>:/T3_demo/icons/icons/flat.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Flat</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Toggle 3D effect</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Toggle 3D effect</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionPreferences">
|
||||
<property name="icon">
|
||||
<iconset resource="T3_demo.qrc">
|
||||
<normaloff>:/T3_demo/icons/icons/preferences.jpeg</normaloff>:/T3_demo/icons/icons/preferences.jpeg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Preferences...</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Change Colors, Transparency, etc.</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Change Colors, Transparency, etc.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionInsert_Vertex">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="T3_demo.qrc">
|
||||
<normaloff>:/T3_demo/icons/icons/insert.jpeg</normaloff>:/T3_demo/icons/icons/insert.jpeg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Insert Vertex</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Insert a point and update the triangulation</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Insert a point and update the triangulation</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionInsert_Point">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="T3_demo.qrc">
|
||||
<normaloff>:/T3_demo/icons/icons/insert_point.jpg</normaloff>:/T3_demo/icons/icons/insert_point.jpg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Insert Point</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Show the conflict region of a point and insert it</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Show the conflict region of a point and insert it</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionSelect_Vertex">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="T3_demo.qrc">
|
||||
<normaloff>:/T3_demo/icons/icons/select_hand.jpeg</normaloff>:/T3_demo/icons/icons/select_hand.jpeg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Select Vertex</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Select vertices</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Select vertices</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionMove_Vertex">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="T3_demo.qrc">
|
||||
<normaloff>:/T3_demo/icons/icons/move_1.jpeg</normaloff>:/T3_demo/icons/icons/move_1.jpeg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Move Vertex</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Move a vertex</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Move a vertex</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionFind_NearestNb">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="T3_demo.qrc">
|
||||
<normaloff>:/T3_demo/icons/icons/nearest_nb.png</normaloff>:/T3_demo/icons/icons/nearest_nb.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Nearest Neighbor Search</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Find the nearest neighbor of the query point</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Find the nearest neighbor of the query point</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionEmpty_Sphere">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="T3_demo.qrc">
|
||||
<normaloff>:/T3_demo/icons/icons/empty_sphere.jpeg</normaloff>:/T3_demo/icons/icons/empty_sphere.jpeg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Show Empty Sphere</string>
|
||||
</property>
|
||||
<property name="iconText">
|
||||
<string>Click to select a cell and show empty sphere of that cell.</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Locate the query point in a cell and show empty sphere of that cell</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Locate the query point in a cell and show empty sphere of that cell</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionNormal_View">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="T3_demo.qrc">
|
||||
<normaloff>:/T3_demo/icons/icons/normal_view.jpeg</normaloff>:/T3_demo/icons/icons/normal_view.jpeg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Normal Mode</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Normal Mode</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Normal Mode</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionDemo_Help">
|
||||
<property name="text">
|
||||
<string>Triangulation_3D Demo Help</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Triangulation_3D Demo Help</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Triangulation_3D Demo Help</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>H</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionIncremental_Construct">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="T3_demo.qrc">
|
||||
<normaloff>:/T3_demo/icons/icons/play.jpeg</normaloff>
|
||||
<normalon>:/T3_demo/icons/icons/pause.jpeg</normalon>:/T3_demo/icons/icons/play.jpeg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Insertion Animation</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Animation of incremental Delaunay triangulation</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Animation of incremental Delaunay triangulation</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionStop_Animation">
|
||||
<property name="icon">
|
||||
<iconset resource="T3_demo.qrc">
|
||||
<normaloff>:/T3_demo/icons/icons/stop.jpeg</normaloff>:/T3_demo/icons/icons/stop.jpeg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Stop Animation</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Stop Animation</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Stop Animation</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionAbout_T3_demo">
|
||||
<property name="text">
|
||||
<string>About T3_demo</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<layoutdefault spacing="3" margin="1"/>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>Viewer</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>Viewer.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources>
|
||||
<include location="T3_demo.qrc"/>
|
||||
</resources>
|
||||
<connections/>
|
||||
</ui>
|
||||
|
|
@ -1,399 +0,0 @@
|
|||
#include <QtGui>
|
||||
#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() );
|
||||
}
|
||||
|
|
@ -1,70 +0,0 @@
|
|||
#ifndef PREFERENCE_DLG_H
|
||||
#define PREFERENCE_DLG_H
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
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
|
||||
|
|
@ -1,225 +0,0 @@
|
|||
#include "Scene.h"
|
||||
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
#include <CGAL/IO/File_scanner_OFF.h>
|
||||
#include <CGAL/IO/File_header_OFF.h>
|
||||
#include <CGAL/IO/File_writer_OFF.h>
|
||||
#include <CGAL/IO/read_off_points.h>
|
||||
#include <CGAL/IO/write_off_points.h>
|
||||
#include <CGAL/IO/read_xyz_points.h>
|
||||
#include <CGAL/IO/write_xyz_points.h>
|
||||
|
||||
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<Point_3> pts_generator(1.0);
|
||||
/* 2. randomly on a sphere of radius 1.0 --tested */
|
||||
// CGAL::Random_points_in_sphere_3<Point_3> pts_generator(1.0);
|
||||
|
||||
/* Insert them into the point list: */
|
||||
/* 1. use CGAL's copy function --tested */
|
||||
list<Point_3> pts;
|
||||
CGAL::copy_n( pts_generator, num, std::back_inserter(pts) );
|
||||
/* 2. use STL's function */
|
||||
//for (int i=0; i<num; ++i, ++pts_generator) {
|
||||
// pts.push_back(*pts_generator);
|
||||
//}
|
||||
|
||||
/* 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::readOFFPointsandFacets(const char* filename,
|
||||
std::list<Point_3> & 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<scanner.size_of_vertices(); ++i) {
|
||||
scanner.scan_vertex( x, y, z );
|
||||
Point_3 pt(x, y, z);
|
||||
points.push_back(pt);
|
||||
scanner.skip_to_next_vertex(i);
|
||||
}//end-for-vertex
|
||||
}
|
||||
|
||||
void Scene::loadPointsOFF(const char* filename)
|
||||
{
|
||||
list<Point_3> 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<Point_3> 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) );
|
||||
}
|
||||
}
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
#ifndef SCENE_H
|
||||
#define SCENE_H
|
||||
|
||||
#include "typedefs.h"
|
||||
#include <QGLViewer/qglviewer.h>
|
||||
|
||||
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<Point_3> &);
|
||||
|
||||
private:
|
||||
//added for T3 demo
|
||||
DT3 m_dt;
|
||||
QList<Vertex_handle> m_vhArray;
|
||||
|
||||
QGLViewer* m_viewer;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -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 <fei@cis.udel.edu>
|
||||
//
|
||||
// File Description : Demo of CGAL 3D Triangulation package
|
||||
|
||||
#include "MainWindow.h"
|
||||
#include <QApplication>
|
||||
|
||||
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();
|
||||
}
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
<RCC>
|
||||
<qresource prefix="/T3_demo/icons">
|
||||
<file>icons/flat.png</file>
|
||||
<file>icons/stereo.png</file>
|
||||
<file>icons/pause.jpeg</file>
|
||||
<file>icons/show_delaunay.jpeg</file>
|
||||
<file>icons/show_facet.jpeg</file>
|
||||
<file>icons/show_point.jpeg</file>
|
||||
<file>icons/show_voronoi.jpeg</file>
|
||||
<file>icons/play.jpeg</file>
|
||||
<file>icons/stop.jpeg</file>
|
||||
<file>icons/empty_sphere.jpeg</file>
|
||||
<file>icons/normal_view.jpeg</file>
|
||||
<file>icons/nearest_nb.png</file>
|
||||
<file>icons/quit.jpeg</file>
|
||||
<file>icons/insert_point.jpg</file>
|
||||
<file>icons/clear.jpeg</file>
|
||||
<file>icons/coordinates.jpeg</file>
|
||||
<file>icons/fileOpen.png</file>
|
||||
<file>icons/pointRandom.png</file>
|
||||
<file>icons/fileSave.png</file>
|
||||
<file>icons/cgal_logo.xpm</file>
|
||||
<file>icons/insert.jpeg</file>
|
||||
<file>icons/move_1.jpeg</file>
|
||||
<file>icons/select_hand.jpeg</file>
|
||||
<file>icons/preferences.jpeg</file>
|
||||
</qresource>
|
||||
<qresource prefix="/T3_demo/html">
|
||||
<file>icons/about_CGAL.html</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
|
@ -1,290 +0,0 @@
|
|||
#ifndef VIEWER_H
|
||||
#define VIEWER_H
|
||||
|
||||
#include "Scene.h"
|
||||
#include <QGLViewer/qglviewer.h>
|
||||
#include <QMouseEvent>
|
||||
#include <QKeyEvent>
|
||||
#include <QSettings>
|
||||
#include "PreferenceDlg.h"
|
||||
|
||||
#include <iostream>
|
||||
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<QColor>();
|
||||
#if QT_VERSION >= 0x040600
|
||||
m_fSizeVertex = settings.value( "Show/vertexsize", 0.04f ).toFloat();
|
||||
#else
|
||||
m_fSizeVertex = settings.value( "Show/vertexsize", 0.04f ).value<float>();
|
||||
#endif
|
||||
m_colorDEdge = settings.value( "Show/dedgecolor", QColor(0, 255, 0) ).value<QColor>();
|
||||
#if QT_VERSION >= 0x040600
|
||||
m_fSizeDEdge = settings.value( "Show/dedgesize", 0.01f ).toFloat();
|
||||
#else
|
||||
m_fSizeDEdge = settings.value( "Show/dedgesize", 0.01f ).value<float>();
|
||||
#endif
|
||||
m_colorVEdge = settings.value( "Show/vedgecolor", QColor(0, 0, 255) ).value<QColor>();
|
||||
#if QT_VERSION >= 0x040600
|
||||
m_fSizeVEdge = settings.value( "Show/vedgesize", 0.01f ).toFloat();
|
||||
#else
|
||||
m_fSizeVEdge = settings.value( "Show/vedgesize", 0.01f ).value<float>();
|
||||
#endif
|
||||
m_colorFacet = settings.value( "Show/facetcolor",
|
||||
QColor(255, 255, 0, 96) ).value<QColor>();
|
||||
m_colorTrackball = settings.value( "Show/ballcolor",
|
||||
QColor(150, 150, 150, 128) ).value<QColor>();
|
||||
m_iStep = settings.value( "Show/ballstep", 4000 ).toInt();
|
||||
m_colorEmptySphere = settings.value( "Show/spherecolor",
|
||||
QColor(180, 50, 180, 64) ).value<QColor>();
|
||||
}
|
||||
|
||||
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<Point_3> m_incrementalPts;
|
||||
enum Step { INIT, NEWPT, CELL, CONFLICT };
|
||||
Step m_curStep;
|
||||
Cell_handle m_cellContain;
|
||||
QList<Facet> m_boundaryFacets;
|
||||
QList<Cell_handle> 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<int> 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
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
<html>
|
||||
<body>
|
||||
<h2>CGAL Triangulation_3 Demo</h2>
|
||||
<p>Copyright ©2010-2011<br>
|
||||
<a href="http://www-sop.inria.fr/">INRIA Sophia Antipolis - Mediterranee<a/></p>
|
||||
<p>This application illustrates an interactive demo for 3D Delaunay Triangulation package
|
||||
of <a href="http://www.cgal.org/">CGAL</a>.</p>
|
||||
<p>See also the package manual:<br>
|
||||
<a href="http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Triangulation_3/Chapter_main.html">
|
||||
3D Triangulations</a>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
<html>
|
||||
<body>
|
||||
<h2>Computational Geometry Algorithms Library</h2>
|
||||
<p>CGAL provides efficient and reliable geometric algorithms in the form of a C++ library.</p>
|
||||
<p>For more information visit <a href="http://www.cgal.org/">www.cgal.org</a>.</p>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
<html>
|
||||
<body>
|
||||
<p><img src=":/cgal/logos/CGAL.gif"></p>
|
||||
<h2>Computational Geometry Algorithms Library<!--CGAL_VERSION--></h2>
|
||||
<p>CGAL provides efficient and reliable geometric algorithms in the form of a C++ library.</p>
|
||||
<p>For more information visit <a href="http://www.cgal.org/">www.cgal.org</a></p>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -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 */
|
||||
"................",
|
||||
"...++++...++++..",
|
||||
"..+....+.+....+.",
|
||||
"..+......+......",
|
||||
"..+......+..+++.",
|
||||
"..+......+....+.",
|
||||
"..+....+.+....+.",
|
||||
"...++++...++++..",
|
||||
"................",
|
||||
"...++++...+.....",
|
||||
"..+....+..+.....",
|
||||
"..+....+..+.....",
|
||||
"..++++++..+.....",
|
||||
"..+....+..+.....",
|
||||
"..+....+..+++++.",
|
||||
"................"};
|
||||
|
Before Width: | Height: | Size: 768 B |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 798 B |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 797 B |
|
Before Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1003 B |
|
Before Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 326 B |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.2 KiB |
|
|
@ -1,101 +0,0 @@
|
|||
#ifndef TYPEDEFS_H
|
||||
#define TYPEDEFS_H
|
||||
|
||||
#include <vector> //dynamic array
|
||||
#include <list> //linked list
|
||||
|
||||
// CGAL
|
||||
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
||||
#include <CGAL/point_generators_3.h>
|
||||
|
||||
// Added for T3 demo
|
||||
#include <CGAL/Delaunay_triangulation_3.h>
|
||||
#include <CGAL/Triangulation_vertex_base_3.h>
|
||||
|
||||
// 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<GT> >
|
||||
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<TDS2>::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<Kernel> > Tds;
|
||||
/*
|
||||
* Delaunay_triangulation_3<arg1, arg2, arg3>
|
||||
* 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<Kernel, Tds, CGAL::Fast_location> 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
|
||||
|
|
@ -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 <QtCore/QVariant>
|
||||
#include <QtGui/QAction>
|
||||
#include <QtGui/QApplication>
|
||||
#include <QtGui/QButtonGroup>
|
||||
#include <QtGui/QHBoxLayout>
|
||||
#include <QtGui/QMainWindow>
|
||||
#include <QtGui/QMenu>
|
||||
#include <QtGui/QMenuBar>
|
||||
#include <QtGui/QStatusBar>
|
||||
#include <QtGui/QToolBar>
|
||||
#include <QtGui/QWidget>
|
||||
#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
|
||||
|
|
@ -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()
|
||||
|
||||
|
|
@ -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
|
||||
--------------------------------------------------------------
|
||||
|
|
@ -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 <Monique.Teillaud@sophia.inria.fr>
|
||||
|
||||
#include <CGAL/basic.h>
|
||||
|
||||
#ifndef CGAL_USE_GEOMVIEW
|
||||
#include <iostream>
|
||||
int main()
|
||||
{
|
||||
std::cerr << "Geomview doesn't work on this platform,"
|
||||
" so this demo doesn't work" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
|
||||
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
||||
|
||||
#include <CGAL/Delaunay_triangulation_3.h>
|
||||
#include <CGAL/Triangulation_vertex_base_with_info_3.h>
|
||||
|
||||
#include <CGAL/IO/Triangulation_geomview_ostream_3.h>
|
||||
|
||||
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
|
||||
|
||||
typedef CGAL::Triangulation_vertex_base_with_info_3<CGAL::Color, K> Vb;
|
||||
typedef CGAL::Triangulation_data_structure_3<Vb> Tds;
|
||||
typedef CGAL::Delaunay_triangulation_3<K, Tds> 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
|
||||
|
|
@ -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 <Monique.Teillaud@sophia.inria.fr>
|
||||
|
||||
#include <CGAL/basic.h>
|
||||
|
||||
#ifndef CGAL_USE_GEOMVIEW
|
||||
#include <iostream>
|
||||
int main()
|
||||
{
|
||||
std::cerr << "Geomview doesn't work on this platform,"
|
||||
" so this demo doesn't work" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
|
||||
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
||||
|
||||
#include <CGAL/Delaunay_triangulation_3.h>
|
||||
|
||||
#include <CGAL/IO/Triangulation_geomview_ostream_3.h>
|
||||
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <iterator>
|
||||
#include <unistd.h>
|
||||
|
||||
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
|
||||
|
||||
typedef CGAL::Delaunay_triangulation_3<K> 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<class TRIANGULATION>
|
||||
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<class TRIANGULATION>
|
||||
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<class TRIANGULATION>
|
||||
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<class TRIANGULATION>
|
||||
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<class TRIANGULATION>
|
||||
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"<<std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
std::cout <<" Reading file data/points" << std::endl ;
|
||||
{
|
||||
std::istream_iterator<Point> 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" <<std::endl
|
||||
<<" two triangulations by selecting it" <<std::endl
|
||||
<<" in the Geomview targets" <<std::endl;
|
||||
|
||||
char ch;
|
||||
std::cout << "Enter any character to quit" << std::endl;
|
||||
std::cin >> ch;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif // CGAL_USE_GEOMVIEW
|
||||
|
|
@ -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 <Monique.Teillaud@sophia.inria.fr>
|
||||
|
||||
#include <CGAL/basic.h>
|
||||
|
||||
#ifndef CGAL_USE_GEOMVIEW
|
||||
#include <iostream>
|
||||
int main()
|
||||
{
|
||||
std::cerr << "Geomview doesn't work on this platform,"
|
||||
" so this demo doesn't work" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
|
||||
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
||||
|
||||
#include <CGAL/Delaunay_triangulation_3.h>
|
||||
|
||||
#include <CGAL/IO/Triangulation_geomview_ostream_3.h>
|
||||
|
||||
#include <unistd.h>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
|
||||
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
|
||||
typedef CGAL::Delaunay_triangulation_3<K, CGAL::Fast_location> 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<class TRIANGULATION>
|
||||
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<class TRIANGULATION>
|
||||
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<class TRIANGULATION>
|
||||
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<class TRIANGULATION>
|
||||
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<class TRIANGULATION>
|
||||
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<Vertex_handle> 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
|
||||
|
|
@ -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 <Monique.Teillaud@sophia.inria.fr>
|
||||
|
||||
#include <CGAL/basic.h>
|
||||
|
||||
#ifndef CGAL_USE_GEOMVIEW
|
||||
#include <iostream>
|
||||
int main()
|
||||
{
|
||||
std::cerr << "Geomview doesn't work on this platform,"
|
||||
" so this demo doesn't work"
|
||||
<< std::endl;
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
|
||||
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
|
||||
|
||||
#include <CGAL/Delaunay_triangulation_3.h>
|
||||
#include <CGAL/Triangulation_cell_base_with_circumcenter_3.h>
|
||||
|
||||
#include <CGAL/IO/Triangulation_geomview_ostream_3.h>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
// 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<K> Vb;
|
||||
typedef CGAL::Triangulation_cell_base_with_circumcenter_3<K> Cb;
|
||||
typedef CGAL::Triangulation_data_structure_3<Vb, Cb> TDS;
|
||||
typedef CGAL::Delaunay_triangulation_3<K, TDS> Triangulation;
|
||||
// typedef CGAL::Delaunay_triangulation_3<K> 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
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
0 0 0
|
||||
1 0 0
|
||||
0 1 0
|
||||
0 0 1
|
||||
2 2 2
|
||||
-1 0 1
|
||||
|
||||
|
|
@ -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}
|
||||
|
|
@ -1,386 +0,0 @@
|
|||
% file : doc_tex/basic/TriangulationDS_3/TDS3.tex
|
||||
% revision : $Id$
|
||||
%
|
||||
% author(s) : Monique Teillaud <Monique.Teillaud@sophia.inria.fr>
|
||||
|
||||
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}
|
||||
<CENTER>
|
||||
<img border=0 src="./repres.gif" align=middle alt="Representation">
|
||||
</CENTER>
|
||||
\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}
|
||||
<CENTER>
|
||||
<img border=0 src="./topo-simplex4.gif" align=middle
|
||||
alt="4D simplex and a 3D geometric embedding">
|
||||
</CENTER>
|
||||
\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}
|
||||
<CENTER>
|
||||
<img border=0 src="./topo-simplex3.gif" align=middle
|
||||
alt="3D simplex and a 2D geometric embedding">
|
||||
</CENTER>
|
||||
\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}
|
||||
<CENTER>
|
||||
<img border=0 src="./topo-simplex2.gif" align=middle
|
||||
alt="2D simplex and a 1D geometric embedding">
|
||||
</CENTER>
|
||||
\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}
|
||||
<CENTER>
|
||||
<img border=0 src="./comborient.gif" align=middle alt="Orientation of a cell (3-dimensional case)">
|
||||
</CENTER>
|
||||
\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}
|
||||
<CENTER>
|
||||
<img border=0 src="./design_tds.gif" align=middle
|
||||
alt="Triangulation Data Structure software design">
|
||||
</CENTER>
|
||||
\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<Vb, Cb> Self;
|
||||
|
||||
// Rebind the vertex and cell base to the actual TDS (Self).
|
||||
typedef typename Vb::template Rebind_TDS<Self>::Other VertexBase;
|
||||
typedef typename Cb::template Rebind_TDS<Self>::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<TDS2> 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<TDS2>::Other Vb2;
|
||||
typedef Triangulation_vertex_base_3<GT, Vb2> 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.
|
||||
|
Before Width: | Height: | Size: 1.4 KiB |
|
|
@ -1,50 +0,0 @@
|
|||
<ipe version="60023" creator="Ipe 6.0 preview 23" media="-424.716 -80.299 170.284 761.701">
|
||||
<info created="D:20050330172912" modified="D:20050330172912" bbox="cropbox"/>
|
||||
<page>
|
||||
<layer name="alpha"/>
|
||||
<view layers="alpha" active="alpha"/>
|
||||
<path layer="alpha" stroke="black" pen="0.4">
|
||||
-111.778 375.245 m
|
||||
-152.403 305.344 l
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
-111.778 375.245 m
|
||||
-58.153 352.486 l
|
||||
</path>
|
||||
<path stroke="black" dash="[1 3] 0" pen="0.4">
|
||||
-152.403 305.344 m
|
||||
-58.153 352.486 l
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
-152.403 305.344 m
|
||||
-67.903 270.394 l
|
||||
-111.778 375.245 l
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
-58.153 352.486 m
|
||||
-67.903 270.394 l
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
-111.778 375.245 m
|
||||
-164.591 413.446 l
|
||||
-152.403 305.344 l
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
-164.591 413.446 m
|
||||
-58.153 352.486 l
|
||||
</path>
|
||||
<text stroke="black" pos="-180.028 424.013" type="label" width="9.656" height="8.112" depth="2.47" valign="bottom" size="10">$v_3^1$</text>
|
||||
<text stroke="black" pos="-61.403 257.389" type="label" width="9.656" height="8.112" depth="2.47" valign="bottom" size="10">$v_3^2$</text>
|
||||
<text stroke="black" pos="-43.528 351.674" type="label" width="51.065" height="8.112" depth="2.47" valign="bottom" size="10">$v_0^2 = v_1^1 = v$</text>
|
||||
<text stroke="black" pos="-102.028 384.998" type="label" width="51.582" height="8.112" depth="2.47" valign="bottom" size="10">$v_1^2 = v_0^1 = u$</text>
|
||||
<text stroke="black" pos="-210.903 289.901" type="label" width="53.279" height="8.112" depth="2.47" valign="bottom" size="10">$v_2^2 = v_2^1 = w$</text>
|
||||
<path stroke="black" dash="[4] 0" pen="0.4" arrow="7">
|
||||
-50.8405 282.586 m
|
||||
20.9708 0 0 20.9708 -67.903 270.394 -88.0664 264.631 a
|
||||
</path>
|
||||
<path stroke="black" dash="[4] 0" pen="0.4" backarrow="7">
|
||||
-141.029 415.072 m
|
||||
21.9574 0 0 21.9574 -154.841 398.003 -174.479 388.18 a
|
||||
</path>
|
||||
</page>
|
||||
</ipe>
|
||||
|
|
@ -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<TDS=Self> >\001
|
||||
4 0 0 50 0 0 16 0.0000 4 225 3135 2295 8865 DSVertexBase<TDS=Dummy>\001
|
||||
4 0 0 50 0 0 16 0.0000 4 225 2880 6030 8865 DSCellBase<TDS=Dummy>\001
|
||||
4 0 0 50 0 0 13 0.0000 4 195 3210 2295 7065 UserVB<...,DSVB<TDS=Dummy> >\001
|
||||
4 0 0 50 0 0 13 0.0000 4 195 3240 5940 7065 UserCB<...,DSCB<TDS=Dummy> >\001
|
||||
4 0 0 50 0 0 15 0.0000 4 180 2820 5940 3195 UserCB<...,DSCB<TDS=Self> >\001
|
||||
|
Before Width: | Height: | Size: 360 KiB |
|
Before Width: | Height: | Size: 2.7 KiB |
|
|
@ -1,67 +0,0 @@
|
|||
<ipe version="60023" creator="Ipe 6.0 preview 23" media="-341.361 -348.1 253.639 493.9">
|
||||
<info created="D:20050330173011" modified="D:20050330173011" bbox="cropbox"/>
|
||||
<page>
|
||||
<layer name="alpha"/>
|
||||
<view layers="alpha" active="alpha"/>
|
||||
<path layer="alpha" fill="0.8" pen="0.4">
|
||||
-8.1225 76.95 m
|
||||
38.1758 52.65 l
|
||||
84.474 93.15 l
|
||||
h
|
||||
</path>
|
||||
<group>
|
||||
<path fill="0.8" pen="0.4">
|
||||
-122.65 172.53 m
|
||||
-156.764 -26.73 l
|
||||
-125.899 52.65 l
|
||||
h
|
||||
</path>
|
||||
<path stroke="black" dash="[1 3] 0" pen="0.4">
|
||||
-172.197 76.95 m
|
||||
-79.6005 93.15 l
|
||||
</path>
|
||||
<path stroke="black" dash="[1 3] 0" pen="1.2">
|
||||
-122.65 172.53 m
|
||||
-156.764 -26.73 l
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
-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
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
-172.197 76.95 m
|
||||
-156.764 -26.73 l
|
||||
</path>
|
||||
</group>
|
||||
<path stroke="black" dash="[1 3] 0" pen="0.4">
|
||||
-8.1225 76.95 m
|
||||
84.474 93.15 l
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
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
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
-8.1225 76.95 m
|
||||
7.31025 -26.73 l
|
||||
</path>
|
||||
<path stroke="black" pen="0.4" arrow="7" backarrow="7">
|
||||
-25.1797 80.19 m
|
||||
32.1918 0 0 32.1918 -46.6754 56.2266 -69.0413 79.3799 a
|
||||
</path>
|
||||
<text stroke="black" pos="-136.458 -22.68" type="label" width="53.743" height="6.918" depth="0" valign="bottom" size="10">3 tetrahedra</text>
|
||||
<text stroke="black" pos="32.49 -22.68" type="label" width="53.743" height="6.918" depth="0" valign="bottom" size="10">2 tetrahedra</text>
|
||||
</page>
|
||||
</ipe>
|
||||
|
|
@ -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}
|
||||
|
||||
|
Before Width: | Height: | Size: 2.7 KiB |
|
|
@ -1,64 +0,0 @@
|
|||
<ipe version="60023" creator="Ipe 6.0 preview 23" media="-368.166 -402.234 226.834 439.766">
|
||||
<info created="D:20050330173055" modified="D:20050330173055" bbox="cropbox"/>
|
||||
<page>
|
||||
<layer name="alpha"/>
|
||||
<view layers="alpha" active="alpha"/>
|
||||
<text layer="alpha" stroke="black" pos="-156.764 -42.93" type="label" width="36.53" height="6.42" depth="0" valign="bottom" size="10">vextex 0</text>
|
||||
<text stroke="black" pos="-30.2803 -44.2787" type="label" width="35.174" height="6.42" depth="0" valign="bottom" size="10">vertex 1</text>
|
||||
<text stroke="black" pos="9.747 42.93" type="label" width="35.174" height="6.42" depth="0" valign="bottom" size="10">vertex 2</text>
|
||||
<text stroke="black" pos="-120.213 81.81" type="label" width="35.174" height="6.42" depth="0" valign="bottom" size="10">vertex 3</text>
|
||||
<path stroke="black" fill="0.6" pen="0.4">
|
||||
-16.245 27.54 m
|
||||
-64.1677 51.03 l
|
||||
-38.1758 -8.1 l
|
||||
h
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
-64.1677 51.03 m
|
||||
-92.5965 -9.72 l
|
||||
-38.1758 -8.1 l
|
||||
</path>
|
||||
<path stroke="black" fill="black" dash="[1 3] 0" pen="0.4">
|
||||
-92.5965 -9.72 m
|
||||
-16.245 27.54 l
|
||||
</path>
|
||||
<text stroke="black" pos="9.747 -13.77" type="label" width="29.058" height="6.918" depth="0" valign="bottom" size="10">facet 0</text>
|
||||
<path stroke="black" dash="[4] 0" pen="0.4">
|
||||
-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
|
||||
</path>
|
||||
<text stroke="black" pos="15.4327 81" type="label" width="45.967" height="6.926" depth="1.93" valign="bottom" size="10">neighbor 0</text>
|
||||
<text stroke="black" pos="-151.891 42.93" type="label" width="44.832" height="7.473" depth="2.49" valign="bottom" size="10">edge $(1,3)$</text>
|
||||
<path stroke="black" dash="[1] 0" pen="0.4" arrow="7">
|
||||
7.31028 -0.81007 m
|
||||
48.7338 0 0 48.7338 -35.966 -23.2187 -42.237 25.1099 a
|
||||
</path>
|
||||
<path stroke="black" dash="[1] 0" pen="0.4" arrow="7">
|
||||
-104.78 37.26 m
|
||||
30.3329 0 0 30.3329 -78.6585 52.6788 -57.6698 30.78 a
|
||||
</path>
|
||||
<path stroke="black" dash="[1] 0" pen="0.4" arrow="7">
|
||||
-78.7882 72.09 m
|
||||
-64.1677 51.03 l
|
||||
</path>
|
||||
<path stroke="black" dash="[1] 0" pen="0.4" arrow="7">
|
||||
-34.1145 -31.59 m
|
||||
-38.1758 -8.1 l
|
||||
</path>
|
||||
<path stroke="black" dash="[1] 0" pen="0.4" arrow="7">
|
||||
-111.278 -28.35 m
|
||||
-92.5965 -9.72 l
|
||||
</path>
|
||||
<path stroke="black" dash="[1] 0" pen="0.4" arrow="7">
|
||||
4.06125 42.93 m
|
||||
-16.245 27.54 l
|
||||
</path>
|
||||
<path stroke="black" dash="[1] 0" pen="0.4" backarrow="7">
|
||||
-29.6619 60.0906 m
|
||||
60.4585 0 0 60.4585 -28.8736 120.544 15.4631 79.4406 a
|
||||
</path>
|
||||
</page>
|
||||
</ipe>
|
||||
|
Before Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
|
@ -1,34 +0,0 @@
|
|||
<ipe version="60023" creator="Ipe 6.0 preview 23" media="-316.558 -155.714 278.442 686.286">
|
||||
<info created="D:20050330173125" modified="D:20050330173125" bbox="cropbox"/>
|
||||
<page>
|
||||
<layer name="alpha"/>
|
||||
<view layers="alpha" active="alpha"/>
|
||||
<path layer="alpha" stroke="black" pen="0.4">
|
||||
48.0739 0 0 48.0739 -117.794 261.666 e
|
||||
</path>
|
||||
<mark stroke="black" pos="-159.018 236.932" shape="2" size="2"/>
|
||||
<mark stroke="black" pos="-79.4174 232.713" shape="2" size="2"/>
|
||||
<mark stroke="black" pos="-125.947 309.044" shape="2" size="2"/>
|
||||
<text stroke="black" pos="-185.823 230.918" type="label" width="9.298" height="4.294" depth="1.49" valign="bottom" size="10">$v_0$</text>
|
||||
<text stroke="black" pos="-75.6612 223.83" type="label" width="9.298" height="4.294" depth="1.49" valign="bottom" size="10">$v_1$</text>
|
||||
<text stroke="black" pos="-127.95 316.98" type="label" width="9.298" height="4.294" depth="1.49" valign="bottom" size="10">$v_2$</text>
|
||||
<path stroke="black" pen="0.4">
|
||||
-26.9262 268.887 m
|
||||
147.708 270.405 l
|
||||
</path>
|
||||
<mark stroke="black" pos="16.729 269.266" shape="2" size="2"/>
|
||||
<mark stroke="black" pos="106.582 270.048" shape="2" size="2"/>
|
||||
<text stroke="black" pos="-40.6329 275.974" type="label" width="9.963" height="4.289" depth="0" valign="bottom" size="10">$\infty$</text>
|
||||
<text stroke="black" pos="140.6 277.999" type="label" width="9.963" height="4.289" depth="0" valign="bottom" size="10">$\infty$</text>
|
||||
<text stroke="black" pos="9.62509 278.505" type="label" width="9.482" height="4.297" depth="1.93" valign="bottom" size="10">$p_0$</text>
|
||||
<text stroke="black" pos="95.9267 278.505" type="label" width="9.482" height="4.297" depth="1.93" valign="bottom" size="10">$p_1$</text>
|
||||
<path stroke="black" dash="[1] 0" pen="0.4" arrow="7" backarrow="7">
|
||||
138.57 292.68 m
|
||||
383.284 0 0 383.284 -36.0222 -48.5299 -112.214 327.105 a
|
||||
</path>
|
||||
<path stroke="black" dash="[1] 0" pen="0.4" arrow="7" backarrow="7">
|
||||
-38.0946 290.149 m
|
||||
55.7192 0 0 55.7192 -91.7888 275.264 -112.213 327.105 a
|
||||
</path>
|
||||
</page>
|
||||
</ipe>
|
||||
|
Before Width: | Height: | Size: 3.0 KiB |
|
|
@ -1,101 +0,0 @@
|
|||
<ipe version="60023" creator="Ipe 6.0 preview 23" media="-315.698 -211.073 279.302 630.927">
|
||||
<info created="D:20050330173201" modified="D:20050330173201" bbox="cropbox"/>
|
||||
<page>
|
||||
<layer name="alpha"/>
|
||||
<view layers="alpha" active="alpha"/>
|
||||
<path layer="alpha" stroke="black" pen="0.4">
|
||||
67.3355 225.217 m
|
||||
83.5755 257.852 l
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
61.0952 192.965 m
|
||||
107.951 170.069 l
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
23.1352 182.041 m
|
||||
-7.02484 160.713 l
|
||||
</path>
|
||||
<text stroke="black" pos="-12.137 146.823" type="label" width="9.963" height="4.289" depth="0" valign="bottom" size="10">$\infty$</text>
|
||||
<text stroke="black" pos="113.485 166.435" type="label" width="9.963" height="4.289" depth="0" valign="bottom" size="10">$\infty$</text>
|
||||
<text stroke="black" pos="65.7566 256.554" type="label" width="9.963" height="4.289" depth="0" valign="bottom" size="10">$\infty$</text>
|
||||
<path stroke="black" pen="0.4">
|
||||
22.6345 181.072 m
|
||||
60.5943 191.996 l
|
||||
66.8343 224.248 l
|
||||
22.6345 181.072 l
|
||||
</path>
|
||||
<mark stroke="black" pos="22.6345 181.072" shape="2" size="2"/>
|
||||
<mark stroke="black" pos="61.0952 192.965" shape="2" size="2"/>
|
||||
<mark stroke="black" pos="66.8343 224.248" shape="2" size="2"/>
|
||||
<text stroke="black" pos="2.70162 179.906" type="label" width="9.482" height="4.297" depth="1.93" valign="bottom" size="10">$p_1$</text>
|
||||
<text stroke="black" pos="69.5928 193.723" type="label" width="9.482" height="4.297" depth="1.93" valign="bottom" size="10">$p_2$</text>
|
||||
<text stroke="black" pos="45.2253 225.17" type="label" width="9.482" height="4.297" depth="1.93" valign="bottom" size="10">$p_0$</text>
|
||||
<text stroke="black" pos="-119.419 235.666" type="label" width="9.298" height="4.294" depth="1.49" valign="bottom" size="10">$v_0$</text>
|
||||
<text stroke="black" pos="-138.949 205.172" type="label" width="9.298" height="4.294" depth="1.49" valign="bottom" size="10">$v_1$</text>
|
||||
<text stroke="black" pos="-81.1031 204.643" type="label" width="9.298" height="4.294" depth="1.49" valign="bottom" size="10">$v_2$</text>
|
||||
<text stroke="black" pos="-87.556 248.411" type="label" width="9.298" height="4.294" depth="1.49" valign="bottom" size="10">$v_3$</text>
|
||||
<path stroke="black" pen="0.4">
|
||||
51.1524 0 0 51.1524 -98.729 221.878 e
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
-102.282 189.477 m
|
||||
20.4215 0 0 20.4215 -120.558 198.59 -101.992 190.084 a
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
-124.619 203.653 m
|
||||
34.6684 0 0 34.6684 -105.013 232.245 -84.0066 204.666 a
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
-105.013 232.244 m
|
||||
24.0712 0 0 24.0712 -101.042 208.503 -124.619 203.653 a
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
-84.007 204.666 m
|
||||
33.6269 0 0 33.6269 -117.433 200.996 -105.013 232.245 a
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
-143.664 197.436 m
|
||||
21.6103 0 0 21.6103 -140.084 218.748 -124.619 203.653 a
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
-84.007 204.666 m
|
||||
30.2533 0 0 30.2533 -57.8262 219.826 -59.0489 189.597 a
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
-92.3377 256.019 m
|
||||
24.3954 0 0 24.3954 -116.202 250.956 -105.027 272.641 a
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
-92.3374 256.019 m
|
||||
36.6504 0 0 36.6504 -68.5987 228.095 -105.013 232.245 a
|
||||
</path>
|
||||
<path stroke="black" dash="[1 3] 0" pen="0.4">
|
||||
-105.026 272.641 m
|
||||
71.753 0 0 71.753 -72.7761 208.544 -143.664 197.436 a
|
||||
</path>
|
||||
<path stroke="black" dash="[1 3] 0" pen="0.4">
|
||||
-59.0486 189.597 m
|
||||
98.0382 0 0 98.0382 -154.137 213.465 -70.4186 264.482 a
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
-70.4195 264.482 m
|
||||
67.9292 0 0 67.9292 -57.2788 197.836 -92.3381 256.019 a
|
||||
</path>
|
||||
<mark stroke="black" pos="-124.619 203.653" shape="2" size="2"/>
|
||||
<mark stroke="black" pos="-84.007 204.665" shape="2" size="2"/>
|
||||
<mark stroke="black" pos="-105.013 232.245" shape="2" size="2"/>
|
||||
<mark stroke="black" pos="-92.3376 256.019" shape="2" size="2"/>
|
||||
<path stroke="black" dash="[1] 0" pen="0.4" arrow="7" backarrow="7">
|
||||
109.633 180.293 m
|
||||
104.199 0 0 104.199 6.0939 192.002 -75.1533 257.242 a
|
||||
</path>
|
||||
<path stroke="black" dash="[1] 0" pen="0.4" arrow="7" backarrow="7">
|
||||
-75.1533 257.241 m
|
||||
272.961 0 0 272.961 183.418 344.697 -15.2519 157.513 a
|
||||
</path>
|
||||
<path stroke="black" dash="[1] 0" pen="0.4" arrow="7" backarrow="7">
|
||||
59.8832 265.85 m
|
||||
165.466 0 0 165.466 1.96907 110.85 -75.1535 257.244 a
|
||||
</path>
|
||||
</page>
|
||||
</ipe>
|
||||
|
Before Width: | Height: | Size: 4.2 KiB |
|
|
@ -1,102 +0,0 @@
|
|||
<ipe version="60023" creator="Ipe 6.0 preview 23" media="-272.391 -173.882 322.609 668.118">
|
||||
<info created="D:20050330173233" modified="D:20050330173233" bbox="cropbox"/>
|
||||
<page>
|
||||
<layer name="alpha"/>
|
||||
<view layers="alpha" active="alpha"/>
|
||||
<path layer="alpha" stroke="black" pen="0.4">
|
||||
-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
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
-106.628 208.137 m
|
||||
-28.9568 257.749 l
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
-79.2149 322.548 m
|
||||
88.1957 0 0 88.1957 -29.0183 250.031 -106.628 208.136 a
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
-79.2154 322.548 m
|
||||
421.773 0 0 421.773 340.434 280.277 -81.2459 271.415 a
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
-28.9565 257.749 m
|
||||
73.1042 0 0 73.1042 -101.91 253.057 -79.2145 322.549 a
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
-42.6635 209.656 m
|
||||
59.5577 0 0 59.5577 -65.8704 264.506 -79.2143 322.55 a
|
||||
</path>
|
||||
<mark stroke="black" pos="-106.628 208.137" shape="2" size="2"/>
|
||||
<mark stroke="black" pos="-42.6635 209.655" shape="2" size="2"/>
|
||||
<mark stroke="black" pos="-28.9568 257.749" shape="2" size="2"/>
|
||||
<mark stroke="black" pos="-81.2454 271.418" shape="2" size="2"/>
|
||||
<mark stroke="black" pos="-79.2148 322.549" shape="2" size="2"/>
|
||||
<text stroke="black" pos="-113.735 196.999" type="label" width="9.298" height="4.294" depth="1.49" valign="bottom" size="10">$v_0$</text>
|
||||
<text stroke="black" pos="-45.7094 199.53" type="label" width="9.298" height="4.294" depth="1.49" valign="bottom" size="10">$v_1$</text>
|
||||
<text stroke="black" pos="-22.3573 256.737" type="label" width="9.298" height="4.294" depth="1.49" valign="bottom" size="10">$v_2$</text>
|
||||
<text stroke="black" pos="-75.1535 275.468" type="label" width="9.298" height="4.294" depth="1.49" valign="bottom" size="10">$v_3$</text>
|
||||
<text stroke="black" pos="-94.9521 325.587" type="label" width="9.298" height="4.294" depth="1.49" valign="bottom" size="10">$v_4$</text>
|
||||
<path stroke="black" pen="0.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
|
||||
</path>
|
||||
<path stroke="black" dash="[1 3] 0" pen="0.4">
|
||||
54.2988 206.112 m
|
||||
131.97 255.724 l
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
79.6817 269.393 m
|
||||
79.6817 309.893 l
|
||||
79.6817 309.893 l
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
131.97 255.724 m
|
||||
155.83 267.874 l
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
118.264 207.63 m
|
||||
144.154 171.18 l
|
||||
</path>
|
||||
<path stroke="black" pen="0.4">
|
||||
54.2988 206.112 m
|
||||
19.2706 183.33 l
|
||||
</path>
|
||||
<mark stroke="black" pos="54.2988 206.112" shape="2" size="2"/>
|
||||
<mark stroke="black" pos="118.264 207.63" shape="2" size="2"/>
|
||||
<mark stroke="black" pos="131.97 255.724" shape="2" size="2"/>
|
||||
<mark stroke="black" pos="79.6817 269.393" shape="2" size="2"/>
|
||||
<text stroke="black" pos="54.8065 194.974" type="label" width="9.482" height="4.297" depth="1.93" valign="bottom" size="10">$p_0$</text>
|
||||
<text stroke="black" pos="125.878 205.099" type="label" width="9.482" height="4.297" depth="1.93" valign="bottom" size="10">$p_1$</text>
|
||||
<text stroke="black" pos="123.34 261.293" type="label" width="9.482" height="4.297" depth="1.93" valign="bottom" size="10">$p_2$</text>
|
||||
<text stroke="black" pos="63.9443 267.368" type="label" width="9.482" height="4.297" depth="1.93" valign="bottom" size="10">$p_3$</text>
|
||||
<path stroke="black" dash="[1] 0" pen="0.4" arrow="7" backarrow="7">
|
||||
74.0975 315.968 m
|
||||
126.287 0 0 126.287 -6.86057 219.044 -79.2145 322.549 a
|
||||
</path>
|
||||
<path stroke="black" dash="[1] 0" pen="0.4" arrow="7" backarrow="7">
|
||||
159.383 176.749 m
|
||||
143.066 0 0 143.066 24.2582 223.75 -79.2152 322.548 a
|
||||
</path>
|
||||
<path stroke="black" dash="[1] 0" pen="0.4" arrow="7" backarrow="7">
|
||||
153.292 274.962 m
|
||||
147.512 0 0 147.512 19.4676 212.906 -79.2142 322.549 a
|
||||
</path>
|
||||
<path stroke="black" dash="[1] 0" pen="0.4" arrow="7" backarrow="7">
|
||||
24.3472 199.024 m
|
||||
81.2765 0 0 81.2765 -35.4707 254.048 -79.2147 322.549 a
|
||||
</path>
|
||||
<text stroke="black" pos="-2.051 187.38" type="label" width="9.963" height="4.289" depth="0" valign="bottom" size="10">$\infty$</text>
|
||||
<text stroke="black" pos="148.723 168.649" type="label" width="9.963" height="4.289" depth="0" valign="bottom" size="10">$\infty$</text>
|
||||
<text stroke="black" pos="163.953 269.393" type="label" width="9.963" height="4.289" depth="0" valign="bottom" size="10">$\infty$</text>
|
||||
<text stroke="black" pos="80.1893 314.449" type="label" width="9.963" height="4.289" depth="0" valign="bottom" size="10">$\infty$</text>
|
||||
</page>
|
||||
</ipe>
|
||||
|
|
@ -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}
|
||||
|
|
@ -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
|
||||
% +------------------------------------------------------------------------+
|
||||
|
||||
|
|
@ -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 <typename TDS2>
|
||||
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}
|
||||
|
|
@ -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 <typename TDS2>
|
||||
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}
|
||||
|
|
@ -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<TriangulationTraits_3,TriangulationDataStructure_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<TriangulationVertexBase_3,TriangulationCellBase_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 <Cell_handle, int, int>}{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 <typename Vb2> 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 <typename Cb2> 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<Cell_handle, int, int> 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<Cell_handle, int> 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}
|
||||
<CENTER>
|
||||
<img border=0 src="./flips.gif" align=middle alt="Flips">
|
||||
</CENTER>
|
||||
\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}
|
||||
<CENTER>
|
||||
<img border=0 src="./topo-insert_outside_affine_hull.gif" align=middle
|
||||
alt="insert_increase_dimension} (1-dimensional case)">
|
||||
</CENTER>
|
||||
\end{ccHtmlOnly}
|
||||
\end{figure}
|
||||
|
||||
\ccMethod{template <class CellIt>
|
||||
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 <class CellIt>
|
||||
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}
|
||||
<CENTER>
|
||||
<img border=0 height="500" src="./tds-dim_down.png" align=middle alt="Lowering dimension from 3D to 2D">
|
||||
</CENTER>
|
||||
\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 <class VertexIt>
|
||||
void delete_vertices(VertexIt first, VertexIt last);}
|
||||
{Calls \ccc{delete_vertex} over an iterator range of value type
|
||||
\ccc{Vertex_handle}.}
|
||||
|
||||
\ccMethod{template <class CellIt>
|
||||
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 <class OutputIterator>
|
||||
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 <class OutputIterator>
|
||||
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 <class OutputIterator>
|
||||
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 <class OutputIterator>
|
||||
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}
|
||||
|
|
@ -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<TriangulationDSVertexBase_3,TriangulationDSCellBase_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> Vertex_range;}{Vertex container type.}
|
||||
\ccGlue
|
||||
\ccTypedef{typedef CGAL::Compact_container<Cell> 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}
|
||||
|
|
@ -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 <typename Traits> 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}
|
||||
|
|
@ -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}
|
||||
|
|
@ -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}
|
||||
<CENTER>
|
||||
<img border=0 src="./utils.gif" align=middle alt="Operations on indices">
|
||||
</CENTER>
|
||||
\end{ccHtmlOnly}
|
||||
\caption{Operations on indices.
|
||||
\label{Triangulation3-fig-utils}}
|
||||
\end{figure}
|
||||
|
||||
\end{ccRefClass}
|
||||
|
Before Width: | Height: | Size: 2.7 KiB |
|
|
@ -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<TriangulationDSVertexBase_3,TriangulationDSCellBase_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<TriangulationTraits_3, TriangulationDSCellBase_3>}\\
|
||||
\ccRefIdfierPage{CGAL::Triangulation_vertex_base_3<TriangulationTraits_3, TriangulationDSVertexBase_3>}\\
|
||||
\ccRefIdfierPage{CGAL::Triangulation_hierarchy_vertex_base_3<TriangulationVertexBase_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.
|
||||
|
||||
|
||||
|
||||
|
|
@ -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}
|
||||
|
||||
|
|
@ -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{<</EndOfBlock false F}!
|
||||
/X{/ASCII85Decode filter}!/@X{@ X}!/&2{2 index 2 index}!
|
||||
/@F{@ &2<<F}!/@C{@X &2 FX}!
|
||||
/$X{+ @X |}!/&4{4 index 4 index}!/$F{+ @ &4<<F |}!/$C{+ @X &4 FX |}!
|
||||
/IC{3 1 roll 10 dict begin 1{/ImageType/Interpolate/Decode/DataSource
|
||||
/ImageMatrix/BitsPerComponent/Height/Width}{exch def}forall
|
||||
currentdict end image}!
|
||||
/~{@ read {pop} if}!
|
||||
end readonly def
|
||||
%%EndResource
|
||||
/pagesave null def
|
||||
%%EndProlog
|
||||
%%Page: 1 1
|
||||
%%BeginPageSetup
|
||||
GS_epswrite_2_0_1001 begin
|
||||
/pagesave save store 197 dict begin
|
||||
0.1 0.1 scale
|
||||
%%EndPageSetup
|
||||
gsave mark
|
||||
Q q
|
||||
778.531 3030.2 3001.48 2119 re
|
||||
Y
|
||||
4 w
|
||||
1 j
|
||||
255 0 r6
|
||||
1389.74 3785.55 0 496.97 S
|
||||
1394.26 4291.56 311.74 -709.31 S
|
||||
2776.74 3275.03 388.54 975.87 S
|
||||
3490.57 3537.07 -323.29 711.11 S
|
||||
20 w
|
||||
255 0 r3
|
||||
3171.06 3286.88 314.07 241.24 S
|
||||
2779.62 3268.68 391.44 22.75 S
|
||||
2779.62 3268.68 473.37 -218.48 S
|
||||
2772.67 3275.63 714.61 268.54 -245.79 -477.92 S
|
||||
3171.06 3291.43 77.38 -236.68 S
|
||||
1386.81 3787.56 -391.44 -464.26 0 0 473.37 -223.04 ^ 241.24 482.48 ^ -318.62 209.38 S
|
||||
1289.35 4630.19 149.56 159.37 158.14 -160.59 H
|
||||
S
|
||||
K
|
||||
1463 4812 63 64 /7D
|
||||
$C
|
||||
.0P`_]HH/ET'.;*cqVpte\*nCmHX!8^O?!/mJjZ1^$kp5pO@PXrqG==]>+<RJ+E:2s5)N!rmu)G
|
||||
p=aHZX1rtp\#XVQqfT?T@ANTGW*qeBQr!~>
|
||||
,
|
||||
1395 4661 58 64 /2O
|
||||
$C
|
||||
-,RJ0c<MK2Lo1^o7\OK<@F>QF6,"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'dJFI<BsfX6]fcs8W,.s825rmB>o[)VYX-_V"<f2Ei&<Ku&B$
|
||||
s8W-!+CU0-I6[~>
|
||||
,
|
||||
1884 4904 40 45 /2U
|
||||
$C
|
||||
.E%bXLdAn"*BGA+kR`&+\d@V,3aU>`Zp3"7%<:k97S`pY?aoE@>?bfG>VrN!9#kZ`<hY4)M#~>
|
||||
,
|
||||
1936 4904 40 45 /7N
|
||||
$C
|
||||
.De@QKH)-!_K8(,i.8HGkr+aVPLcfe&+mX:s1A<Cmb&.u:>0mg&&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^<fIq@$Hu]k>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&<pJCE.t+e+<NTV-pJ/(b4/I7@PL[6GVWg$@V/tS1+q-ePqu<]k5Q~>
|
||||
,
|
||||
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<g>=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
|
||||
|
Before Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 99 KiB |
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |