Merge branch 'master' into Parameterization-no_opennl-GF
|
|
@ -1,6 +1,6 @@
|
|||
|
||||
/*!
|
||||
\ingroup PkgAlgebraicFoundationsInteroperabilityConcepts
|
||||
\ingroup PkgAlgebraicFoundationsAlgebraicStructuresConcepts
|
||||
\cgalConcept
|
||||
|
||||
Two types `A` and `B` are a model of the `ExplicitInteroperable`
|
||||
|
|
@ -27,4 +27,3 @@ class ExplicitInteroperable {
|
|||
public:
|
||||
|
||||
}; /* end ExplicitInteroperable */
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
|
||||
/*!
|
||||
\ingroup PkgAlgebraicFoundationsFractionsConcepts
|
||||
\ingroup PkgAlgebraicFoundationsAlgebraicStructuresConcepts
|
||||
\cgalConcept
|
||||
|
||||
A type is considered as a `Fraction`, if there is a reasonable way to
|
||||
|
|
@ -17,4 +17,3 @@ class Fraction {
|
|||
public:
|
||||
|
||||
}; /* end Fraction */
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
|
||||
/*!
|
||||
\ingroup PkgAlgebraicFoundationsConcepts
|
||||
\ingroup PkgAlgebraicFoundationsAlgebraicStructuresConcepts
|
||||
\cgalConcept
|
||||
|
||||
A model of the concept `FromDoubleConstructible` is required
|
||||
|
|
@ -27,4 +27,3 @@ FromDoubleConstructible(const double& d);
|
|||
/// @}
|
||||
|
||||
}; /* end FromDoubleConstructible */
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
|
||||
/*!
|
||||
\ingroup PkgAlgebraicFoundationsConcepts
|
||||
\ingroup PkgAlgebraicFoundationsAlgebraicStructuresConcepts
|
||||
\cgalConcept
|
||||
|
||||
A model of the concept `FromIntConstructible` is required
|
||||
|
|
@ -28,4 +28,3 @@ FromIntConstructible(int& i);
|
|||
/// @}
|
||||
|
||||
}; /* end FromIntConstructible */
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
|
||||
/*!
|
||||
\ingroup PkgAlgebraicFoundationsInteroperabilityConcepts
|
||||
\ingroup PkgAlgebraicFoundationsAlgebraicStructuresConcepts
|
||||
\cgalConcept
|
||||
|
||||
Two types `A` and `B` are a model of the concept
|
||||
|
|
@ -29,4 +29,3 @@ class ImplicitInteroperable {
|
|||
public:
|
||||
|
||||
}; /* end ImplicitInteroperable */
|
||||
|
||||
|
|
|
|||
|
|
@ -1,19 +1,16 @@
|
|||
#ifndef CGAL_APOLLONIUS_GRAPH_2_TEST_H
|
||||
#define CGAL_APOLLONIUS_GRAPH_2_TEST_H
|
||||
|
||||
#include <cassert>
|
||||
#include <CGAL/enum.h>
|
||||
#include <CGAL/use.h>
|
||||
|
||||
#include <CGAL/Vector_2.h> // this is done in order to avoid error
|
||||
// when the Segment_2_Segment_2_intersection.h file is included from
|
||||
// the Triangulation_euclidean_traits_2.h file.
|
||||
|
||||
#include <CGAL/Apollonius_graph_2.h>
|
||||
#include <CGAL/Apollonius_graph_hierarchy_2.h>
|
||||
#include <CGAL/Apollonius_graph_traits_2.h>
|
||||
#include <CGAL/Apollonius_graph_filtered_traits_2.h>
|
||||
//#include <CGAL/new_traits/Apollonius_graph_new_filtered_traits_2.h>
|
||||
|
||||
#include <cassert>
|
||||
#include <CGAL/enum.h>
|
||||
#include <CGAL/use.h>
|
||||
#include <CGAL/Random.h>
|
||||
|
||||
|
||||
#include "IO/Null_output_stream.h"
|
||||
|
||||
|
|
@ -839,24 +836,29 @@ bool test_algo_generic(InputStream& is)
|
|||
// file I/O methods
|
||||
//--------------------------------------------------------------------
|
||||
{
|
||||
std::ofstream ofs("ag_testsuite.tmp");
|
||||
std::string fname = "ag_testsuite_" + std::to_string(CGAL::Random().get_seed()) + ".tmp";
|
||||
std::cout << "writing to " << fname << std::endl;
|
||||
|
||||
std::ofstream ofs(fname);
|
||||
assert( ofs );
|
||||
ag.file_output(ofs);
|
||||
ofs.close();
|
||||
|
||||
std::ifstream ifs("ag_testsuite.tmp");
|
||||
std::ifstream ifs(fname);
|
||||
assert( ifs );
|
||||
ag.file_input(ifs);
|
||||
ifs.close();
|
||||
assert( ag.is_valid() );
|
||||
}
|
||||
{
|
||||
std::ofstream ofs("ag_testsuite.tmp");
|
||||
std::string fname = "ag_testsuite_" + std::to_string(CGAL::Random().get_seed()) + ".tmp";
|
||||
std::cout << "writing to " << fname << std::endl;
|
||||
std::ofstream ofs(fname);
|
||||
assert( ofs );
|
||||
ofs << ag;
|
||||
ofs.close();
|
||||
|
||||
std::ifstream ifs("ag_testsuite.tmp");
|
||||
std::ifstream ifs(fname);
|
||||
assert( ifs );
|
||||
ifs >> ag;
|
||||
ifs.close();
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
#include <CGAL/config.h>
|
||||
|
||||
#include <CGAL/boost/graph/dijkstra_shortest_paths.h>
|
||||
#include <boost/graph/dijkstra_shortest_paths.hpp>
|
||||
#include <boost/property_map/vector_property_map.hpp>
|
||||
|
||||
#include <CGAL/graph_traits_Arrangement_2.h>
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
#include <CGAL/Arr_extended_dcel.h>
|
||||
#include <CGAL/Arrangement_2.h>
|
||||
|
||||
#include <CGAL/boost/graph/dijkstra_shortest_paths.h>
|
||||
#include <boost/graph/dijkstra_shortest_paths.hpp>
|
||||
|
||||
#include <CGAL/graph_traits_dual_arrangement_2.h>
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
#include <CGAL/graph_traits_Arrangement_2.h>
|
||||
#include <CGAL/Arr_vertex_index_map.h>
|
||||
|
||||
#include <CGAL/boost/graph/dijkstra_shortest_paths.h>
|
||||
#include <boost/graph/dijkstra_shortest_paths.hpp>
|
||||
|
||||
#include <CGAL/property_map.h>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
||||
|
||||
#include <CGAL/boost/graph/graph_traits_Triangulation_2.h>
|
||||
#include <CGAL/boost/graph/dijkstra_shortest_paths.h>
|
||||
#include <boost/graph/dijkstra_shortest_paths.hpp>
|
||||
|
||||
#include <fstream>
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
#include <CGAL/Triangulation_vertex_base_with_id_2.h>
|
||||
|
||||
#include <CGAL/boost/graph/graph_traits_Delaunay_triangulation_2.h>
|
||||
#include <CGAL/boost/graph/dijkstra_shortest_paths.h>
|
||||
#include <boost/graph/dijkstra_shortest_paths.hpp>
|
||||
|
||||
#include <fstream>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,30 +0,0 @@
|
|||
// Copyright (c) 2014 GeometryFactory (France). All rights reserved.
|
||||
//
|
||||
// This file is part of CGAL (www.cgal.org)
|
||||
//
|
||||
// $URL$
|
||||
// $Id$
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
|
||||
//
|
||||
//
|
||||
// Author(s) : Sebastien Loriot
|
||||
|
||||
|
||||
#ifndef CGAL_BOOST_GRAPH_DIJKSTRA_SHORTEST_PATHS_H
|
||||
#define CGAL_BOOST_GRAPH_DIJKSTRA_SHORTEST_PATHS_H
|
||||
|
||||
// This will push/pop a VC++ warning
|
||||
#include <CGAL/Named_function_parameters.h>
|
||||
|
||||
#if defined(BOOST_MSVC)
|
||||
# pragma warning(push)
|
||||
# pragma warning(disable:4172) // Address warning inside boost named parameters
|
||||
#endif
|
||||
|
||||
#include <boost/graph/dijkstra_shortest_paths.hpp>
|
||||
|
||||
#if defined(BOOST_MSVC)
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#endif // CGAL_BOOST_GRAPH_DIJKSTRA_SHORTEST_PATHS_H
|
||||
|
|
@ -102,11 +102,13 @@ collinearC3(const FT &px, const FT &py, const FT &pz,
|
|||
FT dqx = qx-rx;
|
||||
FT dpy = py-ry;
|
||||
FT dqy = qy-ry;
|
||||
if (sign_of_determinant(dpx, dqx, dpy, dqy) != ZERO)
|
||||
|
||||
auto is_zero = sign_of_determinant(dpx, dqx, dpy, dqy) == ZERO;
|
||||
if (certainly_not(is_zero))
|
||||
return false;
|
||||
FT dpz = pz-rz;
|
||||
FT dqz = qz-rz;
|
||||
return CGAL_AND( sign_of_determinant(dpx, dqx, dpz, dqz) == ZERO ,
|
||||
return is_zero & CGAL_AND( sign_of_determinant(dpx, dqx, dpz, dqz) == ZERO ,
|
||||
sign_of_determinant(dpy, dqy, dpz, dqz) == ZERO );
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -34,11 +34,7 @@
|
|||
#include <boost/bind/bind.hpp>
|
||||
#include <boost/ptr_container/ptr_vector.hpp>
|
||||
#include <boost/random/mersenne_twister.hpp>
|
||||
#if BOOST_VERSION >= 104700
|
||||
# include <boost/random/uniform_int_distribution.hpp>
|
||||
#else
|
||||
# include <boost/random/uniform_int.hpp>
|
||||
#endif
|
||||
#include <boost/random/uniform_int_distribution.hpp>
|
||||
#include <boost/random/uniform_01.hpp>
|
||||
#include <boost/random/normal_distribution.hpp>
|
||||
#if defined(CGAL_LINKED_WITH_BOOST_IOSTREAMS) && defined(CGAL_LINKED_WITH_BOOST_SERIALIZATION)
|
||||
|
|
@ -65,17 +61,10 @@ inline void init_feature_class_data(FeatureClassDataFloat& /*data*/, int /*n_cla
|
|||
}
|
||||
typedef std::unordered_set<int> FeatureSet;
|
||||
|
||||
#if BOOST_VERSION >= 104700
|
||||
typedef boost::random::uniform_int_distribution<> UniformIntDist;
|
||||
typedef boost::random::normal_distribution<> NormalDist;
|
||||
typedef boost::random::mt19937 RandomGen;
|
||||
typedef boost::random::uniform_01<> UnitDist;
|
||||
#else
|
||||
typedef boost::uniform_int<> UniformIntDist;
|
||||
typedef boost::normal_distribution<> NormalDist;
|
||||
typedef boost::uniform_01<> UnitDist;
|
||||
typedef boost::mt19937 RandomGen;
|
||||
#endif
|
||||
|
||||
struct ForestParams {
|
||||
size_t n_classes;
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ then the default traits class of `::convex_hull_3()` is `Convex_hull_traits_3<R>
|
|||
\cgalHeading{Implementation}
|
||||
|
||||
The algorithm implemented by these functions is the quickhull algorithm of
|
||||
Barnard <I>et al.</I> \cgalCite{bdh-qach-96}.
|
||||
Barber <I>et al.</I> \cgalCite{bdh-qach-96}.
|
||||
|
||||
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -263,7 +263,7 @@ set(CGAL_DOC_DXY_DIR "${CMAKE_BINARY_DIR}/doc_dxy")
|
|||
file(MAKE_DIRECTORY "${CGAL_DOC_DXY_DIR}")
|
||||
|
||||
#Setting the resource directory depending on the version of doxygen
|
||||
set(CGAL_DOC_RESOURCE_DIR_DEFAULT "${CMAKE_CURRENT_LIST_DIR}/resources/1.9.6")
|
||||
set(CGAL_DOC_RESOURCE_DIR_DEFAULT "${CMAKE_CURRENT_LIST_DIR}/resources/1.10.0")
|
||||
|
||||
# first look if resources for the specific doxygen version is available, fallback
|
||||
# on the default otherwise
|
||||
|
|
|
|||
|
|
@ -238,9 +238,10 @@ in \cgal programs, the executables should be linked with the CMake
|
|||
imported target `CGAL::LASLIB_support` provided in
|
||||
`CGAL_LASLIB_support.cmake`.
|
||||
|
||||
The \laslib web site is <a
|
||||
href="https://rapidlasso.com/lastools/">`https://rapidlasso.com/lastools/`</a>. \laslib
|
||||
is usually distributed along with LAStools: for simplicity, \cgal
|
||||
\laslib information can be obtained from
|
||||
<a href="https://lastools.github.io/">https://lastools.github.io/</a> and
|
||||
<a href="https://rapidlasso.de/product-overview/">https://rapidlasso.de/product-overview/</a>.
|
||||
\laslib is usually distributed along with LAStools: for simplicity, \cgal
|
||||
provides <a href="https://github.com/CGAL/LAStools">a fork with a
|
||||
CMake based install procedure</a>.
|
||||
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@
|
|||
, pages = "617--625"
|
||||
, note = "SIGGRAPH '2005 Conference Proceedings"
|
||||
, volume = 24
|
||||
, url = "https://hal.inria.fr/inria-00226418"
|
||||
, url = "https://inria.hal.science/inria-00226418"
|
||||
, geombib = "not yet"
|
||||
}
|
||||
|
||||
|
|
@ -157,7 +157,7 @@ Pion and Monique Teillaud and Mariette Yvinec"
|
|||
@ARTICLE{cgal:bdt-hdcvd-14,
|
||||
AUTHOR = {Mikhail Bogdanov and Olivier Devillers and Monique Teillaud},
|
||||
JOURNAL = {Journal of Computational Geometry},
|
||||
NOTE = {https://hal.inria.fr/hal-00961390},
|
||||
NOTE = {https://inria.hal.science/hal-00961390},
|
||||
PAGES = {56--85},
|
||||
TITLE = {Hyperbolic {Delaunay} complexes and {Voronoi} diagrams made practical},
|
||||
VOLUME = {5},
|
||||
|
|
@ -243,7 +243,7 @@ Pion and Monique Teillaud and Mariette Yvinec"
|
|||
Boissonnat}
|
||||
, title = {Mesh Generation from 3D Multi-material Images}
|
||||
, pages = {283--290}
|
||||
, url = "https://hal.inria.fr/inria-00420228"
|
||||
, url = "https://inria.hal.science/inria-00420228"
|
||||
, x-international-audience = "yes"
|
||||
, x-proceedings = "yes"
|
||||
}
|
||||
|
|
@ -257,7 +257,7 @@ Boissonnat}
|
|||
, pages = "1455-14645"
|
||||
, volume = 28
|
||||
, year = 2009
|
||||
, url = "https://hal.inria.fr/inria-00413248"
|
||||
, url = "https://inria.hal.science/inria-00413248"
|
||||
, x-international-audience = "yes"
|
||||
, x-editorial-board = "yes"
|
||||
}
|
||||
|
|
@ -361,7 +361,7 @@ Boissonnat}
|
|||
TITLE = {Delaunay triangulations on orientable surfaces of low genus},
|
||||
YEAR = {2016},
|
||||
DOI = {10.4230/LIPIcs.SoCG.2016.20},
|
||||
URL = {https://hal.inria.fr/hal-01276386}
|
||||
URL = {https://inria.hal.science/hal-01276386}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -402,7 +402,7 @@ Boissonnat}
|
|||
,school = "Universit\'e de {Nice-Sophia Antipolis}"
|
||||
,address = "France"
|
||||
,year = 2010
|
||||
,url = "https://tel.archives-ouvertes.fr/tel-00552215/"
|
||||
,url = "https://theses.hal.science/tel-00552215/"
|
||||
}
|
||||
|
||||
@inproceedings{cgal:ccplr-redtp-10,
|
||||
|
|
@ -545,7 +545,7 @@ note="Conference version: Symp. on Geometry Processing 2003"
|
|||
, year = 2009
|
||||
, volume = 5757
|
||||
, pages = "37--48"
|
||||
, note = "Full version available as INRIA Research Report 6823 \url{https://hal.inria.fr/inria-00356871}"
|
||||
, note = "Full version available as INRIA Research Report 6823 \url{https://inria.hal.science/inria-00356871}"
|
||||
}
|
||||
|
||||
@inproceedings{cgal:pt-rs-14,
|
||||
|
|
@ -747,7 +747,7 @@ Mourrain and Monique Teillaud"
|
|||
, nickname = "ALENEX '03"
|
||||
, year = 2003
|
||||
, pages = "37--44"
|
||||
, url = "https://hal.inria.fr/inria-00344517/"
|
||||
, url = "https://inria.hal.science/inria-00344517/"
|
||||
}
|
||||
|
||||
@article{ cgal:dpt-wt-02
|
||||
|
|
@ -766,7 +766,7 @@ Teillaud"
|
|||
, author = "Olivier Devillers and Monique Teillaud"
|
||||
, title = "Perturbations and Vertex Removal in a {3D Delaunay} Triangulation"
|
||||
, booktitle = "Proc. 14th ACM-SIAM Sympos. Discrete Algorithms (SODA)"
|
||||
, url = "https://hal.inria.fr/inria-00166710/"
|
||||
, url = "https://inria.hal.science/inria-00166710/"
|
||||
, year = 2003
|
||||
, pages = "313-319"
|
||||
}
|
||||
|
|
@ -778,7 +778,7 @@ Teillaud"
|
|||
, volume = 44
|
||||
, year = 2011
|
||||
, pages = "160--168"
|
||||
, url = "https://hal.archives-ouvertes.fr/inria-00560388/"
|
||||
, url = "https://theses.hal.science/inria-00560388/"
|
||||
, doi = "10.1016/j.comgeo.2010.09.010"
|
||||
}
|
||||
|
||||
|
|
@ -845,7 +845,7 @@ Teillaud"
|
|||
,school = "Universit\'e de {Nice-Sophia Antipolis}"
|
||||
,address = "France"
|
||||
,year = 2003
|
||||
,url = "https://tel.archives-ouvertes.fr/tel-00832487/"
|
||||
,url = "https://theses.hal.science/tel-00832487/"
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1230,7 +1230,7 @@ Teillaud"
|
|||
TITLE = {{Implementing Delaunay triangulations of the Bolza surface}},
|
||||
YEAR = {2017},
|
||||
DOI = {10.4230/LIPIcs.SoCG.2017.44},
|
||||
URL = {https://hal.inria.fr/hal-01568002},
|
||||
URL = {https://inria.hal.science/hal-01568002},
|
||||
}
|
||||
|
||||
@inproceedings{cgal:j-lrsspp-19,
|
||||
|
|
@ -1341,6 +1341,29 @@ Teillaud"
|
|||
year = {2012},
|
||||
}
|
||||
|
||||
@article{cgal:lrtc-iccmps-20,
|
||||
author = {Jacques-Olivier Lachaud and Pascal Romon and Boris Thibert and David Coeurjolly},
|
||||
journal = {Computer Graphics Forum (Proceedings of Symposium on Geometry Processing)},
|
||||
number = {5},
|
||||
title = {Interpolated Corrected Curvature Measures for Polygonal Surfaces},
|
||||
volume = {39},
|
||||
month = aug,
|
||||
year = {2020},
|
||||
url = {https://doi.org/10.1111/cgf.14067},
|
||||
doi = {10.1111/cgf.14067}
|
||||
}
|
||||
|
||||
@article{cgal:lrt-ccm-22,
|
||||
author = {Jacques-Olivier Lachaud and Pascal Romon and Boris Thibert},
|
||||
journal = {Discrete & Computational Geometry},
|
||||
title = {Corrected Curvature Measures},
|
||||
volume = {68},
|
||||
pages = {477-524},
|
||||
month = jul,
|
||||
year = {2022},
|
||||
url = {https://doi.org/10.1007/s00454-022-00399-4}
|
||||
}
|
||||
|
||||
@inproceedings{ cgal:lt-fmeps-98,
|
||||
author = "Peter Lindstrom and Greg Turk",
|
||||
title = "Fast and memory efficient polygonal simplification",
|
||||
|
|
@ -1887,13 +1910,13 @@ ABSTRACT = {We present the first complete, exact and efficient C++ implementatio
|
|||
@article{cgal:btsag-asosr-16,
|
||||
TITLE = {{A Survey of Surface Reconstruction from Point Clouds}},
|
||||
AUTHOR = {Berger, Matthew and Tagliasacchi, Andrea and Seversky, Lee and Alliez, Pierre and Guennebaud, Gael and Levine, Joshua and Sharf, Andrei and Silva, Claudio},
|
||||
URL = {https://hal.inria.fr/hal-01348404},
|
||||
URL = {https://inria.hal.science/hal-01348404},
|
||||
JOURNAL = {{Computer Graphics Forum}},
|
||||
PUBLISHER = {{Wiley}},
|
||||
PAGES = {27},
|
||||
YEAR = {2016},
|
||||
DOI = {10.1111/cgf.12802},
|
||||
PDF = {https://hal.inria.fr/hal-01348404/file/survey-author.pdf},
|
||||
PDF = {https://inria.hal.science/hal-01348404/file/survey-author.pdf},
|
||||
HAL_ID = {hal-01348404},
|
||||
HAL_VERSION = {v2}
|
||||
}
|
||||
|
|
@ -2293,7 +2316,7 @@ location = {Salt Lake City, Utah, USA}
|
|||
, pages = "75:1-75:9"
|
||||
, note = "SIGGRAPH '2009 Conference Proceedings"
|
||||
, volume = "28(3)"
|
||||
, url = "https://hal.inria.fr/inria-00359288"
|
||||
, url = "https://inria.hal.science/inria-00359288"
|
||||
, geombib = "not yet"
|
||||
, x-editorial-board = {yes}
|
||||
, x-proceedings = {yes}
|
||||
|
|
@ -2768,7 +2791,7 @@ author = "Pedro M.M. de Castro and Frederic Cazals and Sebastien Loriot and Moni
|
|||
, volume = "40"
|
||||
, number = "1"
|
||||
, pages = "61-78"
|
||||
, url = "https://hal.inria.fr/inria-00344310/"
|
||||
, url = "https://inria.hal.science/inria-00344310/"
|
||||
, doi = "10.1016/j.comgeo.2007.06.003"
|
||||
, x-international-audience = "yes"
|
||||
, x-editorial-board = "yes"
|
||||
|
|
@ -2788,7 +2811,7 @@ author = "Pedro M.M. de Castro and Frederic Cazals and Sebastien Loriot and Moni
|
|||
, title = "Complexity of {Delaunay} triangulation for points on lower-dimensional polyhedra"
|
||||
, booktitle = "Proc. 18th ACM-SIAM Sympos. Discrete Algorithms"
|
||||
, nickname = "SODA"
|
||||
, url = "https://hal.inria.fr/inria-00182835/"
|
||||
, url = "https://inria.hal.science/inria-00182835/"
|
||||
, year = 2007
|
||||
, pages = "1106--1113"
|
||||
}
|
||||
|
|
@ -3213,14 +3236,14 @@ pages = "207--221"
|
|||
@techreport{frey:inria-00069921,
|
||||
TITLE = {{MEDIT : An interactive Mesh visualization Software}},
|
||||
AUTHOR = {Frey, Pascal},
|
||||
URL = {https://hal.inria.fr/inria-00069921},
|
||||
URL = {https://inria.hal.science/inria-00069921},
|
||||
NUMBER = {RT-0253},
|
||||
PAGES = {41},
|
||||
INSTITUTION = {{INRIA}},
|
||||
YEAR = {2001},
|
||||
MONTH = Dec,
|
||||
KEYWORDS = {MESH ; VISUALIZATION ; POST-PROCESSING},
|
||||
PDF = {https://hal.inria.fr/inria-00069921/file/RT-0253.pdf},
|
||||
PDF = {https://inria.hal.science/inria-00069921/file/RT-0253.pdf},
|
||||
HAL_ID = {inria-00069921},
|
||||
HAL_VERSION = {v1}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5682,7 +5682,7 @@ cell neighborhood in $O(m)$ time."
|
|||
, year = 2000
|
||||
, pages = "61--79"
|
||||
, note = "Special Issue on Computational Geometry, to appear"
|
||||
, url = "https://hal.inria.fr/inria-00338566"
|
||||
, url = "https://inria.hal.science/inria-00338566"
|
||||
, succeeds = "ads-rdppw-98"
|
||||
, update = "00.03 devillers"
|
||||
, abstract = "We describe two problem-specific approaches to remove geometric degeneracies that we call {\it perturbing the problem} and {\it perturbing the world}. Using as our primary examples 2-d and 3-d Delaunay triangulation with Euclidean and polygonal metrics, we show that these approaches lead to relatively simple and efficient perturbations of the points that do not depend on a fixed ordering or index. Thus, they produce canonical output, which is important for producing test suites and verifiers for randomized or dynamic geometric algorithms."
|
||||
|
|
@ -11386,7 +11386,7 @@ method that uses very different techniques."
|
|||
, address = "BP93, 06902 Sophia-Antipolis, France"
|
||||
, month = jun
|
||||
, year = 1993
|
||||
, url = "https://hal.inria.fr/inria-00074682"
|
||||
, url = "https://inria.hal.science/inria-00074682"
|
||||
, keywords = "parallel algorithms, hypercube, multisearching, point location"
|
||||
, update = "95.09 devillers, 95.01 devillers, 93.09 devillers+milone+mitchell"
|
||||
}
|
||||
|
|
@ -13129,7 +13129,7 @@ small factor with respect to floating-point calculation."
|
|||
, number = 2
|
||||
, year = 1997
|
||||
, pages = "111--132"
|
||||
, url = "https://hal.inria.fr/inria-00090613"
|
||||
, url = "https://inria.hal.science/inria-00090613"
|
||||
, succeeds = "abdpy-esdus-94, abdpy-enmcs-95"
|
||||
, cites = "bjmm-lsicg-93, c-sede-92, fm-nsala-91, f-nsa2d-92, f-smpst-89, fv-eeacg-93, gss-egbra-89, gy-frcg-86, hhk-rsops-89, kln-edtur-91, m-dpggt-89, m-vigau-88a, ps-cgi-85, si-gafpa-88, v-cca-79"
|
||||
, update = "99.11 bibrelex+devillers, 99.07 devillers, 98.07 tamassia, 97.11 bibrelex, 97.03 devillers"
|
||||
|
|
@ -13142,7 +13142,7 @@ small factor with respect to floating-point calculation."
|
|||
, booktitle = "Proc. 11th Annu. ACM Sympos. Comput. Geom."
|
||||
, year = 1995
|
||||
, pages = "C16--C17"
|
||||
, url = "https://hal.inria.fr/inria-00090613"
|
||||
, url = "https://inria.hal.science/inria-00090613"
|
||||
, precedes = "abdpy-esdus-97"
|
||||
, cites = "ZZZ"
|
||||
, update = "99.11 bibrelex, 99.07 devillers, 98.03 bibrelex, 97.03 devillers, 96.01 devillers, 95.05 devillers"
|
||||
|
|
@ -18553,7 +18553,7 @@ the interior. Contains pseudocode."
|
|||
, volume = 31
|
||||
, year = 1998
|
||||
, pages = "613--628"
|
||||
, url = "https://hal.inria.fr/inria-00413175"
|
||||
, url = "https://inria.hal.science/inria-00413175"
|
||||
, succeeds = "bdkst-cmotc-96"
|
||||
, cites = "ast-apsgo-92, abb-amps-91, ag-mrpc-92, absstz-sacp-96, ab-pptr-88, c-pcp-83, c-oaitd-92, c-chdc-93, cghkkk-gpmem-93, ck-cppop-93, f-fapct-85, fj-gsrsm-84, g-cp-67, h-ampac-92, hkk-dvdmh-92i, hks-uevsi-93, l-rmp-91, msw-aotp-93, pt-cocpc-92, scklps-gadss-86, v-aitco-95"
|
||||
, update = "99.11 devillers, 99.07 devillers, 98.11 devillers"
|
||||
|
|
@ -18569,7 +18569,7 @@ the interior. Contains pseudocode."
|
|||
, month = aug
|
||||
, year = 1997
|
||||
, pages = "215--219"
|
||||
, url = "https://hal.inria.fr/inria-00413170"
|
||||
, url = "https://inria.hal.science/inria-00413170"
|
||||
, succeeds = "bdds-cscut-95"
|
||||
, cites = "bds-lric-94, bdsty-arsol-92, cct-rpatd-92, cs-arscg-89, d-rysoa-92, gks-ricdv-92, gss-gmppt-89, m-cgitr-93, s-sfira-91"
|
||||
, update = "99.11 devillers, 99.07 devillers, 98.11 devillers, 98.07 bibrelex, 98.03 mitchell, 97.11 oostrum"
|
||||
|
|
@ -23796,7 +23796,7 @@ In [BSBL93], the synthesis problem has been solved for a
|
|||
, booktitle = "Proc. 15th Annu. ACM Sympos. Comput. Geom."
|
||||
, year = 1999
|
||||
, pages = "421--423"
|
||||
, url = "https://hal.inria.fr/inria-00348713/"
|
||||
, url = "https://inria.hal.science/inria-00348713/"
|
||||
, update = "02.03 devillers, 00.03 bibrelex, 99.11 bibrelex, 99.07 devillers"
|
||||
}
|
||||
|
||||
|
|
@ -23854,7 +23854,7 @@ In [BSBL93], the synthesis problem has been solved for a
|
|||
, volume = 6
|
||||
, year = 1996
|
||||
, pages = "123--130"
|
||||
, url = "https://hal.inria.fr/inria-00413159"
|
||||
, url = "https://inria.hal.science/inria-00413159"
|
||||
, succeeds = "bcddy-acchs-92"
|
||||
, cites = "r-chada-92, ss-tddsp-90, m-mnfcp-70, c-ochap-91, cs-arscg-89, s-sdlpc-91, bdsty-arsol-92"
|
||||
, update = "99.11 bibrelex+devillers, 99.07 devillers, 97.07 devillers"
|
||||
|
|
@ -23896,7 +23896,7 @@ In [BSBL93], the synthesis problem has been solved for a
|
|||
, number = 1
|
||||
, year = 1996
|
||||
, pages = "1--14"
|
||||
, url = "https://hal.inria.fr/hal-00795075"
|
||||
, url = "https://inria.hal.science/hal-00795075"
|
||||
, succeeds = "bcdt-osc3d-91t, bcdt-osc3d-91i"
|
||||
, cites = "ps-cgi-85, e-acg-87, a-vdsfg-91, s-chdch-86, ms-loq-92, cs-arscg-89, bdsty-arsol-92, bcdt-osc3d-91i, bm-sdcs-71, bcdt-osc3d-94t, b-srpcs-88, a-pdpaa-87, c-ig-61, p-gcc-70, dmt-ssgtu-92i, gs-ccrs-87, eg-tsa-89, b-gdg-83"
|
||||
, update = "99.11 bibrelex+devillers, 99.07 devillers, 97.03 devillers, 96.05 devillers"
|
||||
|
|
@ -23974,7 +23974,7 @@ of the output, and the extra storage is {$O(n)$}."
|
|||
, publisher = "Springer-Verlag"
|
||||
, year = 1994
|
||||
, pages = "254--265"
|
||||
, url = "https://hal.inria.fr/hal-01179475"
|
||||
, url = "https://inria.hal.science/hal-01179475"
|
||||
, precedes = "bcdry-ctbc-99"
|
||||
, update = "99.11 bibrelex+devillers, 99.07 devillers, 98.03 mitchell, 97.03 devillers, 96.01 devillers, 95.05 agarwal"
|
||||
, abstract = "
|
||||
|
|
@ -23994,7 +23994,7 @@ of the output, and the extra storage is {$O(n)$}."
|
|||
, volume = 13
|
||||
, year = 1999
|
||||
, pages = "149--159"
|
||||
, url = "https://hal.inria.fr/inria-00413181"
|
||||
, url = "https://inria.hal.science/inria-00413181"
|
||||
, archive = "XXX:cs.CG/9909004"
|
||||
, succeeds = "bcdry-ctbc-94"
|
||||
, cites = "agss-ltacv-89, dxcr-kmp-93, d-cmlca-57, fw-pcm-91, jc-pspmr-89, kslo-prpph-96, k-osps-83, l-rmp-91, o-mpic-87, o-ramp-92, os-plamp-94, p-masp-77, rs-mppmo-94, ss-ampr-90, w-mpav-88"
|
||||
|
|
@ -24032,7 +24032,7 @@ of the output, and the extra storage is {$O(n)$}."
|
|||
, volume = 10
|
||||
, year = 2000
|
||||
, pages = "41--54"
|
||||
, url = "https://hal.inria.fr/inria-00338701"
|
||||
, url = "https://inria.hal.science/inria-00338701"
|
||||
, archive = "XXX/cs.CG/9909005"
|
||||
, succeeds = "bcduy-clcst-96"
|
||||
, cites = "abosy-fmcnp-89, b-cspps-88, bcdy-csp-95, bg-aoscf-95, cegss-cfals-93, dj-cmcnp-90, bds-lric-95, dk-ladsc-85, egs-cmcap-90, ep-mps-88, f-spcrd-86, ka-dd-84, k-eccs-79, k-osps-83, ld-gvdp-81, mt-cppna-85, m-lpltw-84, ms-sapo-95, m-idssp-92, okm-ccs-86"
|
||||
|
|
@ -24094,7 +24094,7 @@ must lie in the halfplanes delimited by the query lines."
|
|||
, number = "1--2"
|
||||
, year = 1995
|
||||
, pages = "3--20"
|
||||
, url = "https://hal.inria.fr/hal-00795083"
|
||||
, url = "https://inria.hal.science/hal-00795083"
|
||||
, succeeds = "bddp-mpsr-92,bddp-spsr-92"
|
||||
, cites = "ps-cgi-85, l-knnvd-82, agss-ltacv-87, s-ksacs-91, hs-ompc-91, p-pplr-90, w-cvgnl-85, bdp-cu3ct-91"
|
||||
, update = "99.11 bibrelex+devillers, 99.07 devillers, 97.03 devillers, 96.01 devillers, 95.09 devillers"
|
||||
|
|
@ -24155,7 +24155,7 @@ must lie in the halfplanes delimited by the query lines."
|
|||
, volume = 30
|
||||
, year = 2000
|
||||
, pages = "218--246"
|
||||
, url = "https://hal.inria.fr/inria-00099289"
|
||||
, url = "https://inria.hal.science/inria-00099289"
|
||||
, archive = "XXX/cs.CG/9909006"
|
||||
, succeeds = "bdl-mplr-94,bdl-srhdr-94,bdl-srhdr-94c"
|
||||
, cites = "bddp-mplrs-95, dd-frspp-90, h-fuenl-89, ks-empac-90, kst-coksm-97, l-ptrmn-96, s-ksacs-91, ss-nempa-87, t-frnns-91"
|
||||
|
|
@ -24184,7 +24184,7 @@ must lie in the halfplanes delimited by the query lines."
|
|||
, number = 2
|
||||
, year = 1991
|
||||
, pages = "187--196"
|
||||
, url = "https://hal.inria.fr/inria-00167176"
|
||||
, url = "https://inria.hal.science/inria-00167176"
|
||||
, keywords = "convex hull, motion planning, legged robot"
|
||||
, update = "99.11 bibrelex+devillers, 99.07 devillers, 97.03 devillers, 96.01 devillers, 95.09 devillers, 95.01 devillers"
|
||||
, abstract = "Given is a set $s$ of $n$ points, each colored with one of $k \geq 3$ colours. We say that a triangle defined by three points of $\cal s$ is 3-colored if its vertices have distinct colours. We prove in this paper that the problem of constructing the boundary of the union $\cal ts$ of all such 3-colored triangles can be done in optimal $O(n \log n)$ time."
|
||||
|
|
@ -24210,7 +24210,7 @@ must lie in the halfplanes delimited by the query lines."
|
|||
, volume = 8
|
||||
, year = 1992
|
||||
, pages = "51--71"
|
||||
, url = "https://hal.inria.fr/inria-00090675"
|
||||
, url = "https://inria.hal.science/inria-00090675"
|
||||
, keywords = "randomized algorithms, Delaunay triangulation, semi-dynamic algorithms, arrangement of line-segments"
|
||||
, succeeds = "bdsty-olgag-91i"
|
||||
, update = "99.11 bibrelex, 99.07 devillers, 98.07 bibrelex, 97.03 devillers, 96.01 devillers, 95.09 devillers, 95.01 devillers"
|
||||
|
|
@ -24278,7 +24278,7 @@ arrangements of curves in the plane and others."
|
|||
, volume = 9
|
||||
, year = 1993
|
||||
, pages = "329--356"
|
||||
, url = "https://hal.inria.fr/inria-00090668"
|
||||
, url = "https://inria.hal.science/inria-00090668"
|
||||
, keywords = "randomized algorithms, higher order Voronoi diagrams, dynamic algorithms"
|
||||
, succeeds = "bdt-olcho-90"
|
||||
, update = "99.11 bibrelex, 99.07 devillers, 97.03 devillers+schwarzkopf, 96.05 agarwal, 96.01 devillers, 95.09 devillers, 95.01 devillers, 93.09 devillers"
|
||||
|
|
@ -24459,7 +24459,7 @@ the computational geometry algorithms library CGAL."
|
|||
, booktitle = "Proc. 13th Annu. ACM Sympos. Comput. Geom."
|
||||
, year = 1997
|
||||
, pages = "67--76"
|
||||
, url = "https://hal.inria.fr/inria-00073622z"
|
||||
, url = "https://inria.hal.science/inria-00073622z"
|
||||
, precedes = "blt-smssa-98"
|
||||
, cites = "ab-scsp-87, ab-pptr-89, abdpy-esdus-97, bdh-qach-93, dm-mtcae-95, gs-ccrs-87, lm-cancp-93, l-spcsa-83, ZZZ"
|
||||
, update = "99.11 bibrelex, 99.07 devillers, 98.07 bibrelex+devillers, 97.07 efrat"
|
||||
|
|
@ -27482,7 +27482,7 @@ and solids on dynamically evolving grids without remeshing."
|
|||
, year = 1999
|
||||
, pages = "173--197"
|
||||
, note = "Special Issue on Real Numbers and Computers"
|
||||
, url = "https://hal.inria.fr/inria-00344324"
|
||||
, url = "https://inria.hal.science/inria-00344324"
|
||||
, succeeds = "bepp-cegpu-97"
|
||||
, update = "99.07 devillers"
|
||||
}
|
||||
|
|
@ -27523,7 +27523,7 @@ and solids on dynamically evolving grids without remeshing."
|
|||
, booktitle = "GAMM/IMACS International Symposium on Scientific Computing, Computer Arithmetic and Validated Numerics"
|
||||
, year = 1997
|
||||
, pages = ""
|
||||
, url = "https://hal.inria.fr/inria-00344403/"
|
||||
, url = "https://inria.hal.science/inria-00344403/"
|
||||
, update = "99.11 bibrelex, 99.07 devillers, 98.11 devillers"
|
||||
}
|
||||
|
||||
|
|
@ -44139,7 +44139,7 @@ Contains C code."
|
|||
, school = "Universit\'e de Nice-Sophia Antipolis"
|
||||
, address = "France"
|
||||
, year = 1996
|
||||
, url = "https://hal.inria.fr/tel-00771335"
|
||||
, url = "https://inria.hal.science/tel-00771335"
|
||||
, keywords = "doctoral thesis"
|
||||
, update = "99.11 bibrelex, 99.07 devillers, 98.07 devillers"
|
||||
}
|
||||
|
|
@ -44150,7 +44150,7 @@ Contains C code."
|
|||
, booktitle = "Proc. 7th Canad. Conf. Comput. Geom."
|
||||
, year = 1995
|
||||
, pages = "49--54"
|
||||
, url = "https://hal.inria.fr/inria-00413229"
|
||||
, url = "https://inria.hal.science/inria-00413229"
|
||||
, update = "99.11 bibrelex, 99.07 devillers, 97.03 devillers, 96.01 devillers, 95.09 jones"
|
||||
}
|
||||
|
||||
|
|
@ -44261,7 +44261,7 @@ Contains C code."
|
|||
, volume = 157
|
||||
, year = 1996
|
||||
, pages = "35--52"
|
||||
, url = "https://hal.inria.fr/inria-00167202"
|
||||
, url = "https://inria.hal.science/inria-00167202"
|
||||
, cites = "as-solri-92, bd-rcuet-92, bdsty-arsol-92, bdt-schov-93, bt-hrodt-86, bt-rcdt-93, prisme-by-ga-95, ce-oails-92, cegss-cfals-93, c-ochaa-93, c-narsc-87, cms-frric-93, cs-arscg-89, prisme-2626, bds-lric-94, d-rysoa-92, dg-dbppl-93, dmt-fddtl-92, dty-dlals-92, dy-rchyd-93, gks-ricdv-92, ms-dplah-91, m-lavd-91, m-rmstd-91, m-rmstf-91, m-rmstl-91, m-cgitr-93, ol-mcp-81, ps-cgi-85, p-slpab-90, s-dmgsm-91, s-dmcpr-92, s-sfira-91, t-tdrac-93"
|
||||
, update = "99.11 bibrelex+devillers, 99.07 devillers, 97.03 devillers, 96.05 smid, 96.01 devillers"
|
||||
, abstract = "This paper is not a complete survey on randomized algorithms in computational geometry, but an introduction to this subject providing intuitions and references. In a first time, some basic ideas are illustrated by the sorting problem, and in a second time few results on computational geometry are briefly explained."
|
||||
|
|
@ -44286,7 +44286,7 @@ Contains C code."
|
|||
, booktitle = "Proc. 14th Annu. ACM Sympos. Comput. Geom."
|
||||
, year = 1998
|
||||
, pages = "106--115"
|
||||
, url = "https://hal.inria.fr/hal-01179446"
|
||||
, url = "https://inria.hal.science/hal-01179446"
|
||||
, archive = "XXX:cs.CG/9907024"
|
||||
, update = "99.11 bibrelex+devillers, 99.07 devillers, 98.11 devillers"
|
||||
, abstract = "We propose a new data structure to compute the Delaunay triangulation of a set of points in the plane. It combines good worst case complexity, fast behavior on real data, and small memory occupation. The location structure is organized into several levels. The lowest level just consists of the triangulation, then each level contains the triangulation of a small sample of the levels below. Point location is done by marching in a triangulation to determine the nearest neighbor of the query at that level, then the march restarts from that neighbor at the level below. Using a small sample (3 {\%}) allows a small memory occupation; the march and the use of the nearest neighbor to change levels quickly locate the query."
|
||||
|
|
@ -44323,7 +44323,7 @@ Contains C code."
|
|||
, year = 2009
|
||||
, type = "Research Report"
|
||||
, number = 7104
|
||||
, url = "https://hal.inria.fr/inria-00433107/"
|
||||
, url = "https://inria.hal.science/inria-00433107/"
|
||||
}
|
||||
|
||||
@inproceedings{d-ddt-99
|
||||
|
|
@ -44332,7 +44332,7 @@ Contains C code."
|
|||
, booktitle = "Proc. 15th Annu. ACM Sympos. Comput. Geom."
|
||||
, year = 1999
|
||||
, pages = "181--188"
|
||||
, url = "https://hal.inria.fr/hal-01179435"
|
||||
, url = "https://inria.hal.science/hal-01179435"
|
||||
, archive = "XXX:cs.CG/9907023"
|
||||
, succeeds = "d-ddt-98"
|
||||
, cites = "agss-ltacv-89, a-pdpaa-87, bbp-iayed-98scg, bd-irgo-95, bm-sdcs-71, c-bvdcp-86, ads-rdppw-98, d-iirdt-98, dmt-ssgtu-92i, dp-papaf-98, es-itfwr-96, gs-cdtp-78, h-taatm-90, l-tdam-97, m-smdnt-93, msz-frplw-96, obs-stcav-92, p-gcc-70, s-chdch-86, s-nmpgc-98"
|
||||
|
|
@ -44349,7 +44349,7 @@ Contains C code."
|
|||
, number = 1
|
||||
, year = 1992
|
||||
, pages = "97--111"
|
||||
, url = "https://hal.inria.fr/inria-00167206"
|
||||
, url = "https://inria.hal.science/inria-00167206"
|
||||
, archive = "XXX:cs.CG/9810007"
|
||||
, keywords = "randomized algorithms, Delaunay triangulation, skeleton, medial axis, minimum spanning tree, simple polygon"
|
||||
, succeeds = "d-sroa-91"
|
||||
|
|
@ -44567,7 +44567,7 @@ respectively, we obtain a speedup of $\frac p{\log p}$."
|
|||
, number = 3
|
||||
, year = 1995
|
||||
, pages = "157--164"
|
||||
, url = "https://hal.inria.fr/inria-00074391"
|
||||
, url = "https://inria.hal.science/inria-00074391"
|
||||
, succeeds = "dg-iafch-94"
|
||||
, cites = "a-dcgp-85, bcddy-acchs-92, r-chada-92"
|
||||
, update = "99.11 devillers, 99.07 devillers, 96.01 devillers"
|
||||
|
|
@ -44821,7 +44821,7 @@ respectively, we obtain a speedup of $\frac p{\log p}$."
|
|||
, volume = 20
|
||||
, year = 1998
|
||||
, pages = "523--547"
|
||||
, url = "https://hal.inria.fr/inria-00090653"
|
||||
, url = "https://inria.hal.science/inria-00090653"
|
||||
, archive = "XXX:cs.CG/9907029"
|
||||
, succeeds = "dp-papaf-96"
|
||||
, cites = "b-g-87, bkmnsu-egcl-95, bms-hcvdl-94, fv-eeacg-93, lpt-rpqiv-96, mn-iga-94, y-tegc-97"
|
||||
|
|
@ -117677,7 +117677,7 @@ both for rendering and for modeling. Contains C code."
|
|||
, booktitle = "Workshop on Applications of Interval Analysis to systems and Control"
|
||||
, year = 1999
|
||||
, pages = "99--110"
|
||||
, url = "https://hal.inria.fr/inria-00344513"
|
||||
, url = "https://inria.hal.science/inria-00344513"
|
||||
, update = "01.07 devillers, 00.03 devillers, 99.07 devillers"
|
||||
}
|
||||
|
||||
|
|
@ -140376,7 +140376,7 @@ code."
|
|||
, publisher = "INRIA Sophia-Antipolis"
|
||||
, year = 1999
|
||||
, pages = "175--178"
|
||||
, url = "https://hal.inria.fr/inria-00167199"
|
||||
, url = "https://inria.hal.science/inria-00167199"
|
||||
, update = "00.03 bibrelex+devillers, 99.07 bibrelex"
|
||||
}
|
||||
|
||||
|
|
@ -151938,7 +151938,7 @@ pages = {179--189}
|
|||
, number = "RR-8467"
|
||||
, month = "Feb"
|
||||
, year = "2014"
|
||||
, url = "https://hal.inria.fr/hal-00943409"
|
||||
, url = "https://inria.hal.science/hal-00943409"
|
||||
}
|
||||
|
||||
@article{XinWang2009improvingchenandhan,
|
||||
|
|
@ -152006,13 +152006,13 @@ pages = {179--189}
|
|||
@inproceedings{boissonnat2009Delaunay,
|
||||
TITLE = {{Incremental construction of the Delaunay graph in medium dimension}},
|
||||
AUTHOR = {Boissonnat, Jean-Daniel and Devillers, Olivier and Hornus, Samuel},
|
||||
URL = {https://hal.inria.fr/inria-00412437},
|
||||
URL = {https://inria.hal.science/inria-00412437},
|
||||
BOOKTITLE = {{Annual Symposium on Computational Geometry}},
|
||||
ADDRESS = {Aarhus, Denmark},
|
||||
PAGES = {208-216},
|
||||
YEAR = {2009},
|
||||
MONTH = Jun,
|
||||
PDF = {https://hal.inria.fr/inria-00412437/file/socg09.pdf},
|
||||
PDF = {https://inria.hal.science/inria-00412437/file/socg09.pdf},
|
||||
HAL_ID = {inria-00412437},
|
||||
HAL_VERSION = {v1},
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,822 @@
|
|||
# Doxyfile 1.10.0
|
||||
|
||||
# This file describes the settings to be used by the documentation system
|
||||
# doxygen (www.doxygen.org) for a project.
|
||||
#
|
||||
# Only the settings that are not the default ones are kept in this file
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Project related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
|
||||
# double-quotes, unless you are using Doxywizard) that should identify the
|
||||
# project for which the documentation is generated. This name is used in the
|
||||
# title of most generated pages and in a few other places.
|
||||
# The default value is: My Project.
|
||||
|
||||
PROJECT_NAME =
|
||||
|
||||
# This tag implements a quasi-intelligent brief description abbreviator that is
|
||||
# used to form the text in various listings. Each string in this list, if found
|
||||
# as the leading text of the brief description, will be stripped from the text
|
||||
# and the result, after processing the whole list, is used as the annotated
|
||||
# text. Otherwise, the brief description is used as-is. If left blank, the
|
||||
# following values are used ($name is automatically replaced with the name of
|
||||
# the entity):The $name class, The $name widget, The $name file, is, provides,
|
||||
# specifies, contains, represents, a, an and the.
|
||||
|
||||
ABBREVIATE_BRIEF =
|
||||
|
||||
# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
|
||||
# first line (until the first dot) of a Javadoc-style comment as the brief
|
||||
# description. If set to NO, the Javadoc-style will behave just like regular Qt-
|
||||
# style comments (thus requiring an explicit @brief command for a brief
|
||||
# description.)
|
||||
# The default value is: NO.
|
||||
|
||||
JAVADOC_AUTOBRIEF = YES
|
||||
|
||||
# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
|
||||
# line (until the first dot) of a Qt-style comment as the brief description. If
|
||||
# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
|
||||
# requiring an explicit \brief command for a brief description.)
|
||||
# The default value is: NO.
|
||||
|
||||
QT_AUTOBRIEF = YES
|
||||
|
||||
# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
|
||||
# documentation from any documented member that it re-implements.
|
||||
# The default value is: YES.
|
||||
|
||||
INHERIT_DOCS = NO
|
||||
|
||||
# This tag can be used to specify a number of aliases that act as commands in
|
||||
# the documentation. An alias has the form:
|
||||
# name=value
|
||||
# For example adding
|
||||
# "sideeffect=@par Side Effects:^^"
|
||||
# will allow you to put the command \sideeffect (or @sideeffect) in the
|
||||
# documentation, which will result in a user-defined paragraph with heading
|
||||
# "Side Effects:". Note that you cannot put \n's in the value part of an alias
|
||||
# to insert newlines (in the resulting output). You can put ^^ in the value part
|
||||
# of an alias to insert a newline as if a physical newline was in the original
|
||||
# file. When you need a literal { or } or , in the value part of an alias you
|
||||
# have to escape them by means of a backslash (\), this can lead to conflicts
|
||||
# with the commands \{ and \} for these it is advised to use the version @{ and
|
||||
# @} or use a double escape (\\{ and \\})
|
||||
|
||||
ALIASES = "cgal=%CGAL" \
|
||||
"protocgal=C++gal" \
|
||||
"plageo=Plageo" \
|
||||
"stl=STL" \
|
||||
"gmp=GMP" \
|
||||
"gmpxx=GMPXX" \
|
||||
"iso=ISO" \
|
||||
"lisp=Lisp" \
|
||||
"ieee=IEEE" \
|
||||
"ascii=ASCII" \
|
||||
"exacus=Exacus" \
|
||||
"mpir=MPIR" \
|
||||
"mpfr=MPFR" \
|
||||
"leda=LEDA" \
|
||||
"gcc=GCC" \
|
||||
"dcel=DCEL" \
|
||||
"bgl=BGL" \
|
||||
"boost=Boost" \
|
||||
"gnu=GNU" \
|
||||
"ms=MS" \
|
||||
"qt=Qt" \
|
||||
"qt5=Qt5" \
|
||||
"eigen=Eigen" \
|
||||
"opengr=OpenGR" \
|
||||
"libpointmatcher=libpointmatcher" \
|
||||
"core=Core" \
|
||||
"mpfi=MPFI" \
|
||||
"ntl=NTL" \
|
||||
"pdb=PDB" \
|
||||
"esbtl=ESBTL" \
|
||||
"tbb=TBB" \
|
||||
"laslib=LASlib" \
|
||||
"opencv=OpenCV" \
|
||||
"tensorflow=TensorFlow" \
|
||||
"metis=METIS" \
|
||||
"zlib=zlib" \
|
||||
"ceres=Ceres" \
|
||||
"glpk=GLPK" \
|
||||
"scip=SCIP" \
|
||||
"osqp=OSQP" \
|
||||
"rs=RS" \
|
||||
"rs3=RS3" \
|
||||
"unix=Unix" \
|
||||
"api=API" \
|
||||
"vtk=VTK" \
|
||||
"visualstudio=Visual Studio" \
|
||||
"taucs=TAUCS" \
|
||||
"lapack=LAPACK" \
|
||||
"blas=BLAS" \
|
||||
"opennl=OpenNL" \
|
||||
"cpp=C++" \
|
||||
"cpp11=C++11" \
|
||||
"CC=C++" \
|
||||
"cgalExample{1}=<br><b>File</b> \ref \1 \include \1" \
|
||||
"cgalFigureAnchor{1}=\anchor fig__\1" \
|
||||
"cgalFigureRef{1}=\ref fig__\1" \
|
||||
"cgalFigureBegin{2}=\anchor fig__\1 ^^ \image html \2 ^^ \image latex \2 \"\" width=15cm ^^ \htmlonly[block] <div class=\"cgal_figure_caption\"> \endhtmlonly ^^ \ref fig__\1" \
|
||||
"cgalFigureBegin{3}=\anchor fig__\1 ^^ <CENTER> <TABLE border=0> <TR> <TD> \image html \2 ^^ \image latex \2 \"\" width=7.5cm ^^ </TD> <TD> \image html \3 ^^ \image latex \3 \"\" width=7.5cm ^^ </TD> </TR> </TABLE> </CENTER> \htmlonly[block] <div class=\"cgal_figure_caption\"> \endhtmlonly ^^ \ref fig__\1" \
|
||||
"cgalFigureBegin{4}=\anchor fig__\1 ^^ <CENTER> <TABLE border=0> <TR> <TD> \image html \2 ^^ \image latex \2 \"\" width=5cm ^^ </TD> <TD> \image html \3 ^^ \image latex \3 \"\" width=5cm ^^ </TD> <TD> \image html \4 ^^ \image latex \4 \"\" width=5cm ^^ </TD> </TR> </TABLE> </CENTER> \htmlonly[block] <div class=\"cgal_figure_caption\"> \endhtmlonly ^^ \ref fig__\1" \
|
||||
"cgalFigureBegin{5}=\anchor fig__\1 ^^ <CENTER> <TABLE border=0> <TR> <TD> \image html \2 ^^ \image latex \2 \"\" width=3.75cm ^^ </TD> <TD> \image html \3 ^^ \image latex \3 \"\" width=3.75cm ^^ </TD> <TD> \image html \4 ^^ \image latex \4 \"\" width=3.75cm ^^ </TD> <TD> \image html \5 ^^ \image latex \5 \"\" width=3.75cm ^^ </TD> </TR> </TABLE> </CENTER> \htmlonly[block] <div class=\"cgal_figure_caption\"> \endhtmlonly ^^ \ref fig__\1" \
|
||||
"cgalFigureBegin{6}=\anchor fig__\1 ^^ <CENTER> <TABLE border=0> <TR> <TD> \image html \2 ^^ \image latex \2 \"\" width=3cm ^^ </TD> <TD> \image html \3 ^^ \image latex \3 \"\" width=3cm ^^ </TD> <TD> \image html \4 ^^ \image latex \4 \"\" width=3cm ^^ </TD> <TD> \image html \5 ^^ \image latex \5 \"\" width=3cm ^^ </TD> <TD> \image html \6 ^^ \image latex \6 \"\" width=3cm ^^ </TD> </TR> </TABLE> </CENTER> \htmlonly[block] <div class=\"cgal_figure_caption\"> \endhtmlonly ^^ \ref fig__\1" \
|
||||
"cgalFigureBegin{7}=\anchor fig__\1 ^^ <CENTER> <TABLE border=0> <TR> <TD> \image html \2 ^^ \image latex \2 \"\" width=2.5cm ^^ </TD> <TD> \image html \3 ^^ \image latex \3 \"\" width=2.5cm ^^ </TD> <TD> \image html \4 ^^ \image latex \4 \"\" width=2.5cm ^^ </TD> <TD> \image html \5 ^^ \image latex \5 \"\" width=2.5cm ^^ </TD> <TD> \image html \6 ^^ \image latex \6 \"\" width=2.5cm ^^ </TD> <TD> \image html \7 ^^ \image latex \7 \"\" width=2.5cm ^^ </TD> </TR> </TABLE> </CENTER> \htmlonly[block] <div class=\"cgal_figure_caption\"> \endhtmlonly ^^ \ref fig__\1" \
|
||||
"cgalFigureBegin{8}=\anchor fig__\1 ^^ <CENTER> <TABLE border=0> <TR> <TD> \image html \2 ^^ \image latex \2 \"\" width=2.1cm ^^ </TD> <TD> \image html \3 ^^ \image latex \3 \"\" width=2.1cm ^^ </TD> <TD> \image html \4 ^^ \image latex \4 \"\" width=2.1cm ^^ </TD> <TD> \image html \5 ^^ \image latex \5 \"\" width=2.1cm ^^ </TD> <TD> \image html \6 ^^ \image latex \6 \"\" width=2.1cm ^^ </TD> <TD> \image html \7 ^^ \image latex \7 \"\" width=2.1cm ^^ </TD> <TD> \image html \8 ^^ \image latex \8 \"\" width=2.1cm ^^ </TD> </TR> </TABLE> </CENTER> \htmlonly[block] <div class=\"cgal_figure_caption\"> \endhtmlonly ^^ \ref fig__\1" \
|
||||
"cgalFigureBegin{9}=\anchor fig__\1 ^^ <CENTER> <TABLE border=0> <TR> <TD> \image html \2 ^^ \image latex \2 \"\" width=1.9cm ^^ </TD> <TD> \image html \3 ^^ \image latex \3 \"\" width=1.9cm ^^ </TD> <TD> \image html \4 ^^ \image latex \4 \"\" width=1.9cm ^^ </TD> <TD> \image html \5 ^^ \image latex \5 \"\" width=1.9cm ^^ </TD> <TD> \image html \6 ^^ \image latex \6 \"\" width=1.9cm ^^ </TD> <TD> \image html \7 ^^ \image latex \7 \"\" width=1.9cm ^^ </TD> <TD> \image html \8 ^^ \image latex \8 \"\" width=1.9cm ^^ </TD> <TD> \image html \9 ^^ \image latex \9 \"\" width=1.9cm ^^ </TD> </TR> </TABLE> </CENTER> \htmlonly[block] <div class=\"cgal_figure_caption\"> \endhtmlonly ^^ \ref fig__\1" \
|
||||
"cgalFigureBegin{10}=\anchor fig__\1 ^^ <CENTER> <TABLE border=0> <TR> <TD> \image html \2 ^^ \image latex \2 \"\" width=1.6cm ^^ </TD> <TD> \image html \3 ^^ \image latex \3 \"\" width=1.6cm ^^ </TD> <TD> \image html \4 ^^ \image latex \4 \"\" width=1.6cm ^^ </TD> <TD> \image html \5 ^^ \image latex \5 \"\" width=1.6cm ^^ </TD> <TD> \image html \6 ^^ \image latex \6 \"\" width=1.6cm ^^ </TD> <TD> \image html \7 ^^ \image latex \7 \"\" width=1.6cm ^^ </TD> <TD> \image html \8 ^^ \image latex \8 \"\" width=1.6cm ^^ </TD> <TD> \image html \9 ^^ \image latex \9 \"\" width=1.6cm ^^ </TD> <TD> \image html \10 ^^ \image latex \10 \"\" width=1.6cm ^^ </TD> </TR> </TABLE> </CENTER> \htmlonly[block] <div class=\"cgal_figure_caption\"> \endhtmlonly ^^ \ref fig__\1" \
|
||||
"cgalFigureEnd=\htmlonly[block] </div> \endhtmlonly <br>" \
|
||||
"cgalFigureCaptionBegin{1}=\htmlonly[block] <div class=\"cgal_figure_caption\"> \endhtmlonly \ref fig__\1" \
|
||||
"cgalFigureCaptionEnd=\htmlonly[block] </div> \endhtmlonly <br>" \
|
||||
"cgalConcept=\details <div id=\"CGALConcept\"></div>^^ \brief" \
|
||||
"cgalConceptNamespace=\details <div id=\"CGALConceptNS\"></div>^^ \brief" \
|
||||
"cgalRefines=Refines" \
|
||||
"cgalRefines{1}=<dl><dt>@cgalRefines</dt><dd>@c \1</dd></dl>" \
|
||||
"cgalRefines{2}=<dl><dt>@cgalRefines</dt><dd>@c \1</dd><dt></dt><dd>@c \2</dd></dl>" \
|
||||
"cgalRefines{3}=<dl><dt>@cgalRefines</dt><dd>@c \1</dd><dt></dt><dd>@c \2</dd><dt></dt><dd>@c \3</dd></dl>" \
|
||||
"cgalRefines{4}=<dl><dt>@cgalRefines</dt><dd>@c \1</dd><dt></dt><dd>@c \2</dd><dt></dt><dd>@c \3</dd><dt></dt><dd>@c \4</dd></dl>" \
|
||||
"cgalRefines{5}=<dl><dt>@cgalRefines</dt><dd>@c \1</dd><dt></dt><dd>@c \2</dd><dt></dt><dd>@c \3</dd><dt></dt><dd>@c \4</dd><dt></dt><dd>@c \5</dd></dl>" \
|
||||
"cgalRefinesBare{1}=<dl><dt>@cgalRefines</dt><dd>\1</dd></dl>" \
|
||||
"cgalRefinesBare{2}=<dl><dt>@cgalRefines</dt><dd>@c \1</dd><dt></dt><dd>\2</dd></dl>" \
|
||||
"cgalModelsHeader=Is model of" \
|
||||
"cgalModels{1}=<dl><dt>@cgalModelsHeader</dt><dd>@c \1</dd></dl>" \
|
||||
"cgalModels{2}=<dl><dt>@cgalModelsHeader</dt><dd>@c \1</dd><dt></dt><dd>@c \2</dd></dl>" \
|
||||
"cgalModels{3}=<dl><dt>@cgalModelsHeader</dt><dd>@c \1</dd><dt></dt><dd>@c \2</dd><dt></dt><dd>@c \3</dd></dl>" \
|
||||
"cgalModels{4}=<dl><dt>@cgalModelsHeader</dt><dd>@c \1</dd><dt></dt><dd>@c \2</dd><dt></dt><dd>@c \3</dd><dt></dt><dd>@c \4</dd></dl>" \
|
||||
"cgalModels{5}=<dl><dt>@cgalModelsHeader</dt><dd>@c \1</dd><dt></dt><dd>@c \2</dd><dt></dt><dd>@c \3</dd><dt></dt><dd>@c \4</dd><dt></dt><dd>@c \5</dd></dl>" \
|
||||
"cgalModels{6}=<dl><dt>@cgalModelsHeader</dt><dd>@c \1</dd><dt></dt><dd>@c \2</dd><dt></dt><dd>@c \3</dd><dt></dt><dd>@c \4</dd><dt></dt><dd>@c \5</dd><dt></dt><dd>@c \6</dd></dl>" \
|
||||
"cgalModelsBareBegin=<dl><dt>@cgalModelsHeader</dt><dd></dd>" \
|
||||
"cgalModelsBareEnd=</dl>" \
|
||||
"cgalModelsBare{1}=<dt></dt><dd>\1</dd>" \
|
||||
"cgalGeneralizes=\xrefitem generalizes \"Generalizes\" \"Generalization Relationships\"" \
|
||||
"cgalHasModelsHeader=Has models" \
|
||||
"cgalHasModelsBegin=<dl><dt>@cgalHasModelsHeader</dt><dd></dd>" \
|
||||
"cgalHasModels{1}=<dt></dt><dd>`\1`</dd>" \
|
||||
"cgalHasModelsBare{1}=<dt></dt><dd>\1</dd>" \
|
||||
"cgalHasModelsEnd=</dl>" \
|
||||
"cgalDebugBegin=\htmlonly[block] <div class=\"CGALDebug\"> <div>Debugging Support</div> \endhtmlonly ^^" \
|
||||
"cgalDebugEnd=\htmlonly[block] </div> \endhtmlonly" \
|
||||
"cgalDebugFunction=This is a function for debugging purpose." \
|
||||
"cgalAdvancedBegin=^^ \htmlonly[block] <div class=\"CGALAdvanced\"> <div>Advanced</div> \endhtmlonly ^^" \
|
||||
"cgalAdvancedEnd=\noop ^^ \htmlonly[block] </div> \endhtmlonly" \
|
||||
"cgalAdvancedFunction=This is an advanced function." \
|
||||
"cgalAdvancedClass=This is an advanced class." \
|
||||
"cgalAdvancedType=This is an advanced type." \
|
||||
"cgalAdvancedConcept=This is an advanced concept." \
|
||||
"cgalRequiresCPP11=\warning This function requires a C++11 compiler." \
|
||||
"cgalPkgPicture{1}=<div class=\"PkgImage\"> ^^ \image html \1 ^^</div>" \
|
||||
"cgalPkgSummaryBegin=<div class=\"PkgSummary\">" \
|
||||
"cgalPkgSummaryEnd=</div>" \
|
||||
"cgalPkgShortInfoBegin=<div class=\"PkgShortInfo\">" \
|
||||
"cgalPkgShortInfoEnd=</div>" \
|
||||
"cgalPkgAuthor{1}=<div class=\"PkgAuthors\">\1</div>" \
|
||||
"cgalPkgAuthors{1}=\cgalPkgAuthor{\1}" \
|
||||
"cgalPkgDesc{1}=<div class=\"PkgDescription\">\1</div>" \
|
||||
"cgalPkgSince{1}=<B>Introduced in:</B> \cgal \1<BR>" \
|
||||
"cgalPkgDependsOn{1}=<B>Depends on:</B> \1 <BR>" \
|
||||
"cgalPkgLicense{1}=<B>License:</B> \1 <BR>" \
|
||||
"cgalPkgDemo{2}=<B>Windows Demo:</B> <a href=\"https://www.cgal.org/demo/${CGAL_CREATED_VERSION_NUM}/\2\">\1</a><BR>" \
|
||||
"cgalPkgDemo{4}=<B>Windows Demos:</B> <a href=\"https://www.cgal.org/demo/${CGAL_CREATED_VERSION_NUM}/\2\">\1</a>, <a href=\"https://www.cgal.org/demo/${CGAL_CREATED_VERSION_NUM}/\4\">\3</a><BR>" \
|
||||
"cgalPkgDemo{6}=<B>Windows Demos:</B> <a href=\"https://www.cgal.org/demo/${CGAL_CREATED_VERSION_NUM}/\2\">\1</a>, <a href=\"https://www.cgal.org/demo/${CGAL_CREATED_VERSION_NUM}/\4\">\3</a>, <a href=\"https://www.cgal.org/demo/${CGAL_CREATED_VERSION_NUM}/\6\">\5</a><BR>" \
|
||||
"cgalPkgDescriptionEnd=" \
|
||||
"cgalModifBegin=\htmlonly <div class=\"CGALModification\"> \endhtmlonly \xrefitem Modification \"Modifications\" \"MODIFICATIONS\"" \
|
||||
"cgalModifEnd=\htmlonly </div> \endhtmlonly \latexonly END MODIFICATIONS \endlatexonly" \
|
||||
"cgalPkgBib{1}=<B>BibTeX:</B> <a href=\"../Manual/how_to_cite_cgal.html#\1-${CGAL_RELEASE_YEAR_ID}\">\1-${CGAL_RELEASE_YEAR_ID}</a><BR>" \
|
||||
"cgalFootnote{1}=<span class=\"footnote\">\1</span>" \
|
||||
"cgalFootnoteCode{1}=<tt style='display:inline'>\1</tt>" \
|
||||
"cgalAutoToc=\htmlonly[block] <div id=\"autotoc\" class=\"toc\"></div> \endhtmlonly" \
|
||||
"cgalTagTrue=\link CGAL::Tag_true `CGAL::Tag_true`\endlink" \
|
||||
"cgalTagFalse=\link CGAL::Tag_false `CGAL::Tag_false`\endlink" \
|
||||
"cgalHeading{1}= <B>\1</B><BR>" \
|
||||
"cgalClassifedRefPages=\htmlonly[block] <h2 class=\"groupheader\">Classified Reference Pages</h2> \endhtmlonly" \
|
||||
"cgalCRPSection{1}=<h2>\1</h2>" \
|
||||
"cgalCRPSubsection{1}=<h3>\1</h3>" \
|
||||
"cgalCite{1}=<!-- -->\cite \1" \
|
||||
"cgalPackageSection{2}=\htmlonly[block] <div style=\"background-color: #EEEDF2;\">\endhtmlonly \section \1 \2 ^^ \htmlonly[block] </div>\endhtmlonly" \
|
||||
"cgalNamedParamsBegin=<dl class=\"params\"><dt>Optional Named Parameters</dt><dd> <table class=\"params\">" \
|
||||
"cgalNamedParamsBegin{1}=<dl class=\"params\"><dt>\1</dt><dd> <table class=\"params\">" \
|
||||
"cgalNamedParamsEnd=</table> </dd> </dl>" \
|
||||
"cgalParamNBegin{1}=<tr><td class> \htmlonly[block] <button class=\"collapsible\">\endhtmlonly <b>\1</b> \htmlonly[block]</button> <div class=\"content\">\endhtmlonly<ul>" \
|
||||
"cgalParamDescription{1}=<li>\1</li>" \
|
||||
"cgalParamType{1}=<li><b>Type: </b>\1</li>" \
|
||||
"cgalParamDefault{1}=<li><b>%Default: </b>\1</li>" \
|
||||
"cgalParamExtra{1}=<li><b>Extra: </b>\1</li>" \
|
||||
"cgalParamNEnd=</ul> \htmlonly[block] </div> \endhtmlonly </td><td></td></tr>" \
|
||||
"cgalParamSectionBegin{1}=\cgalParamNBegin{\1}" \
|
||||
"cgalParamSectionEnd=\cgalParamNEnd" \
|
||||
"cgalParamPrecondition{1}=<li><b>Precondition: </b>\1</li>" \
|
||||
"cgalBigO{1}=\f$O(\1)\f$" \
|
||||
"cgalBigOLarge{1}=\f$O\left(\1\right)\f$" \
|
||||
"cgalInclude{1}=`#include<\1>`"
|
||||
|
||||
# Doxygen selects the parser to use depending on the extension of the files it
|
||||
# parses. With this tag you can assign which parser to use for a given
|
||||
# extension. Doxygen has a built-in mapping, but you can override or extend it
|
||||
# using this tag. The format is ext=language, where ext is a file extension, and
|
||||
# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
|
||||
# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice,
|
||||
# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
|
||||
# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
|
||||
# tries to guess whether the code is fixed or free formatted code, this is the
|
||||
# default for Fortran type files). For instance to make doxygen treat .inc files
|
||||
# as Fortran files (default is PHP), and .f files as C (default is Fortran),
|
||||
# use: inc=Fortran f=C.
|
||||
#
|
||||
# Note: For files without extension you can use no_extension as a placeholder.
|
||||
#
|
||||
# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
|
||||
# the files are not read by doxygen. When specifying no_extension you should add
|
||||
# * to the FILE_PATTERNS.
|
||||
#
|
||||
# Note see also the list of default file extension mappings.
|
||||
|
||||
EXTENSION_MAPPING = txt=C++
|
||||
|
||||
# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
|
||||
# to that level are automatically included in the table of contents, even if
|
||||
# they do not have an id attribute.
|
||||
# Note: This feature currently applies only to Markdown headings.
|
||||
# Minimum value: 0, maximum value: 99, default value: 5.
|
||||
# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
|
||||
|
||||
TOC_INCLUDE_HEADINGS = 0
|
||||
|
||||
# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
|
||||
# to include (a tag file for) the STL sources as input, then you should set this
|
||||
# tag to YES in order to let doxygen match functions declarations and
|
||||
# definitions whose arguments contain STL classes (e.g. func(std::string);
|
||||
# versus func(std::string) {}). This also make the inheritance and collaboration
|
||||
# diagrams that involve STL classes more complete and accurate.
|
||||
# The default value is: NO.
|
||||
|
||||
BUILTIN_STL_SUPPORT = YES
|
||||
|
||||
# For Microsoft's IDL there are propget and propput attributes to indicate
|
||||
# getter and setter methods for a property. Setting this option to YES will make
|
||||
# doxygen to replace the get and set methods by a property in the documentation.
|
||||
# This will only work if the methods are indeed getting or setting a simple
|
||||
# type. If this is not the case, or you want to show the methods anyway, you
|
||||
# should set this option to NO.
|
||||
# The default value is: YES.
|
||||
|
||||
IDL_PROPERTY_SUPPORT = NO
|
||||
|
||||
# Set the SUBGROUPING tag to YES to allow class member groups of the same type
|
||||
# (for instance a group of public functions) to be put as a subgroup of that
|
||||
# type (e.g. under the Public Functions section). Set it to NO to prevent
|
||||
# subgrouping. Alternatively, this can be done per class using the
|
||||
# \nosubgrouping command.
|
||||
# The default value is: YES.
|
||||
|
||||
SUBGROUPING = NO
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Build related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
|
||||
# documentation are documented, even if no documentation was available. Private
|
||||
# class members and static file members will be hidden unless the
|
||||
# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
|
||||
# Note: This will also disable the warnings about undocumented members that are
|
||||
# normally produced when WARNINGS is set to YES.
|
||||
# The default value is: NO.
|
||||
|
||||
EXTRACT_ALL = YES
|
||||
|
||||
# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
|
||||
# included in the documentation.
|
||||
# The default value is: NO.
|
||||
|
||||
EXTRACT_STATIC = YES
|
||||
|
||||
# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
|
||||
# grouped member an include statement to the documentation, telling the reader
|
||||
# which file to include in order to use the member.
|
||||
# The default value is: NO.
|
||||
|
||||
SHOW_GROUPED_MEMB_INC = YES
|
||||
|
||||
# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
|
||||
# documentation for inline members.
|
||||
# The default value is: YES.
|
||||
|
||||
INLINE_INFO = NO
|
||||
|
||||
# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
|
||||
# fully-qualified names, including namespaces. If set to NO, the class list will
|
||||
# be sorted only by class name, not including the namespace part.
|
||||
# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
|
||||
# Note: This option applies only to the class list, not to the alphabetical
|
||||
# list.
|
||||
# The default value is: NO.
|
||||
|
||||
SORT_BY_SCOPE_NAME = YES
|
||||
|
||||
# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
|
||||
# the bottom of the documentation of classes and structs. If set to YES, the
|
||||
# list will mention the files that were used to generate the documentation.
|
||||
# The default value is: YES.
|
||||
|
||||
SHOW_USED_FILES = NO
|
||||
|
||||
# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
|
||||
# will remove the Files entry from the Quick Index and from the Folder Tree View
|
||||
# (if specified).
|
||||
# The default value is: YES.
|
||||
|
||||
SHOW_FILES = NO
|
||||
|
||||
# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
|
||||
# by doxygen. The layout file controls the global structure of the generated
|
||||
# output files in an output format independent way. To create the layout file
|
||||
# that represents doxygen's defaults, run doxygen with the -l option. You can
|
||||
# optionally specify a file name after the option, if omitted DoxygenLayout.xml
|
||||
# will be used as the name of the layout file. See also section "Changing the
|
||||
# layout of pages" for information.
|
||||
#
|
||||
# Note that if you run doxygen from a directory containing a file called
|
||||
# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
|
||||
# tag is left empty.
|
||||
|
||||
LAYOUT_FILE = ${CGAL_DOC_RESOURCE_DIR}/DoxygenLayoutPackage.xml
|
||||
|
||||
# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
|
||||
# the reference definitions. This must be a list of .bib files. The .bib
|
||||
# extension is automatically appended if omitted. This requires the bibtex tool
|
||||
# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
|
||||
# For LaTeX the style of the bibliography can be controlled using
|
||||
# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
|
||||
# search path. See also \cite for info how to create references.
|
||||
|
||||
CITE_BIB_FILES = ${CGAL_DOC_BIBLIO_DIR}/cgal_manual.bib \
|
||||
${CGAL_DOC_BIBLIO_DIR}/geom.bib
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to warning and progress messages
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# The QUIET tag can be used to turn on/off the messages that are generated to
|
||||
# standard output by doxygen. If QUIET is set to YES this implies that the
|
||||
# messages are off.
|
||||
# The default value is: NO.
|
||||
|
||||
QUIET = YES
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the input files
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the value of the INPUT tag contains directories, you can use the
|
||||
# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
|
||||
# *.h) to filter out the source-files in the directories.
|
||||
#
|
||||
# Note that for custom extensions or not directly supported extensions you also
|
||||
# need to set EXTENSION_MAPPING for the extension otherwise the files are not
|
||||
# read by doxygen.
|
||||
#
|
||||
# Note the list of default checked file patterns might differ from the list of
|
||||
# default file extension mappings.
|
||||
#
|
||||
# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
|
||||
# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
|
||||
# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml,
|
||||
# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C
|
||||
# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd,
|
||||
# *.vhdl, *.ucf, *.qsf and *.ice.
|
||||
|
||||
FILE_PATTERNS = *.cpp \
|
||||
*.txt \
|
||||
*.md \
|
||||
*.h \
|
||||
*.hpp
|
||||
|
||||
# The RECURSIVE tag can be used to specify whether or not subdirectories should
|
||||
# be searched for input files as well.
|
||||
# The default value is: NO.
|
||||
|
||||
RECURSIVE = YES
|
||||
|
||||
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
|
||||
# (namespaces, classes, functions, etc.) that should be excluded from the
|
||||
# output. The symbol name can be a fully qualified name, a word, or if the
|
||||
# wildcard * is used, a substring. Examples: ANamespace, AClass,
|
||||
# ANamespace::AClass, ANamespace::*Test
|
||||
|
||||
EXCLUDE_SYMBOLS = Tr \
|
||||
Vb \
|
||||
Cb \
|
||||
Fb \
|
||||
K \
|
||||
Traits \
|
||||
internal
|
||||
|
||||
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
|
||||
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
|
||||
# *.h) to filter out the source-files in the directories. If left blank all
|
||||
# files are included.
|
||||
|
||||
EXAMPLE_PATTERNS = *.cpp \
|
||||
*.h
|
||||
|
||||
# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
|
||||
# searched for input files to be used with the \include or \dontinclude commands
|
||||
# irrespective of the value of the RECURSIVE tag.
|
||||
# The default value is: NO.
|
||||
|
||||
EXAMPLE_RECURSIVE = YES
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to source browsing
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
|
||||
# verbatim copy of the header file for each class for which an include is
|
||||
# specified. Set to NO to disable this.
|
||||
# See also: Section \class.
|
||||
# The default value is: YES.
|
||||
|
||||
VERBATIM_HEADERS = NO
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the alphabetical class index
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
|
||||
# compounds will be generated. Enable this if the project contains a lot of
|
||||
# classes, structs, unions or interfaces.
|
||||
# The default value is: YES.
|
||||
|
||||
ALPHABETICAL_INDEX = NO
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the HTML output
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
#
|
||||
# To get valid HTML the header file that includes any scripts and style sheets
|
||||
# that doxygen needs, which is dependent on the configuration options used (e.g.
|
||||
# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
|
||||
# default header using
|
||||
# doxygen -w html new_header.html new_footer.html new_stylesheet.css
|
||||
# YourConfigFile
|
||||
# and then modify the file new_header.html. See also section "Doxygen usage"
|
||||
# for information on how to generate the default header that doxygen normally
|
||||
# uses.
|
||||
# Note: The header is subject to change so you typically have to regenerate the
|
||||
# default header when upgrading to a newer version of doxygen. For a description
|
||||
# of the possible markers and block names see the documentation.
|
||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||
|
||||
HTML_HEADER = ${CGAL_DOC_HEADER_PACKAGE}
|
||||
|
||||
# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
|
||||
# generated HTML page. If the tag is left blank doxygen will generate a standard
|
||||
# footer. See HTML_HEADER for more information on how to generate a default
|
||||
# footer and what special commands can be used inside the footer. See also
|
||||
# section "Doxygen usage" for information on how to generate the default footer
|
||||
# that doxygen normally uses.
|
||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||
|
||||
HTML_FOOTER = ${CGAL_DOC_RESOURCE_DIR}/footer.html
|
||||
|
||||
# Doxygen stores a couple of settings persistently in the browser (via e.g.
|
||||
# cookies). By default these settings apply to all HTML pages generated by
|
||||
# doxygen across all projects. The HTML_PROJECT_COOKIE tag can be used to store
|
||||
# the settings under a project specific key, such that the user preferences will
|
||||
# be stored separately.
|
||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||
|
||||
HTML_PROJECT_COOKIE = CGAL
|
||||
|
||||
# If you want full control over the layout of the generated HTML pages it might
|
||||
# be necessary to disable the index and replace it with your own. The
|
||||
# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
|
||||
# of each HTML page. A value of NO enables the index and the value YES disables
|
||||
# it. Since the tabs in the index contain the same information as the navigation
|
||||
# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
|
||||
# The default value is: NO.
|
||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||
|
||||
DISABLE_INDEX = YES
|
||||
|
||||
# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
|
||||
# structure should be generated to display hierarchical information. If the tag
|
||||
# value is set to YES, a side panel will be generated containing a tree-like
|
||||
# index structure (just like the one that is generated for HTML Help). For this
|
||||
# to work a browser that supports JavaScript, DHTML, CSS and frames is required
|
||||
# (i.e. any modern browser). Windows users are probably better off using the
|
||||
# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
|
||||
# further fine tune the look of the index (see "Fine-tuning the output"). As an
|
||||
# example, the default style sheet generated by doxygen has an example that
|
||||
# shows how to put an image at the root of the tree instead of the PROJECT_NAME.
|
||||
# Since the tree basically has the same information as the tab index, you could
|
||||
# consider setting DISABLE_INDEX to YES when enabling this option.
|
||||
# The default value is: NO.
|
||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||
|
||||
GENERATE_TREEVIEW = YES
|
||||
|
||||
# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg
|
||||
# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
|
||||
# https://inkscape.org) to generate formulas as SVG images instead of PNGs for
|
||||
# the HTML output. These images will generally look nicer at scaled resolutions.
|
||||
# Possible values are: png (the default) and svg (looks nicer but requires the
|
||||
# pdf2svg or inkscape tool).
|
||||
# The default value is: png.
|
||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||
|
||||
HTML_FORMULA_FORMAT = svg
|
||||
|
||||
# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
|
||||
# https://www.mathjax.org) which uses client side JavaScript for the rendering
|
||||
# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
|
||||
# installed or if you want to formulas look prettier in the HTML output. When
|
||||
# enabled you may also need to install MathJax separately and configure the path
|
||||
# to it using the MATHJAX_RELPATH option.
|
||||
# The default value is: NO.
|
||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||
|
||||
USE_MATHJAX = YES
|
||||
|
||||
# When MathJax is enabled you need to specify the location relative to the HTML
|
||||
# output directory using the MATHJAX_RELPATH option. The destination directory
|
||||
# should contain the MathJax.js script. For instance, if the mathjax directory
|
||||
# is located at the same level as the HTML output directory, then
|
||||
# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
|
||||
# Content Delivery Network so you can quickly see the result without installing
|
||||
# MathJax. However, it is strongly recommended to install a local copy of
|
||||
# MathJax from https://www.mathjax.org before deployment. The default value is:
|
||||
# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2
|
||||
# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3
|
||||
# This tag requires that the tag USE_MATHJAX is set to YES.
|
||||
|
||||
${CGAL_DOC_MATHJAX_LOCATION_FULL_OPTION_LINE}
|
||||
|
||||
# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
|
||||
# extension names that should be enabled during MathJax rendering. For example
|
||||
# for MathJax version 2 (see
|
||||
# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions):
|
||||
# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
|
||||
# For example for MathJax version 3 (see
|
||||
# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html):
|
||||
# MATHJAX_EXTENSIONS = ams
|
||||
# This tag requires that the tag USE_MATHJAX is set to YES.
|
||||
|
||||
MATHJAX_EXTENSIONS = TeX/AMSmath \
|
||||
TeX/AMSsymbols
|
||||
|
||||
# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
|
||||
# of code that will be used on startup of the MathJax code. See the MathJax site
|
||||
# (see:
|
||||
# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an
|
||||
# example see the documentation.
|
||||
# This tag requires that the tag USE_MATHJAX is set to YES.
|
||||
|
||||
MATHJAX_CODEFILE = ${CGAL_DOC_RESOURCE_DIR}/CGAL_mathjax.js
|
||||
|
||||
# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
|
||||
# the HTML output. The underlying search engine uses javascript and DHTML and
|
||||
# should work on any modern browser. Note that when using HTML help
|
||||
# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
|
||||
# there is already a search function so this one should typically be disabled.
|
||||
# For large projects the javascript based search engine can be slow, then
|
||||
# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
|
||||
# search using the keyboard; to jump to the search box use <access key> + S
|
||||
# (what the <access key> is depends on the OS and browser, but it is typically
|
||||
# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
|
||||
# key> to jump into the search results window, the results can be navigated
|
||||
# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
|
||||
# the search. The filter options can be selected when the cursor is inside the
|
||||
# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
|
||||
# to select a filter and <Enter> or <escape> to activate or cancel the filter
|
||||
# option.
|
||||
# The default value is: YES.
|
||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||
|
||||
SEARCHENGINE = NO
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the LaTeX output
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
|
||||
# The default value is: YES.
|
||||
|
||||
GENERATE_LATEX = NO
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the RTF output
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the man page output
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the XML output
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
|
||||
# listings (including syntax highlighting and cross-referencing information) to
|
||||
# the XML output. Note that enabling this will significantly increase the size
|
||||
# of the XML output.
|
||||
# The default value is: YES.
|
||||
# This tag requires that the tag GENERATE_XML is set to YES.
|
||||
|
||||
XML_PROGRAMLISTING = NO
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the preprocessor
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
|
||||
# in the source code. If set to NO, only conditional compilation will be
|
||||
# performed. Macro expansion can be done in a controlled way by setting
|
||||
# EXPAND_ONLY_PREDEF to YES.
|
||||
# The default value is: NO.
|
||||
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
|
||||
|
||||
MACRO_EXPANSION = YES
|
||||
|
||||
# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
|
||||
# the macro expansion is limited to the macros specified with the PREDEFINED and
|
||||
# EXPAND_AS_DEFINED tags.
|
||||
# The default value is: NO.
|
||||
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
|
||||
|
||||
EXPAND_ONLY_PREDEF = YES
|
||||
|
||||
# The PREDEFINED tag can be used to specify one or more macro names that are
|
||||
# defined before the preprocessor is started (similar to the -D option of e.g.
|
||||
# gcc). The argument of the tag is a list of macros of the form: name or
|
||||
# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
|
||||
# is assumed. To prevent a macro definition from being undefined via #undef or
|
||||
# recursively expanded use the := operator instead of the = operator.
|
||||
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
|
||||
|
||||
PREDEFINED = DOXYGEN_RUNNING \
|
||||
"CGAL_NP_TEMPLATE_PARAMETERS=NamedParameters = CGAL::parameters::Default_named_parameters" \
|
||||
"CGAL_NP_CLASS=NamedParameters" \
|
||||
"CGAL_NP_TEMPLATE_PARAMETERS_1=NamedParameters1 = CGAL::parameters::Default_named_parameter" \
|
||||
"CGAL_NP_CLASS_1=NamedParameters1" \
|
||||
"CGAL_NP_TEMPLATE_PARAMETERS_2=NamedParameters2 = CGAL::parameters::Default_named_parameter" \
|
||||
"CGAL_NP_CLASS_2=NamedParameters2" \
|
||||
CGAL_DEPRECATED \
|
||||
CGAL_DEPRECATED_MSG(name)=
|
||||
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to external references
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
|
||||
# in the modules index. If set to NO, only the current project's groups will be
|
||||
# listed.
|
||||
# The default value is: YES.
|
||||
|
||||
EXTERNAL_GROUPS = NO
|
||||
|
||||
# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
|
||||
# the related pages index. If set to NO, only the current project's pages will
|
||||
# be listed.
|
||||
# The default value is: YES.
|
||||
|
||||
EXTERNAL_PAGES = NO
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to diagram generator tools
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
|
||||
# available from the path. This tool is part of Graphviz (see:
|
||||
# https://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
|
||||
# Bell Labs. The other options in this section have no effect if this option is
|
||||
# set to NO
|
||||
# The default value is: NO.
|
||||
|
||||
HAVE_DOT = YES
|
||||
|
||||
# If the CLASS_GRAPH tag is set to YES or GRAPH or BUILTIN then doxygen will
|
||||
# generate a graph for each documented class showing the direct and indirect
|
||||
# inheritance relations. In case the CLASS_GRAPH tag is set to YES or GRAPH and
|
||||
# HAVE_DOT is enabled as well, then dot will be used to draw the graph. In case
|
||||
# the CLASS_GRAPH tag is set to YES and HAVE_DOT is disabled or if the
|
||||
# CLASS_GRAPH tag is set to BUILTIN, then the built-in generator will be used.
|
||||
# If the CLASS_GRAPH tag is set to TEXT the direct and indirect inheritance
|
||||
# relations will be shown as texts / links.
|
||||
# Possible values are: NO, YES, TEXT, GRAPH and BUILTIN.
|
||||
# The default value is: YES.
|
||||
|
||||
CLASS_GRAPH = TEXT
|
||||
|
||||
# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
|
||||
# graph for each documented class showing the direct and indirect implementation
|
||||
# dependencies (inheritance, containment, and class references variables) of the
|
||||
# class with other documented classes.
|
||||
# The default value is: YES.
|
||||
# This tag requires that the tag HAVE_DOT is set to YES.
|
||||
|
||||
COLLABORATION_GRAPH = NO
|
||||
|
||||
# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
|
||||
# groups, showing the direct groups dependencies. See also the chapter Grouping
|
||||
# in the manual.
|
||||
# The default value is: YES.
|
||||
# This tag requires that the tag HAVE_DOT is set to YES.
|
||||
|
||||
GROUP_GRAPHS = NO
|
||||
|
||||
# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
|
||||
# collaboration graphs will show the relations between templates and their
|
||||
# instances.
|
||||
# The default value is: NO.
|
||||
# This tag requires that the tag HAVE_DOT is set to YES.
|
||||
|
||||
TEMPLATE_RELATIONS = YES
|
||||
|
||||
# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
|
||||
# YES then doxygen will generate a graph for each documented file showing the
|
||||
# direct and indirect include dependencies of the file with other documented
|
||||
# files.
|
||||
# The default value is: YES.
|
||||
# This tag requires that the tag HAVE_DOT is set to YES.
|
||||
|
||||
INCLUDE_GRAPH = NO
|
||||
|
||||
# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
|
||||
# set to YES then doxygen will generate a graph for each documented file showing
|
||||
# the direct and indirect include dependencies of the file with other documented
|
||||
# files.
|
||||
# The default value is: YES.
|
||||
# This tag requires that the tag HAVE_DOT is set to YES.
|
||||
|
||||
INCLUDED_BY_GRAPH = NO
|
||||
|
||||
# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
|
||||
# hierarchy of all classes instead of a textual one.
|
||||
# The default value is: YES.
|
||||
# This tag requires that the tag HAVE_DOT is set to YES.
|
||||
|
||||
GRAPHICAL_HIERARCHY = NO
|
||||
|
||||
# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
|
||||
# dependencies a directory has on other directories in a graphical way. The
|
||||
# dependency relations are determined by the #include relations between the
|
||||
# files in the directories.
|
||||
# The default value is: YES.
|
||||
# This tag requires that the tag HAVE_DOT is set to YES.
|
||||
|
||||
DIRECTORY_GRAPH = NO
|
||||
|
||||
# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
|
||||
# generated by dot. For an explanation of the image formats see the section
|
||||
# output formats in the documentation of the dot tool (Graphviz (see:
|
||||
# https://www.graphviz.org/)).
|
||||
# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
|
||||
# to make the SVG files visible in IE 9+ (other browsers do not have this
|
||||
# requirement).
|
||||
# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
|
||||
# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
|
||||
# png:gdiplus:gdiplus.
|
||||
# The default value is: png.
|
||||
# This tag requires that the tag HAVE_DOT is set to YES.
|
||||
|
||||
DOT_IMAGE_FORMAT = svg
|
||||
|
||||
# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
|
||||
# enable generation of interactive SVG images that allow zooming and panning.
|
||||
#
|
||||
# Note that this requires a modern browser other than Internet Explorer. Tested
|
||||
# and working are Firefox, Chrome, Safari, and Opera.
|
||||
# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
|
||||
# the SVG files visible. Older versions of IE do not have SVG support.
|
||||
# The default value is: NO.
|
||||
# This tag requires that the tag HAVE_DOT is set to YES.
|
||||
|
||||
INTERACTIVE_SVG = YES
|
||||
|
||||
# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
|
||||
# explaining the meaning of the various boxes and arrows in the dot generated
|
||||
# graphs.
|
||||
# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal
|
||||
# graphical representation for inheritance and collaboration diagrams is used.
|
||||
# The default value is: YES.
|
||||
# This tag requires that the tag HAVE_DOT is set to YES.
|
||||
|
||||
GENERATE_LEGEND = NO
|
||||
|
||||
# Flag available on in https://github.com/CGAL/doxygen/tree/release_1_9_6_patched
|
||||
# When the EXTRACT_ALL tag is set to YES and a member or class has no
|
||||
# documentation, no detailed section will be produced if the
|
||||
# NO_ADDITIONAL_DETAILS tag is set to YES. This tag has no effect if
|
||||
# the EXTRACT_ALL tag is set to NO.
|
||||
# The default value is: NO.
|
||||
${CGAL_OPT_NO_ADDITIONAL_DETAILS}
|
||||
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
//<![CDATA[
|
||||
MathJax.Hub.Config(
|
||||
{
|
||||
TeX: {
|
||||
Macros: {
|
||||
qprel: [ "{\\gtreqless}", 0],
|
||||
qpx: [ "{\\mathbf{x}}", 0],
|
||||
qpl: [ "{\\mathbf{l}}", 0],
|
||||
qpu: [ "{\\mathbf{u}}", 0],
|
||||
qpc: [ "{\\mathbf{c}}", 0],
|
||||
qpb: [ "{\\mathbf{b}}", 0],
|
||||
qpy: [ "{\\mathbf{y}}", 0],
|
||||
qpw: [ "{\\mathbf{w}}", 0],
|
||||
qplambda: [ "{\\mathbf{\\lambda}}", 0],
|
||||
ssWpoint: [ "{\\bf #1}", 1],
|
||||
ssWeight: [ "{w_{#1}}", 1],
|
||||
dabs: [ "{\\parallel\\! #1 \\!\\parallel}", 1],
|
||||
E: [ "{\\mathrm{E}}", 0],
|
||||
A: [ "{\\mathrm{A}}", 0],
|
||||
R: [ "{\\mathrm{R}}", 0],
|
||||
N: [ "{\\mathrm{N}}", 0],
|
||||
Q: [ "{\\mathrm{Q}}", 0],
|
||||
Z: [ "{\\mathrm{Z}}", 0],
|
||||
ccSum: [ "{\\sum_{#1}^{#2}{#3}}", 3],
|
||||
ccProd: [ "{\\prod_{#1}^{#2}{#3}}", 3],
|
||||
pyr: [ "{\\operatorname{Pyr}}", 0],
|
||||
aff: [ "{\\operatorname{aff}}", 0],
|
||||
Ac: [ "{\\cal A}", 0],
|
||||
Sc: [ "{\\cal S}", 0],
|
||||
},
|
||||
equationNumbers: { autoNumber: "AMS" }
|
||||
}
|
||||
}
|
||||
);
|
||||
//]]>
|
||||
|
|
@ -0,0 +1,177 @@
|
|||
<doxygenlayout version="1.0">
|
||||
<!-- Navigation index tabs for HTML output -->
|
||||
<navindex>
|
||||
<tab type="mainpage" visible="yes" title=""/>
|
||||
<tab type="topics" visible="yes" title="" intro=""/>
|
||||
<tab type="pages" visible="yes" title="" intro=""/>
|
||||
<tab type="classlist" visible="no" title="Class and Concept List" intro="Here is the list of all concepts and classes of the CGAL Library. Classes are inside the namespace CGAL. Concepts are in the global namespace."/>
|
||||
<tab type="examples" visible="no" title="" intro=""/>
|
||||
<!-- <tab type="user" url="@ref how_to_cite_cgal" title="Acknowledging CGAL"/> -->
|
||||
</navindex>
|
||||
|
||||
<!-- Layout definition for a class page -->
|
||||
<class>
|
||||
<briefdescription visible="no"/>
|
||||
<detaileddescription title=" "/>
|
||||
<includes visible="$SHOW_INCLUDE_FILES"/>
|
||||
<inheritancegraph visible="$CLASS_GRAPH"/>
|
||||
<collaborationgraph visible="$COLLABORATION_GRAPH"/>
|
||||
<allmemberslink visible="yes"/>
|
||||
<memberdecl>
|
||||
<nestedclasses visible="yes" title=""/>
|
||||
<publictypes title=""/>
|
||||
<publicslots title=""/>
|
||||
<signals title=""/>
|
||||
<publicmethods title=""/>
|
||||
<publicstaticmethods title=""/>
|
||||
<publicattributes title=""/>
|
||||
<publicstaticattributes title=""/>
|
||||
<protectedtypes title=""/>
|
||||
<protectedslots title=""/>
|
||||
<protectedmethods title=""/>
|
||||
<protectedstaticmethods title=""/>
|
||||
<protectedattributes title=""/>
|
||||
<protectedstaticattributes title=""/>
|
||||
<packagetypes title=""/>
|
||||
<packagemethods title=""/>
|
||||
<packagestaticmethods title=""/>
|
||||
<packageattributes title=""/>
|
||||
<packagestaticattributes title=""/>
|
||||
<properties title=""/>
|
||||
<events title=""/>
|
||||
<privatetypes title=""/>
|
||||
<privateslots title=""/>
|
||||
<privatemethods title=""/>
|
||||
<privatestaticmethods title=""/>
|
||||
<privateattributes title=""/>
|
||||
<privatestaticattributes title=""/>
|
||||
<friends title=""/>
|
||||
<related title="" subtitle=""/>
|
||||
<membergroups visible="yes"/>
|
||||
</memberdecl>
|
||||
|
||||
<memberdef>
|
||||
<inlineclasses title=""/>
|
||||
<typedefs title=""/>
|
||||
<enums title=""/>
|
||||
<constructors title=""/>
|
||||
<functions title=""/>
|
||||
<related title=""/>
|
||||
<variables title=""/>
|
||||
<properties title=""/>
|
||||
<events title=""/>
|
||||
</memberdef>
|
||||
<usedfiles visible="$SHOW_USED_FILES"/>
|
||||
<authorsection visible="yes"/>
|
||||
</class>
|
||||
|
||||
<!-- Layout definition for a namespace page -->
|
||||
<namespace>
|
||||
<briefdescription visible="yes"/>
|
||||
<memberdecl>
|
||||
<nestednamespaces visible="yes" title=""/>
|
||||
<classes visible="yes" title=""/>
|
||||
<typedefs title=""/>
|
||||
<enums title=""/>
|
||||
<functions title=""/>
|
||||
<variables title=""/>
|
||||
<membergroups visible="yes"/>
|
||||
</memberdecl>
|
||||
<detaileddescription title=""/>
|
||||
<memberdef>
|
||||
<inlineclasses title=""/>
|
||||
<typedefs title=""/>
|
||||
<enums title=""/>
|
||||
<functions title=""/>
|
||||
<variables title=""/>
|
||||
</memberdef>
|
||||
<authorsection visible="yes"/>
|
||||
</namespace>
|
||||
|
||||
<!-- Layout definition for a file page -->
|
||||
<file>
|
||||
<briefdescription visible="yes"/>
|
||||
<includes visible="$SHOW_INCLUDE_FILES"/>
|
||||
<includegraph visible="$INCLUDE_GRAPH"/>
|
||||
<includedbygraph visible="$INCLUDED_BY_GRAPH"/>
|
||||
<sourcelink visible="yes"/>
|
||||
<memberdecl>
|
||||
<classes visible="yes" title=""/>
|
||||
<namespaces visible="yes" title=""/>
|
||||
<defines title=""/>
|
||||
<typedefs title=""/>
|
||||
<enums title=""/>
|
||||
<functions title=""/>
|
||||
<variables title=""/>
|
||||
<membergroups visible="yes"/>
|
||||
</memberdecl>
|
||||
<detaileddescription title=""/>
|
||||
<memberdef>
|
||||
<inlineclasses title=""/>
|
||||
<defines title=""/>
|
||||
<typedefs title=""/>
|
||||
<enums title=""/>
|
||||
<functions title=""/>
|
||||
<variables title=""/>
|
||||
</memberdef>
|
||||
<authorsection/>
|
||||
</file>
|
||||
|
||||
<!-- Layout definition for a group page -->
|
||||
<group>
|
||||
<detaileddescription title=" "/>
|
||||
<authorsection visible="yes"/>
|
||||
<groupgraph visible="$GROUP_GRAPHS"/>
|
||||
<memberdef>
|
||||
<pagedocs/>
|
||||
</memberdef>
|
||||
<memberdecl>
|
||||
<nestedgroups visible="yes" title=""/>
|
||||
<dirs visible="yes" title=""/>
|
||||
<files visible="yes" title=""/>
|
||||
<namespaces visible="yes" title=""/>
|
||||
<classes visible="yes" title=""/>
|
||||
<defines title=""/>
|
||||
<typedefs title=""/>
|
||||
<enums title=""/>
|
||||
<enumvalues title=""/>
|
||||
<functions title=""/>
|
||||
<variables title=""/>
|
||||
<signals title=""/>
|
||||
<publicslots title=""/>
|
||||
<protectedslots title=""/>
|
||||
<privateslots title=""/>
|
||||
<events title=""/>
|
||||
<properties title=""/>
|
||||
<friends title=""/>
|
||||
<membergroups visible="yes"/>
|
||||
</memberdecl>
|
||||
<memberdef>
|
||||
<inlineclasses title=""/>
|
||||
<defines title=""/>
|
||||
<typedefs title=""/>
|
||||
<enums title=""/>
|
||||
<enumvalues title=""/>
|
||||
<functions title=""/>
|
||||
<variables title=""/>
|
||||
<signals title=""/>
|
||||
<publicslots title=""/>
|
||||
<protectedslots title=""/>
|
||||
<privateslots title=""/>
|
||||
<events title=""/>
|
||||
<properties title=""/>
|
||||
<friends title=""/>
|
||||
</memberdef>
|
||||
</group>
|
||||
|
||||
<!-- Layout definition for a directory page -->
|
||||
<directory>
|
||||
<briefdescription visible="yes"/>
|
||||
<directorygraph visible="yes"/>
|
||||
<memberdecl>
|
||||
<dirs visible="yes"/>
|
||||
<files visible="yes"/>
|
||||
</memberdecl>
|
||||
<detaileddescription title=""/>
|
||||
</directory>
|
||||
</doxygenlayout>
|
||||
|
|
@ -0,0 +1,178 @@
|
|||
<doxygenlayout version="1.0">
|
||||
<!-- Navigation index tabs for HTML output -->
|
||||
<navindex>
|
||||
<tab type="mainpage" visible="yes" title=""/>
|
||||
<tab type="topics" visible="yes" title="Reference Manual" intro=""/>
|
||||
<tab type="pages" visible="yes" title="Pages" intro=""/>
|
||||
<tab type="classlist" visible="yes" title="Class and Concept List" intro="Here is the list of all concepts and classes of this package. Classes are inside the namespace CGAL. Concepts are in the global namespace."/>
|
||||
<tab type="filelist" visible="yes" title="" intro=""/>
|
||||
<tab type="examples" visible="yes" title="" intro=""/>
|
||||
</navindex>
|
||||
|
||||
<!-- Layout definition for a class page -->
|
||||
<class>
|
||||
<briefdescription visible="no"/>
|
||||
<includes visible="$SHOW_INCLUDE_FILES"/>
|
||||
<inheritancegraph visible="$CLASS_GRAPH"/>
|
||||
<detaileddescription title="Definition"/>
|
||||
<collaborationgraph visible="$COLLABORATION_GRAPH"/>
|
||||
<allmemberslink visible="yes"/>
|
||||
<memberdecl>
|
||||
<nestedclasses visible="yes" title=""/>
|
||||
<!-- Disable the naming of the public types group -->
|
||||
<publictypes title=""/>
|
||||
<publicslots title=""/>
|
||||
<signals title=""/>
|
||||
<publicmethods title=""/>
|
||||
<publicstaticmethods title=""/>
|
||||
<publicattributes title=""/>
|
||||
<publicstaticattributes title=""/>
|
||||
<protectedtypes title=""/>
|
||||
<protectedslots title=""/>
|
||||
<protectedmethods title=""/>
|
||||
<protectedstaticmethods title=""/>
|
||||
<protectedattributes title=""/>
|
||||
<protectedstaticattributes title=""/>
|
||||
<packagetypes title=""/>
|
||||
<packagemethods title=""/>
|
||||
<packagestaticmethods title=""/>
|
||||
<packageattributes title=""/>
|
||||
<packagestaticattributes title=""/>
|
||||
<properties title=""/>
|
||||
<events title=""/>
|
||||
<privatetypes title=""/>
|
||||
<privateslots title=""/>
|
||||
<privatemethods title=""/>
|
||||
<privatestaticmethods title=""/>
|
||||
<privateattributes title=""/>
|
||||
<privatestaticattributes title=""/>
|
||||
<friends title=""/>
|
||||
<related title="" subtitle=""/>
|
||||
<membergroups visible="yes"/>
|
||||
</memberdecl>
|
||||
|
||||
<memberdef>
|
||||
<inlineclasses title=""/>
|
||||
<typedefs title=""/>
|
||||
<enums title=""/>
|
||||
<constructors title=""/>
|
||||
<functions title=""/>
|
||||
<related title=""/>
|
||||
<variables title=""/>
|
||||
<properties title=""/>
|
||||
<events title=""/>
|
||||
</memberdef>
|
||||
<usedfiles visible="$SHOW_USED_FILES"/>
|
||||
<authorsection visible="yes"/>
|
||||
</class>
|
||||
|
||||
<!-- Layout definition for a namespace page -->
|
||||
<namespace>
|
||||
<briefdescription visible="yes"/>
|
||||
<memberdecl>
|
||||
<nestednamespaces visible="yes" title=""/>
|
||||
<classes visible="yes" title=""/>
|
||||
<typedefs title=""/>
|
||||
<enums title=""/>
|
||||
<functions title=""/>
|
||||
<variables title=""/>
|
||||
<membergroups visible="yes"/>
|
||||
</memberdecl>
|
||||
<detaileddescription title="Definition"/>
|
||||
<memberdef>
|
||||
<inlineclasses title=""/>
|
||||
<typedefs title=""/>
|
||||
<enums title=""/>
|
||||
<functions title=""/>
|
||||
<variables title=""/>
|
||||
</memberdef>
|
||||
<authorsection visible="yes"/>
|
||||
</namespace>
|
||||
|
||||
<!-- Layout definition for a file page -->
|
||||
<file>
|
||||
<briefdescription visible="yes"/>
|
||||
<includes visible="$SHOW_INCLUDE_FILES"/>
|
||||
<includegraph visible="$INCLUDE_GRAPH"/>
|
||||
<includedbygraph visible="$INCLUDED_BY_GRAPH"/>
|
||||
<sourcelink visible="yes"/>
|
||||
<memberdecl>
|
||||
<classes visible="yes" title=""/>
|
||||
<namespaces visible="yes" title=""/>
|
||||
<defines title=""/>
|
||||
<typedefs title=""/>
|
||||
<enums title=""/>
|
||||
<functions title=""/>
|
||||
<variables title=""/>
|
||||
<membergroups visible="yes"/>
|
||||
</memberdecl>
|
||||
<detaileddescription title=""/>
|
||||
<memberdef>
|
||||
<inlineclasses title=""/>
|
||||
<defines title=""/>
|
||||
<typedefs title=""/>
|
||||
<enums title=""/>
|
||||
<functions title=""/>
|
||||
<variables title=""/>
|
||||
</memberdef>
|
||||
<authorsection/>
|
||||
</file>
|
||||
|
||||
<!-- Layout definition for a group page -->
|
||||
<group>
|
||||
<detaileddescription title=" "/>
|
||||
<authorsection visible="yes"/>
|
||||
<groupgraph visible="$GROUP_GRAPHS"/>
|
||||
<memberdef>
|
||||
<pagedocs/>
|
||||
</memberdef>
|
||||
<memberdecl>
|
||||
<nestedgroups visible="yes" title=""/>
|
||||
<dirs visible="yes" title=""/>
|
||||
<files visible="yes" title=""/>
|
||||
<namespaces visible="yes" title=""/>
|
||||
<classes visible="yes" title=""/>
|
||||
<defines title=""/>
|
||||
<typedefs title=""/>
|
||||
<enums title=""/>
|
||||
<enumvalues title=""/>
|
||||
<functions title=""/>
|
||||
<variables title=""/>
|
||||
<signals title=""/>
|
||||
<publicslots title=""/>
|
||||
<protectedslots title=""/>
|
||||
<privateslots title=""/>
|
||||
<events title=""/>
|
||||
<properties title=""/>
|
||||
<friends title=""/>
|
||||
<membergroups visible="yes"/>
|
||||
</memberdecl>
|
||||
<memberdef>
|
||||
<inlineclasses title=""/>
|
||||
<defines title=""/>
|
||||
<typedefs title=""/>
|
||||
<enums title=""/>
|
||||
<enumvalues title=""/>
|
||||
<functions title=""/>
|
||||
<variables title=""/>
|
||||
<signals title=""/>
|
||||
<publicslots title=""/>
|
||||
<protectedslots title=""/>
|
||||
<privateslots title=""/>
|
||||
<events title=""/>
|
||||
<properties title=""/>
|
||||
<friends title=""/>
|
||||
</memberdef>
|
||||
</group>
|
||||
|
||||
<!-- Layout definition for a directory page -->
|
||||
<directory>
|
||||
<briefdescription visible="yes"/>
|
||||
<directorygraph visible="yes"/>
|
||||
<memberdecl>
|
||||
<dirs visible="yes"/>
|
||||
<files visible="yes"/>
|
||||
</memberdecl>
|
||||
<detaileddescription title=""/>
|
||||
</directory>
|
||||
</doxygenlayout>
|
||||
|
|
@ -0,0 +1,386 @@
|
|||
body, table, div, p, dl {
|
||||
font: Lucida Grande,sans-serif;
|
||||
}
|
||||
|
||||
.textsc {
|
||||
font-variant: small-caps;
|
||||
}
|
||||
|
||||
#projectnumber {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#back-nav {
|
||||
border-bottom: 1px solid;
|
||||
padding: 0.5em;
|
||||
background-color: #FAF9FB;
|
||||
}
|
||||
|
||||
#back-nav h2 {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
#back-nav ul
|
||||
{
|
||||
display: inline;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
#back-nav li
|
||||
{
|
||||
display: inline;
|
||||
list-style-type: none;
|
||||
padding-right: 20px;
|
||||
}
|
||||
|
||||
.tparams .paramname {
|
||||
font-weight: bold;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 180%;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 120%;
|
||||
}
|
||||
|
||||
|
||||
.icon-namespace {
|
||||
font-family: Arial, Helvetica;
|
||||
font-weight: bold;
|
||||
font-size: 12px;
|
||||
height: 14px;
|
||||
width: 16px;
|
||||
display: inline-block;
|
||||
background-color: #FF0000;
|
||||
color: white;
|
||||
text-align: center;
|
||||
border-radius: 4px;
|
||||
margin-left: 2px;
|
||||
margin-right: 2px;
|
||||
}
|
||||
|
||||
.icon-class {
|
||||
font-family: Arial, Helvetica;
|
||||
font-weight: bold;
|
||||
font-size: 12px;
|
||||
height: 14px;
|
||||
width: 16px;
|
||||
display: inline-block;
|
||||
background-color: #0000FF;
|
||||
color: white;
|
||||
text-align: center;
|
||||
border-radius: 4px;
|
||||
margin-left: 2px;
|
||||
margin-right: 2px;
|
||||
}
|
||||
|
||||
.icon-concept {
|
||||
font-family: Arial, Helvetica;
|
||||
font-weight: bold;
|
||||
font-size: 12px;
|
||||
height: 14px;
|
||||
width: 16px;
|
||||
display: inline-block;
|
||||
background-color: #67489A;
|
||||
color: white;
|
||||
text-align: center;
|
||||
border-radius: 4px;
|
||||
margin-left: 2px;
|
||||
margin-right: 2px;
|
||||
}
|
||||
|
||||
h1.groupheader {
|
||||
font-size: 150%;
|
||||
}
|
||||
|
||||
/* enable this to make sections more alike */
|
||||
/* h2.groupheader { */
|
||||
/* border-bottom: none; */
|
||||
/* color: black; */
|
||||
/* font-size: 100%; */
|
||||
/* font-weight: bold; */
|
||||
/* margin-top: 1.75em; */
|
||||
/* padding-bottom: 0; */
|
||||
/* padding-top: 0; */
|
||||
/* width: 100%; */
|
||||
/* } */
|
||||
|
||||
a.el {
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.memproto a {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.PkgSummary {
|
||||
width: 60%;
|
||||
}
|
||||
|
||||
.PkgShortInfo {
|
||||
width: 20%;
|
||||
}
|
||||
|
||||
.PkgSummary, .PkgShortInfo, .PkgImage, .PkgImage .image {
|
||||
display:inline-block;
|
||||
padding:5px;
|
||||
vertical-align:middle;
|
||||
}
|
||||
|
||||
.PkgAuthors {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.PkgDescription {
|
||||
padding-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
text-align: justify;
|
||||
}
|
||||
|
||||
/* footnote support */
|
||||
|
||||
blockquote sup {
|
||||
position: absolute;
|
||||
right: 3px;
|
||||
top: 3px;
|
||||
}
|
||||
|
||||
.footnote ol li:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
a.footnoteBackref, a.footnoteLink {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
ol.footnotesList {
|
||||
margin: 0;
|
||||
font-size: 0.8em;
|
||||
padding-top: 5px;
|
||||
}
|
||||
|
||||
ol.footnotesList > li {
|
||||
text-indent: -1.5em;
|
||||
padding-left: 1.5em;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.footnoteBackReferenceGroup {
|
||||
padding-right: 0.5em;
|
||||
}
|
||||
.footnoteBackref {
|
||||
padding-right: 0.25em;
|
||||
}
|
||||
span.footnoteContent {
|
||||
|
||||
}
|
||||
span.footnoteContent > p:first-child, span.footnoteContent > div:first-child {
|
||||
display: inline;
|
||||
}
|
||||
span.footnoteContent p, span.footnoteContent div {
|
||||
text-indent: 0em;
|
||||
}
|
||||
|
||||
/* footnote support end */
|
||||
|
||||
dl
|
||||
{
|
||||
padding: 0 0 0 0;
|
||||
}
|
||||
|
||||
dl.section, dl.hasModels, dl.debugs, dl.models, dl.refines, dl.requires
|
||||
{
|
||||
margin-left: 0px;
|
||||
padding-left: 0px;
|
||||
}
|
||||
|
||||
dl.section dt a, dl.hasModels dt a, dl.debugs dt a,
|
||||
dl.models dt a, dl.refines dt a, dl.advanced dt a,
|
||||
dl.requires dt a, dl.todo dt a, dl.bug dt a, dl.test dt a
|
||||
{
|
||||
font-weight: bold;
|
||||
color: black;
|
||||
}
|
||||
|
||||
div.toc {
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.ui-resizable-e {
|
||||
background-repeat: repeat-y;
|
||||
}
|
||||
|
||||
div.cgal_figure_caption {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
div.cgal_video_caption {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
div.groupText {
|
||||
font-style: none;
|
||||
}
|
||||
|
||||
#projectname
|
||||
{
|
||||
font: 200% Tahoma, Arial,sans-serif;
|
||||
}
|
||||
|
||||
#titlearea {
|
||||
background: white;
|
||||
}
|
||||
|
||||
#MSearchResultsWindow {
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
dl.note, dl.warning, dl.attention,
|
||||
dl.pre, dl.post, dl.invariant, dl.deprecated,
|
||||
dl.todo, dl.test, dl.bug
|
||||
{
|
||||
margin-left:-7px;
|
||||
padding-left: 3px;
|
||||
}
|
||||
|
||||
div.CGALAdvanced
|
||||
{
|
||||
background: #eeb;
|
||||
border: 1px solid #9e9e7d;
|
||||
box-shadow: 0.5ex 0.5ex #ccc;
|
||||
}
|
||||
div.CGALDebug
|
||||
{
|
||||
background: #c8a8d0;
|
||||
border: 1px solid #846f8a;
|
||||
box-shadow: 0.5ex 0.5ex #777;
|
||||
}
|
||||
dl.deprecated
|
||||
{
|
||||
border-left: 4px solid;
|
||||
border-color: #505050;
|
||||
|
||||
background: #d8c0a0;
|
||||
border: 1px solid #94836e;
|
||||
box-shadow: 0.5ex 0.5ex #aaa;
|
||||
}
|
||||
|
||||
div.CGALAdvanced,
|
||||
div.CGALDebug,
|
||||
dl.deprecated
|
||||
{
|
||||
border-radius: 1ex;
|
||||
padding-top: 0.5ex;
|
||||
padding-bottom: 0.25ex;
|
||||
padding-left: 1ex;
|
||||
padding-right: 1ex;
|
||||
margin-bottom: 1ex;
|
||||
}
|
||||
|
||||
div.CGALModification
|
||||
{
|
||||
background: #f85858;
|
||||
border: 1px solid #000000;
|
||||
box-shadow: 0.5ex 0.5ex #777;
|
||||
border-radius: 1ex;
|
||||
padding-top: 0.5ex;
|
||||
padding-bottom: 0.25ex;
|
||||
padding-left: 1ex;
|
||||
padding-right: 1ex;
|
||||
margin-bottom: 1ex;
|
||||
}
|
||||
|
||||
.Modification
|
||||
{
|
||||
background: #f85858;
|
||||
border: 0px;
|
||||
padding-top: 0ex;
|
||||
padding-bottom: 0ex;
|
||||
padding-left: 0ex;
|
||||
padding-right: 0ex;
|
||||
margin-bottom: 0ex;
|
||||
}
|
||||
|
||||
/* The first div in CGALAdvanced sections is the "Advanced" header */
|
||||
div.CGALAdvanced > div,
|
||||
div.CGALDebug > div,
|
||||
dl.deprecated > dt > b > a
|
||||
{
|
||||
font-style: italic;
|
||||
font-weight: bold;
|
||||
}
|
||||
/* Everything else is noise and should stay in the normal font */
|
||||
div.CGALAdvanced > div ~ div,
|
||||
div.CGALDebug > div ~ div,
|
||||
dl.deprecated > dt ~ dt
|
||||
{
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
/* More indentation for the text body */
|
||||
div.CGALAdvanced > p,
|
||||
div.CGALDebug > p,
|
||||
dl.deprecated > dd
|
||||
{
|
||||
margin-left: 0;
|
||||
margin-top: 1ex;
|
||||
margin-bottom: 1ex;
|
||||
padding-left: 1em;
|
||||
padding-right: 1em;
|
||||
}
|
||||
|
||||
/* Adjust the top and bottom margins of div.fragment */
|
||||
div.fragment {
|
||||
padding: 4px;
|
||||
margin: 1em 4px 1em 4px;
|
||||
}
|
||||
|
||||
/* Make summary smaller to avoid wrapping of classes and concepts */
|
||||
div.summary
|
||||
{
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.collapsible {
|
||||
background-color: white;
|
||||
color: #602020;
|
||||
cursor: pointer;
|
||||
padding: 3px;
|
||||
width: 100%;
|
||||
border: none;
|
||||
text-align: left;
|
||||
outline: none;
|
||||
font: 14px Roboto,sans-serif;
|
||||
user-select: auto;
|
||||
}
|
||||
|
||||
.active, .collapsible:hover {
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
.collapsible:after {
|
||||
content: '\25B6';
|
||||
color: #7A93C5;
|
||||
font-weight: bold;
|
||||
float: left;
|
||||
margin-left: -20px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.active:after {
|
||||
content: "\25BC";
|
||||
}
|
||||
|
||||
.content {
|
||||
padding: 0 18px;
|
||||
color: black;
|
||||
max-height: 0;
|
||||
overflow: hidden;
|
||||
transition: max-height 0.2s ease-out;
|
||||
background-color: white;
|
||||
}
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
<!-- HTML footer for doxygen 1.9.6-->
|
||||
<!-- start footer part -->
|
||||
<!-- The footer div is not part of the default but we require it to
|
||||
move the footer to the bottom of the page. -->
|
||||
<div id="footer">
|
||||
<!--BEGIN GENERATE_TREEVIEW-->
|
||||
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
|
||||
<ul>
|
||||
$navpath
|
||||
<li class="footer">$generatedby <a href="https://www.doxygen.org/index.html"><img class="footer" src="$relpath^doxygen.svg" width="104" height="31" alt="doxygen"/></a> $doxygenversion </li>
|
||||
</ul>
|
||||
</div>
|
||||
<!--END GENERATE_TREEVIEW-->
|
||||
<!--BEGIN !GENERATE_TREEVIEW-->
|
||||
<hr class="footer"/><address class="footer"><small>
|
||||
$generatedby <a href="https://www.doxygen.org/index.html"><img class="footer" src="$relpath^doxygen.svg" width="104" height="31" alt="doxygen"/></a> $doxygenversion
|
||||
</small></address>
|
||||
<!--END !GENERATE_TREEVIEW-->
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,128 @@
|
|||
function generate_autotoc() {
|
||||
var toc = $("#autotoc").append('<ul></ul>');
|
||||
if(toc.length > 0) { // an autotoc has been requested
|
||||
toc = toc.find('ul');
|
||||
var indices = new Array();
|
||||
indices[0] = 0;
|
||||
indices[1] = 0;
|
||||
indices[2] = 0;
|
||||
|
||||
$("h1, h2, h3").each(function(i) {
|
||||
var current = $(this);
|
||||
var levelTag = current[0].tagName.charAt(1);
|
||||
var cur_id = current.attr("id");
|
||||
|
||||
indices[levelTag-1]+=1;
|
||||
var prefix=indices[0];
|
||||
if (levelTag >1) prefix+="."+indices[1];
|
||||
if (levelTag >2) prefix+="."+indices[2];
|
||||
current.html(prefix + " " + current.html());
|
||||
for(var l = levelTag; l < 3; ++l){
|
||||
indices[l] = 0;
|
||||
}
|
||||
|
||||
if(cur_id == undefined) {
|
||||
current.attr('id', 'title' + i);
|
||||
current.addClass('anchor');
|
||||
toc.append("<li class='level" + levelTag + "'><a id='link" + i + "' href='#title" +
|
||||
i + "' title='" + current.prop("tagName") + "'>" + current.text() + "</a></li>");
|
||||
} else {
|
||||
toc.append("<li class='level" + levelTag + "'><a id='" + cur_id + "' href='#title" +
|
||||
i + "' title='" + current.prop("tagName") + "'>" + current.text() + "</a></li>");
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// throw a stick at the topics array and hijack gotoNode
|
||||
// for our own evil purposes
|
||||
$(document).ready(function() {
|
||||
if (typeof topics !== 'undefined') {
|
||||
// topics has been loaded, that means we are inside the
|
||||
// documentation of a package
|
||||
NAVTREE[0][2][1][1] = topics[0][1];
|
||||
NAVTREE[0][2][1][2] = topics[0][2];
|
||||
// override gotoNode from navtree.js
|
||||
gotoNode = function (o,subIndex,root,hash,relpath) {
|
||||
var nti = navTreeSubIndices[subIndex][root+hash];
|
||||
if (!nti)
|
||||
{
|
||||
nti = navTreeSubIndices[subIndex][root];
|
||||
}
|
||||
if(nti && (nti[0] === 1 && nti[0])) {
|
||||
nti.splice(1, 1);
|
||||
}
|
||||
o.breadcrumbs = $.extend(true, [], nti ? nti : navTreeSubIndices[subIndex][root]);
|
||||
if (!o.breadcrumbs && root!=NAVTREE[0][1]) { // fallback: show index
|
||||
navTo(o,NAVTREE[0][1],"",relpath);
|
||||
$('.item').removeClass('selected');
|
||||
$('.item').removeAttr('id');
|
||||
}
|
||||
if (o.breadcrumbs) {
|
||||
o.breadcrumbs.unshift(0); // add 0 for root node
|
||||
showNode(o, o.node, 0, hash);
|
||||
}
|
||||
}
|
||||
}
|
||||
// set-up footnote generation
|
||||
$("#doc-content").append('<ol id="autoFootnotes0" class="footnotesList"></ol>');
|
||||
$("body").footnotes();
|
||||
generate_autotoc();
|
||||
});
|
||||
|
||||
|
||||
/*
|
||||
* A jQuery plugin by Brian Holt that will search the selected blocks for
|
||||
* specially-defined footnote elements. If found, these elements will be
|
||||
* moved to a footnotes section and links to and from the footnotes will
|
||||
* be created.
|
||||
*
|
||||
* See http://www.planetholt.com/articles/jQuery-Footnotes
|
||||
* for full documentation.
|
||||
*
|
||||
* By default, footnotes will be found in SPANs with the footnote class,
|
||||
* and in BLOCKQUOTEs with a TITLE attribute.
|
||||
*
|
||||
* Thanks to CSSNewbies.com for the general idea, which I have enhanced
|
||||
* and implemented with as a jQuery plugin.
|
||||
*
|
||||
* Copyright 2008-2009 Brian Holt.
|
||||
* Licensed under the LGPL license. See
|
||||
* http://www.gnu.org/licenses/lgpl-3.0-standalone.html
|
||||
*
|
||||
* Version 1.2.2
|
||||
*/
|
||||
(function(c){c.fn.footnotes=function(d){var e=c.extend({},c.fn.footnotes.defaults,d);return this.each(function(f){b("INFO: Building footnotes for "+(f+1)+"...",e.debugMode);c(e.footnotes,this).addClass(e.autoFootnoteClass);var h=(""===e.contentBlock)?c(this):c(e.contentBlock,this),g=e.orderedList?"<ol/>":"<ul/>";c("."+e.autoFootnoteClass).each(function(l){var t=-1,n=f+"-"+l,q=c(this),j,r,s,u,p,m,o,k;if(e.singleFootnoteDestination){j=c("#"+e.destination);if(0===j.length){b("INFO: No #autoFootnotes found; adding our own",e.debugMode);j=c(g).attr("id",e.destination).addClass("footnotesList").appendTo(h)}}else{j=c("#"+e.destination+f);if(0===j.length){b("INFO: No #autoFootnotes"+f+" found; adding our own for "+(f+1),e.debugMode);j=c(g).attr("id",e.destination+f).addClass("footnotesList").appendTo(h)}}q.removeClass(e.autoFootnoteClass);r=e.fnExtractFootnote(this);t=-1;n=f+"-"+l;j.find("li > .footnoteContent").each(function(i){var v=c(this);if(v.html()===r){t=i;s=c(v.parents("li").get(0));return false}});if(-1===t){u=c("<a/>").attr("href","#cite-text-"+n).attr("name","cite-ref-"+n).attr("id","cite-ref-"+n).attr("dir","ltr").attr("title",r).text("["+(j.find("li").length+1)+"]").addClass("footnoteLink");if(q.is(e.prependTags)){c("<sup/>").prependTo(this).append(u)}else{c("<sup/>").appendTo(this).append(u)}p=c("<li/>").attr("id","cite-text-"+n);m=c("<span/>").addClass("footnoteBackReferenceGroup").appendTo(p);c("<span/>").addClass("footnoteContent").html(r).appendTo(p);u=c("<a/>").text("^").attr("href","#cite-ref-"+n).addClass("footnoteBackref").prependTo(m);j.append(p)}else{n=f+"-"+t;m=c(c("li > .footnoteBackReferenceGroup",j).get(t));o=m.find(".footnoteBackref");k=o.length;if(0===o.length){b("ERROR: $backRefs.length == 0, which should have prevented this code path",e.debugMode)}else{if(1===o.length){c("<sup/>").text("^ ").addClass("footnoteBackref").prependTo(m);o.html("<sup>a</sup>");++k}u=c("<a/>").attr("href","#"+s.attr("id")).attr("name","cite-ref-"+n+"-"+o.length).attr("id","cite-ref-"+n+"-"+o.length).attr("title",r).text("["+(t+1)+"]").addClass("footnoteLink");if(q.is(e.prependTags)){c("<sup/>").prependTo(this).append(u)}else{c("<sup/>").appendTo(this).append(u)}u=c("<a/>").attr("href","#cite-ref-"+n+"-"+o.length).addClass("footnoteBackref");if(k>=26){b("WARN: multiple letter functionality is probably broken when more than 26 footnotes exist",e.debugMode)}u.prepend(String.fromCharCode((k)+96));c("<sup/>").appendTo(m).append(u)}}});b("INFO: Done building footnotes for "+(f+1),e.debugMode)})};c.fn.footnotes.version=function(){return"1.2.2"};c.fn.footnotes.defaults={footnotes:"blockquote[title],span.footnote,blockquote[cite]",prependTags:"blockquote",singleFootnoteDestination:false,destination:"autoFootnotes",contentBlock:".content",autoFootnoteClass:"autoFootnote",fnExtractFootnote:a,orderedList:true,debugMode:true};function b(e,d){if(d){if(window.console&&window.console.log){window.console.log(e)}}}function a(i){var j=c(i),e,f,h,g,d;if(j.is("span.footnote")){e=c(i).html();f=/^(?:(?: )|\s)*\(([\S\s]+)\)(?:(?: )|\s)*$/;h=e.match(f);if(h&&2===h.length){e=h[1]}j.empty()}else{if(j.is("blockquote[title]")){g=j.attr("cite");e=j.attr("title");if(""!==g){d=c("<a/>").attr("href",g);if(0===c(e).length){e=d.text(e)}else{e=d.text(g).wrap("<span/>").parent().append(": "+e);j.attr("title","")}}}else{if(j.is("blockquote[cite]")){g=j.attr("cite");e=c("<a/>").attr("href",g).text(g)}}}return e}})(jQuery);
|
||||
(function(){
|
||||
if(window.location.href.includes("doc.cgal.org")){
|
||||
var url='https://doc.cgal.org/latest/Manual/menu_version.js';
|
||||
var script = document.createElement("script"); // Make a script DOM node
|
||||
script.src = url; // Set it's src to the provided URL
|
||||
document.head.appendChild(script);
|
||||
}
|
||||
else
|
||||
{
|
||||
var url='../Manual/menu_version.js';
|
||||
var script = document.createElement("script"); // Make a script DOM node
|
||||
script.src = url; // Set it's src to the provided URL
|
||||
document.head.appendChild(script);
|
||||
}
|
||||
})();
|
||||
|
||||
$(document).ready(function() {
|
||||
var coll = document.getElementsByClassName("collapsible");
|
||||
var i;
|
||||
|
||||
for (i = 0; i < coll.length; i++) {
|
||||
coll[i].addEventListener("click", function() {
|
||||
this.classList.toggle("active");
|
||||
var content = this.nextElementSibling;
|
||||
if (content.style.maxHeight){
|
||||
content.style.maxHeight = null;
|
||||
} else {
|
||||
content.style.maxHeight = content.scrollHeight + "px";
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
@ -0,0 +1,85 @@
|
|||
<!-- HTML header for doxygen 1.9.6-->
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="$langISO">
|
||||
<head>
|
||||
<link rel="icon" type="image/png" href="$relpath$../Manual/g-196x196-doc.png"/>
|
||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
|
||||
<meta name="generator" content="Doxygen $doxygenversion"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
|
||||
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
|
||||
<!-- <link href="$relpath^../Manual/tabs.css" rel="stylesheet" type="text/css"/> -->
|
||||
<!--BEGIN DISABLE_INDEX-->
|
||||
<!--BEGIN FULL_SIDEBAR-->
|
||||
<script type="text/javascript">var page_layout=1;</script>
|
||||
<!--END FULL_SIDEBAR-->
|
||||
<!--END DISABLE_INDEX-->
|
||||
<script type="text/javascript" src="$relpath^../Manual/jquery.js"></script>
|
||||
<script type="text/javascript" src="$relpath^../Manual/dynsections.js"></script>
|
||||
<!--BEGIN COPY_CLIPBOARD-->
|
||||
<script type="text/javascript" src="$relpath^clipboard.js"></script>
|
||||
<!--END COPY_CLIPBOARD-->
|
||||
<script src="$relpath$../Manual/hacks.js" type="text/javascript"></script>
|
||||
$treeview
|
||||
$search
|
||||
$mathjax
|
||||
$darkmode
|
||||
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
|
||||
<!-- This should probably be an extrastylesheet instead of hardcoded. -->
|
||||
<link href="$relpath$../Manual/cgal_stylesheet.css" rel="stylesheet" type="text/css" />
|
||||
$extrastylesheet
|
||||
</head>
|
||||
<body>
|
||||
<!--BEGIN DISABLE_INDEX-->
|
||||
<!--BEGIN FULL_SIDEBAR-->
|
||||
<div id="side-nav" class="ui-resizable side-nav-resizable"><!-- do not remove this div, it is closed by doxygen! -->
|
||||
<!--END FULL_SIDEBAR-->
|
||||
<!--END DISABLE_INDEX-->
|
||||
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
||||
<div id="back-nav">
|
||||
<ul>
|
||||
<li><a href="https://www.cgal.org/">cgal.org</a></li>
|
||||
<li><a href="../Manual/index.html">Top</a></li>
|
||||
<li><a href="../Manual/general_intro.html">Getting Started</a></li>
|
||||
<li><a href="../Manual/tutorials.html">Tutorials</a></li>
|
||||
<li><a href="../Manual/packages.html">Package Overview</a></li>
|
||||
<li><a href="../Manual/how_to_cite_cgal.html">Acknowledging CGAL</a></li>
|
||||
</ul>
|
||||
$searchbox
|
||||
</div>
|
||||
|
||||
<!--BEGIN TITLEAREA-->
|
||||
<div id="titlearea">
|
||||
<table cellspacing="0" cellpadding="0">
|
||||
<tbody>
|
||||
<tr id="projectrow">
|
||||
<!--BEGIN PROJECT_LOGO-->
|
||||
<td id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"/></td>
|
||||
<!--END PROJECT_LOGO-->
|
||||
<!--BEGIN PROJECT_NAME-->
|
||||
<td id="projectalign">
|
||||
<div id="projectname">$projectname<!--BEGIN PROJECT_NUMBER--><span id="projectnumber"> $projectnumber</span><!--END PROJECT_NUMBER-->
|
||||
</div>
|
||||
<!--BEGIN PROJECT_BRIEF--><div id="projectbrief">$projectbrief</div><!--END PROJECT_BRIEF-->
|
||||
</td>
|
||||
<!--END PROJECT_NAME-->
|
||||
<!--BEGIN !PROJECT_NAME-->
|
||||
<!--BEGIN PROJECT_BRIEF-->
|
||||
<div id="projectbrief">$projectbrief</div>
|
||||
</td>
|
||||
<!--END PROJECT_BRIEF-->
|
||||
<!--END !PROJECT_NAME-->
|
||||
<!--BEGIN DISABLE_INDEX-->
|
||||
<!--BEGIN SEARCHENGINE-->
|
||||
<!-- We disable the search box because we have added it in the
|
||||
back-nav for stylistic reasons. -->
|
||||
<!-- <td>$searchbox</td> -->
|
||||
<!--END SEARCHENGINE-->
|
||||
<!--END DISABLE_INDEX-->
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<!--END TITLEAREA-->
|
||||
<!-- end header part -->
|
||||
|
|
@ -0,0 +1,147 @@
|
|||
<!-- HTML header for doxygen 1.9.6-->
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="$langISO">
|
||||
<head>
|
||||
<link rel="icon" type="image/png" href="$relpath$../Manual/g-196x196-doc.png"/>
|
||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
|
||||
<meta name="generator" content="Doxygen $doxygenversion"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
|
||||
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
|
||||
<!-- <link href="$relpath^../Manual/tabs.css" rel="stylesheet" type="text/css"/> -->
|
||||
<!--BEGIN DISABLE_INDEX-->
|
||||
<!--BEGIN FULL_SIDEBAR-->
|
||||
<script type="text/javascript">var page_layout=1;</script>
|
||||
<!--END FULL_SIDEBAR-->
|
||||
<!--END DISABLE_INDEX-->
|
||||
<script type="text/javascript" src="$relpath^../Manual/jquery.js"></script>
|
||||
<script type="text/javascript" src="$relpath^../Manual/dynsections.js"></script>
|
||||
<!--BEGIN COPY_CLIPBOARD-->
|
||||
<script type="text/javascript" src="$relpath^clipboard.js"></script>
|
||||
<!--END COPY_CLIPBOARD-->
|
||||
<script src="$relpath^../Manual/hacks.js" type="text/javascript"></script>
|
||||
<!-- Manually include treeview and search to avoid bloat and to fix
|
||||
paths to the directory Manual . -->
|
||||
<!-- $.treeview -->
|
||||
<!-- $.search -->
|
||||
<link href="navtree.css" rel="stylesheet" type="text/css"/>
|
||||
<script type="text/javascript" src="$relpath^../Manual/resize.js"></script>
|
||||
<script type="text/javascript" src="navtreedata.js"></script>
|
||||
<script type="text/javascript" src="navtree.js"></script>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(initResizable);
|
||||
</script>
|
||||
<link href="$relpath^../Manual/search/search.css" rel="stylesheet" type="text/css"/>
|
||||
<script type="text/javascript" src="$relpath^../Manual/search/searchdata.js"></script>
|
||||
<script type="text/javascript" src="$relpath^../Manual/search/search.js"></script>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() { init_search(); });
|
||||
</script>
|
||||
<link href="$relpath^../Manual/search/search.css" rel="stylesheet" type="text/css"/>
|
||||
<script type="text/javascript" src="../Manual/search/search.js"></script>
|
||||
<!-- Manually done below. -->
|
||||
<link href="$relpath^../Manual/$stylesheet" rel="stylesheet" type="text/css" />
|
||||
<!-- This should probably be an extrastylesheet instead of hardcoded. -->
|
||||
<link href="$relpath$../Manual/cgal_stylesheet.css" rel="stylesheet" type="text/css" />
|
||||
$mathjax
|
||||
$darkmode
|
||||
<script src="$relpath^topics.js" type="text/javascript"></script>
|
||||
$extrastylesheet
|
||||
</head>
|
||||
<body>
|
||||
<!--BEGIN DISABLE_INDEX-->
|
||||
<!--BEGIN FULL_SIDEBAR-->
|
||||
<div id="side-nav" class="ui-resizable side-nav-resizable"><!-- do not remove this div, it is closed by doxygen! -->
|
||||
<!--END FULL_SIDEBAR-->
|
||||
<!--END DISABLE_INDEX-->
|
||||
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
||||
<div id="back-nav">
|
||||
<ul>
|
||||
<li><a href="https://www.cgal.org/">cgal.org</a></li>
|
||||
<li><a href="../Manual/index.html">Top</a></li>
|
||||
<li><a href="../Manual/general_intro.html">Getting Started</a></li>
|
||||
<li><a href="../Manual/tutorials.html">Tutorials</a></li>
|
||||
<li><a href="../Manual/packages.html">Package Overview</a></li>
|
||||
<li><a href="../Manual/how_to_cite_cgal.html">Acknowledging CGAL</a></li>
|
||||
</ul>
|
||||
<!-- In a package SEARCHENGINE = false, so we cannot use $searchbox
|
||||
insertion. That's why we have to do it manually here. Notice
|
||||
that we also take pngs from the Manual. -->
|
||||
<div id="MSearchBox" class="MSearchBoxInactive">
|
||||
<span class="left">
|
||||
<span id="MSearchSelect"
|
||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
||||
onmouseout="return searchBox.OnSearchSelectHide()"> 
|
||||
</span>
|
||||
<input type="text" id="MSearchField" value="" placeholder="Search" accesskey="S"
|
||||
onfocus="searchBox.OnSearchFieldFocus(true)"
|
||||
onblur="searchBox.OnSearchFieldFocus(false)"
|
||||
onkeyup="searchBox.OnSearchFieldChange(event)"/>
|
||||
</span>
|
||||
<span class="right">
|
||||
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="$relpath^../Manual/search/close.svg" alt=""/></a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<!--BEGIN TITLEAREA-->
|
||||
<div id="titlearea">
|
||||
<table cellspacing="0" cellpadding="0">
|
||||
<tbody>
|
||||
<tr id="projectrow">
|
||||
<!--BEGIN PROJECT_LOGO-->
|
||||
<td id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"/></td>
|
||||
<!--END PROJECT_LOGO-->
|
||||
<!--BEGIN PROJECT_NAME-->
|
||||
<td id="projectalign">
|
||||
<div id="projectname">$projectname<!--BEGIN PROJECT_NUMBER--><span id="projectnumber"> $projectnumber</span><!--END PROJECT_NUMBER-->
|
||||
</div>
|
||||
<!--BEGIN PROJECT_BRIEF--><div id="projectbrief">$projectbrief</div><!--END PROJECT_BRIEF-->
|
||||
</td>
|
||||
<!--END PROJECT_NAME-->
|
||||
<!--BEGIN !PROJECT_NAME-->
|
||||
<!--BEGIN PROJECT_BRIEF-->
|
||||
<div id="projectbrief">$projectbrief</div>
|
||||
</td>
|
||||
<!--END PROJECT_BRIEF-->
|
||||
<!--END !PROJECT_NAME-->
|
||||
<!--BEGIN DISABLE_INDEX-->
|
||||
<!--BEGIN SEARCHENGINE-->
|
||||
<!-- We disable the search box because we have added it in the
|
||||
back-nav for stylistic reasons. -->
|
||||
<!-- <td>$.searchbox</td> -->
|
||||
<!--END SEARCHENGINE-->
|
||||
<!--END DISABLE_INDEX-->
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<!-- Code below is usually inserted by doxygen when SEARCHENGINE =
|
||||
true. Notice that the path to the search directory is adjusted to
|
||||
the top-level.-->
|
||||
<script type="text/javascript">
|
||||
var searchBox = new SearchBox("searchBox", "../Manual/search/",'.html');
|
||||
</script>
|
||||
<!-- window showing the filter options -->
|
||||
<div id="MSearchSelectWindow"
|
||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
||||
onmouseout="return searchBox.OnSearchSelectHide()"
|
||||
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
||||
</div>
|
||||
<!-- iframe showing the search results (closed by default) -->
|
||||
<div id="MSearchResultsWindow">
|
||||
<div id="MSearchResults">
|
||||
<div class="SRPage">
|
||||
<div id="SRIndex">
|
||||
<div id="SRResults"></div>
|
||||
<div class="SRStatus" id="Loading">Loading...</div>
|
||||
<div class="SRStatus" id="Searching">Searching...</div>
|
||||
<div class="SRStatus" id="NoMatches">No Matches</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--END TITLEAREA-->
|
||||
<!-- end header part -->
|
||||
|
|
@ -0,0 +1,109 @@
|
|||
(function() {
|
||||
'use strict';
|
||||
|
||||
var url_re = /(cgal\.geometryfactory\.com\/CGAL\/doc\/|doc\.cgal\.org\/)(master|latest|(\d\.\d+|\d\.\d+\.\d+)(-beta\d)?)\//;
|
||||
var url_local = /.*\/doc_output\//;
|
||||
var current_version_local = 'master'
|
||||
var all_versions = [
|
||||
'master',
|
||||
'6.0-beta1',
|
||||
'5.6',
|
||||
'latest',
|
||||
'5.5.2',
|
||||
'5.4.4',
|
||||
'5.3.2',
|
||||
'5.2.4',
|
||||
'5.1.5',
|
||||
'5.0.4',
|
||||
'4.14.3',
|
||||
'4.13.2',
|
||||
'4.12.2',
|
||||
'4.11.3',
|
||||
'4.10.2',
|
||||
'4.9.1',
|
||||
'4.8.2',
|
||||
'4.7',
|
||||
'4.6.3',
|
||||
'4.5.2',
|
||||
'4.4',
|
||||
'4.3'
|
||||
];
|
||||
|
||||
function build_select(current_version) {
|
||||
if( current_version == 'master') {
|
||||
let top_elt = document.getElementById("top");
|
||||
|
||||
let first_element = top_elt.childNodes[0];
|
||||
let new_div = document.createElement("p");
|
||||
new_div.innerHTML = '⚠️ This documentation corresponds to the <a style="font-familly: monospace;" href="https://github.com/CGAL/cgal/tree/master">master</a> development branch of CGAL. It might diverge from the official releases.';
|
||||
new_div.style.cssText = "background-color: #ff9800; margin: 1ex auto 1ex 1em; padding: 1ex; border-radius: 1ex; display: inline-block;"
|
||||
let OK = top_elt.insertBefore(new_div, first_element);
|
||||
}
|
||||
var buf = ['<select>'];
|
||||
$.each(all_versions, function(id) {
|
||||
var version = all_versions[id];
|
||||
buf.push('<option value="' + version + '"');
|
||||
if (version == current_version) {
|
||||
buf.push(' selected="selected">' + version);
|
||||
} else {
|
||||
buf.push('>' + version);
|
||||
}
|
||||
buf.push('</option>');
|
||||
});
|
||||
if ( !all_versions.includes(current_version)) {
|
||||
buf.push('<option value="' + current_version + '"');
|
||||
buf.push(' selected="selected">' + current_version);
|
||||
buf.push('</option>');
|
||||
}
|
||||
buf.push('</select>');
|
||||
return buf.join('');
|
||||
}
|
||||
|
||||
function patch_url(url, new_version) {
|
||||
if(url.includes("doc.cgal.org")||url.includes("cgal.geometryfactory.com")){
|
||||
return url.replace(url_re, 'doc.cgal.org/' + new_version + '/');
|
||||
}
|
||||
else{
|
||||
return url.replace(url_local, 'https://doc.cgal.org/' + new_version + '/');
|
||||
}
|
||||
}
|
||||
|
||||
function on_switch() {
|
||||
var selected = $(this).children('option:selected').attr('value');
|
||||
var url = window.location.href,
|
||||
new_url = patch_url(url, selected);
|
||||
if (new_url != url) {
|
||||
window.location.href = new_url;
|
||||
}
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
var motherNode=$("#back-nav ul")[0];
|
||||
var node = document.createElement("LI");
|
||||
var spanNode = document.createElement("SPAN");
|
||||
var titleNode =document.createTextNode("CGAL Version: ");
|
||||
var textNode = document.createTextNode("x.y");
|
||||
spanNode.setAttribute("class", "version_menu");
|
||||
spanNode.appendChild(textNode);
|
||||
node.appendChild(titleNode);
|
||||
node.appendChild(spanNode);
|
||||
motherNode.insertBefore(node, motherNode.firstChild);
|
||||
$("#back-nav").css("padding-top", "0").css("padding-bottom", "0");
|
||||
var match = url_re.exec(window.location.href);
|
||||
if (match) {
|
||||
var version = match[2];
|
||||
var select = build_select(version);
|
||||
spanNode.innerHTML=select;
|
||||
$('.version_menu select').bind('change', on_switch);
|
||||
}
|
||||
else {
|
||||
match = url_local.exec(window.location.href);
|
||||
if (match) {
|
||||
var version = current_version_local;
|
||||
var select = build_select(version);
|
||||
spanNode.innerHTML=select;
|
||||
$('.version_menu select').bind('change', on_switch);
|
||||
}
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
|
@ -85,7 +85,7 @@ pre_html=r"""<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "htt
|
|||
<link rel="icon" type="image/png" href="../Manual/g-196x196-doc.png"/>
|
||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
||||
<link href="stylesheet.css" rel="stylesheet" type="text/css" />
|
||||
<link href="cgal_stylesheet.css" rel="stylesheet" type="text/css" />
|
||||
<title>CGAL ${CGAL_CREATED_VERSION_NUM} - Manual: Acknowledging CGAL</title>
|
||||
</head>
|
||||
<body>
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ def clean_doc():
|
|||
duplicate_files=list(package_glob('./*/jquery.js'))
|
||||
duplicate_files.extend(package_glob('./*/dynsections.js'))
|
||||
duplicate_files.extend(package_glob('./*/resize.js'))
|
||||
duplicate_files.extend(package_glob('./*/stylesheet.css'))
|
||||
duplicate_files.extend(package_glob('./*/cgal_stylesheet.css'))
|
||||
# kill _all_, including the one in CGAL tabs.css files
|
||||
duplicate_files.extend(glob.glob('./*/tabs.css'))
|
||||
# left-over by doxygen?
|
||||
|
|
|
|||
|
|
@ -20,7 +20,9 @@ DOXYGEN_2=$($PATH_TO_1_9_6 --version)
|
|||
|
||||
DO_COMPARE=TRUE
|
||||
PATH_TO_SCRIPTS=${PWD}
|
||||
NB_CORES="$(nproc)"
|
||||
|
||||
set +e
|
||||
#######################################
|
||||
## download and build doxygen_master ##
|
||||
#######################################
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@
|
|||
#ifdef CGAL_ENVELOPE_USE_BFS_FACE_ORDER
|
||||
#include <CGAL/Arr_face_index_map.h>
|
||||
#include <CGAL/graph_traits_dual_arrangement_on_surface_2.h>
|
||||
#include <CGAL/boost/graph/dijkstra_shortest_paths.h>
|
||||
#include <boost/graph/dijkstra_shortest_paths.hpp>
|
||||
#endif
|
||||
|
||||
// this base divide & conquer algorithm splits the input into 2 groups,
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ Algebraic_foundations
|
|||
Apollonius_graph_2
|
||||
Arithmetic_kernel
|
||||
Arrangement_on_surface_2
|
||||
BGL
|
||||
Cartesian_kernel
|
||||
Circulator
|
||||
Distance_2
|
||||
|
|
|
|||
|
|
@ -293,7 +293,6 @@ namespace CGAL { namespace internal { namespace Static_filters_predicates {
|
|||
double drt = (((square( drx ) + square( dry )) + square( drz )) + twt_rwt);
|
||||
int cmp;
|
||||
int int_tmp_result;
|
||||
double eps;
|
||||
double RT_tmp_result = CGAL::determinant( dpx, dpy, dpt, dqx, dqy, dqt, drx, dry, drt );
|
||||
|
||||
double max7 = CGAL::abs(dpz);
|
||||
|
|
@ -371,8 +370,7 @@ namespace CGAL { namespace internal { namespace Static_filters_predicates {
|
|||
if( max5 < aqx_rx ) max5 = aqx_rx;
|
||||
double max6 = CGAL::abs(qy_ry);
|
||||
if( max6 < apy_ry ) max6 = apy_ry;
|
||||
if( (cmp != 0) )
|
||||
{
|
||||
|
||||
int int_tmp_result_FFWKCAA;
|
||||
double double_tmp_result;
|
||||
double_tmp_result = ((px_rx * qy_ry) - (qx_rx * py_ry));
|
||||
|
|
@ -412,177 +410,6 @@ namespace CGAL { namespace internal { namespace Static_filters_predicates {
|
|||
}
|
||||
return static_cast<result_type>(cmp * int_tmp_result_FFWKCAA);
|
||||
}
|
||||
int int_tmp_result_k60Ocge;
|
||||
double RT_tmp_result_3SPBwDj = CGAL::determinant( dpx, dpz, dpt, dqx, dqz, dqt, drx, drz, drt );
|
||||
lower_bound_1 = max1;
|
||||
upper_bound_1 = max1;
|
||||
if( (max7 < lower_bound_1) ) lower_bound_1 = max7;
|
||||
if( (max2 < lower_bound_1) ) lower_bound_1 = max2;
|
||||
//handwritten workaround to handle case where all weights are equal
|
||||
//if( ((lower_bound_1 < 2.92391967062015793913e-74) || (max4 < 8.54930624023949352313e-148)) )
|
||||
if( ((lower_bound_1 < 2.92391967062015793913e-74) || (max4 < 8.54930624023949352313e-148 && max4!=0)) )
|
||||
{
|
||||
CGAL_BRANCH_PROFILER_BRANCH_2(tmp);
|
||||
return Base::operator()(p,q,r,t);
|
||||
}
|
||||
else
|
||||
{
|
||||
if( ((upper_bound_1 > 7.23700557733225980357e+75) || (max4 > 5.23742497263382350320e+151)) )
|
||||
{
|
||||
CGAL_BRANCH_PROFILER_BRANCH_2(tmp);
|
||||
return Base::operator()(p,q,r,t);
|
||||
}
|
||||
eps = (3.04426660386257731823e-14 * ((max2 * max7) * (CGAL::max)( max4, (max1 * max1) )));
|
||||
if( (RT_tmp_result_3SPBwDj > eps) )
|
||||
{
|
||||
int_tmp_result_k60Ocge = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if( (RT_tmp_result_3SPBwDj < -eps) )
|
||||
{
|
||||
int_tmp_result_k60Ocge = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
CGAL_BRANCH_PROFILER_BRANCH_2(tmp);
|
||||
return Base::operator()(p,q,r,t);
|
||||
}
|
||||
}
|
||||
}
|
||||
cmp = int_tmp_result_k60Ocge;
|
||||
double qz_rz = (qz - rz);
|
||||
double pz_rz = (pz - rz);
|
||||
double max8 = CGAL::abs(qz_rz);
|
||||
double apz_rz = CGAL::abs(pz_rz);
|
||||
if( max8 < apz_rz ) max8 = apz_rz;
|
||||
if( (cmp != 0) )
|
||||
{
|
||||
int int_tmp_result_k3Lzf6g;
|
||||
double double_tmp_result_Gx4H;
|
||||
double_tmp_result_Gx4H = ((px_rx * qz_rz) - (qx_rx * pz_rz));
|
||||
lower_bound_1 = max5;
|
||||
upper_bound_1 = max5;
|
||||
if( (max8 < lower_bound_1) ) lower_bound_1 = max8;
|
||||
else
|
||||
{
|
||||
if( (max8 > upper_bound_1) ) upper_bound_1 = max8;
|
||||
}
|
||||
if( (lower_bound_1 < 5.00368081960964690982e-147) )
|
||||
{
|
||||
CGAL_BRANCH_PROFILER_BRANCH_2(tmp);
|
||||
return Base::operator()(p,q,r,t);
|
||||
}
|
||||
else
|
||||
{
|
||||
if( (upper_bound_1 > 7.23700557733225980357e+75) )
|
||||
{
|
||||
CGAL_BRANCH_PROFILER_BRANCH_2(tmp);
|
||||
return Base::operator()(p,q,r,t);
|
||||
}
|
||||
eps = (8.88720573725927976811e-16 * (max5 * max8));
|
||||
if( (double_tmp_result_Gx4H > eps) )
|
||||
{
|
||||
int_tmp_result_k3Lzf6g = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if( (double_tmp_result_Gx4H < -eps) )
|
||||
{
|
||||
int_tmp_result_k3Lzf6g = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
CGAL_BRANCH_PROFILER_BRANCH_2(tmp);
|
||||
return Base::operator()(p,q,r,t);
|
||||
}
|
||||
}
|
||||
}
|
||||
return static_cast<result_type>(cmp * int_tmp_result_k3Lzf6g);
|
||||
}
|
||||
int int_tmp_result_AvrrXBP;
|
||||
double RT_tmp_result_feLwnHn = CGAL::determinant( dpy, dpz, dpt, dqy, dqz, dqt, dry, drz, drt );
|
||||
lower_bound_1 = max1;
|
||||
upper_bound_1 = max1;
|
||||
if( (max7 < lower_bound_1) ) lower_bound_1 = max7;
|
||||
if( (max3 < lower_bound_1) ) lower_bound_1 = max3;
|
||||
//handwritten workaround to handle case where all weights are equal
|
||||
//if( ((lower_bound_1 < 2.92391967062015793913e-74) || (max4 < 8.54930624023949352313e-148)) )
|
||||
if( ((lower_bound_1 < 2.92391967062015793913e-74) || (max4 < 8.54930624023949352313e-148 && max4!=0)) )
|
||||
{
|
||||
CGAL_BRANCH_PROFILER_BRANCH_2(tmp);
|
||||
return Base::operator()(p,q,r,t);
|
||||
}
|
||||
else
|
||||
{
|
||||
if( ((upper_bound_1 > 7.23700557733225980357e+75) || (max4 > 5.23742497263382350320e+151)) )
|
||||
{
|
||||
CGAL_BRANCH_PROFILER_BRANCH_2(tmp);
|
||||
return Base::operator()(p,q,r,t);
|
||||
}
|
||||
eps = (3.04426660386257731823e-14 * ((max3 * max7) * (CGAL::max)( max4, (max1 * max1) )));
|
||||
if( (RT_tmp_result_feLwnHn > eps) )
|
||||
{
|
||||
int_tmp_result_AvrrXBP = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if( (RT_tmp_result_feLwnHn < -eps) )
|
||||
{
|
||||
int_tmp_result_AvrrXBP = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
CGAL_BRANCH_PROFILER_BRANCH_2(tmp);
|
||||
return Base::operator()(p,q,r,t);
|
||||
}
|
||||
}
|
||||
}
|
||||
cmp = int_tmp_result_AvrrXBP;
|
||||
int int_tmp_result_agX3WsT;
|
||||
double double_tmp_result_Dw20Kqh = ((py_ry * qz_rz) - (qy_ry * pz_rz));
|
||||
lower_bound_1 = max8;
|
||||
upper_bound_1 = max8;
|
||||
if( (max6 < lower_bound_1) )
|
||||
{
|
||||
lower_bound_1 = max6;
|
||||
}
|
||||
else
|
||||
{
|
||||
if( (max6 > upper_bound_1) ) upper_bound_1 = max6;
|
||||
}
|
||||
if( (lower_bound_1 < 5.00368081960964690982e-147) )
|
||||
{
|
||||
CGAL_BRANCH_PROFILER_BRANCH_2(tmp);
|
||||
return Base::operator()(p,q,r,t);
|
||||
}
|
||||
else
|
||||
{
|
||||
if( (upper_bound_1 > 7.23700557733225980357e+75) )
|
||||
{
|
||||
CGAL_BRANCH_PROFILER_BRANCH_2(tmp);
|
||||
return Base::operator()(p,q,r,t);
|
||||
}
|
||||
eps = (8.88720573725927976811e-16 * (max6 * max8));
|
||||
if( (double_tmp_result_Dw20Kqh > eps) )
|
||||
{
|
||||
int_tmp_result_agX3WsT = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if( (double_tmp_result_Dw20Kqh < -eps) )
|
||||
{
|
||||
int_tmp_result_agX3WsT = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
CGAL_BRANCH_PROFILER_BRANCH_2(tmp);
|
||||
return Base::operator()(p,q,r,t);
|
||||
}
|
||||
}
|
||||
}
|
||||
return static_cast<result_type>(cmp * int_tmp_result_agX3WsT);
|
||||
}
|
||||
else
|
||||
return Base::operator()(p,q,r,t);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,5 +8,5 @@ is available in:
|
|||
Mikhail Bogdanov, Olivier Devillers, and Monique Teillaud. Hyperbolic
|
||||
Delaunay complexes and Voronoi diagrams made practical. Journal of
|
||||
Computational Geometry, 5(1):56–85, 2014.
|
||||
URL: https://hal.inria.fr/hal-00961390,
|
||||
URL: https://inria.hal.science/hal-00961390,
|
||||
doi:10.20382/jocg.v5i1a4.
|
||||
|
|
@ -22,7 +22,7 @@ Release date: October 2023
|
|||
has been removed.
|
||||
|
||||
#### Envelopes of Surfaces in 3D
|
||||
- ** Breaking change**: Construct_projected_boundary_2 in `EnvelopeTraits_3` is now using `std::variant` instead of `Object`
|
||||
- **Breaking change**: Construct_projected_boundary_2 in `EnvelopeTraits_3` is now using `std::variant` instead of `Object`
|
||||
|
||||
### [Combinatorial Maps](https://doc.cgal.org/6.0/Manual/packages.html#PkgCombinatorialMaps) and [Generalized Maps](https://doc.cgal.org/6.0/Manual/packages.html#PkgGeneralizedMaps)
|
||||
|
||||
|
|
@ -36,6 +36,11 @@ Release date: October 2023
|
|||
- Removed the class templates `Gray_image_mesh_domain_3`, `Implicit_mesh_domain_3`, and `Labeled_image_mesh_domain_3`
|
||||
which are deprecated since CGAL-4.13.
|
||||
|
||||
### [Polygon Mesh Processing](https://doc.cgal.org/6.0/Manual/packages.html#PkgPolygonMeshProcessing)
|
||||
|
||||
- Added the function `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures()` which can be used to compute
|
||||
the mean and Gaussian curvatures, as well as the principal curvature and directions.
|
||||
|
||||
### [2D Arrangements](https://doc.cgal.org/6.0/Manual/packages.html#PkgArrangementOnSurface2)
|
||||
- Fixed a bug in the zone construction code applied to arrangements of geodesic arcs on a sphere,
|
||||
when inserting an arc that lies on the identification curve.
|
||||
|
|
@ -56,6 +61,9 @@ Release date: October 2023
|
|||
### [Surface Mesh Parameterization](https://doc.cgal.org/6.0/Manual/packages.html#PkgSurfaceMeshParameterization)
|
||||
- **Breaking change**: LSCM_parameterizer_3 needs Eigen
|
||||
|
||||
### [3D Triangulations](https://doc.cgal.org/6.0/Manual/packages.html#PkgTriangulation3)
|
||||
- Added three functions `vertices()` to the class `Triangulation_3`.
|
||||
Each of them returns an array containing the vertices of the given triangulation simplex.
|
||||
|
||||
[Release 5.6](https://github.com/CGAL/cgal/releases/tag/v5.6)
|
||||
-----------
|
||||
|
|
|
|||
|
|
@ -0,0 +1,54 @@
|
|||
// Copyright (c) 2016 GeometryFactory SARL (France).
|
||||
// All rights reserved.
|
||||
//
|
||||
// This file is part of CGAL (www.cgal.org)
|
||||
//
|
||||
// $URL$
|
||||
// $Id$
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
|
||||
//
|
||||
// Author(s) : Andreas Fabri
|
||||
//
|
||||
// Warning: this file is generated, see include/CGAL/licence/README.md
|
||||
|
||||
#ifndef CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURES_H
|
||||
#define CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURES_H
|
||||
|
||||
#include <CGAL/config.h>
|
||||
#include <CGAL/license.h>
|
||||
|
||||
#ifdef CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURES_COMMERCIAL_LICENSE
|
||||
|
||||
# if CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURES_COMMERCIAL_LICENSE < CGAL_RELEASE_DATE
|
||||
|
||||
# if defined(CGAL_LICENSE_WARNING)
|
||||
|
||||
CGAL_pragma_warning("Your commercial license for CGAL does not cover "
|
||||
"this release of the Polygon Mesh Processing - Interpolated Corrected Curvatures package.")
|
||||
# endif
|
||||
|
||||
# ifdef CGAL_LICENSE_ERROR
|
||||
# error "Your commercial license for CGAL does not cover this release \
|
||||
of the Polygon Mesh Processing - Interpolated Corrected Curvatures package. \
|
||||
You get this error, as you defined CGAL_LICENSE_ERROR."
|
||||
# endif // CGAL_LICENSE_ERROR
|
||||
|
||||
# endif // CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURES_COMMERCIAL_LICENSE < CGAL_RELEASE_DATE
|
||||
|
||||
#else // no CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURES_COMMERCIAL_LICENSE
|
||||
|
||||
# if defined(CGAL_LICENSE_WARNING)
|
||||
CGAL_pragma_warning("\nThe macro CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURES_COMMERCIAL_LICENSE is not defined."
|
||||
"\nYou use the CGAL Polygon Mesh Processing - Interpolated Corrected Curvatures package under "
|
||||
"the terms of the GPLv3+.")
|
||||
# endif // CGAL_LICENSE_WARNING
|
||||
|
||||
# ifdef CGAL_LICENSE_ERROR
|
||||
# error "The macro CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURES_COMMERCIAL_LICENSE is not defined.\
|
||||
You use the CGAL Polygon Mesh Processing - Interpolated Corrected Curvatures package under the terms of \
|
||||
the GPLv3+. You get this error, as you defined CGAL_LICENSE_ERROR."
|
||||
# endif // CGAL_LICENSE_ERROR
|
||||
|
||||
#endif // no CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURES_COMMERCIAL_LICENSE
|
||||
|
||||
#endif // CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURES_H
|
||||
|
|
@ -51,6 +51,7 @@ Polygon_mesh_processing/connected_components Polygon Mesh Processing - Connected
|
|||
Polygon_mesh_processing/corefinement Polygon Mesh Processing - Corefinement
|
||||
Polygon_mesh_processing/core Polygon Mesh Processing - Core
|
||||
Polygon_mesh_processing/distance Polygon Mesh Processing - Distance
|
||||
Polygon_mesh_processing/interpolated_corrected_curvatures Polygon Mesh Processing - Interpolated Corrected Curvatures
|
||||
Polygon_mesh_processing/measure Polygon Mesh Processing - Geometric Measure
|
||||
Polygon_mesh_processing/meshing_hole_filling Polygon Mesh Processing - Meshing and Hole Filling
|
||||
Polygon_mesh_processing/orientation Polygon Mesh Processing - Orientation
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
namespace CGAL {
|
||||
|
||||
/*!
|
||||
\ingroup kernel_affine
|
||||
\ingroup kernel_classes2
|
||||
|
||||
The class `Aff_transformation_2` represents two-dimensional affine transformations.
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ namespace CGAL {
|
|||
|
||||
/*!
|
||||
\ingroup kernel_classes3
|
||||
\ingroup kernel_affine
|
||||
|
||||
The class `Aff_transformation_3` represents three-dimensional affine transformations.
|
||||
The general form of an affine transformation is based on a homogeneous
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
namespace CGAL {
|
||||
|
||||
/*!
|
||||
\ingroup kernel_affine
|
||||
\ingroup PkgKernel23Ref
|
||||
|
||||
Tag class for affine transformations.
|
||||
|
||||
|
|
@ -24,7 +24,7 @@ public:
|
|||
namespace CGAL {
|
||||
|
||||
/*!
|
||||
\ingroup kernel_affine
|
||||
\ingroup PkgKernel23Ref
|
||||
|
||||
Tag class for affine transformations.
|
||||
|
||||
|
|
@ -46,7 +46,7 @@ public:
|
|||
namespace CGAL {
|
||||
|
||||
/*!
|
||||
\ingroup kernel_affine
|
||||
\ingroup PkgKernel23Ref
|
||||
|
||||
Tag class for affine transformations.
|
||||
|
||||
|
|
@ -68,7 +68,7 @@ public:
|
|||
namespace CGAL {
|
||||
|
||||
/*!
|
||||
\ingroup kernel_affine
|
||||
\ingroup PkgKernel23Ref
|
||||
|
||||
Tag class for affine transformations.
|
||||
|
||||
|
|
@ -90,7 +90,7 @@ public:
|
|||
namespace CGAL {
|
||||
|
||||
/*!
|
||||
\ingroup kernel_affine
|
||||
\ingroup PkgKernel23Ref
|
||||
|
||||
Tag class for affine transformations.
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ function are available.
|
|||
|
||||
/*!
|
||||
\addtogroup do_intersect_linear_grp
|
||||
\ingroup do_intersect
|
||||
\ingroup do_intersect_grp
|
||||
|
||||
\sa `do_intersect_circular_grp`
|
||||
\sa `do_intersect_spherical_grp`
|
||||
|
|
@ -79,7 +79,7 @@ function are available.
|
|||
|
||||
/*!
|
||||
\addtogroup intersection_linear_grp
|
||||
\ingroup intersection
|
||||
\ingroup intersection_grp
|
||||
|
||||
*/
|
||||
/// @{
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@
|
|||
// To avoid verbose function and named parameters call
|
||||
using namespace CGAL::parameters;
|
||||
|
||||
|
||||
template <typename Concurrency_tag>
|
||||
void test()
|
||||
{
|
||||
|
|
@ -31,7 +32,7 @@ void test()
|
|||
std::size_t nb_runs = 2;
|
||||
unsigned int nb_lloyd = 2;
|
||||
unsigned int nb_odt = 2;
|
||||
double perturb_bound = 10.;
|
||||
double perturb_bound = 7.;
|
||||
double exude_bound = 15.;
|
||||
|
||||
// Domain
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ public:
|
|||
namespace CGAL {
|
||||
|
||||
/*!
|
||||
\ingroup PkgMinkowskiSum2Classes
|
||||
\ingroup PkgMinkowskiSum2Ref
|
||||
|
||||
The `Hertel_Mehlhorn_convex_decomposition_2` class implements the approximation algorithm of Hertel
|
||||
and Mehlhorn for decomposing a polygon into convex
|
||||
|
|
|
|||
|
|
@ -18,9 +18,6 @@
|
|||
/// \defgroup nt_cgal CGAL Number Types
|
||||
/// \ingroup PkgNumberTypesRef
|
||||
|
||||
/// \defgroup nt_cgal CGAL Number Types
|
||||
/// \ingroup PkgNumberTypesRef
|
||||
|
||||
/// \defgroup nt_rrational Relates Rational
|
||||
/// \ingroup PkgNumberTypesRef
|
||||
|
||||
|
|
|
|||
|
|
@ -8,15 +8,4 @@
|
|||
<enableAddressBar>false</enableAddressBar>
|
||||
<enableFilterFunctionality>false</enableFilterFunctionality>
|
||||
</assistant>
|
||||
<docFiles>
|
||||
<generate>
|
||||
<file>
|
||||
<input>Periodic_3_triangulation_3.qhp</input>
|
||||
<output>Periodic_3_triangulation_3.qch</output>
|
||||
</file>
|
||||
</generate>
|
||||
<register>
|
||||
<file>Periodic_3_triangulation_3.qch</file>
|
||||
</register>
|
||||
</docFiles>
|
||||
</QHelpCollectionProject>
|
||||
|
|
|
|||
|
|
@ -8,15 +8,4 @@
|
|||
<enableAddressBar>false</enableAddressBar>
|
||||
<enableFilterFunctionality>false</enableFilterFunctionality>
|
||||
</assistant>
|
||||
<docFiles>
|
||||
<generate>
|
||||
<file>
|
||||
<input>Periodic_Lloyd_3.qhp</input>
|
||||
<output>Periodic_Lloyd_3.qch</output>
|
||||
</file>
|
||||
</generate>
|
||||
<register>
|
||||
<file>Periodic_Lloyd_3.qch</file>
|
||||
</register>
|
||||
</docFiles>
|
||||
</QHelpCollectionProject>
|
||||
|
|
|
|||
|
|
@ -39,11 +39,7 @@
|
|||
|
||||
#include <CGAL/property_map.h>
|
||||
#include <boost/graph/adjacency_list.hpp>
|
||||
#include <CGAL/boost/graph/dijkstra_shortest_paths.h> // work around a
|
||||
// bug in boost
|
||||
// 1.54
|
||||
|
||||
|
||||
#include <boost/graph/dijkstra_shortest_paths.hpp>
|
||||
#include <boost/graph/prim_minimum_spanning_tree.hpp>
|
||||
|
||||
#if defined(BOOST_MSVC)
|
||||
|
|
@ -553,9 +549,6 @@ create_mst_graph(
|
|||
For this reason it should not be called on sorted containers.
|
||||
It is based on \cgalCite{cgal:hddms-srup-92}.
|
||||
|
||||
\warning This function may fail when Boost version 1.54 is used,
|
||||
because of the following bug: https://svn.boost.org/trac/boost/ticket/9012
|
||||
|
||||
\pre Normals must be unit vectors
|
||||
\pre `k >= 2`
|
||||
|
||||
|
|
|
|||
|
|
@ -23,6 +23,17 @@ EXCLUDE_SYMBOLS += experimental
|
|||
HTML_EXTRA_FILES = ${CGAL_PACKAGE_DOC_DIR}/fig/selfintersections.jpg \
|
||||
${CGAL_PACKAGE_DOC_DIR}/fig/mesh_smoothing.png \
|
||||
${CGAL_PACKAGE_DOC_DIR}/fig/shape_smoothing.png \
|
||||
${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmax0.040000-0.000000.jpg \
|
||||
${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmin0.040000-0.000000.jpg \
|
||||
${CGAL_PACKAGE_DOC_DIR}/fig/bimba-gaussian0.040000-0.000000.jpg \
|
||||
${CGAL_PACKAGE_DOC_DIR}/fig/bimba-mean0.020000-0.000000.jpg \
|
||||
${CGAL_PACKAGE_DOC_DIR}/fig/bimba-mean0.020000-0.002000.jpg \
|
||||
${CGAL_PACKAGE_DOC_DIR}/fig/bimba-mean0.030000-0.000000.jpg \
|
||||
${CGAL_PACKAGE_DOC_DIR}/fig/bimba-mean0.030000-0.002000.jpg \
|
||||
${CGAL_PACKAGE_DOC_DIR}/fig/bimba-mean0.040000-0.000000.jpg \
|
||||
${CGAL_PACKAGE_DOC_DIR}/fig/bimba-mean0.040000-0.002000.jpg \
|
||||
${CGAL_PACKAGE_DOC_DIR}/fig/bimba-mean0.050000-0.000000.jpg \
|
||||
${CGAL_PACKAGE_DOC_DIR}/fig/bimba-mean0.050000-0.002000.jpg \
|
||||
${CGAL_PACKAGE_DOC_DIR}/fig/decimate_cheese.png \
|
||||
${CGAL_PACKAGE_DOC_DIR}/fig/decimate_colors.png \
|
||||
${CGAL_PACKAGE_DOC_DIR}/fig/decimate_rg_joint.png
|
||||
|
|
|
|||
|
|
@ -16,6 +16,10 @@
|
|||
/// Functions to triangulate faces, and to refine and fair regions of a polygon mesh.
|
||||
/// \ingroup PkgPolygonMeshProcessingRef
|
||||
|
||||
/// \defgroup PMP_corrected_curvatures_grp Corrected Curvature Computation
|
||||
/// Functions to compute the corrected curvatures of a polygon mesh.
|
||||
/// \ingroup PkgPolygonMeshProcessingRef
|
||||
|
||||
/// \defgroup PMP_normal_grp Normal Computation
|
||||
/// Functions to compute unit normals for individual/all vertices or faces.
|
||||
/// \ingroup PkgPolygonMeshProcessingRef
|
||||
|
|
@ -75,7 +79,7 @@
|
|||
\cgalPkgPicture{hole_filling_ico.png}
|
||||
|
||||
\cgalPkgSummaryBegin
|
||||
\cgalPkgAuthors{Sébastien Loriot, Mael Rouxel-Labbé, Jane Tournois, and Ilker %O. Yaz}
|
||||
\cgalPkgAuthors{David Coeurjolly, Jaques-Olivier Lachaud, Konstantinos Katrioplas, Sébastien Loriot, Mael Rouxel-Labbé, Hossam Saeed, Jane Tournois, and Ilker %O. Yaz}
|
||||
\cgalPkgDesc{This package provides a collection of methods and classes for polygon mesh processing,
|
||||
ranging from basic operations on simplices, to complex geometry processing algorithms such as
|
||||
Boolean operations, remeshing, repairing, collision and intersection detection, and more.}
|
||||
|
|
@ -208,6 +212,9 @@ The page \ref bgl_namedparameters "Named Parameters" describes their usage.
|
|||
- \link PMP_locate_grp Nearest Face Location Queries \endlink
|
||||
- \link PMP_locate_grp Random Location Generation \endlink
|
||||
|
||||
\cgalCRPSection{Corrected Curvatures}
|
||||
- `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures()`
|
||||
|
||||
\cgalCRPSection{Normal Computation Functions}
|
||||
- `CGAL::Polygon_mesh_processing::compute_face_normal()`
|
||||
- `CGAL::Polygon_mesh_processing::compute_face_normals()`
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ namespace CGAL {
|
|||
\anchor Chapter_PolygonMeshProcessing
|
||||
|
||||
\cgalAutoToc
|
||||
\authors Sébastien Loriot, Mael Rouxel-Labbé, Jane Tournois, Ilker %O. Yaz
|
||||
\authors David Coeurjolly, Jaques-Olivier Lachaud, Konstantinos Katrioplas, Sébastien Loriot, Mael Rouxel-Labbé, Hossam Saeed, Jane Tournois, and Ilker %O. Yaz
|
||||
|
||||
\image html neptun_head.jpg
|
||||
\image latex neptun_head.jpg
|
||||
|
|
@ -49,6 +49,7 @@ mesh, which includes point location and self intersection tests.
|
|||
- \ref PMPCombinatorialRepair : repair of polygon meshes and polygon soups.
|
||||
- \ref PMPGeometricRepair : repair of the geometry of polygon meshes.
|
||||
- \ref PMPNormalComp : normal computation at vertices and on faces of a polygon mesh.
|
||||
- \ref PMPICC : computing curvatures (mean, gaussian, principal) on a polygon mesh.
|
||||
- \ref PMPSlicer : functor able to compute the intersections of a polygon mesh with arbitrary planes (slicer).
|
||||
- \ref PMPConnectedComponents : methods to deal with connected
|
||||
components of a polygon mesh (extraction, marks, removal, ...).
|
||||
|
|
@ -935,6 +936,144 @@ not provide storage for the normals.
|
|||
|
||||
\cgalExample{Polygon_mesh_processing/compute_normals_example_Polyhedron.cpp}
|
||||
|
||||
****************************************
|
||||
\section PMPICC Computing Curvatures
|
||||
|
||||
This package provides methods to compute curvatures on polygonal meshes based on Interpolated
|
||||
Corrected Curvatures on Polyhedral Surfaces \cgalCite{cgal:lrtc-iccmps-20}. This includes mean curvature,
|
||||
Gaussian curvature, principal curvatures and directions. These can be computed on triangle meshes,
|
||||
quad meshes, and meshes with n-gon faces (for n-gons, the centroid must be inside the n-gon face).
|
||||
The algorithms used prove to work well in general. Also, on meshes with noise on vertex positions,
|
||||
they give accurate results, under the condition that the correct vertex normals are provided.
|
||||
|
||||
\subsection ICCBackground Brief Background
|
||||
|
||||
Surface curvatures are quantities that describe the local geometry of a surface. They are important in many
|
||||
geometry processing applications. As surfaces are 2-dimensional objects (embedded in 3D), they can bend
|
||||
in 2 independent directions. These directions are called principal directions, and the amount of bending
|
||||
in each direction is called the principal curvature: \f$ k_1 \f$ and \f$ k_2 \f$ (denoting max and min
|
||||
curvatures). Curvature is usually expressed as scalar quantities like the mean curvature \f$ H \f$ and
|
||||
the Gaussian curvature \f$ K \f$ which are defined in terms of the principal curvatures.
|
||||
|
||||
The algorithms are based on the two papers \cgalCite{cgal:lrt-ccm-22} and \cgalCite{cgal:lrtc-iccmps-20}. They
|
||||
introduce a new way to compute curvatures on polygonal meshes. The main idea in \cgalCite{cgal:lrt-ccm-22} is
|
||||
based on decoupling the normal information from the position information, which is useful for dealing with
|
||||
digital surfaces, or meshes with noise on vertex positions. \cgalCite{cgal:lrtc-iccmps-20} introduces some
|
||||
extensions to this framework, as it uses linear interpolation on the corrected normal vector field
|
||||
to derive new closed form equations for the corrected curvature measures. These <b>interpolated</b>
|
||||
curvature measures are the first step for computing the curvatures. For a triangle \f$ \tau_{ijk} \f$,
|
||||
with vertices \a i, \a j, \a k:
|
||||
|
||||
\f[
|
||||
\begin{align*}
|
||||
\mu^{(0)}(\tau_{ijk}) = &\frac{1}{2} \langle \bar{\mathbf{u}} \mid (\mathbf{x}_j - \mathbf{x}_i) \times (\mathbf{x}_k - \mathbf{x}_i) \rangle, \\
|
||||
\mu^{(1)}(\tau_{ijk}) = &\frac{1}{2} \langle \bar{\mathbf{u}} \mid (\mathbf{u}_k - \mathbf{u}_j) \times \mathbf{x}_i + (\mathbf{u}_i - \mathbf{u}_k) \times \mathbf{x}_j + (\mathbf{u}_j - \mathbf{u}_i) \times \mathbf{x}_k \rangle, \\
|
||||
\mu^{(2)}(\tau_{ijk}) = &\frac{1}{2} \langle \mathbf{u}_i \mid \mathbf{u}_j \times \mathbf{u}_k \rangle, \\
|
||||
\mu^{\mathbf{X},\mathbf{Y}}(\tau_{ijk}) = & \frac{1}{2} \big\langle \bar{\mathbf{u}} \big| \langle \mathbf{Y} | \mathbf{u}_k -\mathbf{u}_i \rangle \mathbf{X} \times (\mathbf{x}_j - \mathbf{x}_i) \big\rangle
|
||||
-\frac{1}{2} \big\langle \bar{\mathbf{u}} \big| \langle \mathbf{Y} | \mathbf{u}_j -\mathbf{u}_i \rangle \mathbf{X} \times (\mathbf{x}_k - \mathbf{x}_i) \big\rangle,
|
||||
\end{align*}
|
||||
\f]
|
||||
where \f$ \langle \cdot \mid \cdot \rangle \f$ denotes the usual scalar product,
|
||||
\f$ \bar{\mathbf{u}}=\frac{1}{3}( \mathbf{u}_i + \mathbf{u}_j + \mathbf{u}_k )\f$.
|
||||
|
||||
The first measure \f$ \mu^{(0)} \f$ is the area measure of the triangle, and the measures \f$ \mu^{(1)} \f$ and
|
||||
\f$ \mu^{(2)} \f$ are the mean and Gaussian corrected curvature measures of the triangle. The last measure
|
||||
\f$ \mu^{\mathbf{X},\mathbf{Y}} \f$ is the anisotropic corrected curvature measure of the triangle. The
|
||||
anisotropic measure is later used to compute the principal curvatures and directions through an eigenvalue
|
||||
solver.
|
||||
|
||||
The interpolated curvature measures are then computed for each vertex \f$ v \f$ as the sum of
|
||||
the curvature measures of the faces in a ball around \f$ v \f$ weighted by the inclusion ratio of the
|
||||
triangle in the ball. If the ball radius is not specified, the sum is instead computed over the incident faces
|
||||
of \f$ v \f$.
|
||||
|
||||
To get the final curvature value for a vertex \f$ v \f$, the respective interpolated curvature measure
|
||||
is divided by the interpolated area measure.
|
||||
|
||||
\f[
|
||||
\mu^{(k)}( B ) = \sum_{\tau : \text{triangle} } \mu^{(k)}( \tau ) \frac{\mathrm{Area}( \tau \cap B )}{\mathrm{Area}(\tau)}.
|
||||
\f]
|
||||
|
||||
\subsection ICCAPI API
|
||||
|
||||
The implementation is generic in terms of mesh data structure. It can be used on `Surface_mesh`,
|
||||
`Polyhedron_3` and other polygonal mesh structures based on the concept `FaceGraph`.
|
||||
|
||||
These computations are performed using (on all vertices of the mesh) `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures()`
|
||||
where function named parameters are used to select the curvatures (and possibly directions) to be computed. An overload function with the same name
|
||||
but taking a given vertex is also available in case the computation should be done only for that vertex.
|
||||
|
||||
\subsection ICCResults Results & Performance
|
||||
|
||||
First, \cgalFigureRef{icc_measures} illustrates various curvature measures on a triangular mesh.
|
||||
|
||||
\cgalFigureAnchor{icc_measures}
|
||||
<center>
|
||||
<table border=0>
|
||||
<tr>
|
||||
<td><img src="bimba-mean0.040000-0.000000.jpg" style="width:100%;"/></td>
|
||||
<td><img src="bimba-gaussian0.040000-0.000000.jpg" style="width:100%;"/></td>
|
||||
<td><img src="bimba-dmin0.040000-0.000000.jpg" style="width:100%;"/></td>
|
||||
<td><img src="bimba-dmax0.040000-0.000000.jpg" style="width:100%;"/></td>
|
||||
</tr>
|
||||
<tr align="center"><td>(a)</td><td>(b)</td></tr>
|
||||
</table>
|
||||
</center>
|
||||
|
||||
|
||||
\cgalFigureCaptionBegin{icc_measures}
|
||||
Mean curvature, Gaussian curvature, minimal principal curvature direction and maximal principal curvature direction on a mesh (ball radius set to 0.04).
|
||||
\cgalFigureCaptionEnd
|
||||
|
||||
\cgalFigureAnchor{icc_various_ball_radii}
|
||||
<center>
|
||||
<table border=0>
|
||||
<tr>
|
||||
<td><img src="bimba-mean0.020000-0.000000.jpg" style="width:100%;"/></td>
|
||||
<td><img src="bimba-mean0.030000-0.000000.jpg" style="width:100%;"/></td>
|
||||
<td><img src="bimba-mean0.040000-0.000000.jpg" style="width:100%;"/></td>
|
||||
<td><img src="bimba-mean0.050000-0.000000.jpg" style="width:100%;"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="bimba-mean0.020000-0.002000.jpg" style="width:100%;"/></td>
|
||||
<td><img src="bimba-mean0.030000-0.002000.jpg" style="width:100%;"/></td>
|
||||
<td><img src="bimba-mean0.040000-0.002000.jpg" style="width:100%;"/></td>
|
||||
<td><img src="bimba-mean0.050000-0.002000.jpg" style="width:100%;"/></td>
|
||||
</tr>
|
||||
<tr align="center"><td>(a)</td><td>(b)</td></tr>
|
||||
</table>
|
||||
</center>
|
||||
\cgalFigureCaptionBegin{icc_various_ball_radii}
|
||||
When changing the integration ball radius, we obtain a scale space of curvature measure that can be used to tackle possible noise in the input as illustrated in the second row (mean curvature only with fixed colormap ranges and ball radii in {0.02,0.03,0.04,0.05}).
|
||||
\cgalFigureCaptionEnd
|
||||
|
||||
|
||||
\ref BGLPropertyMaps are used to record the computed curvatures as shown in examples. In the following examples, for each property map, we associate
|
||||
a curvature value to each vertex.
|
||||
|
||||
\subsection ICCExampleSM Interpolated Corrected Curvatures on a Surface Mesh Example
|
||||
|
||||
The following example illustrates how to
|
||||
compute the curvatures on vertices
|
||||
and store them in the property maps provided by the class `Surface_mesh`.
|
||||
|
||||
\cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_SM.cpp}
|
||||
|
||||
\subsection ICCExamplePH Interpolated Corrected Curvatures on a Polyhedron Example
|
||||
|
||||
The following example illustrates how to
|
||||
compute the curvatures on vertices
|
||||
and store them in dynamic property maps as the class `Polyhedron_3` does
|
||||
not provide storage for the curvatures.
|
||||
|
||||
\cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_PH.cpp}
|
||||
|
||||
\subsection ICCExampleSV Interpolated Corrected Curvatures on a Vertex Example
|
||||
|
||||
The following example illustrates how to
|
||||
compute the curvatures on a specific vertex.
|
||||
|
||||
\cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_vertex.cpp}
|
||||
|
||||
****************************************
|
||||
\section PMPSlicer Slicer
|
||||
|
|
@ -1143,6 +1282,10 @@ available on 7th of October 2020. It only uses the high level algorithm of chec
|
|||
is covered by a set of prisms, where each prism is an offset for an input triangle.
|
||||
That is, the implementation in \cgal does not use indirect predicates.
|
||||
|
||||
The interpolated corrected curvatures were implemented during GSoC 2022. This was implemented by Hossam Saeed and under
|
||||
supervision of David Coeurjolly, Jaques-Olivier Lachaud, and Sébastien Loriot. The implementation is based on \cgalCite{cgal:lrtc-iccmps-20}.
|
||||
<a href="https://dgtal-team.github.io/doc-nightly/moduleCurvatureMeasures.html">DGtal's implementation</a> was also
|
||||
used as a reference during the project.
|
||||
|
||||
*/
|
||||
} /* namespace CGAL */
|
||||
|
|
|
|||
|
|
@ -19,6 +19,9 @@
|
|||
\example Polygon_mesh_processing/refine_fair_example.cpp
|
||||
\example Polygon_mesh_processing/mesh_slicer_example.cpp
|
||||
\example Polygon_mesh_processing/isotropic_remeshing_example.cpp
|
||||
\example Polygon_mesh_processing/interpolated_corrected_curvatures_SM.cpp
|
||||
\example Polygon_mesh_processing/interpolated_corrected_curvatures_PH.cpp
|
||||
\example Polygon_mesh_processing/interpolated_corrected_curvatures_vertex.cpp
|
||||
\example Polygon_mesh_processing/delaunay_remeshing_example.cpp
|
||||
\example Polygon_mesh_processing/compute_normals_example_Polyhedron.cpp
|
||||
\example Polygon_mesh_processing/hausdorff_distance_remeshing_example.cpp
|
||||
|
|
|
|||
|
After Width: | Height: | Size: 138 KiB |
|
After Width: | Height: | Size: 164 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 76 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 74 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 72 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 71 KiB |
|
|
@ -73,6 +73,12 @@ if(TARGET CGAL::Eigen3_support)
|
|||
target_link_libraries(delaunay_remeshing_example PUBLIC CGAL::Eigen3_support)
|
||||
create_single_source_cgal_program("remesh_almost_planar_patches.cpp")
|
||||
target_link_libraries(remesh_almost_planar_patches PUBLIC CGAL::Eigen3_support)
|
||||
create_single_source_cgal_program("interpolated_corrected_curvatures_SM.cpp")
|
||||
target_link_libraries(interpolated_corrected_curvatures_SM PUBLIC CGAL::Eigen3_support)
|
||||
create_single_source_cgal_program("interpolated_corrected_curvatures_PH.cpp")
|
||||
target_link_libraries(interpolated_corrected_curvatures_PH PUBLIC CGAL::Eigen3_support)
|
||||
create_single_source_cgal_program("interpolated_corrected_curvatures_vertex.cpp")
|
||||
target_link_libraries(interpolated_corrected_curvatures_vertex PUBLIC CGAL::Eigen3_support)
|
||||
else()
|
||||
message(STATUS "NOTICE: Examples that use Eigen will not be compiled.")
|
||||
endif()
|
||||
|
|
|
|||
|
|
@ -0,0 +1,57 @@
|
|||
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
||||
#include <CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h>
|
||||
#include <CGAL/Polygon_mesh_processing/IO/polygon_mesh_io.h>
|
||||
#include <CGAL/Polyhedron_3.h>
|
||||
#include <CGAL/property_map.h>
|
||||
|
||||
#include <boost/graph/graph_traits.hpp>
|
||||
|
||||
#include <iostream>
|
||||
#include <unordered_map>
|
||||
|
||||
namespace PMP = CGAL::Polygon_mesh_processing;
|
||||
|
||||
typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic_kernel;
|
||||
typedef CGAL::Polyhedron_3<Epic_kernel> Polyhedron;
|
||||
typedef boost::graph_traits<Polyhedron>::vertex_descriptor vertex_descriptor;
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
Polyhedron polyhedron;
|
||||
const std::string filename = (argc > 1) ?
|
||||
argv[1] :
|
||||
CGAL::data_file_path("meshes/sphere.off");
|
||||
|
||||
if (!CGAL::IO::read_polygon_mesh(filename, polyhedron))
|
||||
{
|
||||
std::cerr << "Invalid input file." << std::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
// define property map to store curvature value and directions
|
||||
boost::property_map<Polyhedron, CGAL::dynamic_vertex_property_t<Epic_kernel::FT>>::type
|
||||
mean_curvature_map = get(CGAL::dynamic_vertex_property_t<Epic_kernel::FT>(), polyhedron),
|
||||
Gaussian_curvature_map = get(CGAL::dynamic_vertex_property_t<Epic_kernel::FT>(), polyhedron);
|
||||
|
||||
boost::property_map<Polyhedron, CGAL::dynamic_vertex_property_t<PMP::Principal_curvatures_and_directions<Epic_kernel>>>::type
|
||||
principal_curvatures_and_directions_map =
|
||||
get(CGAL::dynamic_vertex_property_t<PMP::Principal_curvatures_and_directions<Epic_kernel>>(), polyhedron);
|
||||
|
||||
PMP::interpolated_corrected_curvatures(polyhedron,
|
||||
CGAL::parameters::vertex_mean_curvature_map(mean_curvature_map)
|
||||
.vertex_Gaussian_curvature_map(Gaussian_curvature_map)
|
||||
.vertex_principal_curvatures_and_directions_map(principal_curvatures_and_directions_map)
|
||||
// uncomment to use an expansion ball radius of 0.5 to estimate the curvatures
|
||||
// .ball_radius(0.5)
|
||||
);
|
||||
|
||||
int i = 0;
|
||||
for (vertex_descriptor v : vertices(polyhedron))
|
||||
{
|
||||
auto PC = get(principal_curvatures_and_directions_map, v);
|
||||
std::cout << i << ": HC = " << get(mean_curvature_map, v)
|
||||
<< ", GC = " << get(Gaussian_curvature_map, v) << "\n"
|
||||
<< ", PC = [ " << PC.min_curvature << " , " << PC.max_curvature << " ]\n";
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
||||
#include <CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h>
|
||||
#include <CGAL/Polygon_mesh_processing/IO/polygon_mesh_io.h>
|
||||
#include <CGAL/Surface_mesh.h>
|
||||
#include <CGAL/property_map.h>
|
||||
|
||||
#include <boost/graph/graph_traits.hpp>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
namespace PMP = CGAL::Polygon_mesh_processing;
|
||||
|
||||
typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic_kernel;
|
||||
typedef CGAL::Surface_mesh<Epic_kernel::Point_3> Surface_Mesh;
|
||||
typedef boost::graph_traits<Surface_Mesh>::vertex_descriptor vertex_descriptor;
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
Surface_Mesh smesh;
|
||||
const std::string filename = (argc > 1) ?
|
||||
argv[1] :
|
||||
CGAL::data_file_path("meshes/sphere.off");
|
||||
|
||||
if (!CGAL::IO::read_polygon_mesh(filename, smesh))
|
||||
{
|
||||
std::cerr << "Invalid input file." << std::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
// creating and tying surface mesh property maps for curvatures (with defaults = 0)
|
||||
bool created = false;
|
||||
Surface_Mesh::Property_map<vertex_descriptor, Epic_kernel::FT>
|
||||
mean_curvature_map, Gaussian_curvature_map;
|
||||
|
||||
boost::tie(mean_curvature_map, created) =
|
||||
smesh.add_property_map<vertex_descriptor, Epic_kernel::FT>("v:mean_curvature_map", 0);
|
||||
assert(created);
|
||||
|
||||
boost::tie(Gaussian_curvature_map, created) =
|
||||
smesh.add_property_map<vertex_descriptor, Epic_kernel::FT>("v:Gaussian_curvature_map", 0);
|
||||
assert(created);
|
||||
|
||||
// we use a tuple of 2 scalar values and 2 vectors for principal curvatures and directions
|
||||
Surface_Mesh::Property_map<vertex_descriptor, PMP::Principal_curvatures_and_directions<Epic_kernel>>
|
||||
principal_curvatures_and_directions_map;
|
||||
|
||||
boost::tie(principal_curvatures_and_directions_map, created) =
|
||||
smesh.add_property_map<vertex_descriptor, PMP::Principal_curvatures_and_directions<Epic_kernel>>
|
||||
("v:principal_curvatures_and_directions_map", { 0, 0,
|
||||
Epic_kernel::Vector_3(0,0,0),
|
||||
Epic_kernel::Vector_3(0,0,0) });
|
||||
assert(created);
|
||||
|
||||
PMP::interpolated_corrected_curvatures(smesh,
|
||||
CGAL::parameters::vertex_mean_curvature_map(mean_curvature_map)
|
||||
.vertex_Gaussian_curvature_map(Gaussian_curvature_map)
|
||||
.vertex_principal_curvatures_and_directions_map(principal_curvatures_and_directions_map)
|
||||
// uncomment to use an expansion ball radius of 0.5 to estimate the curvatures
|
||||
// .ball_radius(0.5)
|
||||
);
|
||||
|
||||
|
||||
for (vertex_descriptor v : vertices(smesh))
|
||||
{
|
||||
auto PC = principal_curvatures_and_directions_map[v];
|
||||
std::cout << v.idx() << ": HC = " << mean_curvature_map[v]
|
||||
<< ", GC = " << Gaussian_curvature_map[v] << "\n"
|
||||
<< ", PC = [ " << PC.min_curvature << " , " << PC.max_curvature << " ]\n";
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
||||
#include <CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h>
|
||||
#include <CGAL/Polygon_mesh_processing/IO/polygon_mesh_io.h>
|
||||
#include <CGAL/Surface_mesh.h>
|
||||
|
||||
#include <boost/graph/graph_traits.hpp>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
namespace PMP = CGAL::Polygon_mesh_processing;
|
||||
|
||||
typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic_kernel;
|
||||
typedef CGAL::Surface_mesh<Epic_kernel::Point_3> Surface_Mesh;
|
||||
typedef boost::graph_traits<Surface_Mesh>::vertex_descriptor vertex_descriptor;
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
// instantiating and reading mesh
|
||||
Surface_Mesh smesh;
|
||||
const std::string filename = (argc > 1) ?
|
||||
argv[1] :
|
||||
CGAL::data_file_path("meshes/sphere.off");
|
||||
|
||||
if (!CGAL::IO::read_polygon_mesh(filename, smesh))
|
||||
{
|
||||
std::cerr << "Invalid input file." << std::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
// loop over vertices and use vertex_descriptor to compute a curvature on one vertex
|
||||
for (vertex_descriptor v : vertices(smesh))
|
||||
{
|
||||
double h, g;
|
||||
PMP::Principal_curvatures_and_directions<Epic_kernel> p;
|
||||
|
||||
PMP::interpolated_corrected_curvatures(v,
|
||||
smesh,
|
||||
CGAL::parameters::vertex_mean_curvature(std::ref(h))
|
||||
.vertex_Gaussian_curvature(std::ref(g))
|
||||
.vertex_principal_curvatures_and_directions(std::ref(p)));
|
||||
|
||||
// we can also specify a ball radius for expansion and a user defined vertex normals map using
|
||||
// named parameters. Refer to interpolated_corrected_curvatures_SM.cpp to see example usage.
|
||||
|
||||
|
||||
std::cout << v.idx() << ": HC = " << h
|
||||
<< ", GC = " << g << "\n"
|
||||
<< ", PC = [ " << p.min_curvature << " , " << p.max_curvature << " ]\n";
|
||||
}
|
||||
}
|
||||
|
|
@ -1150,6 +1150,9 @@ bool adapt_patch(std::vector<std::vector<Point> >& point_patch,
|
|||
put(local_vpm, v, projector(get(local_vpm, v)));
|
||||
|
||||
// The projector can create degenerate faces
|
||||
for (halfedge_descriptor h : border_hedges)
|
||||
if (is_degenerate_triangle_face(face(opposite(h, local_mesh), local_mesh), local_mesh))
|
||||
return !has_SI;
|
||||
if(!remove_degenerate_faces(local_mesh))
|
||||
return !has_SI;
|
||||
|
||||
|
|
@ -2031,7 +2034,7 @@ remove_self_intersections_one_step(std::set<typename boost::graph_traits<Triangl
|
|||
|
||||
#ifdef CGAL_PMP_REMOVE_SELF_INTERSECTION_OUTPUT_INTERMEDIATE_FULL_MESH
|
||||
fname = "results/mesh_at_step_"+std::to_string(step)+"_CC_"+std::to_string(cc_id)+".off";
|
||||
CGAL::IO::write_polygon_mesh(fname, tmesh, CGAL::parameters::stream_precision);
|
||||
CGAL::IO::write_polygon_mesh(fname, tmesh, CGAL::parameters::stream_precision(17));
|
||||
#endif
|
||||
|
||||
// expand the region to be filled
|
||||
|
|
|
|||
|
|
@ -49,21 +49,3 @@
|
|||
#include <CGAL/Polygon_mesh_processing/smooth_mesh.h>
|
||||
#include <CGAL/Polygon_mesh_processing/smooth_shape.h>
|
||||
#include <CGAL/Polygon_mesh_processing/manifoldness.h>
|
||||
|
||||
// the named parameter header being not documented the doc is put here for now
|
||||
#ifdef DOXYGEN_RUNNING
|
||||
namespace CGAL {
|
||||
namespace Polygon_mesh_processing {
|
||||
namespace parameters {
|
||||
|
||||
/*! \ingroup namedparameters
|
||||
\deprecated This function is deprecated and `default_values()` should be used instead.
|
||||
This function can be used to indicate that all optional named parameters
|
||||
to be used are the default ones. This is particularly useful when a function
|
||||
requires more than one sequence of named parameters and default values is
|
||||
fine only for some of them.
|
||||
*/
|
||||
unspecified_type all_default();
|
||||
|
||||
} } } // end of namespace CGAL::Polygon_mesh_processing::parameters
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -80,6 +80,8 @@ if(TARGET CGAL::Eigen3_support)
|
|||
target_link_libraries(test_shape_smoothing PUBLIC CGAL::Eigen3_support)
|
||||
create_single_source_cgal_program("delaunay_remeshing_test.cpp")
|
||||
target_link_libraries(delaunay_remeshing_test PUBLIC CGAL::Eigen3_support)
|
||||
create_single_source_cgal_program("test_interpolated_corrected_curvatures.cpp")
|
||||
target_link_libraries(test_interpolated_corrected_curvatures PUBLIC CGAL::Eigen3_support)
|
||||
create_single_source_cgal_program("test_decimation_of_planar_patches.cpp")
|
||||
target_link_libraries(test_decimation_of_planar_patches PUBLIC CGAL::Eigen3_support)
|
||||
else()
|
||||
|
|
|
|||
|
|
@ -0,0 +1,229 @@
|
|||
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
||||
#include <CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h>
|
||||
#include <CGAL/Polygon_mesh_processing/random_perturbation.h>
|
||||
#include <CGAL/Polygon_mesh_processing/IO/polygon_mesh_io.h>
|
||||
#include <CGAL/Surface_mesh.h>
|
||||
#include <CGAL/Polyhedron_3.h>
|
||||
#include <CGAL/property_map.h>
|
||||
|
||||
#include <boost/graph/graph_traits.hpp>
|
||||
|
||||
#include <iostream>
|
||||
#include <unordered_map>
|
||||
|
||||
#define ABS_ERROR 1e-6
|
||||
|
||||
namespace PMP = CGAL::Polygon_mesh_processing;
|
||||
|
||||
typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic_kernel;
|
||||
typedef CGAL::Surface_mesh<Epic_kernel::Point_3> SMesh;
|
||||
typedef CGAL::Polyhedron_3<Epic_kernel> Polyhedron;
|
||||
|
||||
struct Average_test_info {
|
||||
Epic_kernel::FT expansion_radius = -1;
|
||||
Epic_kernel::FT mean_curvature_avg;
|
||||
Epic_kernel::FT gaussian_curvature_avg;
|
||||
Epic_kernel::FT principal_curvature_avg;
|
||||
Epic_kernel::FT tolerance = 0.9;
|
||||
|
||||
Average_test_info(
|
||||
Epic_kernel::FT mean_curvature_avg,
|
||||
Epic_kernel::FT gaussian_curvature_avg,
|
||||
Epic_kernel::FT principal_curvature_avg,
|
||||
Epic_kernel::FT expansion_radius = -1,
|
||||
Epic_kernel::FT tolerance = 0.9
|
||||
) :
|
||||
expansion_radius(expansion_radius),
|
||||
mean_curvature_avg(mean_curvature_avg),
|
||||
gaussian_curvature_avg(gaussian_curvature_avg),
|
||||
principal_curvature_avg(principal_curvature_avg),
|
||||
tolerance(tolerance)
|
||||
{
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
bool passes_comparison(Epic_kernel::FT result, Epic_kernel::FT expected, Epic_kernel::FT tolerance) {
|
||||
if (abs(expected) < ABS_ERROR && abs(result) < ABS_ERROR)
|
||||
return true; // expected 0, got 0
|
||||
else if (abs(expected) < ABS_ERROR)
|
||||
return false; // expected 0, got non-0
|
||||
|
||||
return (std::min)(result, expected) / (std::max)(result, expected) > tolerance;
|
||||
}
|
||||
|
||||
template <typename PolygonMesh>
|
||||
void test_average_curvatures(std::string mesh_path,
|
||||
Average_test_info test_info,
|
||||
bool compare_single_vertex = false,
|
||||
int scale_factor_exponent = 0
|
||||
) {
|
||||
typedef typename boost::graph_traits<PolygonMesh>::vertex_descriptor vertex_descriptor;
|
||||
|
||||
PolygonMesh pmesh;
|
||||
const std::string filename = CGAL::data_file_path(mesh_path);
|
||||
|
||||
if (!CGAL::IO::read_polygon_mesh(filename, pmesh) || faces(pmesh).size() == 0)
|
||||
{
|
||||
std::cerr << "Invalid input file." << std::endl;
|
||||
}
|
||||
|
||||
// The following part is used to scale the given mesh and expected curvatures by a constant factor
|
||||
// this is used to test the stability of the implementation across different scales
|
||||
if (scale_factor_exponent) {
|
||||
Epic_kernel::FT factor = pow(10, scale_factor_exponent);
|
||||
|
||||
test_info.expansion_radius *= factor;
|
||||
test_info.mean_curvature_avg /= factor;
|
||||
test_info.gaussian_curvature_avg /= factor * factor;
|
||||
test_info.principal_curvature_avg /= factor;
|
||||
|
||||
auto vpm = get(CGAL::vertex_point, pmesh);
|
||||
|
||||
for (vertex_descriptor vi : vertices(pmesh)) {
|
||||
Epic_kernel::Point_3 pi = get(vpm, vi);
|
||||
Epic_kernel::Point_3 pi_new(pi.x() * factor, pi.y() * factor, pi.z() * factor);
|
||||
put(vpm, vi, pi_new);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
typename boost::property_map<PolygonMesh, CGAL::dynamic_vertex_property_t<Epic_kernel::FT>>::type
|
||||
mean_curvature_map = get(CGAL::dynamic_vertex_property_t<Epic_kernel::FT>(), pmesh),
|
||||
gaussian_curvature_map = get(CGAL::dynamic_vertex_property_t<Epic_kernel::FT>(), pmesh);
|
||||
typename boost::property_map
|
||||
<PolygonMesh, CGAL::dynamic_vertex_property_t<PMP::Principal_curvatures_and_directions<Epic_kernel>>>::type
|
||||
principal_curvatures_and_directions_map =
|
||||
get(CGAL::dynamic_vertex_property_t<PMP::Principal_curvatures_and_directions<Epic_kernel>>(), pmesh);
|
||||
|
||||
PMP::interpolated_corrected_curvatures(
|
||||
pmesh,
|
||||
CGAL::parameters::ball_radius(test_info.expansion_radius)
|
||||
.vertex_mean_curvature_map(mean_curvature_map)
|
||||
.vertex_Gaussian_curvature_map(gaussian_curvature_map)
|
||||
.vertex_principal_curvatures_and_directions_map(principal_curvatures_and_directions_map)
|
||||
);
|
||||
|
||||
Epic_kernel::FT mean_curvature_avg = 0, gaussian_curvature_avg = 0, principal_curvature_avg = 0;
|
||||
|
||||
for (vertex_descriptor v : vertices(pmesh)) {
|
||||
mean_curvature_avg += get(mean_curvature_map, v);
|
||||
gaussian_curvature_avg += get(gaussian_curvature_map, v);
|
||||
principal_curvature_avg += get(principal_curvatures_and_directions_map, v).min_curvature
|
||||
+ get(principal_curvatures_and_directions_map, v).max_curvature;
|
||||
}
|
||||
|
||||
mean_curvature_avg /= vertices(pmesh).size();
|
||||
gaussian_curvature_avg /= vertices(pmesh).size();
|
||||
principal_curvature_avg /= vertices(pmesh).size() * 2;
|
||||
|
||||
// are average curvatures equal to expected?
|
||||
assert(passes_comparison(mean_curvature_avg, test_info.mean_curvature_avg, test_info.tolerance));
|
||||
assert(passes_comparison(gaussian_curvature_avg, test_info.gaussian_curvature_avg, test_info.tolerance));
|
||||
assert(passes_comparison(principal_curvature_avg, test_info.principal_curvature_avg, test_info.tolerance));
|
||||
|
||||
Epic_kernel::FT new_mean_curvature_avg = 0, new_Gaussian_curvature_avg = 0, new_principal_curvature_avg = 0;
|
||||
|
||||
for (vertex_descriptor v : vertices(pmesh)) {
|
||||
new_mean_curvature_avg += get(mean_curvature_map, v);
|
||||
new_Gaussian_curvature_avg += get(gaussian_curvature_map, v);
|
||||
new_principal_curvature_avg += get(principal_curvatures_and_directions_map, v).min_curvature
|
||||
+ get(principal_curvatures_and_directions_map, v).max_curvature;
|
||||
}
|
||||
|
||||
new_mean_curvature_avg /= vertices(pmesh).size();
|
||||
new_Gaussian_curvature_avg /= vertices(pmesh).size();
|
||||
new_principal_curvature_avg /= vertices(pmesh).size() * 2;
|
||||
|
||||
// are average curvatures computed from interpolated_corrected_curvatures()
|
||||
// equal to average curvatures each computed on its own?
|
||||
assert(passes_comparison(mean_curvature_avg, new_mean_curvature_avg, 0.99));
|
||||
assert(passes_comparison(gaussian_curvature_avg, new_Gaussian_curvature_avg, 0.99));
|
||||
assert(passes_comparison(principal_curvature_avg, new_principal_curvature_avg, 0.99));
|
||||
|
||||
if (compare_single_vertex) {
|
||||
// computing curvatures together from interpolated_corrected_curvatures()
|
||||
|
||||
Epic_kernel::FT single_vertex_mean_curvature_avg = 0,
|
||||
single_vertex_Gaussian_curvature_avg = 0,
|
||||
single_vertex_principal_curvature_avg = 0;
|
||||
|
||||
Epic_kernel::FT h, g;
|
||||
PMP::Principal_curvatures_and_directions<Epic_kernel> p;
|
||||
|
||||
for (vertex_descriptor v : vertices(pmesh)) {
|
||||
PMP::interpolated_corrected_curvatures(
|
||||
v,
|
||||
pmesh,
|
||||
CGAL::parameters::vertex_Gaussian_curvature(std::ref(g))
|
||||
.vertex_mean_curvature(std::ref(h))
|
||||
.vertex_principal_curvatures_and_directions(std::ref(p))
|
||||
.ball_radius(test_info.expansion_radius)
|
||||
);
|
||||
|
||||
single_vertex_mean_curvature_avg += h;
|
||||
single_vertex_Gaussian_curvature_avg += g;
|
||||
single_vertex_principal_curvature_avg += p.min_curvature + p.max_curvature;
|
||||
}
|
||||
|
||||
single_vertex_mean_curvature_avg /= vertices(pmesh).size();
|
||||
single_vertex_Gaussian_curvature_avg /= vertices(pmesh).size();
|
||||
single_vertex_principal_curvature_avg /= vertices(pmesh).size() * 2;
|
||||
|
||||
assert(passes_comparison(mean_curvature_avg, single_vertex_mean_curvature_avg, 0.99));
|
||||
assert(passes_comparison(gaussian_curvature_avg, single_vertex_Gaussian_curvature_avg, 0.99));
|
||||
assert(passes_comparison(principal_curvature_avg, single_vertex_principal_curvature_avg, 0.99));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
// testing on a simple sphere(r = 0.5), on both Polyhedron & SurfaceMesh:
|
||||
// For this mesh, ina addition to the whole mesh functions, we also compare against the single vertex
|
||||
// curvature functions to make sure the produce the same results
|
||||
// Expected: Mean Curvature = 2, Gaussian Curvature = 4, Principal Curvatures = 2 & 2 so 2 on avg.
|
||||
test_average_curvatures<Polyhedron>("meshes/sphere.off", Average_test_info(2, 4, 2), true);
|
||||
test_average_curvatures<SMesh>("meshes/sphere.off", Average_test_info(2, 4, 2), true);
|
||||
|
||||
// Same mesh but with specified expansion radii of 0 and 0.25 (half radius of sphere)
|
||||
test_average_curvatures<SMesh>("meshes/sphere.off", Average_test_info(2, 4, 2, 0), true);
|
||||
test_average_curvatures<SMesh>("meshes/sphere.off", Average_test_info(2, 4, 2, 0.25), true);
|
||||
|
||||
// testing on a simple sphere(r = 10), on both Polyhedron & SurfaceMesh:
|
||||
// Expected: Mean Curvature = 0.1, Gaussian Curvature = 0.01, Principal Curvatures = 0.1 & 0.1 so 0.1 on avg.
|
||||
test_average_curvatures<Polyhedron>("meshes/sphere966.off", Average_test_info(0.1, 0.01, 0.1));
|
||||
test_average_curvatures<SMesh>("meshes/sphere966.off", Average_test_info(0.1, 0.01, 0.1));
|
||||
|
||||
// Same mesh but with specified expansion radii of 0 and 5 (half radius of sphere)
|
||||
test_average_curvatures<SMesh>("meshes/sphere966.off", Average_test_info(0.1, 0.01, 0.1, 0));
|
||||
test_average_curvatures<SMesh>("meshes/sphere966.off", Average_test_info(0.1, 0.01, 0.1, 5));
|
||||
|
||||
// testing on a simple half cylinder(r = 1), on both Polyhedron & SurfaceMesh:
|
||||
// Expected: Mean Curvature = 0.5, Gaussian Curvature = 0, Principal Curvatures = 0 & 1 so 0.5 on avg.
|
||||
test_average_curvatures<Polyhedron>("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5));
|
||||
test_average_curvatures<SMesh>("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5));
|
||||
|
||||
// Same mesh but with specified expansion radii of 0 and 0.5 (half radius of cylinder)
|
||||
test_average_curvatures<SMesh>("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0));
|
||||
test_average_curvatures<SMesh>("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0.5));
|
||||
|
||||
// Same tests as last one, but with a scaling on the mesh with different values to check for scale stability
|
||||
test_average_curvatures<SMesh>("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0), false, -6);
|
||||
test_average_curvatures<SMesh>("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0.5), false, -6);
|
||||
|
||||
test_average_curvatures<SMesh>("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0), false, -3);
|
||||
test_average_curvatures<SMesh>("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0.5), false, -3);
|
||||
|
||||
test_average_curvatures<SMesh>("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0), false, -1);
|
||||
test_average_curvatures<SMesh>("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0.5), false, -1);
|
||||
|
||||
test_average_curvatures<SMesh>("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0), false, 1);
|
||||
test_average_curvatures<SMesh>("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0.5), false, 1);
|
||||
|
||||
test_average_curvatures<SMesh>("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0), false, 3);
|
||||
test_average_curvatures<SMesh>("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0.5), false, 3);
|
||||
|
||||
test_average_curvatures<SMesh>("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0), false, 6);
|
||||
test_average_curvatures<SMesh>("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0.5), false, 6);
|
||||
}
|
||||
|
|
@ -18,6 +18,10 @@
|
|||
#include <CGAL/Polygonal_surface_reconstruction/internal/hypothesis.h>
|
||||
#include <CGAL/Polygonal_surface_reconstruction/internal/compute_confidences.h>
|
||||
#include <CGAL/Polygonal_surface_reconstruction/internal/point_set_with_planes.h>
|
||||
#include <CGAL/Polygon_mesh_processing/orient_polygon_soup.h>
|
||||
#include <CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h>
|
||||
#include <CGAL/Polygon_mesh_processing/polygon_mesh_to_polygon_soup.h>
|
||||
#include <CGAL/Polygon_mesh_processing/repair_polygon_soup.h>
|
||||
|
||||
#include <unordered_map>
|
||||
|
||||
|
|
@ -28,7 +32,7 @@
|
|||
namespace CGAL {
|
||||
|
||||
/*!
|
||||
\ingroup PkgPolygonalSurfaceReconstruction
|
||||
\ingroup PkgPolygonalSurfaceReconstructionRef
|
||||
|
||||
\brief
|
||||
|
||||
|
|
@ -455,7 +459,12 @@ namespace CGAL {
|
|||
|
||||
// Converts from internal data structure to the required `PolygonMesh`.
|
||||
output_mesh.clear(); // make sure it is empty.
|
||||
CGAL::copy_face_graph(target_mesh, output_mesh);
|
||||
std::vector<Point> points;
|
||||
std::vector<std::vector<std::size_t> > polygons;
|
||||
CGAL::Polygon_mesh_processing::polygon_mesh_to_polygon_soup(target_mesh, points, polygons);
|
||||
CGAL::Polygon_mesh_processing::merge_duplicate_points_in_polygon_soup(points, polygons);
|
||||
CGAL::Polygon_mesh_processing::orient_polygon_soup(points, polygons);
|
||||
CGAL::Polygon_mesh_processing::polygon_soup_to_polygon_mesh(points, polygons, output_mesh);
|
||||
}
|
||||
else {
|
||||
error_message_ = "solving the binary program failed";
|
||||
|
|
|
|||
|
|
@ -67,6 +67,18 @@ namespace CGAL {
|
|||
delete supporting_plane_;
|
||||
supporting_plane_ = new Plane;
|
||||
CGAL::linear_least_squares_fitting_3(pts.begin(), pts.end(), *supporting_plane_, CGAL::Dimension_tag<0>());
|
||||
|
||||
// Check orientation
|
||||
int vote_for_opposite = 0;
|
||||
for (std::size_t i = 0; i < size(); i++)
|
||||
if (supporting_plane_->orthogonal_vector() * point_set_->normal_map()[at(i)] < 0)
|
||||
vote_for_opposite++;
|
||||
else
|
||||
vote_for_opposite--;
|
||||
|
||||
if (vote_for_opposite > 0)
|
||||
*supporting_plane_ = supporting_plane_->opposite();
|
||||
|
||||
return supporting_plane_;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ Point_set_3
|
|||
Point_set_processing_3
|
||||
Polygon
|
||||
Polygonal_surface_reconstruction
|
||||
Polygon_mesh_processing
|
||||
Principal_component_analysis
|
||||
Principal_component_analysis_LGPL
|
||||
Profiling_tools
|
||||
|
|
|
|||
|
|
@ -179,6 +179,7 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND)
|
|||
Viewer_interface_moc.cpp
|
||||
Scene_item_moc.cpp
|
||||
Scene_item.cpp
|
||||
Scene_item_with_properties.cpp
|
||||
Triangle_container.cpp
|
||||
Edge_container.cpp
|
||||
Point_container.cpp
|
||||
|
|
|
|||
|
|
@ -22,11 +22,13 @@
|
|||
#include <CGAL/Polygon_mesh_processing/compute_normal.h>
|
||||
#include <CGAL/Polygon_mesh_processing/measure.h>
|
||||
#include <CGAL/Polygon_mesh_processing/triangulate_faces.h>
|
||||
#include <CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h>
|
||||
|
||||
#include <QAbstractItemView>
|
||||
#include <QAction>
|
||||
#include <QApplication>
|
||||
#include <QColor>
|
||||
#include <QSlider>
|
||||
#include <QColorDialog>
|
||||
#include <QInputDialog>
|
||||
#include <QMainWindow>
|
||||
|
|
@ -47,6 +49,8 @@
|
|||
|
||||
using namespace CGAL::Three;
|
||||
|
||||
|
||||
|
||||
Viewer_interface* (&getActiveViewer)() = Three::activeViewer;
|
||||
|
||||
class DockWidget
|
||||
|
|
@ -99,6 +103,11 @@ private:
|
|||
MAX_VALUE
|
||||
};
|
||||
|
||||
enum CurvatureType {
|
||||
MEAN_CURVATURE,
|
||||
GAUSSIAN_CURVATURE
|
||||
};
|
||||
|
||||
public:
|
||||
bool applicable(QAction*) const Q_DECL_OVERRIDE
|
||||
{
|
||||
|
|
@ -238,6 +247,14 @@ private:
|
|||
dock_widget->maxBox->setRange(0, 360);
|
||||
dock_widget->maxBox->setValue(0);
|
||||
}
|
||||
else if (property_name == "Interpolated Corrected Gaussian Curvature" ||
|
||||
property_name == "Interpolated Corrected Mean Curvature")
|
||||
{
|
||||
dock_widget->minBox->setRange(-1000, 1000);
|
||||
dock_widget->minBox->setValue(0);
|
||||
dock_widget->maxBox->setRange(-1000, 1000);
|
||||
dock_widget->maxBox->setValue(0);
|
||||
}
|
||||
else if(property_name == "Scaled Jacobian")
|
||||
{
|
||||
dock_widget->minBox->setRange(-1000, 1000);
|
||||
|
|
@ -432,11 +449,15 @@ private:
|
|||
dock_widget->propertyBox->addItems({"Smallest Angle Per Face",
|
||||
"Largest Angle Per Face",
|
||||
"Scaled Jacobian",
|
||||
"Face Area"});
|
||||
"Face Area",
|
||||
"Interpolated Corrected Mean Curvature",
|
||||
"Interpolated Corrected Gaussian Curvature"});
|
||||
property_simplex_types = { Property_simplex_type::FACE,
|
||||
Property_simplex_type::FACE,
|
||||
Property_simplex_type::FACE,
|
||||
Property_simplex_type::FACE };
|
||||
Property_simplex_type::FACE,
|
||||
Property_simplex_type::VERTEX,
|
||||
Property_simplex_type::VERTEX };
|
||||
detectSMScalarProperties(*(sm_item->face_graph()));
|
||||
}
|
||||
else if(ps_item)
|
||||
|
|
@ -506,10 +527,15 @@ private:
|
|||
{
|
||||
CGAL_assertion(static_cast<std::size_t>(dock_widget->propertyBox->count()) == property_simplex_types.size());
|
||||
|
||||
const int property_index = dock_widget->propertyBox->currentIndex();
|
||||
|
||||
// leave it flat if it was, otherwise set to flat+edges
|
||||
if(sm_item->renderingMode() != Flat && sm_item->renderingMode() != FlatPlusEdges)
|
||||
if(sm_item->renderingMode() != Flat && sm_item->renderingMode() != FlatPlusEdges && property_simplex_types.at(property_index) == Property_simplex_type::FACE)
|
||||
sm_item->setRenderingMode(FlatPlusEdges);
|
||||
|
||||
if(sm_item->renderingMode() != Gouraud && sm_item->renderingMode() != GouraudPlusEdges && property_simplex_types.at(property_index) == Property_simplex_type::VERTEX)
|
||||
sm_item->setRenderingMode(GouraudPlusEdges);
|
||||
|
||||
const std::string& property_name = dock_widget->propertyBox->currentText().toStdString();
|
||||
if(property_name == "Smallest Angle Per Face")
|
||||
{
|
||||
|
|
@ -527,6 +553,14 @@ private:
|
|||
{
|
||||
displayArea(sm_item);
|
||||
}
|
||||
else if(property_name == "Interpolated Corrected Mean Curvature")
|
||||
{
|
||||
displayCurvature(sm_item, MEAN_CURVATURE);
|
||||
}
|
||||
else if(property_name == "Interpolated Corrected Gaussian Curvature")
|
||||
{
|
||||
displayCurvature(sm_item, GAUSSIAN_CURVATURE);
|
||||
}
|
||||
else
|
||||
{
|
||||
const int property_index = dock_widget->propertyBox->currentIndex();
|
||||
|
|
@ -629,6 +663,8 @@ private:
|
|||
removeDisplayPluginProperty(item, "f:display_plugin_largest_angle");
|
||||
removeDisplayPluginProperty(item, "f:display_plugin_scaled_jacobian");
|
||||
removeDisplayPluginProperty(item, "f:display_plugin_area");
|
||||
removeDisplayPluginProperty(item, "f:display_plugin_mean_curvature");
|
||||
removeDisplayPluginProperty(item, "f:display_plugin_gaussian_curvature");
|
||||
}
|
||||
|
||||
void displayExtremumAnglePerFace(Scene_surface_mesh_item* sm_item,
|
||||
|
|
@ -809,6 +845,32 @@ private:
|
|||
displaySMProperty<face_descriptor>("f:display_plugin_area", *sm);
|
||||
}
|
||||
|
||||
void displayCurvature(Scene_surface_mesh_item* sm_item,
|
||||
const CurvatureType curvature_type)
|
||||
{
|
||||
SMesh* sm = sm_item->face_graph();
|
||||
if(sm == nullptr)
|
||||
return;
|
||||
|
||||
bool not_initialized;
|
||||
std::string tied_string = (curvature_type == MEAN_CURVATURE) ?
|
||||
"v:display_plugin_mean_curvature" : "v:display_plugin_gaussian_curvature";
|
||||
|
||||
SMesh::Property_map<vertex_descriptor, double> vcurvature;
|
||||
std::tie(vcurvature, not_initialized) = sm->add_property_map<vertex_descriptor, double>(tied_string, 0);
|
||||
|
||||
if (curvature_type == MEAN_CURVATURE)
|
||||
{
|
||||
CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures(*sm, CGAL::parameters::vertex_mean_curvature(vcurvature));
|
||||
}
|
||||
else if (curvature_type == GAUSSIAN_CURVATURE)
|
||||
{
|
||||
CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures(*sm, CGAL::parameters::vertex_Gaussian_curvature(vcurvature));
|
||||
}
|
||||
|
||||
displaySMProperty<vertex_descriptor>(tied_string, *sm);
|
||||
}
|
||||
|
||||
private:
|
||||
template<typename Functor>
|
||||
bool call_on_PS_property(const std::string& name,
|
||||
|
|
@ -964,6 +1026,10 @@ private:
|
|||
zoomToSimplexWithPropertyExtremum(faces(mesh), mesh, "f:display_plugin_scaled_jacobian", extremum);
|
||||
else if(property_name == "Face Area")
|
||||
zoomToSimplexWithPropertyExtremum(faces(mesh), mesh, "f:display_plugin_area", extremum);
|
||||
else if(property_name == "Interpolated Corrected Mean Curvature")
|
||||
zoomToSimplexWithPropertyExtremum(vertices(mesh), mesh, "v:display_plugin_mean_curvature", extremum);
|
||||
else if(property_name == "Interpolated Corrected Gaussian Curvature")
|
||||
zoomToSimplexWithPropertyExtremum(vertices(mesh), mesh, "v:display_plugin_gaussian_curvature", extremum);
|
||||
else if(property_simplex_types.at(property_index) == Property_simplex_type::VERTEX)
|
||||
zoomToSimplexWithPropertyExtremum(vertices(mesh), mesh, property_name, extremum);
|
||||
else if(property_simplex_types.at(property_index) == Property_simplex_type::FACE)
|
||||
|
|
@ -1298,7 +1364,10 @@ isSMPropertyScalar(const std::string& name,
|
|||
if(name == "f:display_plugin_smallest_angle" ||
|
||||
name == "f:display_plugin_largest_angle" ||
|
||||
name == "f:display_plugin_scaled_jacobian" ||
|
||||
name == "f:display_plugin_area")
|
||||
name == "f:display_plugin_area" ||
|
||||
name == "f:display_plugin_mean_curvature" ||
|
||||
name == "f:display_plugin_gaussian_curvature")
|
||||
|
||||
return false;
|
||||
|
||||
// the dispatch function does the filtering we want: if it founds a property
|
||||
|
|
|
|||
|
|
@ -39,7 +39,8 @@
|
|||
#include <CGAL/IO/Complex_3_in_triangulation_3_to_vtk.h>
|
||||
#include <CGAL/SMDS_3/tet_soup_to_c3t3.h>
|
||||
#include <CGAL/IO/output_to_vtu.h>
|
||||
#include <CGAL/boost/graph/io.h>
|
||||
#include <CGAL/boost/graph/IO/VTK.h>
|
||||
#include <CGAL/IO/VTK.h>
|
||||
|
||||
#include <vtkSmartPointer.h>
|
||||
#include <vtkDataSetReader.h>
|
||||
|
|
@ -352,10 +353,23 @@ public:
|
|||
|
||||
if(is_polygon_mesh)
|
||||
{
|
||||
FaceGraph* poly = new FaceGraph();
|
||||
auto poly = std::make_unique<FaceGraph>();
|
||||
Scene_item* poly_item = nullptr;
|
||||
if (CGAL::IO::internal::vtkPointSet_to_polygon_mesh(data, *poly, CGAL::parameters::default_values()))
|
||||
{
|
||||
Scene_facegraph_item* poly_item = new Scene_facegraph_item(poly);
|
||||
poly_item = new Scene_facegraph_item(poly.release());
|
||||
} else {
|
||||
poly.reset(nullptr);
|
||||
std::vector<Point_3> points;
|
||||
std::vector<std::vector<std::size_t> > polygons;
|
||||
if (CGAL::IO::internal::vtkPointSet_to_polygon_soup(data, points, polygons, CGAL::parameters::default_values()))
|
||||
{
|
||||
auto soup_item = new Scene_polygon_soup_item();
|
||||
soup_item->load(points, polygons);
|
||||
poly_item = soup_item;
|
||||
}
|
||||
}
|
||||
if(poly_item) {
|
||||
if(group)
|
||||
{
|
||||
poly_item->setName(QString("%1_faces").arg(fileinfo.baseName()));
|
||||
|
|
|
|||
|
|
@ -270,7 +270,9 @@ private:
|
|||
|
||||
Word_type image_data(int i, int j, int k)
|
||||
{
|
||||
if ( i>=0 && i<image_->xdim() && j>=0 && j<image_->ydim() && k>=0 && k<image_->zdim() )
|
||||
if ( i>=0 && static_cast<std::size_t>(i)<image_->xdim() &&
|
||||
j>=0 && static_cast<std::size_t>(j)<image_->ydim() &&
|
||||
k>=0 && static_cast<std::size_t>(k)<image_->zdim() )
|
||||
return image_->value(i, j, k);
|
||||
else
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -34,14 +34,14 @@ if(ITK_FOUND)
|
|||
target_link_libraries(mesh_3_plugin PUBLIC CGAL::ITK_support)
|
||||
endif(ITK_FOUND)
|
||||
|
||||
find_package(VTK QUIET COMPONENTS vtkImagingGeneral vtkIOImage NO_MODULE)
|
||||
find_package(VTK QUIET COMPONENTS vtkImagingGeneral vtkIOImage vtkIOXML NO_MODULE)
|
||||
if(VTK_FOUND)
|
||||
if(VTK_USE_FILE)
|
||||
include(${VTK_USE_FILE})
|
||||
endif()
|
||||
if("${VTK_VERSION_MAJOR}" GREATER "5" OR VTK_VERSION VERSION_GREATER 5)
|
||||
if(TARGET VTK::IOImage)
|
||||
set(VTK_LIBRARIES VTK::IOImage VTK::ImagingGeneral)
|
||||
set(VTK_LIBRARIES VTK::IOImage VTK::ImagingGeneral VTK::IOXML)
|
||||
endif()
|
||||
if(NOT VTK_LIBRARIES)
|
||||
message(STATUS "NOTICE: DICOM files (.dcm) require the VTK libraries, and will not be readable.")
|
||||
|
|
|
|||
|
|
@ -54,8 +54,10 @@
|
|||
#include <CGAL/IO/read_vtk_image_data.h>
|
||||
|
||||
#include <vtkNew.h>
|
||||
#include <vtkSmartPointer.h>
|
||||
#include <vtkStringArray.h>
|
||||
#include <vtkImageData.h>
|
||||
#include <vtkXMLImageDataReader.h>
|
||||
#include <vtkDICOMImageReader.h>
|
||||
#include <vtkBMPReader.h>
|
||||
#include <vtkNIFTIImageReader.h>
|
||||
|
|
@ -77,6 +79,23 @@
|
|||
#include <iostream>
|
||||
#include <locale>
|
||||
|
||||
template <class vtkReader>
|
||||
bool
|
||||
load_vtk_file(QFileInfo fileinfo, Image* image)
|
||||
{
|
||||
#ifdef CGAL_USE_VTK
|
||||
vtkNew<vtkReader> reader;
|
||||
reader->SetFileName(fileinfo.filePath().toUtf8());
|
||||
reader->Update();
|
||||
auto vtk_image = reader->GetOutput();
|
||||
vtk_image->Print(std::cerr);
|
||||
*image = CGAL::IO::read_vtk_image_data(vtk_image); // copy the image data
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
// Covariant return types don't work for scalar types and we cannot
|
||||
// have templates here, hence this unfortunate hack.
|
||||
|
||||
|
|
@ -1089,6 +1108,7 @@ QString Io_image_plugin::nameFilters() const
|
|||
return QString("Inrimage files (*.inr *.inr.gz) ;; "
|
||||
"Analyze files (*.hdr *.img *.img.gz) ;; "
|
||||
"Stanford Exploration Project files (*.H *.HH) ;; "
|
||||
"VTK image files (*.vti) ;; "
|
||||
"NRRD image files (*.nrrd) ;; "
|
||||
"NIFTI image files (*.nii *.nii.gz)");
|
||||
}
|
||||
|
|
@ -1121,6 +1141,7 @@ void convert(Image* image)
|
|||
image->image()->wordKind = WK_FLOAT;
|
||||
}
|
||||
|
||||
|
||||
QList<Scene_item*>
|
||||
Io_image_plugin::load(QFileInfo fileinfo, bool& ok, bool add_to_scene)
|
||||
{
|
||||
|
|
@ -1128,39 +1149,39 @@ Io_image_plugin::load(QFileInfo fileinfo, bool& ok, bool add_to_scene)
|
|||
QApplication::restoreOverrideCursor();
|
||||
Image* image = new Image;
|
||||
|
||||
// read a nrrd file
|
||||
if(fileinfo.suffix() == "nrrd")
|
||||
QString warningMessage;
|
||||
// read a vti file
|
||||
if(fileinfo.suffix() == "vti")
|
||||
{
|
||||
#ifdef CGAL_USE_VTK
|
||||
vtkNew<vtkNrrdReader> reader;
|
||||
reader->SetFileName(fileinfo.filePath().toUtf8());
|
||||
reader->Update();
|
||||
auto vtk_image = reader->GetOutput();
|
||||
vtk_image->Print(std::cerr);
|
||||
*image = CGAL::IO::read_vtk_image_data(vtk_image); // copy the image data
|
||||
ok = load_vtk_file<vtkXMLImageDataReader>(fileinfo, image);
|
||||
#else
|
||||
CGAL::Three::Three::warning("VTK is required to read NRRD files");
|
||||
delete image;
|
||||
return QList<Scene_item*>();
|
||||
ok = false;
|
||||
warningMessage = "VTK is required to read VTI files";
|
||||
#endif
|
||||
}
|
||||
|
||||
// read a nrrd file
|
||||
else if(fileinfo.suffix() == "nrrd")
|
||||
{
|
||||
#ifdef CGAL_USE_VTK
|
||||
ok = load_vtk_file<vtkNrrdReader>(fileinfo, image);
|
||||
#else
|
||||
ok = false;
|
||||
warningMessage = "VTK is required to read NRRD files";
|
||||
#endif
|
||||
}
|
||||
|
||||
// read a NIFTI file
|
||||
if(fileinfo.suffix() == "nii"
|
||||
else if(fileinfo.suffix() == "nii"
|
||||
|| ( fileinfo.suffix() == "gz"
|
||||
&& fileinfo.fileName().endsWith(QString(".nii.gz"), Qt::CaseInsensitive)))
|
||||
{
|
||||
#ifdef CGAL_USE_VTK
|
||||
vtkNew<vtkNIFTIImageReader> reader;
|
||||
reader->SetFileName(fileinfo.filePath().toUtf8());
|
||||
reader->Update();
|
||||
auto vtk_image = reader->GetOutput();
|
||||
vtk_image->Print(std::cerr);
|
||||
*image = CGAL::IO::read_vtk_image_data(vtk_image); // copy the image data
|
||||
ok = load_vtk_file<vtkNIFTIImageReader>(fileinfo, image);
|
||||
#else
|
||||
CGAL::Three::Three::warning("VTK is required to read NIfTI files");
|
||||
delete image;
|
||||
return QList<Scene_item*>();
|
||||
ok = false;
|
||||
warningMessage = "VTK is required to read NifTI files";
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -1267,10 +1288,15 @@ Io_image_plugin::load(QFileInfo fileinfo, bool& ok, bool add_to_scene)
|
|||
if(!success)
|
||||
{
|
||||
ok = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!ok) {
|
||||
if (warningMessage.length() > 0)
|
||||
CGAL::Three::Three::warning(warningMessage);
|
||||
delete image;
|
||||
return QList<Scene_item*>();
|
||||
}
|
||||
}
|
||||
|
||||
// Get display precision
|
||||
QDialog dialog;
|
||||
|
|
|
|||
|
|
@ -368,9 +368,9 @@ std::optional<QString> Mesh_3_plugin::get_items_or_return_error_string() const
|
|||
{
|
||||
auto poly_items_ptr = std::get_if<Polyhedral_mesh_items>(&items.value());
|
||||
auto image_items_ptr = std::get_if<Image_mesh_items>(&items.value());
|
||||
if(poly_items_ptr && poly_items_ptr == nullptr)
|
||||
if(poly_items_ptr != nullptr)
|
||||
poly_items_ptr->polylines_item = polylines_item;
|
||||
else if(image_items_ptr && image_items_ptr == nullptr)
|
||||
else if(image_items_ptr != nullptr )
|
||||
image_items_ptr->polylines_item = polylines_item;
|
||||
}
|
||||
|
||||
|
|
@ -663,6 +663,8 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type,
|
|||
ui.protectEdges->addItem(boundary_only.first, v(boundary_only.second));
|
||||
} else
|
||||
ui.protectEdges->addItem(sharp_edges.first, v(sharp_edges.second));
|
||||
if (polylines_item != nullptr)
|
||||
ui.protectEdges->addItem(input_polylines.first, v(input_polylines.second));
|
||||
} else if (items->index() == IMAGE_MESH_ITEMS) {
|
||||
if (polylines_item != nullptr) {
|
||||
ui.protectEdges->addItem(input_polylines.first, QVariant::fromValue(input_polylines.second));
|
||||
|
|
@ -729,6 +731,7 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type,
|
|||
const auto pe_flags = ui.protectEdges->currentData().value<Protection_flags>();
|
||||
protect_borders = ui.protect->isChecked() && pe_flags.testFlag(BORDERS);
|
||||
protect_features = ui.protect->isChecked() && pe_flags.testFlag(FEATURES);
|
||||
const bool protect_polylines = ui.protect->isChecked() && polylines_item != nullptr;
|
||||
|
||||
const bool detect_connected_components = ui.detectComponents->isChecked();
|
||||
const int manifold = (ui.manifoldCheckBox->isChecked() ? 1 : 0) +
|
||||
|
|
@ -775,7 +778,7 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type,
|
|||
sm_items.removeAll(make_not_null(bounding_sm_item));
|
||||
}
|
||||
|
||||
Scene_polylines_item::Polylines_container plc;
|
||||
Scene_polylines_item::Polylines_container polylines_empty_container;
|
||||
SMesh* bounding_polyhedron = (bounding_sm_item == nullptr)
|
||||
? nullptr
|
||||
: bounding_sm_item->polyhedron();
|
||||
|
|
@ -811,7 +814,7 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type,
|
|||
{
|
||||
thread = cgal_code_mesh_3(
|
||||
polyhedrons,
|
||||
(polylines_item == nullptr) ? plc : polylines_item->polylines,
|
||||
protect_polylines ? polylines_item->polylines : polylines_empty_container,
|
||||
bounding_polyhedron,
|
||||
item_name,
|
||||
angle,
|
||||
|
|
@ -878,11 +881,11 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type,
|
|||
? image_item->image_weights()
|
||||
: nullptr;
|
||||
|
||||
Scene_polylines_item::Polylines_container plc;
|
||||
Scene_polylines_item::Polylines_container polylines_empty_container;
|
||||
|
||||
thread = cgal_code_mesh_3(
|
||||
pImage,
|
||||
(img_polylines_item == nullptr) ? plc : img_polylines_item->polylines,
|
||||
(img_polylines_item == nullptr) ? polylines_empty_container : img_polylines_item->polylines,
|
||||
angle,
|
||||
facets_sizing,
|
||||
facets_min_sizing,
|
||||
|
|
@ -1035,6 +1038,8 @@ treat_result(Scene_item& source_item,
|
|||
float((bbox.ymin() + bbox.ymax())/2.f),
|
||||
float((bbox.zmin() + bbox.zmax())/2.f));
|
||||
|
||||
bool input_is_labeled_img = dynamic_cast<Scene_image_item*>(&source_item) != nullptr;
|
||||
result_item->setUseSubdomainColors(input_is_labeled_img);
|
||||
result_item->setColor(source_item.color());
|
||||
result_item->setRenderingMode(source_item.renderingMode());
|
||||
result_item->set_data_item(&source_item);
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@
|
|||
#include <CGAL/double.h>
|
||||
|
||||
#include "Scene_c3t3_item.h"
|
||||
#include "Scene_triangulation_3_item.h"
|
||||
#include "Scene_tetrahedra_item.h"
|
||||
#include "Messages_interface.h"
|
||||
#include "CGAL_double_edit.h"
|
||||
|
|
@ -58,6 +59,10 @@ public :
|
|||
addDockWidget(dock_widget);
|
||||
|
||||
connect(dock_widget->resetButton, &QPushButton::clicked, [this](){
|
||||
if(!tet_item)
|
||||
return;
|
||||
tet_item->c3t3_item()->resetVisibleSubdomain();
|
||||
tet_item->c3t3_item()->computeIntersection();
|
||||
filter();
|
||||
});
|
||||
}
|
||||
|
|
@ -129,6 +134,7 @@ public Q_SLOTS:
|
|||
connect(dock_widget->minEdit, &DoubleEdit::editingFinished, tet_item, QOverload<>::of(&Scene_tetrahedra_item::setMinThreshold));
|
||||
connect(dock_widget->maxEdit, &DoubleEdit::editingFinished, tet_item, QOverload<>::of(&Scene_tetrahedra_item::setMaxThreshold));
|
||||
|
||||
onFilterIndexChanged(dock_widget->filterBox->currentIndex());
|
||||
dock_widget->show();
|
||||
}
|
||||
|
||||
|
|
@ -150,14 +156,25 @@ public Q_SLOTS:
|
|||
if(!tet_item)
|
||||
return;
|
||||
Scene_c3t3_item* c3t3_item = tet_item->c3t3_item();
|
||||
if(c3t3_item->subdomain_indices().size() > 96)
|
||||
unsigned int max_number_of_item = 32*Scene_triangulation_3_item::number_of_bitset-1;
|
||||
if(c3t3_item->subdomain_indices().size() >= max_number_of_item)
|
||||
{
|
||||
QMessageBox::warning(nullptr, "Warning", tr("The filtering is only available for items with less than 96 subdomains, and this one has %1").arg(c3t3_item->subdomain_indices().size()));
|
||||
QString message = tr("The filtering is only available for items with less than %1 subdomains, and this one has %2")
|
||||
.arg(max_number_of_item)
|
||||
.arg(c3t3_item->subdomain_indices().size());
|
||||
QMessageBox::warning(nullptr, "Warning", message);
|
||||
return;
|
||||
}
|
||||
int counter = 0;
|
||||
int limit = static_cast<int>(std::ceil(CGAL::approximate_sqrt(EPICK::FT(c3t3_item->subdomain_indices().size()))));
|
||||
QGridLayout *layout = dock_widget->gridLayout;
|
||||
//delete all items (see https://stackoverflow.com/questions/4272196/qt-remove-all-widgets-from-layout)
|
||||
QLayoutItem* item;
|
||||
while ((item = layout->takeAt(0)))
|
||||
{
|
||||
delete item->widget();
|
||||
delete item;
|
||||
}
|
||||
for (std::set<int>::iterator it = c3t3_item->subdomain_indices().begin(),
|
||||
end = c3t3_item->subdomain_indices().end(); it != end; ++it)
|
||||
{
|
||||
|
|
@ -165,7 +182,7 @@ public Q_SLOTS:
|
|||
QPushButton* button = new QPushButton(tr("%1").arg(index));
|
||||
buttons.push_back(button);
|
||||
button->setCheckable(true);
|
||||
button->setChecked(true);
|
||||
button->setChecked(c3t3_item->isVisibleSubdomain(index));
|
||||
QColor color = c3t3_item->getSubdomainIndexColor(index);
|
||||
QString s("QPushButton { font-weight: bold; background: #"
|
||||
+ QString::number(90,16)
|
||||
|
|
|
|||
|
|
@ -973,7 +973,7 @@ void Scene_edit_box_item_priv::remodel_box(const QVector3D &dir)
|
|||
Q_FOREACH(Scene_edit_box_item::vertex* selected_vertex, selected_vertices )
|
||||
{
|
||||
int id = selected_vertex->id;
|
||||
CGAL_assume(id<8);
|
||||
CGAL_assume(id<8 && id >=0);
|
||||
*selected_vertex->x = applyX(id, last_pool[id][0], dir.x());
|
||||
*selected_vertex->y = applyY(id, last_pool[id][1], dir.y());
|
||||
*selected_vertex->z = applyZ(id, last_pool[id][2], dir.z());
|
||||
|
|
|
|||
|
|
@ -9,6 +9,20 @@ else()
|
|||
message(STATUS "NOTICE: Eigen 3.1 (or greater) was not found. Jet fitting plugin will not be available.")
|
||||
endif()
|
||||
|
||||
if(TARGET CGAL::Eigen3_support)
|
||||
|
||||
polyhedron_demo_plugin(interpolated_corrected_principal_curvatures_plugin Interpolated_corrected_principal_curvatures_plugin)
|
||||
target_link_libraries(
|
||||
interpolated_corrected_principal_curvatures_plugin PUBLIC scene_surface_mesh_item scene_polylines_item
|
||||
CGAL::Eigen3_support)
|
||||
|
||||
else()
|
||||
message(
|
||||
STATUS
|
||||
"NOTICE: Eigen 3.1 (or greater) was not found. Interpolated corrected principal curvatures plugin will not be available."
|
||||
)
|
||||
endif()
|
||||
|
||||
polyhedron_demo_plugin(extrude_plugin Extrude_plugin KEYWORDS PMP)
|
||||
target_link_libraries(extrude_plugin PUBLIC scene_surface_mesh_item
|
||||
scene_selection_item)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,180 @@
|
|||
#include <CGAL/Three/Polyhedron_demo_plugin_interface.h>
|
||||
#include <CGAL/property_map.h>
|
||||
#include <CGAL/Surface_mesh.h>
|
||||
#include "Scene_surface_mesh_item.h"
|
||||
#include "Scene_polylines_item.h"
|
||||
|
||||
#include <limits>
|
||||
|
||||
#include "Scene.h"
|
||||
#include <QApplication>
|
||||
#include <QMainWindow>
|
||||
|
||||
#include <CGAL/Polygon_mesh_processing/measure.h>
|
||||
#include <CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h>
|
||||
|
||||
using namespace CGAL::Three;
|
||||
class Polyhedron_demo_interpolated_corrected_principal_curvatures_and_directions_plugin :
|
||||
public QObject,
|
||||
public Polyhedron_demo_plugin_interface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(CGAL::Three::Polyhedron_demo_plugin_interface)
|
||||
Q_PLUGIN_METADATA(IID "com.geometryfactory.PolyhedronDemo.PluginInterface/1.0")
|
||||
|
||||
public:
|
||||
|
||||
QList<QAction*> actions() const {
|
||||
return _actions;
|
||||
}
|
||||
void init(QMainWindow* mw,
|
||||
Scene_interface* scene_interface,
|
||||
Messages_interface*)
|
||||
{
|
||||
scene = scene_interface;
|
||||
QAction *actionEstimateCurvature = new QAction(tr("Interpolated Corrected Principal Curvatures"), mw);
|
||||
connect(actionEstimateCurvature, SIGNAL(triggered()), this, SLOT(on_actionEstimateCurvature_triggered()));
|
||||
_actions <<actionEstimateCurvature;
|
||||
|
||||
}
|
||||
|
||||
bool applicable(QAction*) const {
|
||||
return qobject_cast<Scene_surface_mesh_item*>(scene->item(scene->mainSelectionIndex()));
|
||||
}
|
||||
|
||||
public Q_SLOTS:
|
||||
void on_actionEstimateCurvature_triggered();
|
||||
private :
|
||||
Scene_interface *scene;
|
||||
QList<QAction*> _actions;
|
||||
}; // end Polyhedron_demo_interpolated_corrected_principal_curvatures_and_directions_plugin
|
||||
|
||||
|
||||
void compute(SMesh* sMesh,
|
||||
Scene_polylines_item* max_curv,
|
||||
Scene_polylines_item* min_curv,
|
||||
Scene_polylines_item* max_negative_curv,
|
||||
Scene_polylines_item* min_negative_curv)
|
||||
{
|
||||
namespace PMP = CGAL::Polygon_mesh_processing;
|
||||
typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic_kernel;
|
||||
typedef Epic_kernel::Point_3 Point;
|
||||
typedef Epic_kernel::Point_3 Point;
|
||||
typedef Epic_kernel::Vector_3 Vector;
|
||||
typedef boost::graph_traits<SMesh>::vertex_descriptor Vertex_descriptor;
|
||||
|
||||
typename boost::property_map<SMesh, CGAL::vertex_point_t>::type vpmap = get(CGAL::vertex_point, *sMesh);
|
||||
|
||||
bool created = false;
|
||||
SMesh::Property_map<Vertex_descriptor, PMP::Principal_curvatures_and_directions<Epic_kernel>> principal_curvatures_and_directions_map;
|
||||
|
||||
boost::tie(principal_curvatures_and_directions_map, created) = sMesh->add_property_map<Vertex_descriptor, PMP::Principal_curvatures_and_directions<Epic_kernel>>
|
||||
("v:principal_curvatures_and_directions_map", { 0, 0,
|
||||
Vector(0,0,0),
|
||||
Vector(0,0,0) });
|
||||
assert(created);
|
||||
|
||||
|
||||
PMP::interpolated_corrected_curvatures(
|
||||
*sMesh,
|
||||
CGAL::parameters::ball_radius(0)
|
||||
.vertex_principal_curvatures_and_directions_map(principal_curvatures_and_directions_map)
|
||||
);
|
||||
|
||||
double max_curvature_magnitude_on_mesh = 0;
|
||||
for (Vertex_descriptor v : vertices(*sMesh))
|
||||
{
|
||||
const PMP::Principal_curvatures_and_directions<Epic_kernel> pc = principal_curvatures_and_directions_map[v];
|
||||
max_curvature_magnitude_on_mesh = std::max(max_curvature_magnitude_on_mesh, std::max(abs(pc.min_curvature), abs(pc.max_curvature)));
|
||||
}
|
||||
|
||||
for(Vertex_descriptor v : vertices(*sMesh))
|
||||
{
|
||||
std::vector<Point> points;
|
||||
|
||||
// pick central point
|
||||
const Point& central_point = get(vpmap,v);
|
||||
points.push_back(central_point);
|
||||
|
||||
// compute min edge len around central vertex
|
||||
// to scale the ribbons used to display the directions
|
||||
|
||||
const std::size_t n = CGAL::edges(*sMesh).size();
|
||||
|
||||
double avg_edge_length = 0;
|
||||
if (n > 0) {
|
||||
for (auto e : CGAL::edges(*sMesh))
|
||||
avg_edge_length += PMP::edge_length(e, *sMesh);
|
||||
avg_edge_length /= n;
|
||||
}
|
||||
|
||||
const PMP::Principal_curvatures_and_directions<Epic_kernel> pc = principal_curvatures_and_directions_map[v];
|
||||
|
||||
Vector umin = (pc.min_curvature / max_curvature_magnitude_on_mesh) * pc.min_direction * avg_edge_length;
|
||||
Vector umax = (pc.max_curvature / max_curvature_magnitude_on_mesh) * pc.max_direction * avg_edge_length;
|
||||
|
||||
Scene_polylines_item::Polyline max_segment(2), min_segment(2);
|
||||
|
||||
const double du = 0.4;
|
||||
|
||||
min_segment[0] = central_point + du * umin;
|
||||
min_segment[1] = central_point - du * umin;
|
||||
max_segment[0] = central_point + du * umax;
|
||||
max_segment[1] = central_point - du * umax;
|
||||
|
||||
(pc.min_curvature > 0 ? min_curv : min_negative_curv)->polylines.push_back(min_segment);
|
||||
(pc.max_curvature > 0 ? max_curv : max_negative_curv)->polylines.push_back(max_segment);
|
||||
}
|
||||
}
|
||||
|
||||
void Polyhedron_demo_interpolated_corrected_principal_curvatures_and_directions_plugin::on_actionEstimateCurvature_triggered()
|
||||
{
|
||||
// get active polyhedron
|
||||
const CGAL::Three::Scene_interface::Item_id index = scene->mainSelectionIndex();
|
||||
QString name = scene->item(index)->name();
|
||||
Scene_surface_mesh_item* sm_item =
|
||||
qobject_cast<Scene_surface_mesh_item*>(scene->item(index));
|
||||
if(! sm_item){
|
||||
return;
|
||||
}
|
||||
// wait cursor
|
||||
QApplication::setOverrideCursor(Qt::WaitCursor);
|
||||
|
||||
// types
|
||||
Scene_polylines_item* max_curv = new Scene_polylines_item;
|
||||
max_curv->setColor(Qt::red);
|
||||
max_curv->setWidth(3);
|
||||
max_curv->setName(tr("%1 (max curvatures)").arg(name));
|
||||
|
||||
Scene_polylines_item* min_curv = new Scene_polylines_item;
|
||||
min_curv->setColor(QColor(255,210,0));
|
||||
min_curv->setWidth(4);
|
||||
min_curv->setName(tr("%1 (min curvatures)").arg(name));
|
||||
|
||||
Scene_polylines_item* max_negative_curv = new Scene_polylines_item;
|
||||
max_negative_curv->setColor(Qt::cyan);
|
||||
max_negative_curv->setWidth(4);
|
||||
max_negative_curv->setName(tr("%1 (max negative curvatures)").arg(name));
|
||||
|
||||
Scene_polylines_item* min_negative_curv = new Scene_polylines_item;
|
||||
min_negative_curv->setColor(Qt::blue);
|
||||
min_negative_curv->setWidth(3);
|
||||
min_negative_curv->setName(tr("%1 (min negative curvatures)").arg(name));
|
||||
|
||||
SMesh* pMesh = sm_item->polyhedron();
|
||||
compute(pMesh, max_curv, min_curv, max_negative_curv, min_negative_curv);
|
||||
|
||||
scene->addItem(max_curv);
|
||||
scene->addItem(min_curv);
|
||||
max_curv->invalidateOpenGLBuffers();
|
||||
min_curv->invalidateOpenGLBuffers();
|
||||
scene->addItem(max_negative_curv);
|
||||
scene->addItem(min_negative_curv);
|
||||
max_negative_curv->invalidateOpenGLBuffers();
|
||||
min_negative_curv->invalidateOpenGLBuffers();
|
||||
|
||||
// default cursor
|
||||
QApplication::restoreOverrideCursor();
|
||||
}
|
||||
|
||||
#include "Interpolated_corrected_principal_curvatures_plugin.moc"
|
||||
|
|
@ -135,6 +135,26 @@
|
|||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="keep_normal_label">
|
||||
<property name="text">
|
||||
<string>keep vertex normals unperturbed</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>seed_spinbox</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QCheckBox" name="keep_normal_checkbox">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="seed_label">
|
||||
<property name="text">
|
||||
<string>Random seed</string>
|
||||
|
|
@ -147,7 +167,7 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<item row="2" column="1">
|
||||
<widget class="QSpinBox" name="seed_spinbox">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
|
|
@ -163,6 +183,8 @@
|
|||
</layout>
|
||||
<zorder>seed_spinbox</zorder>
|
||||
<zorder>seed_label</zorder>
|
||||
<zorder>keep_normal_label</zorder>
|
||||
<zorder>keep_normal_checkbox</zorder>
|
||||
<zorder>deterministic_label</zorder>
|
||||
<zorder>deterministic_checkbox</zorder>
|
||||
</widget>
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
#include <CGAL/utility.h>
|
||||
|
||||
#include <CGAL/Polygon_mesh_processing/random_perturbation.h>
|
||||
#include <CGAL/Polygon_mesh_processing/compute_normal.h>
|
||||
|
||||
#include <boost/graph/graph_traits.hpp>
|
||||
#include <CGAL/property_map.h>
|
||||
|
|
@ -102,6 +103,12 @@ public Q_SLOTS:
|
|||
if (poly_item)
|
||||
{
|
||||
SMesh& pmesh = *poly_item->face_graph();
|
||||
if(ui.keep_normal_checkbox->isChecked())
|
||||
{
|
||||
SMesh::Property_map<vertex_descriptor, EPICK::Vector_3 > vnormals =
|
||||
pmesh.add_property_map<vertex_descriptor, EPICK::Vector_3 >("v:normal_before_perturbation").first;
|
||||
CGAL::Polygon_mesh_processing::compute_vertex_normals(pmesh,vnormals);
|
||||
}
|
||||
if(ui.deterministic_checkbox->isChecked())
|
||||
{
|
||||
unsigned int seed = static_cast<unsigned int>(ui.seed_spinbox->value());
|
||||
|
|
|
|||
|
|
@ -334,6 +334,8 @@ void Scene_c3t3_item::drawEdges(Viewer_interface *viewer) const
|
|||
{
|
||||
Scene_triangulation_3_item::drawEdges(viewer);
|
||||
//add cnc
|
||||
if(!visible())
|
||||
return;
|
||||
if(d->cnc_are_shown)
|
||||
{
|
||||
getEdgeContainer(CNC)->setColor(QColor(Qt::black));
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ Image_accessor<Word_type>::Image_accessor(const Image& im, int dx, int dy, int d
|
|||
}
|
||||
|
||||
const double nb_Colors = colors_.size()+1;
|
||||
double i=1;
|
||||
double i=0;
|
||||
const double starting_hue = default_color.hueF();
|
||||
for ( auto it = colors_.begin(),
|
||||
end = colors_.end() ; it != end ; ++it, i += 1.)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,14 @@
|
|||
// Copyright (c) 2023 GeometryFactory Sarl (France)
|
||||
// All rights reserved.
|
||||
//
|
||||
// This file is part of CGAL (www.cgal.org).
|
||||
//
|
||||
// $URL$
|
||||
// $Id$
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
|
||||
//
|
||||
// Author(s) : Laurent Rineau
|
||||
|
||||
#include <CGAL/Three/Scene_item_with_properties.h>
|
||||
|
||||
CGAL::Three::Scene_item_with_properties::~Scene_item_with_properties() {}
|
||||
|
|
@ -5,7 +5,7 @@
|
|||
#include <CGAL/Polygon_mesh_processing/compute_normal.h>
|
||||
#include <CGAL/Polygon_mesh_processing/repair.h>
|
||||
#include <CGAL/Polygon_mesh_processing/shape_predicates.h>
|
||||
#include <CGAL/boost/graph/dijkstra_shortest_paths.h>
|
||||
#include <boost/graph/dijkstra_shortest_paths.hpp>
|
||||
#include <CGAL/boost/graph/helpers.h>
|
||||
#include <CGAL/property_map.h>
|
||||
#include <CGAL/Handle_hash_function.h>
|
||||
|
|
|
|||
|
|
@ -370,6 +370,7 @@ struct Scene_triangulation_3_item_priv {
|
|||
is_aabb_tree_built = false;
|
||||
alphaSlider = NULL;
|
||||
is_filterable = true;
|
||||
visible_bitset.fill(0xFFFFFFFF);
|
||||
}
|
||||
void computeIntersection(const Primitive& facet);
|
||||
void fill_aabb_tree() {
|
||||
|
|
@ -527,7 +528,8 @@ struct Scene_triangulation_3_item_priv {
|
|||
QVector<QColor> colors;
|
||||
QVector<QColor> colors_subdomains;
|
||||
boost::dynamic_bitset<> visible_subdomain;
|
||||
std::bitset<24> bs[4] = {16777215, 16777215, 16777215, 16777215};
|
||||
bool use_subdomain_colors = false;
|
||||
std::array<std::bitset<32>, Scene_triangulation_3_item::number_of_bitset> visible_bitset;
|
||||
bool show_tetrahedra;
|
||||
bool cut_plane_enabled;
|
||||
bool is_aabb_tree_built;
|
||||
|
|
@ -720,7 +722,7 @@ Scene_triangulation_3_item::triangulation_changed()
|
|||
}
|
||||
const int max_subdomain_index = max;
|
||||
d->visible_subdomain.resize(max_subdomain_index+1, true);
|
||||
d->is_filterable &=( d->subdomain_ids.size() < 96);
|
||||
d->is_filterable &=( d->subdomain_indices_.size() < 32*number_of_bitset-1);
|
||||
for (Tr::Finite_facets_iterator fit = triangulation().finite_facets_begin(),
|
||||
end = triangulation().finite_facets_end(); fit != end; ++fit)
|
||||
{
|
||||
|
|
@ -943,18 +945,9 @@ Scene_triangulation_3_item_priv::compute_color_map(const QColor& c)
|
|||
{
|
||||
typedef Indices::size_type size_type;
|
||||
|
||||
const size_type nb_domains = subdomain_indices_.size();
|
||||
double i = 0;
|
||||
for (Indices::iterator it = subdomain_indices_.begin(),
|
||||
end = subdomain_indices_.end(); it != end; ++it, i += 1.)
|
||||
{
|
||||
double hue = c.hueF() + 1. / double(nb_domains) * i;
|
||||
if (hue > 1) { hue -= 1.; }
|
||||
colors_subdomains[*it] = QColor::fromHsvF(hue, c.saturationF(), c.valueF());
|
||||
}
|
||||
const size_type nb_patch_indices = surface_patch_indices_.size();
|
||||
i = 0;
|
||||
double patch_hsv_value = fmod(c.valueF() + .5, 1.);
|
||||
double i = -1;
|
||||
double patch_hsv_value = use_subdomain_colors ? fmod(c.valueF() + .5, 1.) : c.valueF();
|
||||
for (Indices::iterator it = surface_patch_indices_.begin(),
|
||||
end = surface_patch_indices_.end(); it != end; ++it, i += 1.)
|
||||
{
|
||||
|
|
@ -963,11 +956,24 @@ Scene_triangulation_3_item_priv::compute_color_map(const QColor& c)
|
|||
colors[*it] = QColor::fromHsvF(hue, c.saturationF(), patch_hsv_value);
|
||||
}
|
||||
|
||||
const size_type nb_domains = subdomain_indices_.size();
|
||||
i = -1;
|
||||
for (Indices::iterator it = subdomain_indices_.begin(),
|
||||
end = subdomain_indices_.end(); it != end; ++it, i += 1.)
|
||||
{
|
||||
double hue = c.hueF() + 1. / double(nb_domains) * i;
|
||||
if (hue > 1) { hue -= 1.; }
|
||||
colors_subdomains[*it] = QColor::fromHsvF(hue, c.saturationF(), c.valueF());
|
||||
}
|
||||
|
||||
if (use_subdomain_colors)
|
||||
{
|
||||
for (std::unordered_map<int, int>::iterator it = visible_surface_patch_to_subdomain.begin(),
|
||||
end = visible_surface_patch_to_subdomain.end(); it != end; ++it)
|
||||
{
|
||||
colors[it->first] = colors_subdomains[it->second];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Geom_traits::Plane_3 Scene_triangulation_3_item::plane(CGAL::qglviewer::Vec offset) const
|
||||
|
|
@ -1053,8 +1059,11 @@ void Scene_triangulation_3_item::draw(CGAL::Three::Viewer_interface* viewer) con
|
|||
program->bind();
|
||||
if(d->is_filterable)
|
||||
{
|
||||
QVector4D visible_bitset(d->bs[0].to_ulong(),d->bs[1].to_ulong(),d->bs[2].to_ulong(),d->bs[3].to_ulong());
|
||||
program->setUniformValue("is_visible_bitset", visible_bitset);
|
||||
std::array<GLuint, number_of_bitset> visible_bitset_ulong;
|
||||
std::transform(d->visible_bitset.cbegin(), d->visible_bitset.cend(), visible_bitset_ulong.begin(),
|
||||
[](const std::bitset<32>& bitset) { return bitset.to_ulong(); }
|
||||
);
|
||||
program->setUniformValueArray("is_visible_bitset", visible_bitset_ulong.data(), number_of_bitset);
|
||||
}
|
||||
program->setUniformValue("is_filterable", d->is_filterable);
|
||||
program->release();
|
||||
|
|
@ -1140,8 +1149,11 @@ void Scene_triangulation_3_item::drawEdges(CGAL::Three::Viewer_interface* viewer
|
|||
program->bind();
|
||||
if(d->is_filterable)
|
||||
{
|
||||
QVector4D visible_bitset(d->bs[0].to_ulong(),d->bs[1].to_ulong(),d->bs[2].to_ulong(),d->bs[3].to_ulong());
|
||||
program->setUniformValue("is_visible_bitset", visible_bitset);
|
||||
std::array<GLuint, number_of_bitset> visible_bitset_ulong;
|
||||
std::transform(d->visible_bitset.cbegin(), d->visible_bitset.cend(), visible_bitset_ulong.begin(),
|
||||
[](const std::bitset<32>& bitset) { return bitset.to_ulong(); }
|
||||
);
|
||||
program->setUniformValueArray("is_visible_bitset", visible_bitset_ulong.data(), number_of_bitset);
|
||||
}
|
||||
program->setUniformValue("is_filterable", d->is_filterable);
|
||||
program->release();
|
||||
|
|
@ -1611,6 +1623,12 @@ Scene_triangulation_3_item::setColor(QColor c)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
Scene_triangulation_3_item::setUseSubdomainColors(bool b)
|
||||
{
|
||||
d->use_subdomain_colors = b;
|
||||
}
|
||||
|
||||
void Scene_triangulation_3_item::show_grid(bool b)
|
||||
{
|
||||
d->is_grid_shown = b;
|
||||
|
|
@ -2148,6 +2166,12 @@ QColor Scene_triangulation_3_item::getSubdomainIndexColor(int i) const
|
|||
return d->colors_subdomains[i];
|
||||
}
|
||||
|
||||
void Scene_triangulation_3_item::resetVisibleSubdomain()
|
||||
{
|
||||
d->visible_subdomain.set();
|
||||
d->visible_bitset.fill(0xFFFFFFFF);
|
||||
}
|
||||
|
||||
void Scene_triangulation_3_item::switchVisibleSubdomain(int id)
|
||||
{
|
||||
d->visible_subdomain[id] = !d->visible_subdomain[id];
|
||||
|
|
@ -2155,7 +2179,12 @@ void Scene_triangulation_3_item::switchVisibleSubdomain(int id)
|
|||
int i = compact_id/32;
|
||||
int j = compact_id%32;
|
||||
|
||||
d->bs[i][j] = d->visible_subdomain[id];
|
||||
d->visible_bitset[i][j] = d->visible_subdomain[id];
|
||||
}
|
||||
|
||||
bool Scene_triangulation_3_item::isVisibleSubdomain(int id) const
|
||||
{
|
||||
return d->visible_subdomain[id];
|
||||
}
|
||||
|
||||
void Scene_triangulation_3_item::computeIntersection()
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ using namespace CGAL::Three;
|
|||
Q_OBJECT
|
||||
public:
|
||||
typedef CGAL::qglviewer::ManipulatedFrame ManipulatedFrame;
|
||||
static const int number_of_bitset = 4; // also defined in "shader_c3t3.frag" and "shader_c3t3_edges.frag"
|
||||
|
||||
Scene_triangulation_3_item(bool display_elements = true);
|
||||
Scene_triangulation_3_item(const T3 t3, bool display_elements = true);
|
||||
|
|
@ -43,6 +44,7 @@ public:
|
|||
|
||||
|
||||
void setColor(QColor c) Q_DECL_OVERRIDE;
|
||||
void setUseSubdomainColors(bool use_subdomain_colors);
|
||||
|
||||
void invalidateOpenGLBuffers() Q_DECL_OVERRIDE;
|
||||
|
||||
|
|
@ -145,7 +147,9 @@ public:
|
|||
|
||||
QColor get_histogram_color(const double v) const;
|
||||
|
||||
void resetVisibleSubdomain();
|
||||
void switchVisibleSubdomain(int);
|
||||
bool isVisibleSubdomain(int) const;
|
||||
|
||||
void itemAboutToBeDestroyed(Scene_item *) Q_DECL_OVERRIDE;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
#include <CGAL/Three/TextRenderer.h>
|
||||
#include <CGAL/Three/Scene_item.h>
|
||||
#include <CGAL/Three/Scene_print_item_interface.h>
|
||||
#include "Scene_polyhedron_selection_item.h"
|
||||
void TextRenderer::draw(CGAL::Three::Viewer_interface *viewer, const QVector3D& scaler)
|
||||
{
|
||||
QPainter *painter = viewer->getPainter();
|
||||
|
|
|
|||
|
|
@ -149,6 +149,7 @@ hole_filling_plugin \
|
|||
hole_filling_sm_plugin \
|
||||
hole_filling_polyline_plugin \
|
||||
inside_out_plugin \
|
||||
interpolated_corrected_principal_curvatures_plugin\
|
||||
surface_intersection_plugin \
|
||||
surface_intersection_sm_plugin \
|
||||
io_image_plugin \
|
||||
|
|
|
|||
|
|
@ -1,4 +1,7 @@
|
|||
#version 150
|
||||
|
||||
const int number_of_bitset = 4;
|
||||
|
||||
in vec4 color;
|
||||
in vec4 fP;
|
||||
in vec3 fN;
|
||||
|
|
@ -21,8 +24,8 @@ uniform bool writing;
|
|||
uniform sampler2D sampler;
|
||||
uniform float alpha;
|
||||
uniform bool is_surface;
|
||||
uniform vec4 is_visible_bitset;
|
||||
uniform bool is_filterable;
|
||||
uniform int is_visible_bitset[number_of_bitset];
|
||||
out vec4 out_color;
|
||||
|
||||
float depth(float z)
|
||||
|
|
@ -47,11 +50,13 @@ bool compute_filtering_visibility() {
|
|||
{
|
||||
uint domain1 = uint(subdomain_out.x);
|
||||
uint domain2 = uint(subdomain_out.y);
|
||||
uint i1 = domain1/25u;
|
||||
uint i2 = domain2/25u;
|
||||
uint i1 = domain1/32u;
|
||||
uint j1 = domain1%32u;
|
||||
uint i2 = domain2/32u;
|
||||
uint j2 = domain2%32u;
|
||||
uint visible1 = uint(is_visible_bitset[i1]);
|
||||
uint visible2 = uint(is_visible_bitset[i2]);
|
||||
return (visible1>>(domain1%25u))%2u == 0u && (visible2>>(domain2%25u))%2u == 0u;
|
||||
return ((visible1>>j1)&1u) == 0u && ((visible2>>j2)&1u) == 0u;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -1,11 +1,14 @@
|
|||
#version 150
|
||||
|
||||
const int number_of_bitset = 4;
|
||||
|
||||
in vec4 color;
|
||||
in float dist[6];
|
||||
flat in vec2 subdomain_out;
|
||||
uniform bool is_clipbox_on;
|
||||
uniform bool is_surface;
|
||||
uniform vec4 is_visible_bitset;
|
||||
uniform bool is_filterable;
|
||||
uniform int is_visible_bitset[number_of_bitset];
|
||||
out vec4 out_color;
|
||||
void main(void)
|
||||
{
|
||||
|
|
@ -22,10 +25,12 @@ void main(void)
|
|||
uint domain1 = uint(subdomain_out.x);
|
||||
uint domain2 = uint(subdomain_out.y);
|
||||
uint i1 = domain1/32u;
|
||||
uint j1 = domain1%32u;
|
||||
uint i2 = domain2/32u;
|
||||
uint j2 = domain2%32u;
|
||||
uint visible1 = uint(is_visible_bitset[i1]);
|
||||
uint visible2 = uint(is_visible_bitset[i2]);
|
||||
if((visible1>>(domain1%32u))%2u == 0u && (visible2>>(domain2%32u))%2u == 0u)
|
||||
if(((visible1>>j1)&1u) == 0u && ((visible2>>j2)&1u) == 0u)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -389,8 +389,8 @@ struct Test_c3t3_io {
|
|||
filename += "_new";
|
||||
if(binary) filename += ".binary";
|
||||
filename += ".cgal";
|
||||
std::ofstream output(filename.c_str(),
|
||||
binary ? (std::ios_base::out | std::ios_base::binary)
|
||||
std::ostringstream output(binary
|
||||
? (std::ios_base::out | std::ios_base::binary)
|
||||
: std::ios_base::out);
|
||||
CGAL::IO::save_binary_file(output, c3t3_bis, binary);
|
||||
}
|
||||
|
|
|
|||