oops bad place

This commit is contained in:
Sébastien Loriot 2011-02-12 08:50:51 +00:00
parent c0624d4d03
commit d6ddce7983
247 changed files with 0 additions and 39364 deletions

130
.gitattributes vendored
View File

@ -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

43
.gitignore vendored
View File

@ -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

View File

@ -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...

View File

@ -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");
}

View File

@ -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

View File

@ -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 )

View File

@ -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();
}

View File

@ -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

View File

@ -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>&amp;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>

View File

@ -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() );
}

View File

@ -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

View File

@ -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) );
}
}

View File

@ -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

View File

@ -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();
}

View File

@ -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>

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -1,13 +0,0 @@
<html>
<body>
<h2>CGAL Triangulation_3 Demo</h2>
<p>Copyright &copy;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>

View File

@ -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>

View File

@ -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>

View File

@ -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 */
"................",
"...++++...++++..",
"..+....+.+....+.",
"..+......+......",
"..+......+..+++.",
"..+......+....+.",
"..+....+.+....+.",
"...++++...++++..",
"................",
"...++++...+.....",
"..+....+..+.....",
"..+....+..+.....",
"..++++++..+.....",
"..+....+..+.....",
"..+....+..+++++.",
"................"};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 768 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 798 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 797 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1003 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 326 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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
--------------------------------------------------------------

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -1,7 +0,0 @@
0 0 0
1 0 0
0 1 0
0 0 1
2 2 2
-1 0 1

View File

@ -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}

View File

@ -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.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -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>

View File

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 360 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -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>

View File

@ -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}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -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>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -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>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -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>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -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>

View File

@ -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}

View File

@ -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
% +------------------------------------------------------------------------+

View File

@ -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}

View File

@ -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}

View File

@ -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}

View File

@ -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}

View File

@ -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&gt) 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}

View File

@ -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}

View File

@ -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}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -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.

View File

@ -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}

View File

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Some files were not shown because too many files have changed in this diff Show More