Merge branch 'master' into BGL-LCC-gdamiand

This commit is contained in:
Guillaume Damiand 2017-06-15 10:03:53 -04:00 committed by GitHub
commit c8250c4570
612 changed files with 26728 additions and 10403 deletions

View File

@ -58,7 +58,9 @@ compiler:
- clang - clang
- gcc - gcc
addons: addons:
apt: apt:
sources:
- sourceline: 'ppa:ppsspp/cmake'
packages: packages:
- zsh - zsh
- cmake - cmake
@ -85,3 +87,7 @@ addons:
# - libglew1.5-dev # - libglew1.5-dev
# - libipe-dev # - libipe-dev
# - libmpfi-dev # - libmpfi-dev
notifications:
email:
on_success: change # default: always
on_failure: always # default: always

View File

@ -1,14 +1,64 @@
#!/bin/bash #!/bin/bash
set -e set -e
CXX_FLAGS="-DCGAL_NDEBUG"
function build_examples {
mkdir -p build-travis
cd build-travis
cmake -DCGAL_DIR="$ROOT/build" -DCMAKE_CXX_FLAGS_RELEASE="${CXX_FLAGS}" ..
make -j2
}
function build_tests {
build_examples
}
function build_demo {
mkdir -p build-travis
cd build-travis
if [ $NEED_3D = 1 ]; then
#install libqglviewer
git clone --depth=1 https://github.com/GillesDebunne/libQGLViewer.git ./qglviewer
pushd ./qglviewer/QGLViewer
#use qt5 instead of qt4
export QT_SELECT=5
qmake NO_QT_VERSION_SUFFIX=yes
make -j2
if [ ! -f libQGLViewer.so ]; then
echo "libQGLViewer.so not made"
exit 1
else
echo "QGLViewer built successfully"
fi
#end install qglviewer
popd
fi
EXTRA_CXX_FLAGS=
if [ "$CC" = "clang" ]; then
EXTRA_CXX_FLAGS="-Werror=inconsistent-missing-override"
fi
if [ $NEED_3D = 1 ]; then
QGLVIEWERROOT=$PWD/qglviewer
export QGLVIEWERROOT
fi
cmake -DCGAL_DIR="$ROOT/build" -DCGAL_DONT_OVERRIDE_CMAKE_FLAGS:BOOL=ON -DCMAKE_CXX_FLAGS_RELEASE="${CXX_FLAGS} ${EXTRA_CXX_FLAGS}" ..
make -j2
}
IFS=$' ' IFS=$' '
ROOT="$PWD/../" ROOT="$PWD/.."
NEED_3D=0 NEED_3D=0
for ARG in $(echo "$@") for ARG in $(echo "$@")
do do
if [ "$ARG" = "CHECK" ] if [ "$ARG" = "CHECK" ]
then then
zsh $ROOT/Scripts/developer_scripts/test_merge_of_branch HEAD zsh $ROOT/Scripts/developer_scripts/test_merge_of_branch HEAD
mkdir -p build-travis
pushd build-travis
cmake -DCGAL_ENABLE_CHECK_HEADERS=ON ../..
make -j2 check_headers
popd
#parse current matrix and check that no package has been forgotten #parse current matrix and check that no package has been forgotten
old_IFS=$IFS old_IFS=$IFS
IFS=$'\n' IFS=$'\n'
@ -38,6 +88,9 @@ do
exit 1 exit 1
fi fi
echo "Matrix is up to date." echo "Matrix is up to date."
cd .travis
./generate_travis.sh -c
cd ..
exit 0 exit 0
fi fi
EXAMPLES="$ARG/examples/$ARG" EXAMPLES="$ARG/examples/$ARG"
@ -53,21 +106,15 @@ do
if [ -d "$ROOT/$EXAMPLES" ] if [ -d "$ROOT/$EXAMPLES" ]
then then
cd $ROOT/$EXAMPLES cd $ROOT/$EXAMPLES
mkdir -p build build_examples
cd build
cmake -DCGAL_DIR="$ROOT/build" -DCMAKE_CXX_FLAGS_RELEASE="-DCGAL_NDEBUG" ..
make -j2
elif [ "$ARG" != Polyhedron_demo ]; then elif [ "$ARG" != Polyhedron_demo ]; then
echo "No example found for $ARG" echo "No example found for $ARG"
fi fi
if [ -d "$ROOT/$TEST" ] if [ -d "$ROOT/$TEST" ]
then then
cd $ROOT/$TEST cd $ROOT/$TEST
mkdir -p build build_tests
cd build
cmake -DCGAL_DIR="$ROOT/build" -DCMAKE_CXX_FLAGS_RELEASE="-DCGAL_NDEBUG" ..
make -j2
elif [ "$ARG" != Polyhedron_demo ]; then elif [ "$ARG" != Polyhedron_demo ]; then
echo "No test found for $ARG" echo "No test found for $ARG"
fi fi
@ -81,54 +128,21 @@ do
fi fi
if [ "$ARG" != Polyhedron ] && [ -d "$ROOT/$DEMO" ] if [ "$ARG" != Polyhedron ] && [ -d "$ROOT/$DEMO" ]
then then
if [ $NEED_3D = 1 ]; then cd $ROOT/$DEMO
cd $ROOT/$DEMO build_demo
#install libqglviewer
git clone --depth=1 https://github.com/GillesDebunne/libQGLViewer.git ./qglviewer
cd ./qglviewer/QGLViewer
#use qt5 instead of qt4
export QT_SELECT=5
qmake NO_QT_VERSION_SUFFIX=yes
make -j2
if [ ! -f libQGLViewer.so ]; then
echo "libQGLViewer.so not made"
exit 1
else
echo "QGLViewer built successfully"
fi
#end install qglviewer
fi
cd $ROOT/$DEMO
mkdir -p build
cd build
if [ $NEED_3D = 1 ]; then
cmake -DCGAL_DIR="$ROOT/build" -DQGLVIEWER_INCLUDE_DIR="$ROOT/$DEMO/qglviewer" -DQGLVIEWER_LIBRARIES="$ROOT/$DEMO/qglviewer/QGLViewer/libQGLViewer.so" -DCMAKE_CXX_FLAGS_RELEASE="-DCGAL_NDEBUG" ..
else
cmake -DCGAL_DIR="$ROOT/build" -DCMAKE_CXX_FLAGS_RELEASE="-DCGAL_NDEBUG" ..
fi
make -j2
elif [ "$ARG" != Polyhedron_demo ]; then elif [ "$ARG" != Polyhedron_demo ]; then
echo "No demo found for $ARG" echo "No demo found for $ARG"
fi fi
done done
if [ "$ARG" = Polyhedron_demo ]; then if [ "$ARG" = Polyhedron_demo ]; then
cd "$ROOT/Polyhedron/demo/Polyhedron" DEMO=Polyhedron/demo/Polyhedron
#install libqglviewer NEED_3D=1
git clone --depth=1 https://github.com/GillesDebunne/libQGLViewer.git ./qglviewer cd "$ROOT/$DEMO"
cd ./qglviewer/QGLViewer build_demo
#use qt5 instead of qt4
export QT_SELECT=5
qmake NO_QT_VERSION_SUFFIX=yes
make -j2
if [ ! -f libQGLViewer.so ]; then
echo "libQGLViewer.so not made"
exit 1
fi
#end install qglviewer
cd "$ROOT/Polyhedron/demo/Polyhedron"
mkdir -p ./build
cd ./build
cmake -DCGAL_DIR="$ROOT/build" -DQGLVIEWER_INCLUDE_DIR="$ROOT/Polyhedron/demo/Polyhedron/qglviewer" -DQGLVIEWER_LIBRARIES="$ROOT/Polyhedron/demo/Polyhedron/qglviewer/QGLViewer/libQGLViewer.so" -DCMAKE_CXX_FLAGS_RELEASE="-DCGAL_NDEBUG" ..
make -j2
fi fi
done done
# Local Variables:
# tab-width: 2
# sh-basic-offset: 2
# End:

23
.travis/generate_travis.sh Normal file → Executable file
View File

@ -1,4 +1,10 @@
#!/bin/bash #!/bin/bash
CHECK=
case $1 in
--check) CHECK=y;;
esac
set -e set -e
cd ../ cd ../
@ -28,8 +34,7 @@ done
if [ -f ".travis.yml" ] if [ -f ".travis.yml" ]
then then
#copy the current .travis.yml for later check #copy the current .travis.yml for later check
cp ./.travis.yml ./.travis.old mv ./.travis.yml ./.travis.old
rm .travis.yml
fi fi
#writes the first part of the file #writes the first part of the file
old_IFS=$IFS old_IFS=$IFS
@ -67,11 +72,19 @@ do
done done
IFS=$' ' IFS=$' '
#check if there are differences between the files #check if there are differences between the files
read -a DIFF <<<$(diff -q ./.travis.yml ./.travis.old) if ! cmp -s ./.travis.yml ./.travis.old;
if [ "${DIFF[0]}" != "" ]
then then
echo ".travis.yml has changed" echo ".travis.yml has changed"
if [ -n "$CHECK" ]; then
echo "You should modify the file .travis/template.txt"
exit 1
fi
fi fi
#erase old travis #erase old travis
rm ./.travis.old rm ./.travis.old
IFS=$old_IFS IFS=$old_IFS
# Local Variables:
# tab-width: 2
# sh-basic-offset: 2
# End:

View File

@ -18,7 +18,9 @@ compiler:
- clang - clang
- gcc - gcc
addons: addons:
apt: apt:
sources:
- sourceline: 'ppa:ppsspp/cmake'
packages: packages:
- zsh - zsh
- cmake - cmake
@ -45,3 +47,7 @@ addons:
# - libglew1.5-dev # - libglew1.5-dev
# - libipe-dev # - libipe-dev
# - libmpfi-dev # - libmpfi-dev
notifications:
email:
on_success: change # default: always
on_failure: always # default: always

View File

@ -7,6 +7,10 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Instruct CMake to run moc automatically when needed. # Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOMOC ON)
cmake_minimum_required(VERSION 2.8.11) cmake_minimum_required(VERSION 2.8.11)
if(POLICY CMP0053)
cmake_policy(SET CMP0053 OLD)
endif()
if(POLICY CMP0043) if(POLICY CMP0043)
cmake_policy(SET CMP0043 OLD) cmake_policy(SET CMP0043 OLD)
endif() endif()

View File

@ -14,7 +14,7 @@
#include <CGAL/Timer.h> #include <CGAL/Timer.h>
#include <CGAL/IO/Polyhedron_iostream.h> #include <CGAL/IO/Polyhedron_iostream.h>
#include <CGAL/Subdivision_method_3.h> #include <CGAL/subdivision_method_3.h>
#include <QOpenGLShader> #include <QOpenGLShader>
#include <QDebug> #include <QDebug>

View File

@ -37,7 +37,7 @@ Each primitive gives access to both one input geometric object
example primitive wraps a 3D triangle as datum and a face handle of a example primitive wraps a 3D triangle as datum and a face handle of a
polyhedral surface as id. Each intersection query can return the polyhedral surface as id. Each intersection query can return the
intersection objects (e.g., 3D points or segments for ray queries) as intersection objects (e.g., 3D points or segments for ray queries) as
well the as id (here the face handle) of the intersected well as the id (here the face handle) of the intersected
primitives. Similarly, each distance query can return the closest primitives. Similarly, each distance query can return the closest
point from the point query as well as the id of the closest primitive. point from the point query as well as the id of the closest primitive.

View File

@ -6,7 +6,6 @@
#include <CGAL/AABB_tree.h> #include <CGAL/AABB_tree.h>
#include <CGAL/AABB_traits.h> #include <CGAL/AABB_traits.h>
#include <CGAL/Polyhedron_3.h> #include <CGAL/Polyhedron_3.h>
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h>
#include <CGAL/AABB_face_graph_triangle_primitive.h> #include <CGAL/AABB_face_graph_triangle_primitive.h>
typedef CGAL::Simple_cartesian<double> K; typedef CGAL::Simple_cartesian<double> K;

View File

@ -6,7 +6,6 @@
#include <CGAL/AABB_tree.h> #include <CGAL/AABB_tree.h>
#include <CGAL/AABB_traits.h> #include <CGAL/AABB_traits.h>
#include <CGAL/Polyhedron_3.h> #include <CGAL/Polyhedron_3.h>
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h>
#include <CGAL/AABB_halfedge_graph_segment_primitive.h> #include <CGAL/AABB_halfedge_graph_segment_primitive.h>
typedef CGAL::Simple_cartesian<double> K; typedef CGAL::Simple_cartesian<double> K;

View File

@ -4,7 +4,6 @@
#include <CGAL/AABB_tree.h> #include <CGAL/AABB_tree.h>
#include <CGAL/AABB_traits.h> #include <CGAL/AABB_traits.h>
#include <CGAL/Polyhedron_3.h> #include <CGAL/Polyhedron_3.h>
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h>
#include <CGAL/AABB_face_graph_triangle_primitive.h> #include <CGAL/AABB_face_graph_triangle_primitive.h>

View File

@ -6,7 +6,6 @@
#include <CGAL/AABB_tree.h> #include <CGAL/AABB_tree.h>
#include <CGAL/AABB_traits.h> #include <CGAL/AABB_traits.h>
#include <CGAL/Polyhedron_3.h> #include <CGAL/Polyhedron_3.h>
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h>
#include <CGAL/AABB_halfedge_graph_segment_primitive.h> #include <CGAL/AABB_halfedge_graph_segment_primitive.h>
typedef CGAL::Simple_cartesian<double> K; typedef CGAL::Simple_cartesian<double> K;

View File

@ -7,7 +7,6 @@
#include <CGAL/AABB_tree.h> #include <CGAL/AABB_tree.h>
#include <CGAL/AABB_traits.h> #include <CGAL/AABB_traits.h>
#include <CGAL/Polyhedron_3.h> #include <CGAL/Polyhedron_3.h>
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h>
#include <CGAL/AABB_face_graph_triangle_primitive.h> #include <CGAL/AABB_face_graph_triangle_primitive.h>
typedef CGAL::Simple_cartesian<double> K; typedef CGAL::Simple_cartesian<double> K;

View File

@ -7,7 +7,6 @@
#include <CGAL/AABB_tree.h> #include <CGAL/AABB_tree.h>
#include <CGAL/AABB_traits.h> #include <CGAL/AABB_traits.h>
#include <CGAL/Polyhedron_3.h> #include <CGAL/Polyhedron_3.h>
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h>
#include <CGAL/AABB_face_graph_triangle_primitive.h> #include <CGAL/AABB_face_graph_triangle_primitive.h>
typedef CGAL::Simple_cartesian<double> K; typedef CGAL::Simple_cartesian<double> K;

View File

@ -1130,7 +1130,7 @@ public:
this->traversal(query, traversal_traits); this->traversal(query, traversal_traits);
return traversal_traits.is_intersection_found(); return traversal_traits.is_intersection_found();
} }
#ifndef DOXYGEN_RUNNING //To avoid doxygen to consider definition and declaration as 2 different functions (size_type causes problems)
template<typename Tr> template<typename Tr>
template<typename Query> template<typename Query>
typename AABB_tree<Tr>::size_type typename AABB_tree<Tr>::size_type
@ -1149,7 +1149,7 @@ public:
this->traversal(query, traversal_traits); this->traversal(query, traversal_traits);
return counter; return counter;
} }
#endif
template<typename Tr> template<typename Tr>
template<typename Query, typename OutputIterator> template<typename Query, typename OutputIterator>
OutputIterator OutputIterator

View File

@ -502,7 +502,6 @@ public:
const Polynomial_2& f, const Polynomial_2& f,
CGAL::Degeneracy_strategy strategy CGAL::Degeneracy_strategy strategy
= CGAL_ACK_DEFAULT_DEGENERACY_STRATEGY) = CGAL_ACK_DEFAULT_DEGENERACY_STRATEGY)
throw(internal::Zero_resultant_exception<Polynomial_2>)
: Base(Rep(kernel,f,strategy)) : Base(Rep(kernel,f,strategy))
{ {
@ -812,7 +811,7 @@ private:
// Creates a status line for the curve's <tt>index</tt>th critical point // Creates a status line for the curve's <tt>index</tt>th critical point
Status_line_1 create_status_line_at_event(size_type index) const Status_line_1 create_status_line_at_event(size_type index) const
throw(CGAL::internal::Non_generic_position_exception) { {
Event_coordinate_1& event = event_coordinates()[index]; Event_coordinate_1& event = event_coordinates()[index];
@ -1446,7 +1445,7 @@ private:
//! Returns the Sturm-Habicht sequence of the primitive part of f //! Returns the Sturm-Habicht sequence of the primitive part of f
std::vector<Polynomial_2>& sturm_habicht_of_primitive() const std::vector<Polynomial_2>& sturm_habicht_of_primitive() const
throw(internal::Zero_resultant_exception<Polynomial_2>) { {
if(! this->ptr()->sturm_habicht_of_primitive) { if(! this->ptr()->sturm_habicht_of_primitive) {
compute_sturm_habicht_of_primitive(); compute_sturm_habicht_of_primitive();
} }
@ -1460,7 +1459,7 @@ public:
* of the primitive part of the defining polynomial * of the primitive part of the defining polynomial
*/ */
Polynomial_2 sturm_habicht_of_primitive(size_type i) const Polynomial_2 sturm_habicht_of_primitive(size_type i) const
throw(internal::Zero_resultant_exception<Polynomial_2>) { {
CGAL_assertion(i>=0 && CGAL_assertion(i>=0 &&
i < static_cast<size_type> i < static_cast<size_type>
(sturm_habicht_of_primitive().size())); (sturm_habicht_of_primitive().size()));
@ -1474,7 +1473,7 @@ public:
* of the primitive part of the defining polynomial * of the primitive part of the defining polynomial
*/ */
Polynomial_1 principal_sturm_habicht_of_primitive(size_type i) const Polynomial_1 principal_sturm_habicht_of_primitive(size_type i) const
throw(internal::Zero_resultant_exception<Polynomial_2>) { {
CGAL_assertion(i>=0 && CGAL_assertion(i>=0 &&
i < static_cast<size_type> i < static_cast<size_type>
(sturm_habicht_of_primitive().size())); (sturm_habicht_of_primitive().size()));
@ -1496,7 +1495,7 @@ public:
* of <tt>y^{i-1}</tt> of the <tt>i</tt>th Sturm-Habicht polynomial * of <tt>y^{i-1}</tt> of the <tt>i</tt>th Sturm-Habicht polynomial
*/ */
Polynomial_1 coprincipal_sturm_habicht_of_primitive(size_type i) const Polynomial_1 coprincipal_sturm_habicht_of_primitive(size_type i) const
throw(internal::Zero_resultant_exception<Polynomial_2>) { {
CGAL_assertion(i>=1 && CGAL_assertion(i>=1 &&
i < static_cast<size_type> i < static_cast<size_type>
(sturm_habicht_of_primitive().size())); (sturm_habicht_of_primitive().size()));
@ -1531,7 +1530,7 @@ private:
// Internal method to compute the Sturm-Habicht sequence // Internal method to compute the Sturm-Habicht sequence
void compute_sturm_habicht_of_primitive() const void compute_sturm_habicht_of_primitive() const
throw(internal::Zero_resultant_exception<Polynomial_2>) { {
#if CGAL_ACK_DEBUG_FLAG #if CGAL_ACK_DEBUG_FLAG
CGAL_ACK_DEBUG_PRINT << "Compute Sturm-Habicht.." << std::flush; CGAL_ACK_DEBUG_PRINT << "Compute Sturm-Habicht.." << std::flush;
@ -1591,7 +1590,7 @@ private:
//! Returns the resultant of the primitive part of f and its y-derivative //! Returns the resultant of the primitive part of f and its y-derivative
Polynomial_1 resultant_of_primitive_and_derivative_y() const Polynomial_1 resultant_of_primitive_and_derivative_y() const
throw(internal::Zero_resultant_exception<Polynomial_2>) { {
if(! this->ptr()->resultant_of_primitive_and_derivative_y) { if(! this->ptr()->resultant_of_primitive_and_derivative_y) {
compute_resultant_of_primitive_and_derivative_y(); compute_resultant_of_primitive_and_derivative_y();
} }
@ -1602,7 +1601,7 @@ private:
//! Returns the resultant of the primitive part of f with its x-derivative //! Returns the resultant of the primitive part of f with its x-derivative
Polynomial_1 resultant_of_primitive_and_derivative_x() const Polynomial_1 resultant_of_primitive_and_derivative_x() const
throw(internal::Zero_resultant_exception<Polynomial_2>) { {
if(! this->ptr()->resultant_of_primitive_and_derivative_x) { if(! this->ptr()->resultant_of_primitive_and_derivative_x) {
compute_resultant_of_primitive_and_derivative_x(); compute_resultant_of_primitive_and_derivative_x();
} }
@ -1612,8 +1611,8 @@ private:
private: private:
// Computes <tt>res_y(f,f_y)</tt>, where \c f is the defining polynomial // Computes <tt>res_y(f,f_y)</tt>, where \c f is the defining polynomial
void compute_resultant_of_primitive_and_derivative_y() const void compute_resultant_of_primitive_and_derivative_y() const
throw(internal::Zero_resultant_exception<Polynomial_2>) { {
#if CGAL_ACK_DEBUG_FLAG #if CGAL_ACK_DEBUG_FLAG
CGAL_ACK_DEBUG_PRINT << "Compute resultant.." << std::flush; CGAL_ACK_DEBUG_PRINT << "Compute resultant.." << std::flush;
#endif #endif
@ -1664,7 +1663,7 @@ private:
// Computes <tt>res_y(f,f_x)</tt>, where \c f is the defining polynomial // Computes <tt>res_y(f,f_x)</tt>, where \c f is the defining polynomial
void compute_resultant_of_primitive_and_derivative_x() const void compute_resultant_of_primitive_and_derivative_x() const
throw(internal::Zero_resultant_exception<Polynomial_2>) { {
#if CGAL_ACK_DEBUG_FLAG #if CGAL_ACK_DEBUG_FLAG
CGAL_ACK_DEBUG_PRINT << "Compute x-resultant.." << std::flush; CGAL_ACK_DEBUG_PRINT << "Compute x-resultant.." << std::flush;
@ -1723,7 +1722,7 @@ private:
// Returns the critical event coordinates // Returns the critical event coordinates
std::vector<Event_coordinate_1>& event_coordinates() const std::vector<Event_coordinate_1>& event_coordinates() const
throw(internal::Zero_resultant_exception<Polynomial_2>) { {
if(! this->ptr()->event_coordinates) { if(! this->ptr()->event_coordinates) {
compute_event_coordinates(); compute_event_coordinates();
} }
@ -1734,8 +1733,7 @@ private:
// Returns the intermediate values for intervals between events // Returns the intermediate values for intervals between events
std::vector<boost::optional<Bound> >& intermediate_values() const std::vector<boost::optional<Bound> >& intermediate_values() const
throw(internal::Zero_resultant_exception<Polynomial_2>) { {
if(! this->ptr()->intermediate_values) { if(! this->ptr()->intermediate_values) {
// This is created during event_coordiantes() // This is created during event_coordiantes()
event_coordinates(); event_coordinates();
@ -1755,7 +1753,7 @@ private:
* x-coordinates of the curve. * x-coordinates of the curve.
*/ */
void compute_event_coordinates() const void compute_event_coordinates() const
throw(internal::Zero_resultant_exception<Polynomial_2>) { {
#if CGAL_ACK_DEBUG_FLAG #if CGAL_ACK_DEBUG_FLAG
CGAL_ACK_DEBUG_PRINT << "compute events..." << std::flush; CGAL_ACK_DEBUG_PRINT << "compute events..." << std::flush;
@ -1953,7 +1951,6 @@ public:
* of the Algebraic_curve_kernel_2 yet. * of the Algebraic_curve_kernel_2 yet.
*/ */
Self& shear_primitive_part(Integer s) const Self& shear_primitive_part(Integer s) const
throw(CGAL::internal::Non_generic_position_exception)
{ {
CGAL_assertion(s!=0); CGAL_assertion(s!=0);
#if CGAL_ACK_USE_SPECIAL_TREATMENT_FOR_CONIX #if CGAL_ACK_USE_SPECIAL_TREATMENT_FOR_CONIX

View File

@ -480,8 +480,6 @@ public:
Curve_analysis_2 c2, Curve_analysis_2 c2,
CGAL::Degeneracy_strategy strategy CGAL::Degeneracy_strategy strategy
= CGAL_ACK_DEFAULT_DEGENERACY_STRATEGY) = CGAL_ACK_DEFAULT_DEGENERACY_STRATEGY)
throw(CGAL::internal::Zero_resultant_exception<Polynomial_2>,
CGAL::internal::Non_generic_position_exception)
: Base(Rep(kernel,c1, c2, strategy)) : Base(Rep(kernel,c1, c2, strategy))
{ {
@ -847,13 +845,11 @@ private:
private: private:
// Computes a slice_info object at Algebraic_real_1 \c alpha // Computes a slice_info object at Algebraic_real_1 \c alpha
Slice_info construct_slice_info(Algebraic_real_1 alpha) const Slice_info construct_slice_info(Algebraic_real_1 alpha) const;
throw(CGAL::internal::Non_generic_position_exception);
private: private:
Status_line_CPA_1 construct_generic_case(size_type i) const Status_line_CPA_1 construct_generic_case(size_type i) const;
throw(CGAL::internal::Non_generic_position_exception);
private: private:
@ -1170,8 +1166,7 @@ private:
Status_line_CPA_1 Status_line_CPA_1
create_event_slice_from_current_intersection_info (size_type i) create_event_slice_from_current_intersection_info (size_type i) const;
const throw(CGAL::internal::Non_generic_position_exception);
Bound x_sheared(Bound x, Bound y,Integer sh) const { Bound x_sheared(Bound x, Bound y,Integer sh) const {
return x-sh*y; return x-sh*y;
@ -1992,8 +1987,7 @@ create_slice_from_slice_info(size_type id,
template<typename AlgebraicKernelWithAnalysis_2> template<typename AlgebraicKernelWithAnalysis_2>
typename Curve_pair_analysis_2<AlgebraicKernelWithAnalysis_2>::Slice_info typename Curve_pair_analysis_2<AlgebraicKernelWithAnalysis_2>::Slice_info
Curve_pair_analysis_2<AlgebraicKernelWithAnalysis_2>:: Curve_pair_analysis_2<AlgebraicKernelWithAnalysis_2>::
construct_slice_info(Algebraic_real_1 alpha) const construct_slice_info(Algebraic_real_1 alpha) const {
throw(CGAL::internal::Non_generic_position_exception) {
/* /*
#if CGAL_ACK_DEBUG_FLAG #if CGAL_ACK_DEBUG_FLAG
@ -2074,8 +2068,7 @@ template<typename AlgebraicKernelWithAnalysis_2>
typename Curve_pair_analysis_2<AlgebraicKernelWithAnalysis_2> typename Curve_pair_analysis_2<AlgebraicKernelWithAnalysis_2>
::Status_line_CPA_1 ::Status_line_CPA_1
Curve_pair_analysis_2<AlgebraicKernelWithAnalysis_2>:: Curve_pair_analysis_2<AlgebraicKernelWithAnalysis_2>::
construct_generic_case(size_type i) const construct_generic_case(size_type i) const {
throw(CGAL::internal::Non_generic_position_exception) {
Algebraic_real_1 alpha = event_x(i); Algebraic_real_1 alpha = event_x(i);
@ -2414,8 +2407,7 @@ template<typename AlgebraicKernelWithAnalysis_2>
typename Curve_pair_analysis_2<AlgebraicKernelWithAnalysis_2> typename Curve_pair_analysis_2<AlgebraicKernelWithAnalysis_2>
::Status_line_CPA_1 ::Status_line_CPA_1
Curve_pair_analysis_2<AlgebraicKernelWithAnalysis_2>:: Curve_pair_analysis_2<AlgebraicKernelWithAnalysis_2>::
create_event_slice_from_current_intersection_info (size_type i) create_event_slice_from_current_intersection_info (size_type i) const{
const throw(CGAL::internal::Non_generic_position_exception){
#if CGAL_ACK_DEBUG_FLAG #if CGAL_ACK_DEBUG_FLAG
CGAL_ACK_DEBUG_PRINT << "Reduce the candidates.." << std::flush; CGAL_ACK_DEBUG_PRINT << "Reduce the candidates.." << std::flush;
#endif #endif

View File

@ -117,7 +117,6 @@ public:
Event_line_builder(Algebraic_kernel_with_analysis_2* kernel, Event_line_builder(Algebraic_kernel_with_analysis_2* kernel,
Curve_analysis_2 curve, Curve_analysis_2 curve,
Polynomial_2 polynomial) Polynomial_2 polynomial)
throw(internal::Zero_resultant_exception<Polynomial_2>)
: _m_kernel(kernel), curve(curve), polynomial(polynomial) : _m_kernel(kernel), curve(curve), polynomial(polynomial)
{} {}
@ -151,7 +150,7 @@ public:
Status_line_1 Status_line_1
create_event_line(int id,Algebraic_real_1 alpha,int arcs_left,int arcs_right, create_event_line(int id,Algebraic_real_1 alpha,int arcs_left,int arcs_right,
bool root_of_resultant, bool root_of_content,int mult) bool root_of_resultant, bool root_of_content,int mult)
throw(CGAL::internal::Non_generic_position_exception) { {
try { try {
@ -531,7 +530,7 @@ protected:
int mult, int mult,
int arcs_left, int arcs_left,
int arcs_right) int arcs_right)
throw(CGAL::internal::Non_generic_position_exception) { {
Bitstream_traits traits(Bitstream_coefficient_kernel(kernel(),alpha)); Bitstream_traits traits(Bitstream_coefficient_kernel(kernel(),alpha));
@ -613,7 +612,7 @@ protected:
int k, int k,
const Polynomial_2& der_1, const Polynomial_2& der_1,
const Polynomial_2& der_2) const Polynomial_2& der_2)
throw(CGAL::internal::Non_generic_position_exception) { {
//Guess the right expression for y //Guess the right expression for y
/* /*

View File

@ -24,17 +24,20 @@
#include <CGAL/license/Alpha_shapes_2.h> #include <CGAL/license/Alpha_shapes_2.h>
// temporarily silenced
/*
#define CGAL_DEPRECATED_HEADER "<CGAL/Weighted_alpha_shape_euclidean_traits_2.h>"
#define CGAL_REPLACEMENT_HEADER "<CGAL/Regular_triangulation_euclidean_traits_2.h>"
#define CGAL_DEPRECATED_MESSAGE_DETAILS \
"The class Weighted_alpha_shape_euclidean_traits_2<K> is deprecated in favor of "\
"Regular_triangulation_euclidean_traits_2<K>."
#include <CGAL/internal/deprecation_warning.h>
*/
#include <CGAL/Regular_triangulation_euclidean_traits_2.h> #include <CGAL/Regular_triangulation_euclidean_traits_2.h>
namespace CGAL { namespace CGAL {
//------------------ Traits class -------------------------------------
#ifdef CGAL_NO_DEPRECATED_CODE
#error The class Weighted_alpha_shape_euclidean_traits_2<K> is deprecated in favor of Regular_triangulation_euclidean_traits_2<K>.
#endif
template< class R > template< class R >
class Weighted_alpha_shape_euclidean_traits_2 : public class Weighted_alpha_shape_euclidean_traits_2 : public
Regular_triangulation_euclidean_traits_2<R, typename R::FT> Regular_triangulation_euclidean_traits_2<R, typename R::FT>

View File

@ -1,80 +0,0 @@
// Copyright (c) 1997 INRIA Sophia-Antipolis (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org).
// You can redistribute it and/or modify it under the terms of the GNU
// General Public License as published by the Free Software Foundation,
// either version 3 of the License, or (at your option) any later version.
//
// Licensees holding a valid commercial license may use this file in
// accordance with the commercial license agreement provided with the software.
//
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
//
// $URL$
// $Id$
//
//
// Author(s) : Tran Kai Frank DA <Frank.Da@sophia.inria.fr>
#ifndef CGAL_SQUARED_RADIUS_SMALLEST_ORTHOGONALCIRCLE_FTC2_H
#define CGAL_SQUARED_RADIUS_SMALLEST_ORTHOGONALCIRCLE_FTC2_H
#include <CGAL/license/Alpha_shapes_2.h>
#include <CGAL/determinant.h>
#include <CGAL/enum.h>
//-------------------------------------------------------------------
namespace CGAL {
//-------------------------------------------------------------------
template< class FT >
CGAL_MEDIUM_INLINE
FT
squared_radius_orthogonalcircleC2(
const FT &px, const FT &py, const FT &pw,
const FT &qx, const FT &qy, const FT &qw,
const FT &rx, const FT &ry, const FT &rw)
{
FT FT4(4);
FT dpx = px-rx;
FT dpy = py-ry;
FT dqx = qx-rx;
FT dqy = qy-ry;
FT dpp = CGAL_NTS square(dpx)+CGAL_NTS square(dpy)-pw+rw;
FT dqq = CGAL_NTS square(dqx)+CGAL_NTS square(dqy)-qw+rw;
FT det0 = determinant(dpx, dpy, dqx, dqy);
FT det1 = determinant(dpp, dpy, dqq, dqy);
FT det2 = determinant(dpx, dpp, dqx, dqq);
return
(CGAL_NTS square(det1)+CGAL_NTS square(det2))/
(FT4*CGAL_NTS square(det0)) - rw;
}
template< class FT >
CGAL_MEDIUM_INLINE
FT
squared_radius_smallest_orthogonalcircleC2(
const FT &px, const FT &py, const FT &pw,
const FT &qx, const FT &qy, const FT &qw)
{
FT FT4(4);
FT dpz = CGAL_NTS square(px-qx)+CGAL_NTS square(py-qy);
return (CGAL_NTS square(dpz-pw+qw)/(FT4*dpz)-qw);
}
//-------------------------------------------------------------------
} //namespace CGAL
//-------------------------------------------------------------------
#endif //CGAL_SQUARED_RADIUS_SMALLEST_ORTHOGONALCIRCLE_ftC2_H

View File

@ -1,56 +0,0 @@
// Copyright (c) 1997 INRIA Sophia-Antipolis (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org).
// You can redistribute it and/or modify it under the terms of the GNU
// General Public License as published by the Free Software Foundation,
// either version 3 of the License, or (at your option) any later version.
//
// Licensees holding a valid commercial license may use this file in
// accordance with the commercial license agreement provided with the software.
//
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
//
// $URL$
// $Id$
//
//
// Author(s) : Tran Kai Frank DA <Frank.Da@sophia.inria.fr>
#ifndef CGAL_IN_SMALLEST_ORTHOGONALCIRCLE_FTC2_H
#define CGAL_IN_SMALLEST_ORTHOGONALCIRCLE_FTC2_H
#include <CGAL/license/Alpha_shapes_2.h>
#include <CGAL/determinant.h>
#include <CGAL/enum.h>
//-------------------------------------------------------------------
namespace CGAL {
//-------------------------------------------------------------------
template< class FT >
CGAL_MEDIUM_INLINE
Bounded_side
in_smallest_orthogonalcircleC2(const FT &px, const FT &py, const FT &pw,
const FT &qx, const FT &qy, const FT &qw,
const FT &tx, const FT &ty, const FT &tw)
{
FT dpx = px-qx;
FT dpy = py-qy;
FT dtx = tx-qx;
FT dty = ty-qy;
FT dpz = CGAL_NTS square(dpx)+CGAL_NTS square(dpy);
return Bounded_side
(CGAL_NTS sign(-(CGAL_NTS square(dtx)+CGAL_NTS square(dty)-tw+qw)*dpz
+(dpz-pw+qw)*(dpx*dtx+dpy*dty)));
}
//-------------------------------------------------------------------
} //namespace CGAL
//-------------------------------------------------------------------
#endif //CGAL_IN_SMALLEST_ORTHOGONALCIRCLEC2_H

View File

@ -8,6 +8,9 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Instruct CMake to run moc automatically when needed. # Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOMOC ON)
cmake_minimum_required(VERSION 2.8.11) cmake_minimum_required(VERSION 2.8.11)
if(POLICY CMP0053)
cmake_policy(SET CMP0053 OLD)
endif()
if(POLICY CMP0043) if(POLICY CMP0043)
cmake_policy(SET CMP0043 OLD) cmake_policy(SET CMP0043 OLD)
endif() endif()

View File

@ -51,7 +51,7 @@ MainWindow::open_file()
QString fileName = QFileDialog::getOpenFileName(this, QString fileName = QFileDialog::getOpenFileName(this,
tr("Open Points File"), tr("Open Points File"),
"./data", "./data",
tr("pts files (*.pts)")); tr("pts files (*.pts)"));
if(! fileName.isEmpty()){ if(! fileName.isEmpty()){
open(fileName); open(fileName);

View File

@ -23,19 +23,20 @@
#include <CGAL/license/Alpha_shapes_3.h> #include <CGAL/license/Alpha_shapes_3.h>
// temporarily silenced
/*
#define CGAL_DEPRECATED_HEADER "<CGAL/Weighted_alpha_shape_euclidean_traits_3.h>"
#define CGAL_REPLACEMENT_HEADER "<CGAL/Regular_triangulation_euclidean_traits_3.h>"
#define CGAL_DEPRECATED_MESSAGE_DETAILS \
"The class Weighted_alpha_shape_euclidean_traits_3<K> is deprecated in favor of "\
"Regular_triangulation_euclidean_traits_3<K>."
#include <CGAL/internal/deprecation_warning.h>
*/
#include <CGAL/Regular_triangulation_euclidean_traits_3.h> #include <CGAL/Regular_triangulation_euclidean_traits_3.h>
namespace CGAL { namespace CGAL {
//------------------ Traits class -------------------------------------
#ifdef CGAL_NO_DEPRECATED_CODE
#error The class Weighted_alpha_shape_euclidean_traits_3<K> is deprecated in favor of Regular_triangulation_euclidean_traits_3<K>.
#endif
template <class K> template <class K>
class Weighted_alpha_shape_euclidean_traits_3 : public class Weighted_alpha_shape_euclidean_traits_3 : public
Regular_triangulation_euclidean_traits_3<K> Regular_triangulation_euclidean_traits_3<K>

View File

@ -43,7 +43,7 @@
#include <CGAL/Apollonius_graph_vertex_base_2.h> #include <CGAL/Apollonius_graph_vertex_base_2.h>
#include <CGAL/in_place_edge_list.h> #include <CGAL/in_place_edge_list.h>
#include <CGAL/Segment_Delaunay_graph_2/edge_list.h> #include <CGAL/internal/TDS_2/edge_list.h>
#include <CGAL/Apollonius_graph_2/Traits_wrapper_2.h> #include <CGAL/Apollonius_graph_2/Traits_wrapper_2.h>
#include <CGAL/Apollonius_graph_2/Constructions_C2.h> #include <CGAL/Apollonius_graph_2/Constructions_C2.h>

View File

@ -3,6 +3,9 @@
project( Arrangement_on_surface_2_Demo ) project( Arrangement_on_surface_2_Demo )
cmake_minimum_required(VERSION 2.8.11) cmake_minimum_required(VERSION 2.8.11)
if(POLICY CMP0053)
cmake_policy(SET CMP0053 OLD)
endif()
if(POLICY CMP0043) if(POLICY CMP0043)
cmake_policy(SET CMP0043 OLD) cmake_policy(SET CMP0043 OLD)
endif() endif()

View File

@ -8,12 +8,11 @@
/// @} /// @}
namespace CGAL { namespace CGAL {
/*! /*! \ingroup PkgArrangement2TraitsClasses
* \ingroup PkgArrangement2TraitsClasses
* *
* Note: The `GeometryTraits_2` can comprise of Line_segments, Conic_arcs, * Note: The `SubcurveTraits_2` can comprise of Line_segments, Conic_arcs,
* Circular_arc, Bezier_curves or Linear_curves. A portion or a part * Circular_arc, Bezier_curves, or Linear_curves. A portion or a part
* of any of the above mentioned geometric traits is called a segment. * of any of the above mentioned geometric traits is called a subcurve.
* *
* The traits class `Arr_polycurve_traits_2` handles piecewise curves that are * The traits class `Arr_polycurve_traits_2` handles piecewise curves that are
* not necessarily linear, such as conic arcs, circular arcs, Bezier curves, * not necessarily linear, such as conic arcs, circular arcs, Bezier curves,
@ -21,22 +20,22 @@ namespace CGAL {
* is a chain of subcurves, where each two neighboring subcurves in the chain * is a chain of subcurves, where each two neighboring subcurves in the chain
* share a common endpoint; that is, the polycurve is continuous. Furthermore, * share a common endpoint; that is, the polycurve is continuous. Furthermore,
* the target of the \f$i\f$th segement of a polycurve has to coincide with * the target of the \f$i\f$th segement of a polycurve has to coincide with
* the source of the \f$i+1\f$st segment; that is, the polycurve has to be \a * the source of the \f$i+1\f$st segment; that is, the polycurve has to be
* well-oriented. Note that it is possible to construct general polycurves * \a well-oriented. Note that it is possible to construct general polycurves
* that are neither continuous nor well-oriented, as it is impossible to * that are neither continuous nor well-oriented, as it is impossible to
* enforce this precondition (using the set of predicates required by the * enforce this precondition (using the set of predicates required by the
* relevant concepts, see below). However, such polycurves cannot be used for * relevant concepts, see below). However, such polycurves cannot be used for
* the actual computation of arrangements. The traits class template exploits * the actual computation of arrangements. The traits class template exploits
* the functionality of the `GeometryTraits_2` template-parameter to handle * the functionality of the `SubcurveTraits_2` template-parameter to handle
* the subcurves that compose the polycurve. * the subcurves that compose the polycurve.
* *
* The type substituting the template parameter `GeometryTraits_2` when * The type substituting the template parameter `SubcurveTraits_2` when
* the template Arr_polycurve_traits_2 is instantiated must be a model * the template Arr_polycurve_traits_2 is instantiated must be a model
* of the concepts * of the concepts
* - `ArrangementTraits_2` and * - `ArrangementTraits_2` and
* - `ArrangementDirectionalXMonotoneTraits_2`. * - `ArrangementDirectionalXMonotoneTraits_2`.
* *
* If, in addition, the GeometryTraits_2 models the concept * If, in addition, the SubcurveTraits_2 models the concept
* `ArrangementApproximateTraits_2` then `Arr_polycurve_traits_2` models this * `ArrangementApproximateTraits_2` then `Arr_polycurve_traits_2` models this
* concept as well. The same holds for the concept * concept as well. The same holds for the concept
* `ArrangementOpenBoundaryTraits_2`. If no type is provided, then * `ArrangementOpenBoundaryTraits_2`. If no type is provided, then
@ -53,22 +52,22 @@ namespace CGAL {
* `Arr_rational_function_traits_2<AlgebraicKernel_d_1>`, * `Arr_rational_function_traits_2<AlgebraicKernel_d_1>`,
* or any other model of the concepts above can be used. * or any other model of the concepts above can be used.
* *
* The number type used by the injected segment traits should support exact * The number type used by the injected subcurve traits should support exact
* rational arithmetic (that is, the number type should support the arithmetic * rational arithmetic (that is, the number type should support the arithmetic
* operations \f$ +\f$, \f$ -\f$, \f$ \times\f$ and \f$ \div\f$ carried out * operations \f$ +\f$, \f$ -\f$, \f$ \times\f$ and \f$ \div\f$ carried out
* without loss of precision), in order to avoid robustness problems, although * without loss of precision), in order to avoid robustness problems, although
* other inexact number types could be used at the user's own risk. * other inexact number types could be used at the user's own risk.
* *
* A polycurve that comprises \f$n > 0\f$ segments has \f$ n+1 \f$ segment * A polycurve that comprises \f$n > 0\f$ subcurves has \f$ n+1 \f$ subcurve
* end-points, and they are represented as objects of type * end-points, and they are represented as objects of type
* `GeometryTraits_2::Point_2`. Since the notion of a \a vertex is reserved to * `SubcurveTraits_2::Point_2`. Since the notion of a \a vertex is reserved to
* 0-dimensional elements of an arrangement, we use, in this context, the * 0-dimensional elements of an arrangement, we use, in this context, the
* notion of \a points in order to refer to the vertices of a polycurve. For * notion of \a points in order to refer to the vertices of a polycurve. For
* example, an arrangement induced by a single non-self intersecting polycurve * example, an arrangement induced by a single non-self intersecting polycurve
* has exactly two vertices regardless of the number of segment * has exactly two vertices regardless of the number of subcurve
* end-points. Finally, the types `Segment_2` and `X_monotone_segment_2` * end-points. Finally, the types `Subcurve_2` and `X_monotone_subcurve_2`
* nested in `Arr_polycurve_traits_2` are nothing but * nested in `Arr_polycurve_traits_2` are nothing but
* `GeometryTraits_2::Curve_2` and `GeometryTraits_2::X_monotone_curve_2`, * `SubcurveTraits_2::Curve_2` and `SubcurveTraits_2::X_monotone_curve_2`,
* respectively. * respectively.
* *
* \cgalHeading{A note on Backwards compatibility} In \cgal version 4.2 (and * \cgalHeading{A note on Backwards compatibility} In \cgal version 4.2 (and
@ -85,10 +84,10 @@ namespace CGAL {
* \cgalModels `ArrangementTraits_2` * \cgalModels `ArrangementTraits_2`
* \cgalModels `ArrangementDirectionalXMonotoneTraits_2` * \cgalModels `ArrangementDirectionalXMonotoneTraits_2`
* \cgalModels `ArrangementApproximateTraits_2` (if the type that substitutes * \cgalModels `ArrangementApproximateTraits_2` (if the type that substitutes
* the template parameter `GeometryTraits_2` models the concept as well) * the template parameter `SubcurveTraits_2` models the concept as well)
* *
* \sa `Arr_algebraic_segment_traits_2<Coefficient>` * \sa `Arr_algebraic_segment_traits_2<Coefficient>`
* \sa `Arr_Bezier_curve_traits_2<RatKernel,AlgKernel,NtTraits>` * \sa `Arr_Bezier_curve_traits_2<RatKernel, AlgKernel, NtTraits>`
* \sa `Arr_circle_segment_traits_2<Kernel>` * \sa `Arr_circle_segment_traits_2<Kernel>`
* \sa `Arr_conic_traits_2<RatKernel, AlgKernel, NtTraits>` * \sa `Arr_conic_traits_2<RatKernel, AlgKernel, NtTraits>`
* \sa `Arr_linear_traits_2<Kernel>` * \sa `Arr_linear_traits_2<Kernel>`
@ -98,7 +97,7 @@ namespace CGAL {
* \sa `CGAL_ALWAYS_LEFT_TO_RIGHT` * \sa `CGAL_ALWAYS_LEFT_TO_RIGHT`
*/ */
template <typename GeometryTraits_2> template <typename SubcurveTraits_2>
class Arr_polycurve_traits_2 { class Arr_polycurve_traits_2 {
public: public:
@ -108,12 +107,12 @@ namespace CGAL {
*/ */
// TODO: Have to turn these into links, so whenever I mention Point_2 it // TODO: Have to turn these into links, so whenever I mention Point_2 it
// will point here and *not* to Kernel::Point_2 for instance. // will point here and *not* to Kernel::Point_2 for instance.
typedef GeometryTraits_2::Point_2 Point_2; typedef SubcurveTraits_2::Point_2 Point_2;
/*! /*!
*/ */
typedef GeometryTraits_2::Curve_2 Segment_2; typedef SubcurveTraits_2::Curve_2 Subcurve_2;
typedef GeometryTraits_2::X_monotone_curve_2 X_monotone_segment_2; typedef SubcurveTraits_2::X_monotone_curve_2 X_monotone_subcurve_2;
/// @} /// @}
/*! Construction functor of a general (not necessarily \f$x\f$-monotone) /*! Construction functor of a general (not necessarily \f$x\f$-monotone)
@ -122,7 +121,7 @@ namespace CGAL {
* This functor constructs general polycurve. Its `operator()` is * This functor constructs general polycurve. Its `operator()` is
* oveloaded to support various input types. * oveloaded to support various input types.
* *
* Note that the composing segments, depending on the `GeometryTraits_2`, * Note that the composing subcurves, depending on the `SubcurveTraits_2`,
* might not be \f$x\f$-monotone. * might not be \f$x\f$-monotone.
*/ */
class Construct_curve_2 { class Construct_curve_2 {
@ -130,15 +129,15 @@ namespace CGAL {
/// \name Operations /// \name Operations
/// @{ /// @{
/*! Obtain a polycurve that comprises of one given segment. /*! Obtain a polycurve that comprises of one given subcurve.
* \param seg input segment * \param subcurve input subcurve.
* \pre `seg` is not degenerated (not tested) * \pre `subcurve` is not degenerated (not tested).
* \return A polycurve with one segment, namely `seg`. * \return A polycurve with one subcurve, namely `subcurve`.
*/ */
Curve_2 operator()(const Segment_2& seg) const; Curve_2 operator()(const Subcurve_2& subcurve) const;
/*! Construct a well-oriented polycurve from a range of either /*! Construct a well-oriented polycurve from a range of either
* `GeometryTraits_2::Point_2` or `GeometryTraits_2::Curve_2`. * `SubcurveTraits_2::Point_2` or `SubcurveTraits_2::Curve_2`.
* *
* \param begin iterator pointing to the first element in the * \param begin iterator pointing to the first element in the
* range. * range.
@ -146,7 +145,7 @@ namespace CGAL {
* element in the range. * element in the range.
* \pre The given range form a continuous and well-oriented polycurve * \pre The given range form a continuous and well-oriented polycurve
* (not tested). * (not tested).
* \pre Contains no degenerated segments (not tested) * \pre Contains no degenerated subcurves (not tested)
* \return A polycurve using the corresponding construction implementation. * \return A polycurve using the corresponding construction implementation.
*/ */
template <typename ForwardIterator> template <typename ForwardIterator>
@ -167,12 +166,12 @@ namespace CGAL {
*/ */
class Construct_x_monotone_curve_2 {}; class Construct_x_monotone_curve_2 {};
/*! Function object which returns the number of segment end-points of a /*! Function object which returns the number of subcurve end-points of a
* polycurve. * polycurve.
*/ */
class Number_of_points_2 {}; class Number_of_points_2 {};
/*! Functor to augment a polycurve by either adding a vertex or a segment /*! Functor to augment a polycurve by either adding a vertex or a subcurve
* at the back. * at the back.
*/ */
class Push_back_2 { class Push_back_2 {
@ -180,32 +179,31 @@ namespace CGAL {
/// \name Operations /// \name Operations
/// @{ /// @{
/*! /*! Append a subcurve `subcurve` to an existing polycurve `cv` at the back.
* Append a segment `seg` to an existing polycurve `cv` at the back. * If `cv` is empty, `subcurve` will be its first subcurve.
* If `cv` is empty, `seg` will be its first segment.
* \param cv a polycurve. Note, `cv` is (not necessarily) \f$x\f$-monotone. * \param cv a polycurve. Note, `cv` is (not necessarily) \f$x\f$-monotone.
* \param seg a segment (not necessarily \f$x\f$-monotone) to be appended * \param subcurve a subcurve (not necessarily \f$x\f$-monotone) to be
* to `cv` * appended to `cv`
*/ */
void operator()(Curve_2& cv, const Segment_2& seg) const; void operator()(Curve_2& cv, const Subcurve_2& subcurve) const;
/*! Append a segment `seg` to an existing \f$x\f$-monotone polycurve `xcv` /*! Append a subcurve `subcurve` to an existing \f$x\f$-monotone polycurve
* at the back. If `xcv` is empty, `seg` will be its first segment. * `xcv` at the back. If `xcv` is empty, `subcurve` will be its first
* subcurve.
* \param xcv existing \f$x\f$-monotone polycurve * \param xcv existing \f$x\f$-monotone polycurve
* \param seg the segment to be added * \param subcurve the subcurve to be added
* \pre If `xcv` is not empty then `seg` extends `xcv` to the right if * \pre If `xcv` is not empty then `subcurve` extends `xcv` to the right
* `xcv` is oriented right-to-left. Otherwise, `seg` extends `xcv` to * if `xcv` is oriented right-to-left. Otherwise, `subcurve` extends
* the left. * `xcv` to the left.
* \pre `seg` is not degenerated. * \pre `subcurve` is not degenerated.
* \pre `xcv` and `seg` should have the same orientation * \pre `xcv` and `subcurve` should have the same orientation
*/ */
void operator()(const X_monotone_curve_2& xcv, X_monotone_segment_2& seg) void operator()(X_monotone_curve_2& xcv,
const; const X_monotone_subcurve_2& subcurve) const;
/// @} /* end of operations */ /// @} /* end of operations */
}; /* end of Arr_polycurve_traits_2::Push_back_2 */ }; /* end of Arr_polycurve_traits_2::Push_back_2 */
/*! Functor to augment a polycurve by either adding a vertex or a segment /*! Functor to augment a polycurve by either adding a vertex or a subcurve
* at the front. * at the front.
*/ */
class Push_front_2 { class Push_front_2 {
@ -213,26 +211,27 @@ namespace CGAL {
/// \name Operations /// \name Operations
/// @{ /// @{
/*! Append a segment `seg` to an existing polycurve `cv` at the front. /*! Append a subcurve `subcurve` to an existing polycurve `cv` at the
* If `cv` is empty, `seg` will be its first segment. * front. If `cv` is empty, `subcurve` will be its first subcurve.
* \param cv a polycurve. Note, `cv` is (not necessarily) \f$x\f$-monotone. * \param cv a polycurve. Note, `cv` is (not necessarily) \f$x\f$-monotone.
* \param seg a segment (not necessarily \f$x\f$-monotone) to be appended * \param subcurve a subcurve (not necessarily \f$x\f$-monotone) to be
* to `cv` * appended to `cv`
*/ */
void operator()(Curve_2& cv, const Segment_2& seg) const; void operator()(Curve_2& cv, const Subcurve_2& subcurve) const;
/*! Append a segment `seg` to an existing \f$x\f$-monotone polycurve `xcv` /*! Append a subcurve `subcurve` to an existing \f$x\f$-monotone polycurve
* at the front. If `xcv` is empty, `seg` will be its first segment. * `xcv` at the front. If `xcv` is empty, `subcurve` will be its first
* subcurve.
* \param xcv existing \f$x\f$-monotone polycurve * \param xcv existing \f$x\f$-monotone polycurve
* \param seg the segment to be added * \param subcurve the subcurve to be added
* \pre If `xcv` is not empty then `seg` extends `xcv` to the left if * \pre If `xcv` is not empty then `subcurve` extends `xcv` to the left if
* `xcv` is oriented right-to-left. Otherwise, `seg` extends `xcv` to * `xcv` is oriented right-to-left. Otherwise, `subcurve` extends
* the right. * `xcv` to the right.
* \pre `seg` is not degenerated. * \pre `subcurve` is not degenerated.
* \pre `xcv` and `seg` should have the same orientation * \pre `xcv` and `subcurve` should have the same orientation
*/ */
void operator()(const X_monotone_curve_2& xcv, X_monotone_segment_2& seg) void operator()(X_monotone_curve_2& xcv,
const; const X_monotone_subcurve_2& subcurve) const;
/// @} /* end of operations */ /// @} /* end of operations */
}; /* end of Arr_polycurve_traits_2::Push_front_2 */ }; /* end of Arr_polycurve_traits_2::Push_front_2 */
@ -249,8 +248,8 @@ namespace CGAL {
const Point_2& tgt) const; const Point_2& tgt) const;
}; };
/*! Subdivide the given segment into x-monotone sub-segments and insert them /*! Subdivide the given subcurve into x-monotone subcurves and insert them
* into the given output iterator. Since the segments that * into the given output iterator. Since the subcurves that
* constitute a general polycurve are not necessarily * constitute a general polycurve are not necessarily
* \f$x\f$-monotone, this functor may break them. * \f$x\f$-monotone, this functor may break them.
*/ */
@ -258,7 +257,7 @@ namespace CGAL {
public: public:
/*! /*!
* \pre if `cv` is not empty then it must be continuous and well-oriented. * \pre if `cv` is not empty then it must be continuous and well-oriented.
* \param cv The segment. * \param cv The subcurve.
* \param oi The output iterator, whose value-type is Object. The output * \param oi The output iterator, whose value-type is Object. The output
* object is a wrapper of a X_monotone_curve_2 objects. * object is a wrapper of a X_monotone_curve_2 objects.
* \return The past-the-end iterator. * \return The past-the-end iterator.
@ -268,25 +267,25 @@ namespace CGAL {
}; };
/*! The `Curve_2` type nested in the `Arr_polycurve_traits_2` represents /*! The `Curve_2` type nested in the `Arr_polycurve_traits_2` represents
* general continuous piecewise-linear segments (a polycurve can be * general continuous piecewise-linear subcurves (a polycurve can be
* self-intersecting) and support their construction from range of * self-intersecting) and support their construction from range of
* segments. Construction of polycurves in various ways is supported using * subcurves. Construction of polycurves in various ways is supported using
* the construction functors. <em>It is strongly recommended to avoid * the construction functors. <em>It is strongly recommended to avoid
* construction of `Curve_2` objects directly and prefer the usage of the * construction of `Curve_2` objects directly and prefer the usage of the
* construction functors.</em> The type `Curve_2` has two template * construction functors.</em> The type `Curve_2` has two template
* parameters, namely `Segment_type_T` and `Point_type_T`, which are * parameters, namely `SubcurveType_2` and `PointType_2`, which are
* `GeometryTraits_2::Curve_2` and `GeometryTraits_2::Point_2` types. Thus, * `SubcurveTraits_2::Curve_2` and `SubcurveTraits_2::Point_2` types. Thus,
* in general, the segments that a `Curve_2` instance comprises could be * in general, the subcurves that a `Curve_2` instance comprises could be
* either \f$x\f$-monotone or not! * either \f$x\f$-monotone or not!
* *
* The copy and default constructor as well as the assignment operator are * The copy and default constructor as well as the assignment operator are
* provided for polycurve segments. In addition, an \link * provided for polycurve subcurves. In addition, an \link
* PkgArrangement2op_left_shift `operator<<` \endlink for the segments is * PkgArrangement2op_left_shift `operator<<` \endlink for the subcurves is
* defined for standard output streams, and an \link * defined for standard output streams, and an \link
* PkgArrangement2op_right_shift `operator>>` \endlink for the segments is * PkgArrangement2op_right_shift `operator>>` \endlink for the subcurves is
* defined for standard input streams. * defined for standard input streams.
*/ */
template <typename Segment_type_T, typename Point_type_T> template <typename SubcurveType_2, typename PointType_2>
class Curve_2 { class Curve_2 {
public: public:
@ -294,36 +293,37 @@ namespace CGAL {
/// \name Types /// \name Types
/// @{ /// @{
/*! The container of the segments that comprises the polycurve. /*! The container of the subcurves that comprises the polycurve.
*/ */
typedef typename std::vector<Segment_2> Segments_container; typedef typename std::vector<Subcurve_2> Subcurves_container;
public: public:
/*! The size of the container that comprises the polycurve. /*! The size of the container that comprises the polycurve.
*/ */
typedef typename Segments_container::size_type Segments_size_type; typedef typename Subcurves_container::size_type Size;
typedef typename Subcurves_container::size_type size_type;
/*! \deprecated /*! \deprecated
* A bidirectional iterator that allows traversing the points * A bidirectional iterator that allows traversing the points
* that comprise a polycurve's segments. * that comprise a polycurve's subcurves.
*/ */
typedef unspecified_type const_iterator; typedef unspecified_type const_iterator;
/*! \deprecated /*! \deprecated
* A bidirectional iterator that allows traversing the points * A bidirectional iterator that allows traversing the points
* that comprise a polycurve's segments. * that comprise a polycurve's subcurves.
*/ */
typedef unspecified_type const_reverse_iterator; typedef unspecified_type const_reverse_iterator;
/*! A bidirectional constant iterator that allows traversing /*! A bidirectional constant iterator that allows traversing
* the segments that comprise the polycurve. * the subcurves that comprise the polycurve.
*/ */
typedef unspecified_type Segment_const_iterator; typedef unspecified_type Subcurve_const_iterator;
/*! A bidirectional constant iterator that allows traversing /*! A bidirectional constant iterator that allows traversing
* the segments that comprise the polycurve. * the subcurves that comprise the polycurve.
*/ */
typedef unspecified_type Segment_const_reverse_iterator; typedef unspecified_type Subcurve_const_reverse_iterator;
/// @} /* End of Types */ /// @} /* End of Types */
@ -334,25 +334,25 @@ namespace CGAL {
*/ */
Curve_2(); Curve_2();
/*! Construct a polycurve from one segment. /*! Construct a polycurve from one subcurve.
*/ */
Curve_2(const Segment_2 seg); Curve_2(const Subcurve_2 subcurve);
/*! Construct a polycurve defined by the given range of segments /*! Construct a polycurve defined by the given range of subcurves
* `[first, last)` (the value-type of `InputIterator` must be * `[first, last)` (the value-type of `InputIterator` must be
* `GeometryTraits_2::Curve_2`. In general, the segments might not * `SubcurveTraits_2::Curve_2`. In general, the subcurves might not
* be \f$x\f$-monotone, furthermore, they might not form a * be \f$x\f$-monotone, furthermore, they might not form a
* continuous polycurve. * continuous polycurve.
* *
* \pre The segments in the range should form a continuous and * \pre The subcurves in the range should form a continuous and
* well-oriented polycurve. * well-oriented polycurve.
* *
* \deprecated For backwards compatibility, it is * \deprecated For backwards compatibility, it is
* possible to call this constructor with a range whose * possible to call this constructor with a range whose
* value-type is `GeometryTraits_2::Point_2`. In this case, the * value-type is `SubcurveTraits_2::Point_2`. In this case, the
* constructed polycurve will concatenate the \f$n\f$th point * constructed polycurve will concatenate the \f$n\f$th point
* with the \f$(n+1)\f$-st point in the range (using a * with the \f$(n+1)\f$-st point in the range (using a
* `GeometryTraits_2::Segment_2`'s). This functionality is \a deprecated. * `SubcurveTraits_2::Subcurve_2`'s). This functionality is \a deprecated.
* Instead use the `Construct_curve_2` functors. * Instead use the `Construct_curve_2` functors.
*/ */
template <typename InputIterator> template <typename InputIterator>
@ -364,9 +364,9 @@ namespace CGAL {
/// @{ /// @{
/*! \deprecated /*! \deprecated
* Obtain the number of segment end-points that comprise the polycurve. * Obtain the number of subcurve end-points that comprise the polycurve.
* Note that for a bounded polycurve, if there are \f$ n\f$ points in the * Note that for a bounded polycurve, if there are \f$ n\f$ points in the
* polycurve, it is comprised of \f$ (n - 1)\f$ segments. * polycurve, it is comprised of \f$ (n - 1)\f$ subcurves.
* Currently, only bounded polycurves are supported. * Currently, only bounded polycurves are supported.
*/ */
unsigned_int points() const; unsigned_int points() const;
@ -376,53 +376,53 @@ namespace CGAL {
*/ */
const_iterator begin() const; const_iterator begin() const;
/*! Obtain an iterator pointing at the first segment of the polycurve. /*! Obtain an iterator pointing at the first subcurve of the polycurve.
*/ */
Segment_const_iterator begin_segments() const; Subcurve_const_iterator begin_subcurves() const;
/*! \deprecated /*! \deprecated
* Obtain an iterator pointing after the end of the polycurve. * Obtain an iterator pointing after the end of the polycurve.
*/ */
const_iterator end() const; const_iterator end() const;
/*! Get an iterator pointing at the past-the-end segment of the polycurve. /*! Get an iterator pointing at the past-the-end subcurve of the polycurve.
*/ */
Segment_const_iterator end_segments() const; Subcurve_const_iterator end_subcurves() const;
/*! \deprecated /*! \deprecated
* Obtain an iterator pointing at the target point of the polycurve. * Obtain an iterator pointing at the target point of the polycurve.
*/ */
const_iterator rbegin() const; const_iterator rbegin() const;
/*! Obtain an iterator pointing at the last segment of the polycurve. /*! Obtain an iterator pointing at the last subcurve of the polycurve.
*/ */
Segment_const_reverse_iterator rbegin_segments() const; Subcurve_const_reverse_iterator rbegin_subcurves() const;
/*! \deprecated /*! \deprecated
* Obtain an iterator pointing before the beginning of the polycurve. * Obtain an iterator pointing before the beginning of the polycurve.
*/ */
const_iterator rend() const; const_iterator rend() const;
/*! Obtain an iterator pointing at the past-the-end segment of /*! Obtain an iterator pointing at the past-the-end subcurve of
* the polycurve in reverse order. * the polycurve in reverse order.
*/ */
Segment_const_reverse_iterator rend_segments() const; Subcurve_const_reverse_iterator rend_subcurves() const;
/*! \deprecated /*! \deprecated
* Obtain the number of segments composing the polycurve * Obtain the number of subcurves composing the polycurve
* (equivalent to `pi.points() - 1`). Was replaced by number_of_segments() * (equivalent to `pi.points() - 1`). Was replaced by number_of_subcurves()
*/ */
Segments_size_type size() const; size_type size() const;
/*! Obtain the number of segments that comprise the polycurve. /*! Obtain the number of subcurves that comprise the polycurve.
*/ */
Segments_container_size number_of_segments() const; size_type number_of_subcurves() const;
/*! Obtain the \f$ k\f$th segment of the polycurve. /*! Obtain the \f$ k\f$th subcurve of the polycurve.
* \pre \f$k\f$ is not greater then or equal to \f$n-1\f$, where * \pre \f$k\f$ is not greater then or equal to \f$n-1\f$, where
* \f$n\f$ is the number of segments. * \f$n\f$ is the number of subcurves.
*/ */
typename GeometryTraits_2::X_monotone_curve_2 typename SubcurveTraits_2::X_monotone_curve_2
operator[](size_t k) const; operator[](size_t k) const;
/*! Obtain the bounding box of the polycurve. /*! Obtain the bounding box of the polycurve.
@ -434,30 +434,32 @@ namespace CGAL {
/// \name Operations /// \name Operations
/// @{ /// @{
/*! Append a segment to the polycurve at the back. /*! Append a subcurve to the polycurve at the back.
* \a Warning: This function does not preform the precondition test * \a Warning: This function does not preform the precondition test
* that the `Push_back_2` functor does. Thus, it is * that the `Push_back_2` functor does. Thus, it is
* recommended to use the latter. * recommended to use the latter.
* \param seg The new segment to be appended to the polycurve. * \param subcurve The new subcurve to be appended to the polycurve.
* \pre If the polycurve is not empty, the source of `seg` must coincide * \pre If the polycurve is not empty, the source of `subcurve` must
* with the target point of the last segment in the polycurve. * coincide with the target point of the last subcurve in the
* polycurve.
*/ */
inline void push_back(const Segment_2& seg); inline void push_back(const Subcurve_2& subcurve);
/*! Append a segment to the polycurve at the front. /*! Append a subcurve to the polycurve at the front.
* \a Warning: This is a risky function! Don't use it! Prefer the * \a Warning: This is a risky function! Don't use it! Prefer the
* corresponding functor which is provided in the traits * corresponding functor which is provided in the traits
* class. * class.
* \param seg The new segment to be appended to the polycurve. * \param subcurve The new subcurve to be appended to the polycurve.
* \pre If the polycurve is not empty, the target of `seg` must coincide * \pre If the polycurve is not empty, the target of `subcurve` must
* with the source point of the first segment in the polycurve. * coincide with the source point of the first subcurve in the
* polycurve.
*/ */
inline void push_front(const Segment_2& seg); inline void push_front(const Subcurve_2& subcurve);
/*! \deprecated /*! \deprecated
* Add a new point to the polycurvs, which becomes the new target point * Add a new point to the polycurvs, which becomes the new target point
* of `pi`. * of `pi`.
* \pre GeometryTraits_2 is a model of * \pre SubcurveTraits_2 is a model of
* ArrangementConstructXMonotoneCurveTraits_2. * ArrangementConstructXMonotoneCurveTraits_2.
*/ */
void push_back(const Point_2 & p); void push_back(const Point_2 & p);
@ -472,15 +474,15 @@ namespace CGAL {
/*! The `X_monotone_curve_2` class nested within the polycurve /*! The `X_monotone_curve_2` class nested within the polycurve
* traits is used to represent \f$ x\f$-monotone piecewise linear segments. * traits is used to represent \f$ x\f$-monotone piecewise linear subcurves.
* *
* It inherits from the `Curve_2` type. `X_monotone_curve_2` can be * It inherits from the `Curve_2` type. `X_monotone_curve_2` can be
* constructed just like `Curve_2`. However, there is precondition * constructed just like `Curve_2`. However, there is precondition
* (which is not tested) that the input defines an \f$ * (which is not tested) that the input defines an \f$
* x\f$-monotone polycurve. Furthermore, in contrast to the general * x\f$-monotone polycurve. Furthermore, in contrast to the general
* `Curve_2` type, in this case, the segments that an * `Curve_2` type, in this case, the subcurves that an
* `X_monotone_curve_2` comprises have to be instances of the type * `X_monotone_curve_2` comprises have to be instances of the type
* `GeometryTraits_2::X_monotone_curve_2`. Note that the \f$ * `SubcurveTraits_2::X_monotone_curve_2`. Note that the \f$
* x\f$-monotonicity ensures that an \f$ x\f$-monotone polycurve * x\f$-monotonicity ensures that an \f$ x\f$-monotone polycurve
* is not self-intersecting. (A self-intersecting polycurve is * is not self-intersecting. (A self-intersecting polycurve is
* subdivided into several interior-disjoint \f$x\f$-monotone subcurves). * subdivided into several interior-disjoint \f$x\f$-monotone subcurves).
@ -490,7 +492,7 @@ namespace CGAL {
* lexicographical \f$ xy\f$-order) or left-to-right (and in this case the * lexicographical \f$ xy\f$-order) or left-to-right (and in this case the
* vertices are stored in a descending lexicographical \f$ xy\f$-order). * vertices are stored in a descending lexicographical \f$ xy\f$-order).
*/ */
template <typename Segment_type_2_T, typename Point_type_2_T> template <typename SubcurveType_2, typename PointType_2>
class X_monotone_curve_2 { class X_monotone_curve_2 {
}; /* end Arr_polycurve_traits_2::X_monotone_curve_2 */ }; /* end Arr_polycurve_traits_2::X_monotone_curve_2 */

View File

@ -84,7 +84,8 @@ namespace CGAL {
* \cgalModels `ArrangementApproximateTraits_2` (if the type that substitutes * \cgalModels `ArrangementApproximateTraits_2` (if the type that substitutes
* the template parameter `SegmentTraits_2` models the concept as well) * the template parameter `SegmentTraits_2` models the concept as well)
* *
* \sa `Arr_Bezier_curve_traits_2<RatKernel,AlgKernel,NtTraits>` * \sa `Arr_polycurve_traits_2<SubcurveTraits_2>`
* \sa `Arr_Bezier_curve_traits_2<RatKernel, AlgKernel, NtTraits>`
* \sa `Arr_circle_segment_traits_2<Kernel>` * \sa `Arr_circle_segment_traits_2<Kernel>`
* \sa `Arr_conic_traits_2<RatKernel, AlgKernel, NtTraits>` * \sa `Arr_conic_traits_2<RatKernel, AlgKernel, NtTraits>`
* \sa `Arr_linear_traits_2<Kernel>` * \sa `Arr_linear_traits_2<Kernel>`
@ -94,21 +95,22 @@ namespace CGAL {
*/ */
template <typename SegmentTraits_2> template <typename SegmentTraits_2>
class Arr_polyline_traits_2 { class Arr_polyline_traits_2 : public Arr_polycurve_traits_2<SegmentTraits_2>{
public: public:
/// \name Types /// \name Types
/// @{ /// @{
/*! /*!
*/ */
typedef SegmentTraits_2 Segment_traits_2;
// TODO: Have to turn these into links, so whenever I mention Point_2 it // TODO: Have to turn these into links, so whenever I mention Point_2 it
// will point here and *not* to Kernel::Point_2 for instance. // will point here and *not* to Kernel::Point_2 for instance.
typedef SegmentTraits_2::Point_2 Point_2; typedef SegmentTraits_2::Point_2 Point_2;
/*! /*!
*/ */
typedef SegmentTraits_2::Curve_2 Segment_2; typedef SegmentTraits_2::Curve_2 Segment_2;
typedef SegmentTraits_2::X_monotone_curve_2 X_monotone_segment_2; typedef SegmentTraits_2::X_monotone_curve_2 X_monotone_segment_2;
/// @} /// @}
/*! Construction functor of a general (not necessarily \f$x\f$-monotone) /*! Construction functor of a general (not necessarily \f$x\f$-monotone)
@ -168,12 +170,7 @@ namespace CGAL {
*/ */
class Construct_x_monotone_curve_2 {}; class Construct_x_monotone_curve_2 {};
/*! Function object which returns the number of points of a polyline. /*! Functor to augment a polyline by either adding a vertex or a segment
*/
class Number_of_points_2 {};
/*!
* Functor to augment a polyline by either adding a vertex or a segment
* at the back. * at the back.
*/ */
class Push_back_2 { class Push_back_2 {
@ -273,260 +270,6 @@ namespace CGAL {
/// @} /* end of operations */ /// @} /* end of operations */
}; /* end of Arr_polyline_traits_2::Push_front_2 */ }; /* end of Arr_polyline_traits_2::Push_front_2 */
class Trim_2 {
public:
/*! Obtain a trimmed version of the polycurve with src and tgt as end
* vertices.
* Src and tgt will be swaped if they do not conform to the direction of
* the polycurve.
*/
X_monotone_curve_2 operator()(const X_monotone_curve_2& xcv,
const Point_2& src,
const Point_2& tgt) const;
};
/*! Subdivide the given curve into x-monotone sub-curves and insert them
* into the given output iterator. Since the segments that
* constitute a general polyline are not necessarily
* \f$x\f$-monotone, this functor may break them.
*/
class Make_x_monotone_2 {
public:
/*! \pre if `cv` is not empty then it must be continuous and well-oriented.
* \param cv The curve.
* \param oi The output iterator, whose value-type is Object. The output
* object is a wrapper of a X_monotone_curve_2 objects.
* \return The past-the-end iterator.
*/
template <typename OutputIterator>
OutputIterator operator()(const Curve_2& cv, OutputIterator oi) const;
};
/*! The `Curve_2` type nested in the `Arr_polyline_traits_2` represents
* general continuous piecewise-linear curves (a polyline can be
* self-intersecting) and support their construction from range of
* segments. Construction of polylines in various ways is supported using the
* construction functors. <em>It is strongly recommended to avoid
* construction of `Curve_2` objects directly and prefer the usage of the
* construction functors.</em> The type `Curve_2` has two template
* parameters, namely `Segment_type_T` and `Point_type_T`, which are
* `SegmentTraits_2::Curve_2` and `SegmentTraits_2::Point_2` types. Thus, in
* general, the segments that a `Curve_2` instance comprises could be either
* \f$x\f$-monotone or not!
*
* The copy and default constructor as well as the assignment
* operator are provided for polyline curves. In addition, an \link
* PkgArrangement2op_left_shift `operator<<` \endlink for the
* curves is defined for standard output streams, and an \link
* PkgArrangement2op_right_shift `operator>>` \endlink for the
* curves is defined for standard input streams.
*/
template <typename Segment_type_T, typename Point_type_T>
class Curve_2 {
public:
protected:
/// \name Types
/// @{
/*! The container of the segments that comprises the polyline.
*/
typedef typename std::vector<Segment_2> Segments_container;
public:
/*! The size of the container that comprises the polylines.
*/
typedef typename Segments_container::size_type Segments_size_type;
/*! \deprecated
* A bidirectional iterator that allows traversing the points
* that comprise a polyline curve.
*/
typedef unspecified_type const_iterator;
/*! \deprecated
* A bidirectional iterator that allows traversing the points
* that comprise a polyline curve.
*/
typedef unspecified_type const_reverse_iterator;
/*! A bidirectional constant iterator that allows traversing
* the segments the comprise the polyline.
*/
typedef unspecified_type Segment_const_iterator;
/*! A bidirectional constant iterator that allows traversing
* the segments the comprise the polyline.
*/
typedef unspecified_type Segment_const_reverse_iterator;
/// @} /* End of Types */
/// \name Creation
/// @{
/*! Default constructor that constructs an empty polyline.
*/
Curve_2();
/*! Construct a polyline from one segment.
*/
Curve_2(const Segment_2 seg);
/*! Construct a polyline defined by the given range of segments
* `[first, last)` (the value-type of `InputIterator` must be
* `SegmentTraits_2::Curve_2`. In general, the segments might not be
* \f$x\f$-monotone, furthermore, they might not form a continuous
* polyline.
*
* \pre The segments in the range should form a continuous and
* well-oriented polyline.
*
* \deprecated For backwards compatibility, it is
* possible to call this constructor with a range whose
* value-type is `SegmentTraits_2::Point_2`. In this case, the
* constructed polyline will concatenate the \f$n\f$th point
* with the \f$(n+1)\f$-st point in the range (using a
* `SegmentTraits_2::Segment_2`'s). This functionality is \a deprecated.
* Instead use the `Construct_curve_2` functors.
*/
template <typename InputIterator>
Curve_2(Iterator first, Iterator last);
/// @} /* End of Creation */
/// \name Access Functions
/// @{
/*! \deprecated Obtain the number of points that comprise the polyline.
* Note that for a bounded polyline, if there are \f$ n\f$ points in the
* polyline, it is comprised of \f$ (n - 1)\f$ segments.
* Currently, only bounded polylines are supported.
*/
unsigned_int points() const;
/*! \deprecated Obtain an iterator pointing at the source point of the
* polyline.
*/
const_iterator begin() const;
/*! Obtain an iterator pointing at the first segment of the polyline.
*/
Segment_const_iterator begin_segments() const;
/*! \deprecated Obtain an iterator pointing after the end of the polyline.
*/
const_iterator end() const;
/*! Obtain an iterator pointing at the past-the-end segment of the
* polyline.
*/
Segment_const_iterator end_segments() const;
/*! \deprecated Obtain an iterator pointing at the target point of the
* polyline.
*/
const_iterator rbegin() const;
/*! Obtain an iterator pointing at the last segment of the polyline.
*/
Segment_const_reverse_iterator rbegin_segments() const;
/*! \deprecated Obtain an iterator pointing before the beginning of the
* polyline.
*/
const_iterator rend() const;
/*!
* Obtain an iterator pointing at the past-the-end segment of
* the polyline in reverse order.
*/
Segment_const_reverse_iterator rend_segments() const;
/*! \deprecated Obtain the number of line segments composing the polyline
* (equivalent to `pi.points() - 1`). Was replaced by number_of_segments()
*/
Segments_size_type size() const;
/*! Obtain the number of segments that comprise the polyline.
*/
Segments_container_size number_of_segments() const;
/*! Obtain the \f$ k\f$th segment of the polyline.
* \pre \f$k\f$ is not greater then or equal to \f$n-1\f$, where
* \f$n\f$ is the number of segments.
*/
typename SegmentTraits_2::X_monotone_curve_2 operator[](size_t k) const;
/*!
* the bounding box of the polyline.
*/
Bbox_2 bbox() const;
/// @} /* End of Access functions */
/// \name Operations
/// @{
/*! Append a segment to the polyline at the back.
* \a Warning: This function does not preform the precondition test
that the `Push_back_2` functor does. Thus, it is
recommended to use the latter.
* \param seg The new segment to be appended to the polyline.
* \pre If the polyline is not empty, the source of `seg` must coincide
* with the target point of the last segment in the polyline.
*/
inline void push_back(const Segment_2& seg);
/*! Append a segment to the polyline at the front.
* \a Warning: This is a risky function! Don't use it! Prefer the
* corresponding functor which is provided in the traits
* class.
* \param seg The new segment to be appended to the polyline.
* \pre If the polyline is not empty, the target of `seg` must coincide
* with the source point of the first segment in the polyline.
*/
inline void push_front(const Segment_2& seg);
/*! \deprecated adds a new point to the polyline, which becomes the new
* target point of `pi`.
*/
void push_back(const Point_2& p);
/*! Reset the polyline.
*/
void clear();
/// @} /* End of Operations */
}; /* end Arr_polyline_traits_2::Curve_2 */
/*! The `X_monotone_curve_2` class nested within the polyline
* traits is used to represent \f$ x\f$-monotone piecewise linear
* curves.
*
* It inherits from the `Curve_2` type. `X_monotone_curve_2` can be
* constructed just like `Curve_2`. However, there is precondition
* (which is not tested) that the input defines an \f$
* x\f$-monotone polyline. Furthermore, in contrast to the general
* `Curve_2` type, in this case, the segments that an
* `X_monotone_curve_2` comprises have to be instances of the type
* `SegmentTraits_2::X_monotone_curve_2`. Note that the \f$
* x\f$-monotonicity ensures that an \f$ x\f$-monotone polyline
* is not self-intersecting. (A self-intersecting polyline is
* subdivided into several interior-disjoint \f$x\f$-monotone subcurves).
*
* The defined \f$ x\f$-monotone polyline can be directed either from
* right-to-left (and in turn its vertices are stored in an ascending
* lexicographical \f$ xy\f$-order) or left-to-right (and in this case the
* vertices are stored in a descending lexicographical \f$ xy\f$-order).
*/
template <typename Segment_type_2_T, typename Point_type_2_T>
class X_monotone_curve_2 {
}; /* end Arr_polyline_traits_2::X_monotone_curve_2 */
/// \name Accessing Functor Objects /// \name Accessing Functor Objects
/// @{ /// @{
@ -538,10 +281,6 @@ namespace CGAL {
*/ */
Construct_x_monotone_curve_2 construct_x_monotone_curve_2_object() const; Construct_x_monotone_curve_2 construct_x_monotone_curve_2_object() const;
/*!
*/
Number_of_points_2 number_of_points_2_object() const;
/*! /*!
*/ */
Push_back_2 push_back_2_object() const; Push_back_2 push_back_2_object() const;
@ -550,10 +289,6 @@ namespace CGAL {
*/ */
Push_front_2 push_front_2_object() const; Push_front_2 push_front_2_object() const;
/*!
*/
Make_x_monotone_2 make_x_monotone_2_object() const;
/// @} /* End Accessing Functor Objects */ /// @} /* End Accessing Functor Objects */
}; /* end Arr_polyline_traits_2 */ }; /* end Arr_polyline_traits_2 */

View File

@ -545,6 +545,10 @@ returning constant iterators instead of mutable ones.
*/ */
Vertex_iterator vertices_end(); Vertex_iterator vertices_end();
/*!
returns a range over handles of the arrangement vertices .
*/
unspecified_type vertex_handles();
/*! /*!
returns the number of arrangement vertices that lie at infinity and returns the number of arrangement vertices that lie at infinity and
are not associated with valid points. Such vertices are not considered are not associated with valid points. Such vertices are not considered
@ -578,6 +582,11 @@ returning constant iterators instead of mutable ones.
*/ */
Halfedge_iterator halfedges_end(); Halfedge_iterator halfedges_end();
/*!
returns a range over handles of the arrangement halfedges .
*/
unspecified_type halfedge_handles();
/*! /*!
returns the number of edges in the arrangement (equivalent to returns the number of edges in the arrangement (equivalent to
`arr.number_of_halfedges() / 2`). `arr.number_of_halfedges() / 2`).
@ -594,6 +603,10 @@ returning constant iterators instead of mutable ones.
*/ */
Edge_iterator edges_end(); Edge_iterator edges_end();
/*!
returns a range over handles of the arrangement edges .
*/
unspecified_type edge_handles();
/// @} /// @}
@ -627,6 +640,11 @@ returning constant iterators instead of mutable ones.
*/ */
Face_iterator faces_end(); Face_iterator faces_end();
/*!
returns a range over handles of the arrangement faces .
*/
unspecified_type face_handles();
/*! /*!
returns the number of unbounded faces in the arrangement. returns the number of unbounded faces in the arrangement.
Note `arr.number_of_faces()` also counts the unbounded faces Note `arr.number_of_faces()` also counts the unbounded faces

View File

@ -163,6 +163,11 @@ returns a past-the-end iterator of the vertices in `dcel`.
*/ */
Vertex_iterator vertices_end(); Vertex_iterator vertices_end();
/*!
returns a range over handles of the vertices in `dcel`.
*/
unspecified_type vertex_handles();
/*! /*!
returns a begin-iterator of the vertices in `dcel`. returns a begin-iterator of the vertices in `dcel`.
*/ */
@ -173,6 +178,11 @@ returns a past-the-end iterator of the vertices in `dcel`.
*/ */
Vertex_const_iterator vertices_end() const; Vertex_const_iterator vertices_end() const;
/*!
returns a const range (model of `ConstRange`) over handles of the vertices in `dcel`.
*/
unspecified_type vertex_handles() const;
/*! /*!
returns a begin-iterator of the halfedges in `dcel`. returns a begin-iterator of the halfedges in `dcel`.
*/ */
@ -183,6 +193,11 @@ returns a past-the-end iterator of the halfedges in `dcel`.
*/ */
Halfedge_iterator halfedges_end(); Halfedge_iterator halfedges_end();
/*!
returns a range over handles of the halfedges in `dcel`.
*/
unspecified_type halfedge_handles();
/*! /*!
returns a begin-iterator of the halfedges in `dcel`. returns a begin-iterator of the halfedges in `dcel`.
*/ */
@ -193,6 +208,11 @@ returns a past-the-end iterator of the halfedges in `dcel`.
*/ */
Halfedge_const_iterator halfedges_end() const; Halfedge_const_iterator halfedges_end() const;
/*!
returns a const range (model of `ConstRange`) over handles of the halfedges in `dcel`.
*/
unspecified_type halfedge_handles() const;
/*! /*!
returns a begin-iterator of the faces in `dcel`. returns a begin-iterator of the faces in `dcel`.
*/ */
@ -203,6 +223,11 @@ returns a past-the-end iterator of the faces in `dcel`.
*/ */
Face_iterator faces_end(); Face_iterator faces_end();
/*!
returns a range over handles of the faces in `dcel`.
*/
unspecified_type face_handles();
/*! /*!
returns a begin-iterator of the faces in `dcel`. returns a begin-iterator of the faces in `dcel`.
*/ */
@ -213,6 +238,10 @@ returns a past-the-end iterator of the faces in `dcel`.
*/ */
Face_const_iterator faces_end() const; Face_const_iterator faces_end() const;
/*!
returns a const range (model of `ConstRange`) over handles of the faces in `dcel`.
*/
unspecified_type face_handles() const;
/// @} /// @}

View File

@ -1011,24 +1011,64 @@ public:
//@{ //@{
Vertex_iterator vertices_begin() { return vertices.begin(); } Vertex_iterator vertices_begin() { return vertices.begin(); }
Vertex_iterator vertices_end() { return vertices.end(); } Vertex_iterator vertices_end() { return vertices.end(); }
Iterator_range<Prevent_deref<Vertex_iterator> >
vertex_handles()
{
return make_prevent_deref_range(vertices_begin(), vertices_end());
}
Halfedge_iterator halfedges_begin() { return halfedges.begin();} Halfedge_iterator halfedges_begin() { return halfedges.begin();}
Halfedge_iterator halfedges_end() { return halfedges.end(); } Halfedge_iterator halfedges_end() { return halfedges.end(); }
Iterator_range<Prevent_deref<Halfedge_iterator> >
halfedge_handles()
{
return make_prevent_deref_range(halfedges_begin(), halfedges_end());
}
Face_iterator faces_begin() { return faces.begin(); } Face_iterator faces_begin() { return faces.begin(); }
Face_iterator faces_end() { return faces.end(); } Face_iterator faces_end() { return faces.end(); }
Iterator_range<Prevent_deref<Face_iterator> >
face_handles()
{
return make_prevent_deref_range(faces_begin(), faces_end());
}
Edge_iterator edges_begin() { return halfedges.begin(); } Edge_iterator edges_begin() { return halfedges.begin(); }
Edge_iterator edges_end() { return halfedges.end(); } Edge_iterator edges_end() { return halfedges.end(); }
Iterator_range<Prevent_deref<Edge_iterator> >
edge_handles()
{
return make_prevent_deref_range(edges_begin(), edges_end());
}
//@} //@}
/// \name Obtaining constant iterators. /// \name Obtaining constant iterators.
//@{ //@{
Vertex_const_iterator vertices_begin() const { return vertices.begin(); } Vertex_const_iterator vertices_begin() const { return vertices.begin(); }
Vertex_const_iterator vertices_end() const { return vertices.end(); } Vertex_const_iterator vertices_end() const { return vertices.end(); }
Iterator_range<Prevent_deref<Vertex_const_iterator> >
vertex_handles() const
{
return make_prevent_deref_range(vertices_begin(), vertices_end());
}
Halfedge_const_iterator halfedges_begin() const { return halfedges.begin(); } Halfedge_const_iterator halfedges_begin() const { return halfedges.begin(); }
Halfedge_const_iterator halfedges_end() const { return halfedges.end(); } Halfedge_const_iterator halfedges_end() const { return halfedges.end(); }
Iterator_range<Prevent_deref<Halfedge_const_iterator> >
halfedge_handles() const
{
return make_prevent_deref_range(halfedges_begin(), halfedges_end());
}
Face_const_iterator faces_begin() const { return faces.begin(); } Face_const_iterator faces_begin() const { return faces.begin(); }
Face_const_iterator faces_end() const { return faces.end(); } Face_const_iterator faces_end() const { return faces.end(); }
Iterator_range<Prevent_deref<Face_const_iterator> >
face_handles() const
{
return make_prevent_deref_range(faces_begin(), faces_end());
}
Edge_const_iterator edges_begin() const { return halfedges.begin(); } Edge_const_iterator edges_begin() const { return halfedges.begin(); }
Edge_const_iterator edges_end() const { return halfedges.end(); } Edge_const_iterator edges_end() const { return halfedges.end(); }
Iterator_range<Prevent_deref<Edge_const_iterator> >
edge_handles() const
{
return make_prevent_deref_range(edges_begin(), edges_end());
}
//@} //@}
// \name Creation of new DCEL features. // \name Creation of new DCEL features.

View File

@ -23,17 +23,15 @@
#include <CGAL/license/Arrangement_on_surface_2.h> #include <CGAL/license/Arrangement_on_surface_2.h>
#define CGAL_DEPRECATED_HEADER "<CGAL/Arr_face_map.h>"
/*! \file #define CGAL_REPLACEMENT_HEADER "<CGAL/Arr_face_index_map.h>"
* Definition of the Arr_face_index_map<Arrangement> class. #include <CGAL/internal/deprecation_warning.h>
*/
#if (defined __GNUC__)
#warning Arr_face_map.h is DEPRECATED, please include Arr_face_index_map.h instead
#elif (defined _MSC_VER)
#pragma message("Arr_face_map.h is DEPRECATED, please include Arr_face_index_map.h instead")
#endif
#include <CGAL/Arr_face_index_map.h> #include <CGAL/Arr_face_index_map.h>
/*! \file
* Definition of the Arr_face_index_map<Arrangement> class.
*/
#endif #endif

View File

@ -2936,7 +2936,7 @@ public:
CGAL_precondition(!kernel.equal_3_object()(source, target)); CGAL_precondition(!kernel.equal_3_object()(source, target));
CGAL_precondition(!kernel.equal_3_object() CGAL_precondition(!kernel.equal_3_object()
(kernel.construct_opposite_direction_3_object()(source), (kernel.construct_opposite_direction_3_object()(source),
target)); static_cast<const Direction_3&>(target)));
this->m_normal = this->construct_normal_3(source, target); this->m_normal = this->construct_normal_3(source, target);
// Check whether one of the endpoints coincides with a pole: */ // Check whether one of the endpoints coincides with a pole: */

View File

@ -401,7 +401,7 @@ public:
NT y3 = p3.y(); NT y3 = p3.y();
// Make sure that the source and the taget are not the same. // Make sure that the source and the target are not the same.
CGAL_precondition (Kernel().compare_xy_2_object() (p1, p3) != EQUAL); CGAL_precondition (Kernel().compare_xy_2_object() (p1, p3) != EQUAL);
// Compute the lines: A1*x + B1*y + C1 = 0, // Compute the lines: A1*x + B1*y + C1 = 0,
@ -532,7 +532,7 @@ public:
/*! /*!
* Get the vertical tangency points the arc contains. * Get the vertical tangency points the arc contains.
* \param vpts Output: The vertical tagnecy points. * \param vpts Output: The vertical tangency points.
* \pre The curve is circular. * \pre The curve is circular.
* \return The number of points (0, 1, or 2). * \return The number of points (0, 1, or 2).
*/ */
@ -593,8 +593,8 @@ private:
/*! /*!
* Get the vertical tangency points the arc contains, assuming it is * Get the vertical tangency points the arc contains, assuming it is
* counterclockwise oreinted. * counterclockwise oriented.
* \param vpts Output: The vertical tagnecy points. * \param vpts Output: The vertical tangency points.
* \return The number of points (0, 1, or 2). * \return The number of points (0, 1, or 2).
*/ */
unsigned int _ccw_vertical_tangency_points (const Point_2& src, unsigned int _ccw_vertical_tangency_points (const Point_2& src,

View File

@ -19,6 +19,11 @@
#include <CGAL/license/Arrangement_on_surface_2.h> #include <CGAL/license/Arrangement_on_surface_2.h>
#define CGAL_DEPRECATED_HEADER "<CGAL/Arr_geometry_traits/Polyline_2.h>"
#define CGAL_REPLACEMENT_HEADER "<CGAL/Arr_geometry_traits/Polycurve_2.h>"
#include <CGAL/internal/deprecation_warning.h>
#include <CGAL/Arr_geometry_traits/Polycurve_2.h>
/*! \file /*! \file
* Header file for the polyline classes used by the * Header file for the polyline classes used by the
@ -26,12 +31,6 @@
* Arr_polyline_traits_2 classes. * Arr_polyline_traits_2 classes.
*/ */
#if (defined __GNUC__)
#warning Polyline_2.h is DEPRECATED, please include Polycurve_2.h instead
#elif (defined _MSC_VER)
#pragma message("Polyline_2.h is DEPRECATED, please include Polycurve_2.h instead")
#endif
#include <CGAL/Arr_geometry_traits/Polycurve_2.h> #include <CGAL/Arr_geometry_traits/Polycurve_2.h>
namespace CGAL { namespace CGAL {

View File

@ -23,17 +23,16 @@
#include <CGAL/license/Arrangement_on_surface_2.h> #include <CGAL/license/Arrangement_on_surface_2.h>
#define CGAL_DEPRECATED_HEADER "<CGAL/Arr_overlay.h>"
#define CGAL_REPLACEMENT_HEADER "<CGAL/Arr_overlay_2.h>"
#include <CGAL/internal/deprecation_warning.h>
#include <CGAL/Arr_overlay_2.h>
/*! \file /*! \file
* Helping file to include Arr_overlay_2 for backward compatibility. * Helping file to include Arr_overlay_2 for backward compatibility.
*/ */
#if (defined __GNUC__)
#warning Arr_overlay.h is DEPRECATED, please include Arr_overlay_2.h instead
#elif (defined _MSC_VER)
#pragma message("Arr_overlay.h is DEPRECATED, please include Arr_overlay_2.h instead")
#endif
#include <CGAL/Arr_overlay_2.h> #include <CGAL/Arr_overlay_2.h>
#endif #endif

View File

@ -50,6 +50,10 @@ class Arr_polyline_traits_2 : public Arr_polycurve_traits_2<SegmentTraits_2> {
public: public:
typedef SegmentTraits_2 Segment_traits_2; typedef SegmentTraits_2 Segment_traits_2;
// For completeness
typedef typename Segment_traits_2::Curve_2 Segment_2;
typedef typename Segment_traits_2::X_monotone_curve_2 X_monotone_segment_2;
private: private:
typedef Arr_polyline_traits_2<Segment_traits_2> Self; typedef Arr_polyline_traits_2<Segment_traits_2> Self;
typedef Arr_polycurve_traits_2<Segment_traits_2> Base; typedef Arr_polycurve_traits_2<Segment_traits_2> Base;
@ -72,7 +76,7 @@ public:
typedef typename Base::Are_all_sides_oblivious_tag typedef typename Base::Are_all_sides_oblivious_tag
Are_all_sides_oblivious_tag; Are_all_sides_oblivious_tag;
typedef typename Base::X_monotone_subcurve_2 X_monotone_subcurve_2; typedef typename Base::X_monotone_subcurve_2 X_monotone_subcurve_2;
typedef typename Base::Subcurve_2 Subcurve_2; typedef typename Base::Subcurve_2 Subcurve_2;
typedef typename Base::Point_2 Point_2; typedef typename Base::Point_2 Point_2;
@ -133,7 +137,7 @@ public:
*/ */
class Push_back_2 : public Base::Push_back_2 { class Push_back_2 : public Base::Push_back_2 {
protected: protected:
typedef Arr_polyline_traits_2<SegmentTraits_2> Polyline_traits_2; typedef Arr_polyline_traits_2<Segment_traits_2> Polyline_traits_2;
public: public:
/*! Constructor. */ /*! Constructor. */
@ -246,7 +250,7 @@ public:
*/ */
class Push_front_2 : public Base::Push_front_2 { class Push_front_2 : public Base::Push_front_2 {
protected: protected:
typedef Arr_polyline_traits_2<SegmentTraits_2> Polyline_traits_2; typedef Arr_polyline_traits_2<Segment_traits_2> Polyline_traits_2;
public: public:
/*! Constructor. */ /*! Constructor. */
@ -300,7 +304,7 @@ public:
/*! Append a point `p` to an existing polyline `xcv` at the front. */ /*! Append a point `p` to an existing polyline `xcv` at the front. */
void operator()(const X_monotone_curve_2& xcv, Point_2& p) const void operator()(const X_monotone_curve_2& xcv, Point_2& p) const
{ {
const SegmentTraits_2* geom_traits = const Segment_traits_2* geom_traits =
this->m_poly_traits.subcurve_traits_2(); this->m_poly_traits.subcurve_traits_2();
CGAL_precondition_code CGAL_precondition_code
( (

View File

@ -335,7 +335,6 @@ private:
virtual void handle_new_edge(typename Base::Halfedge_handle edge) virtual void handle_new_edge(typename Base::Halfedge_handle edge)
{ {
typedef typename Base::Face_handle Arr_face_handle; typedef typename Base::Face_handle Arr_face_handle;
typedef typename Base::Vertex_handle Arr_vertex_handle;
Arr_face_handle src_face = edge->twin()->face(); Arr_face_handle src_face = edge->twin()->face();
Arr_face_handle trg_face = edge->face(); Arr_face_handle trg_face = edge->face();

View File

@ -14,7 +14,7 @@
// //
// $URL$ // $URL$
// $Id$ // $Id$
// //
// //
// Author(s) : Efi Fogel <efif@post.tau.ac.il> // Author(s) : Efi Fogel <efif@post.tau.ac.il>
@ -160,7 +160,7 @@ public:
/*! Set the vertex */ /*! Set the vertex */
void set_vertex(Arr_vertex_handle vertex) { m_vertex = vertex; } void set_vertex(Arr_vertex_handle vertex) { m_vertex = vertex; }
/*! Set the "marked" flag */ /*! Set the "marked" flag */
void set_marked(bool marked) { m_marked = marked; } void set_marked(bool marked) { m_marked = marked; }
@ -218,4 +218,22 @@ struct Arr_polyhedral_sgm_polyhedron_3 :
} //namespace CGAL } //namespace CGAL
//! Make the polyhedron a model of FaceGraph
namespace boost {
template <typename Sgm, typename Traits>
struct graph_traits<CGAL::Arr_polyhedral_sgm_polyhedron_3<Sgm, Traits> > :
public graph_traits<CGAL::Polyhedron_3
<Traits, CGAL::Arr_polyhedral_sgm_polyhedron_items<Sgm> > >
{};
template <typename Sgm, typename Traits, typename Tag>
struct property_map<CGAL::Arr_polyhedral_sgm_polyhedron_3<Sgm, Traits>, Tag> :
public property_map<CGAL::Polyhedron_3
<Traits, CGAL::Arr_polyhedral_sgm_polyhedron_items<Sgm> >,
Tag>
{};
}
#endif #endif

View File

@ -24,17 +24,16 @@
#include <CGAL/license/Arrangement_on_surface_2.h> #include <CGAL/license/Arrangement_on_surface_2.h>
#define CGAL_DEPRECATED_HEADER "<CGAL/Arr_vertex_map.h>"
#define CGAL_REPLACEMENT_HEADER "<CGAL/Arr_vertex_index_map.h>"
#include <CGAL/internal/deprecation_warning.h>
#include <CGAL/Arr_vertex_index_map.h>
/*! \file /*! \file
* Definition of the Arr_vertex_index_map<Arrangement> class. * Definition of the Arr_vertex_index_map<Arrangement> class.
*/ */
#if (defined __GNUC__)
#warning Arr_vertex_map.h is DEPRECATED, please include Arr_vertex_index_map.h instead
#elif (defined _MSC_VER)
#pragma message("Arr_vertex_map.h is DEPRECATED, please include Arr_vertex_index_map.h instead")
#endif
#include <CGAL/Arr_vertex_index_map.h> #include <CGAL/Arr_vertex_index_map.h>
#endif #endif

View File

@ -1024,6 +1024,15 @@ public:
_Is_concrete_vertex(&m_topol_traits))); _Is_concrete_vertex(&m_topol_traits)));
} }
/*!
returns a range over handles of the arrangement vertices .
*/
Iterator_range<Prevent_deref<Vertex_iterator> >
vertex_handles()
{
return make_prevent_deref_range(vertices_begin(), vertices_end());
}
/*! Get a const iterator for the first vertex in the arrangement. */ /*! Get a const iterator for the first vertex in the arrangement. */
Vertex_const_iterator vertices_begin() const Vertex_const_iterator vertices_begin() const
{ {
@ -1039,6 +1048,16 @@ public:
_dcel().vertices_end(), _dcel().vertices_end(),
_Is_concrete_vertex(&m_topol_traits))); _Is_concrete_vertex(&m_topol_traits)));
} }
/*!
returns a const range (model of `ConstRange`) over handles of the arrangement vertices .
*/
Iterator_range<Prevent_deref<Vertex_iterator> >
vertex_handles() const
{
return make_prevent_deref_range(vertices_begin(), vertices_end());
}
//@} //@}
/// \name Traversal functions for the arrangement halfedges. /// \name Traversal functions for the arrangement halfedges.
@ -1060,6 +1079,15 @@ public:
_Is_valid_halfedge(&m_topol_traits))); _Is_valid_halfedge(&m_topol_traits)));
} }
/*!
returns a range over handles of the arrangement halfedges .
*/
Iterator_range<Prevent_deref<Halfedge_iterator> >
halfedge_handles()
{
return make_prevent_deref_range(halfedges_begin(), halfedges_end());
}
/*! Get a const iterator for the first halfedge in the arrangement. */ /*! Get a const iterator for the first halfedge in the arrangement. */
Halfedge_const_iterator halfedges_begin() const Halfedge_const_iterator halfedges_begin() const
{ {
@ -1075,6 +1103,14 @@ public:
_dcel().halfedges_end(), _dcel().halfedges_end(),
_Is_valid_halfedge(&m_topol_traits))); _Is_valid_halfedge(&m_topol_traits)));
} }
/*!
returns a const range (model of `ConstRange`) over handles of the arrangement halfedges .
*/
Iterator_range<Prevent_deref<Halfedge_iterator> >
halfedge_handles() const
{
return make_prevent_deref_range(halfedges_begin(), halfedges_end());
}
//@} //@}
/// \name Traversal functions for the arrangement edges. /// \name Traversal functions for the arrangement edges.
@ -1094,6 +1130,15 @@ public:
_Is_valid_halfedge(&m_topol_traits))); _Is_valid_halfedge(&m_topol_traits)));
} }
/*!
returns a range over handles of the arrangement edges .
*/
Iterator_range<Prevent_deref<Edge_iterator> >
edge_handles()
{
return make_prevent_deref_range(edges_begin(), edges_end());
}
/*! Get a const iterator for the first edge in the arrangement. */ /*! Get a const iterator for the first edge in the arrangement. */
Edge_const_iterator edges_begin() const Edge_const_iterator edges_begin() const
{ {
@ -1107,6 +1152,15 @@ public:
return (Edge_const_iterator(_dcel().edges_end(), _dcel().edges_end(), return (Edge_const_iterator(_dcel().edges_end(), _dcel().edges_end(),
_Is_valid_halfedge(&m_topol_traits))); _Is_valid_halfedge(&m_topol_traits)));
} }
/*!
returns a const range (model of `ConstRange`) over handles of the arrangement edges .
*/
Iterator_range<Prevent_deref<Edge_iterator> >
edge_handles() const
{
return make_prevent_deref_range(edges_begin(), edges_end());
}
//@} //@}
/// \name Traversal functions for the arrangement faces. /// \name Traversal functions for the arrangement faces.
@ -1126,6 +1180,14 @@ public:
_Is_valid_face(&m_topol_traits))); _Is_valid_face(&m_topol_traits)));
} }
/*!
returns a range over handles of the arrangement faces .
*/
Iterator_range<Prevent_deref<Face_iterator> >
face_handles()
{
return make_prevent_deref_range(faces_begin(), faces_end());
}
/*! Get a const iterator for the first face in the arrangement. */ /*! Get a const iterator for the first face in the arrangement. */
Face_const_iterator faces_begin() const Face_const_iterator faces_begin() const
{ {
@ -1140,6 +1202,14 @@ public:
_Is_valid_face(&m_topol_traits))); _Is_valid_face(&m_topol_traits)));
} }
/*!
returns a const range (model of `ConstRange`) over handles of the arrangement faces .
*/
Iterator_range<Prevent_deref<Face_iterator> >
face_handles() const
{
return make_prevent_deref_range(faces_begin(), faces_end());
}
//! reference_face (const version). //! reference_face (const version).
/*! The function returns a reference face of the arrangement. /*! The function returns a reference face of the arrangement.
* All reference faces of arrangements of the same type have a common * All reference faces of arrangements of the same type have a common

View File

@ -581,8 +581,8 @@ function(test_segment_traits_adaptor)
compile_test_with_flags(test_traits_adaptor segments "${flags}") compile_test_with_flags(test_traits_adaptor segments "${flags}")
# if [ -n "${SUCCESS}" ] ; then # if [ -n "${SUCCESS}" ] ; then
execute_commands_traits_adaptor( segments segments_traits_adaptor execute_commands_traits_adaptor( segments segments_traits_adaptor
COMPARE_Y_POSITION COMPARE_CW_AROUND_POINT COMPARE_Y_AT_X_LEFT COMPARE_Y_POSITION COMPARE_CW_AROUND_POINT COMPARE_Y_AT_X_LEFT
ARE_MERGEABLE MERGE IS_IN_X_RANGE IS_BETWEEN_CW) ARE_MERGEABLE MERGE IS_IN_X_RANGE IS_BETWEEN_CW)
endfunction() endfunction()
@ -597,8 +597,8 @@ function(test_linear_traits_adaptor)
compile_test_with_flags( test_traits_adaptor linear "${flags}") compile_test_with_flags( test_traits_adaptor linear "${flags}")
execute_commands_traits_adaptor( linear linear_traits_adaptor execute_commands_traits_adaptor( linear linear_traits_adaptor
COMPARE_Y_AT_X_LEFT ARE_MERGEABLE MERGE IS_IN_X_RANGE COMPARE_Y_AT_X_LEFT ARE_MERGEABLE MERGE IS_IN_X_RANGE
COMPARE_Y_POSITION IS_BETWEEN_CW COMPARE_CW_AROUND_POINT) COMPARE_Y_POSITION IS_BETWEEN_CW COMPARE_CW_AROUND_POINT)
endfunction() endfunction()
@ -614,8 +614,8 @@ function(test_spherical_arcs_traits_adaptor)
compile_test_with_flags( test_traits_adaptor geodesic_arcs_on_sphere "${flags}") compile_test_with_flags( test_traits_adaptor geodesic_arcs_on_sphere "${flags}")
execute_commands_traits_adaptor( spherical_arcs spherical_arcs_traits_adaptor execute_commands_traits_adaptor( spherical_arcs spherical_arcs_traits_adaptor
COMPARE_Y_AT_X_LEFT ARE_MERGEABLE MERGE IS_IN_X_RANGE COMPARE_Y_AT_X_LEFT ARE_MERGEABLE MERGE IS_IN_X_RANGE
COMPARE_Y_POSITION IS_BETWEEN_CW COMPARE_CW_AROUND_POINT) COMPARE_Y_POSITION IS_BETWEEN_CW COMPARE_CW_AROUND_POINT)
endfunction() endfunction()
@ -1365,3 +1365,5 @@ compile_and_run(test_unbounded_removal)
compile_and_run(test_spherical_removal) compile_and_run(test_spherical_removal)
compile_and_run(test_io) compile_and_run(test_io)
compile_and_run(test_sgm)

View File

@ -1711,6 +1711,8 @@ compile_and_run test_spherical_removal
compile_and_run test_io compile_and_run test_io
compile_and_run test_sgm
# if any error occured then append the full error description file to error file # if any error occured then append the full error description file to error file
if [ -f $FULL_ERROR_DESCRIPTION_FILE ] ; then if [ -f $FULL_ERROR_DESCRIPTION_FILE ] ; then

View File

@ -0,0 +1,69 @@
#define CGAL_IDENTIFICATION_XY 2
// Testing the spherical gaussian map
#include <iostream>
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Polyhedron_3.h>
#include <CGAL/convex_hull_3.h>
#include <CGAL/Arr_spherical_gaussian_map_3/Arr_polyhedral_sgm_traits.h>
#include <CGAL/Arr_spherical_gaussian_map_3/Arr_polyhedral_sgm.h>
#include <CGAL/Arr_spherical_gaussian_map_3/Arr_polyhedral_sgm_polyhedron_3.h>
typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
typedef Kernel::Point_3 Point_3;
typedef CGAL::Arr_polyhedral_sgm_traits<Kernel> Gm_traits;
typedef CGAL::Arr_polyhedral_sgm<Gm_traits> Gm;
typedef CGAL::Arr_polyhedral_sgm_polyhedron_3<Gm, Kernel> Gm_polyhedron;
typedef CGAL::Arr_polyhedral_sgm_initializer<Gm, Gm_polyhedron> Gm_initializer;
int main()
{
// Construct the Gaussian map of a tetrahedron
Point_3 points[] = {
Point_3(1.0, 0.0, 0.0),
Point_3(0.0, 1.0, 0.0),
Point_3(0.0, 0.0, 1.0),
Point_3(0.0, 0.0, 0.0)
};
Gm_polyhedron P1;
CGAL::convex_hull_3(points, &points[4], P1);
Gm gm1;
Gm_initializer gm_initializer1(gm1);
gm_initializer1(P1);
if (! gm1.is_valid()) return -1;
// Construct the Gaussian map of the reflection of a tetrahedron
Gm_polyhedron P2;
for (Point_3* p = points; p != &points[4]; ++p) {
Kernel::Vector_3 v = CGAL::ORIGIN - *p;
*p = CGAL::ORIGIN + v;
}
CGAL::convex_hull_3(points, &points[4], P2);
Gm gm2;
Gm_initializer gm_initializer2(gm2);
gm_initializer2(P2);
if (! gm2.is_valid()) return -1;
// Compute the Minowski sum of the Gaussian maps
Gm gm;
gm.minkowski_sum(gm1, gm2);
if (! gm.is_valid()) return -1;
Kernel::FT sw(16);
Gm::Vertex_const_handle it;
for (it = gm.vertices_begin(); it != gm.vertices_end(); ++it) {
if (it->degree() < 3) continue;
Gm::Halfedge_around_vertex_const_circulator hec3(it->incident_halfedges());
Gm::Halfedge_around_vertex_const_circulator hec1 = hec3++;
Gm::Halfedge_around_vertex_const_circulator hec2 = hec3++;
Kernel::Plane_3 plane((*hec1).face()->point(), (*hec2).face()->point(),
(*hec3).face()->point());
Kernel::Vector_3 v(CGAL::ORIGIN, plane.projection(CGAL::ORIGIN));
Kernel::FT tmp = v.squared_length();
if (tmp < sw) sw = tmp;
}
// std::cout << sw << std::endl;
CGAL::Gmpq res(1,3);
if (sw.exact() != res) return -1;
return 0;
}

View File

@ -85,9 +85,8 @@ bool test_one_file(std::ifstream& in_file, bool /* verbose */)
std::cout.flush(); std::cout.flush();
CGAL::insert_non_intersecting_curves(arr, xcurves.begin(), xcurves.end()); CGAL::insert_non_intersecting_curves(arr, xcurves.begin(), xcurves.end());
std::cout << "inserted" << std::endl; std::cout << "inserted" << std::endl;
for (Halfedge_iterator hit = arr.halfedges_begin(); hit != arr.halfedges_end(); hit++) { BOOST_FOREACH(Halfedge_handle hh, arr.halfedge_handles())
halfedges.push_back(hit); halfedges.push_back(hh);
}
#endif #endif
curves.clear(); curves.clear();
@ -102,7 +101,6 @@ bool test_one_file(std::ifstream& in_file, bool /* verbose */)
} }
isolated_points.clear(); isolated_points.clear();
points.clear(); points.clear();
std::cout << "The arrangement size:" << std::endl std::cout << "The arrangement size:" << std::endl
<< " V = " << arr.number_of_vertices() << " V = " << arr.number_of_vertices()
<< ", E = " << arr.number_of_edges() << ", E = " << arr.number_of_edges()
@ -110,16 +108,16 @@ bool test_one_file(std::ifstream& in_file, bool /* verbose */)
{ {
std::cout << "Faces:" << std::endl; std::cout << "Faces:" << std::endl;
Arrangement_2::Face_const_iterator fit; BOOST_FOREACH(Arrangement_2::Face_handle fh, arr.face_handles())
for (fit = arr.faces_begin(); fit != arr.faces_end(); ++fit) { {
std::cout << " Face: " std::cout << " Face: "
<< &(*fit) << &(fh)
<< std::endl; << std::endl;
std::cout << " Outer CCBs: " std::cout << " Outer CCBs: "
<< std::distance(fit->outer_ccbs_begin(), fit->outer_ccbs_end()) << std::distance(fh->outer_ccbs_begin(), fh->outer_ccbs_end())
<< std::endl; << std::endl;
std::cout << " Inner CCBs: " std::cout << " Inner CCBs: "
<< std::distance(fit->inner_ccbs_begin(), fit->inner_ccbs_end()) << std::distance(fh->inner_ccbs_begin(), fh->inner_ccbs_end())
<< std::endl; << std::endl;
std::cout << std::endl; std::cout << std::endl;
} }

View File

@ -0,0 +1,48 @@
/*!
\ingroup PkgBGLConcepts
\cgalConcept
The concept `EdgeListGraph` refines the concept `Graph` and adds
the requirement for traversal of all edges in a graph.
\cgalRefines `Graph`
\cgalHasModel `CGAL::Polyhedron_3`
\cgalHasModel `CGAL::Surface_mesh`
*/
class EdgeListGraph{};
/*! \relates EdgeListGraph
* returns an iterator range over all edges.
*/
template <typename EdgeListGraph>
std::pair<boost::graph_traits<EdgeListGraph>::edge_iterator,
boost::graph_traits<EdgeListGraph>::edge_iterator>
edges(const EdgeListGraph& g);
/*! \relates EdgeListGraph
returns an upper bound of the number of edges of the graph.
\attention `num_edges()` may return a number larger than `std::distance(edges(g).first, edges(g).second)`.
This is the case for implementations only marking edges deleted in the edge container.
*/
template <typename EdgeListGraph>
boost::graph_traits<EdgeListGraph>::ver_size_type
num_edges(const EdgeListGraph& g);
/*! \relates EdgeListGraph
returns the source vertex of `h`.
*/
template <typename EdgeListGraph>
boost::graph_traits<EdgeListGraph>::vertex_descriptor
source(boost::graph_traits<EdgeListGraph>::halfedge_descriptor h, const EdgeListGraph& g);
/*! \relates EdgeListGraph
returns the target vertex of `h`.
*/
template <typename EdgeListGraph>
boost::graph_traits<EdgeListGraph>::vertex_descriptor
target(boost::graph_traits<EdgeListGraph>::halfedge_descriptor h, const EdgeListGraph& g);

View File

@ -13,32 +13,33 @@ face.
\cgalHasModel `CGAL::Surface_mesh` \cgalHasModel `CGAL::Surface_mesh`
\cgalHasModel `CGAL::Linear_cell_complex_for_combinatorial_map` \cgalHasModel `CGAL::Linear_cell_complex_for_combinatorial_map`
\cgalHeading{Notations}
<dl>
<dt>`G`</dt> <dd>A type that is a model of `FaceGraph`.</dd>
<dt>`g`</dt> <dd>An object of type `G`.</dd>
<dt>`e`</dt> <dd>An edge descriptor.</dd>
<dt>`f`</dt> <dd>A face descriptor.</dd>
<dt>`h`</dt> <dd>A halfedge descriptor.</dd>
</dl>
\cgalHeading{Associated Types}
Type | Description
-------------------- | ------------
`boost::graph_traits<G>::%face_descriptor` | A `face_descriptor` corresponds to a unique face in a graph. Must be `DefaultConstructible`, `Assignable`, `EqualityComparable` and `LessThanComparable`.
\cgalHeading{Valid Expressions}
Expression | Returns | Description
-------------------------------------- | ------------------------------------------------------------------------ | ------------------------
`face(h, g)` | `face_descriptor` | The face incident to halfedge `h`.
`halfedge(f, g)` | `halfedge_descriptor` | A halfedge incident to face `f`.
`degree(f,g)` | `degree_size_type` | The number of halfedges, incident to face `f`.
`boost::graph_traits<G>::%null_face()` | `face_descriptor` | Returns a special face that is not equal to any other face.
*/ */
class FaceGraph {}; class FaceGraph {};
/*! \relates FaceGraph
returns the face incident to halfedge `h`.
*/
template <typename FaceGraph>
boost::graph_traits<FaceGraph>::face_descriptor
face(boost::graph_traits<FaceGraph>::halfedge_descriptor h, const FaceGraph& g);
/*! \relates FaceGraph
returns the halfedge incident to face `f`.
*/
template <typename FaceGraph>
boost::graph_traits<FaceGraph>::halfedge_descriptor
halfedge(boost::graph_traits<FaceGraph>::face_descriptor f, const FaceGraph& g);
/*! \relates FaceGraph
returns the number of halfedges incident to face `f`.
*/
template <typename FaceGraph>
boost::graph_traits<FaceGraph>::degree_size_type
degree(boost::graph_traits<FaceGraph>::face_descriptor f, const FaceGraph& g);
/*! \relates FaceGraph
returns a special face that is not equal to any other face.
*/
template <typename FaceGraph>
boost::graph_traits<FaceGraph>::face_descriptor
null_face(const FaceGraph& g);

View File

@ -10,33 +10,25 @@ the requirement for traversal of all faces in a graph.
\cgalHasModel `CGAL::Surface_mesh` \cgalHasModel `CGAL::Surface_mesh`
\cgalHasModel `CGAL::Linear_cell_complex_for_combinatorial_map` \cgalHasModel `CGAL::Linear_cell_complex_for_combinatorial_map`
\cgalHeading{Notations}
<dl>
<dt>`G`</dt> <dd>A type that is a model of `FaceListGraph`.</dd>
<dt>`g`</dt> <dd>An object of type `G`.</dd>
</dl>
\cgalHeading{Associated Types}
Type | Description
----------------- | -----------
`boost::graph_traits<G>::%face_iterator` | %Iterator over all faces.
`boost::graph_traits<G>::%faces_size_type` | Unsigned integer type for number of faces.
\cgalHeading{Valid Expressions}
Expression | returns | Description
----------------- | --------------- | -----------------------
`faces(g)` | `std::pair<face_iterator, face_iterator>` | An iterator range over all faces.
`num_faces(g)` | `faces_size_type` | An upper bound of the number of faces of the graph.
\attention `num_faces()` may return a number larger than `std::distance(faces(g).first, faces(g).second)`.
This is the case for implementations only marking faces deleted in the face container.
<!--
This is for example the case for `CGAL::Surface_mesh` or `OpenMesh::PolyMesh_ArrayKernelT`.
-->
*/ */
class FaceListGraph{}; class FaceListGraph{};
/*! \relates FaceListGraph
* returns an iterator range over all faces.
*/
template <typename FaceListGraph>
std::pair<boost::graph_traits<FaceListGraph>::face_iterator,
boost::graph_traits<FaceListGraph>::face_iterator>
faces(const FaceListGraph& g);
/*! \relates FaceListGraph
returns an upper bound of the number of faces of the graph.
\attention `num_faces()` may return a number larger than `std::distance(faces(g).first, faces(g).second)`.
This is the case for implementations only marking faces deleted in the face container.
*/
template <typename FaceListGraph>
boost::graph_traits<FaceListGraph>::face_size_type
num_faces(const FaceListGraph& g);

View File

@ -23,43 +23,78 @@ A model of `HalfedgeGraph` must have the interior property `vertex_point` attach
\cgalHasModel `CGAL::Polyhedron_3` \cgalHasModel `CGAL::Polyhedron_3`
\cgalHasModel `CGAL::Surface_mesh` \cgalHasModel `CGAL::Surface_mesh`
\cgalHeading{Notations}
<dl>
<dt>`G`</dt> <dd>A type that is a model of `HalfedgeGraph`.</dd>
<dt>`g`</dt> <dd>An object of type `G`.</dd>
<dt>`u`, `v`</dt> <dd>Vertex descriptors.</dd>
<dt>`e`</dt> <dd>An edge descriptor.</dd>
<dt>`h`</dt> <dd>A halfedge descriptor.</dd>
</dl>
\cgalHeading{Associated Types}
Type | Description
--------------------------------------------------------- | ------------
`boost::graph_traits<G>::%halfedge_descriptor` | A `halfedge_descriptor` corresponds to a halfedge in a graph. Must be `DefaultConstructible`, `Assignable`, `EqualityComparable` and `LessThanComparable`.
\cgalHeading{Valid Expressions}
Expression | Returns | Description
--------------------------------------- | ---------------------------------------------------------------------------- | -----------
`edge(h, g)` | `edge_descriptor` | The edge corresponding to `h` and `opposite(h)`.
`halfedge(e, g)` | `halfedge_descriptor` | One of the halfedges corresponding to `e`.
`halfedge(v, g)` | `halfedge_descriptor` | A halfedge with target `v`.
`halfedge(u, v, g)` | `std::pair<halfedge_descriptor,bool>` | The halfedge with source `u` and target `v`. The Boolean is `true`, iff this halfedge exists.
`opposite(h, g)` | `halfedge_descriptor` | The halfedge with source and target swapped.
`source(h,g)` | `vertex_descriptor` | The source vertex of `h`.
`target(h,g)` | `vertex_descriptor` | The target vertex of `h`.
`next(h, g)` | `halfedge_descriptor` | The next halfedge around its face.
`prev(h, g)` | `halfedge_descriptor` | The previous halfedge around its face.
`boost::graph_traits<G>::%null_halfedge()` | `halfedge_descriptor` | Returns a special halfedge that is not equal to any other halfedge.
\cgalHeading{Invariants}
`halfedge(edge(h,g))==h`
*/ */
class HalfedgeGraph {}; class HalfedgeGraph {};
/*! \relates HalfedgeGraph
returns the edge corresponding to halfedges `h` and `opposite(h,g)`.
*/
template <typename HalfedgeGraph>
boost::graph_traits<HalfedgeGraph>::edge_descriptor
edge(boost::graph_traits<HalfedgeGraph>::halfedge_descriptor h, const HalfedgeGraph& g);
/*! \relates HalfedgeGraph
returns one of the halfedges corresponding to `e`.
*/
template <typename HalfedgeGraph>
boost::graph_traits<HalfedgeGraph>::halfedge_descriptor
halfedge(boost::graph_traits<HalfedgeGraph>::edge_descriptor f, const HalfedgeGraph& g);
/*! \relates HalfedgeGraph
returns a halfedge with target `v`.
*/
template <typename HalfedgeGraph>
boost::graph_traits<HalfedgeGraph>::halfedge_descriptor
halfedge(boost::graph_traits<HalfedgeGraph>::vertex_descriptor v, const HalfedgeGraph& g);
/*! \relates HalfedgeGraph
returns the halfedge with source `u` and target `v`. The Boolean is `true`, iff this halfedge exists.
*/
template <typename HalfedgeGraph>
std::pair<boost::graph_traits<HalfedgeGraph>::halfedge_descriptor,bool>
halfedge(boost::graph_traits<HalfedgeGraph>::vertex_descriptor u,
boost::graph_traits<HalfedgeGraph>::vertex_descriptor v,
const HalfedgeGraph& g);
/*! \relates HalfedgeGraph
returns the halfedge with source and target swapped.
*/
template <typename HalfedgeGraph>
boost::graph_traits<HalfedgeGraph>::halfedge_descriptor
opposite(boost::graph_traits<HalfedgeGraph>::halfedge_descriptor h, const HalfedgeGraph& g);
/*! \relates HalfedgeGraph
returns the source vertex of `h`.
*/
template <typename HalfedgeGraph>
boost::graph_traits<HalfedgeGraph>::vertex_descriptor
source(boost::graph_traits<HalfedgeGraph>::halfedge_descriptor h, const HalfedgeGraph& g);
/*! \relates HalfedgeGraph
returns the target vertex of `h`.
*/
template <typename HalfedgeGraph>
boost::graph_traits<HalfedgeGraph>::vertex_descriptor
target(boost::graph_traits<HalfedgeGraph>::halfedge_descriptor h, const HalfedgeGraph& g);
/*! \relates HalfedgeGraph
returns the next halfedge around its face.
*/
template <typename HalfedgeGraph>
boost::graph_traits<HalfedgeGraph>::halfedge_descriptor
next(boost::graph_traits<HalfedgeGraph>::halfedge_descriptor h, const HalfedgeGraph& g);
/*! \relates HalfedgeGraph
returns the previous halfedge around its face.
*/
template <typename HalfedgeGraph>
boost::graph_traits<HalfedgeGraph>::halfedge_descriptor
prev(boost::graph_traits<HalfedgeGraph>::halfedge_descriptor h, const HalfedgeGraph& g);
/*! \relates HalfedgeGraph
returns a special halfedge that is not equal to any other halfedge.
*/
template <typename HalfedgeGraph>
boost::graph_traits<HalfedgeGraph>::halfedge_descriptor
null_halfedge(const HalfedgeGraph& g);

View File

@ -9,35 +9,25 @@ and adds the requirements for traversal of all halfedges in the graph.
\cgalHasModel `CGAL::Polyhedron_3` \cgalHasModel `CGAL::Polyhedron_3`
\cgalHasModel `CGAL::Surface_mesh` \cgalHasModel `CGAL::Surface_mesh`
\cgalHeading{Notations}
<dl>
<dt>`G`</dt> <dd>A type that is a model of `HalfedgeListGraph`.</dd>
<dt>`g`</dt> <dd>An object of type `G`.</dd>
</dl>
\cgalHeading{Associated Types}
Type | Description
-------------------- | ------------
`boost::graph_traits<G>::%halfedge_iterator` | A `BidirectionalIterator` over all halfedges in a graph. Must be `DefaultConstructible`, `Assignable`, `EqualityComparable`.
`boost::graph_traits<G>::%halfedges_size_type` | A size type.
\cgalHeading{Valid Expressions}
Expression | Returns | Description
------------------------------------- | ------------------------------------------| -----------
`num_halfedges(g)` | `halfedges_size_type` | An upper bound of the number of halfedges of the graph.
`halfedges(g)` | `std::pair<halfedge_iterator,halfedge_iterator>` | An iterator range over the halfedges of the graph.
\attention `num_halfedges()` may return a number larger than `std::distance(halfedges(g).first,halfedges(g).second)`.
This is the case for implementations only marking halfedges deleted in the halfedge container.
<!--
This is for example the case for `CGAL::Surface_mesh` or `OpenMesh::PolyMesh_ArrayKernelT`.
-->
*/ */
class HalfedgeListGraph {}; class HalfedgeListGraph {};
/*! \relates HalfedgeListGraph
* returns an iterator range over all halfedges.
*/
template <typename HalfedgeListGraph>
std::pair<boost::graph_traits<HalfedgeListGraph>::halfedge_iterator,
boost::graph_traits<HalfedgeListGraph>::halfedge_iterator>
halfedges(const HalfedgeListGraph& g);
/*! \relates HalfedgeListGraph
returns an upper bound of the number of halfedges of the graph.
\attention `num_halfedges()` may return a number larger than `std::distance(halfedges(g).first, halfedges(g).second)`.
This is the case for implementations only marking halfedges deleted in the halfedge container.
*/
template <typename HalfedgeListGraph>
boost::graph_traits<HalfedgeListGraph>::halfedge_size_type
num_halfedges(const HalfedgeListGraph& g);

View File

@ -11,23 +11,40 @@ the requirement for operations to add faces and to modify face-halfedge relation
\cgalHasModel `CGAL::Surface_mesh` \cgalHasModel `CGAL::Surface_mesh`
\cgalHasModel `CGAL::Linear_cell_complex_for_combinatorial_map` \cgalHasModel `CGAL::Linear_cell_complex_for_combinatorial_map`
\cgalHeading{Notations}
<dl>
<dt>`G`</dt> <dd>A type that is a model of `MutableFaceGraph`.</dd>
<dt>`g`</dt> <dd>An object of type `G`.</dd>
<dt>`h`</dt> <dd>A halfedge descriptor.</dd>
<dt>`f`</dt> <dd>A face descriptor.</dd>
</dl>
\cgalHeading{Valid Expressions}
Expression | returns | Description
----------------------- | ------------ | -----------
`add_face(g)` | `face_descriptor` | Adds a new face to the graph without initializing the connectivity.
`remove_face(f, g)` | `void` | Removes `f` from the graph.
`set_face(h, f, g)` | `void` | Sets the corresponding face of `h` to `f`.
`set_halfedge(f, h, g)` | `void` | Sets the corresponding halfedge of `f` to `h`.
`reserve(g, nv, ne, nf)`| `void` | Called to indicate the expected size of vertices (`nv`), edges (`ed`) and faces (`nf`)
*/ */
class MutableFaceGraph{}; class MutableFaceGraph{};
/*! \relates MutableFaceGraph
Adds a new face to the graph without initializing the connectivity.
*/
template <typename MutableFaceGraph>
boost::graph_traits<MutableFaceGraph>::face_descriptor
add_face(MutableFaceGraph& g);
/*! \relates MutableFaceGraph
Removes `f` from the graph.
*/
template <typename MutableFaceGraph>
boost::graph_traits<MutableFaceGraph>::face_descriptor
remove_face(boost::graph_traits<MutableFaceGraph>::face_descriptor f, MutableFaceGraph& g);
/*! \relates MutableFaceGraph
Sets the corresponding face of `h` to `f`.
*/
template <typename MutableFaceGraph>
void
set_face(boost::graph_traits<MutableFaceGraph>::halfedge_descriptor h, boost::graph_traits<MutableFaceGraph>::face_descriptor f, MutableFaceGraph& g);
/*! \relates MutableFaceGraph
Sets the corresponding halfedge of `f` to `h`.
*/
template <typename MutableFaceGraph>
void
set_halfedge(boost::graph_traits<MutableFaceGraph>::face_descriptor f, boost::graph_traits<MutableFaceGraph>::halfedge_descriptor h, MutableFaceGraph& g);
/*! \relates MutableFaceGraph
Indicates the expected size of vertices (`nv`), edges (`ed`) and faces (`nf`).
*/
template <typename MutableFaceGraph>
void
reserve(MutableFaceGraph& g, boost::graph_traits<MutableFaceGraph>::vertices_size_type nv, boost::graph_traits<MutableFaceGraph>::vertices_size_type ne, boost::graph_traits<MutableFaceGraph>::vertices_size_type nf);

View File

@ -12,28 +12,57 @@ update the incidence information between vertices and halfedges.
\cgalHasModel `CGAL::Surface_mesh` \cgalHasModel `CGAL::Surface_mesh`
\cgalHasModel `CGAL::Linear_cell_complex_for_combinatorial_map` \cgalHasModel `CGAL::Linear_cell_complex_for_combinatorial_map`
\cgalHeading{Notations}
<dl>
<dt>`G`</dt> <dd>A type that is a model of `MutableHalfedgeGraph`.</dd>
<dt>`g`</dt> <dd>An object of type `G`.</dd>
<dt>`v`</dt> <dd>A vertex descriptor.</dd>
<dt>`h`, `h1`, `h2`</dt> <dd>Halfedge descriptors.</dd>
<dt>`e`</dt> <dd>An edge descriptor.</dd>
</dl>
\cgalHeading{Valid Expressions}
Expression | returns | Description
------------------------- | ------------ | -----------
`add_vertex(g)` | `vertex_descriptor` | Adds a new vertex to the graph without initializing the connectivity.
`remove_vertex(v, g)` | `void` | Removes `v` from the graph.
`add_edge(g)` | `edge_descriptor` | Adds two opposite halfedges to the graph without initializing the connectivity.
`remove_edge(e, g)` | `void` | Removes the two halfedges corresponding to `e` from the graph.
`set_target(h, v, g)` | `void` | Sets the target vertex of `h` and the source of `opposite(h)` to `v`.
`set_halfedge(v, h, g)` | `void` | Sets the halfedge of `v` to `h`. The target vertex of `h` must be `v`.
`set_next(h1, h2, g)` | `void` | Sets the successor of `h1` around a face to `h2`, and the prededecessor of `h2` to `h1`.
*/ */
class MutableHalfedgeGraph{}; class MutableHalfedgeGraph{};
/*! \relates MutableFaceGraph
Adds a new vertex to the graph without initializing the connectivity.
*/
template <typename MutableHalfedgeGraph>
boost::graph_traits<MutableHalfedgeGraph>::face_descriptor
add_vertex(MutableHalfedgeGraph& g);
/*! \relates MutableHalfedgeGraph
Removes `v` from the graph.
*/
template <typename MutableHalfedgeGraph>
boost::graph_traits<MutableHalfedgeGraph>::face_descriptor
remove_vertex(boost::graph_traits<MutableHalfedgeGraph>::vertex_descriptor v, MutableHalfedgeGraph& g);
/*! \relates MutableFaceGraph
Adds two opposite halfedges to the graph without initializing the connectivity.
*/
template <typename MutableHalfedgeGraph>
boost::graph_traits<MutableHalfedgeGraph>::edge_descriptor
add_edge(MutableHalfedgeGraph& g);
/*! \relates MutableHalfedgeGraph
Removes the two halfedges corresponding to `e` from the graph.
*/
template <typename MutableHalfedgeGraph>
boost::graph_traits<MutableHalfedgeGraph>::face_descriptor
remove_edge(boost::graph_traits<MutableHalfedgeGraph>::edge_descriptor e, MutableHalfedgeGraph& g);
/*! \relates MutableHalfedgeGraph
Sets the target vertex of `h` and the source of `opposite(h)` to `v`.
*/
template <typename MutableHalfedgeGraph>
void
set_target(boost::graph_traits<MutableHalfedgeGraph>::halfedge_descriptor h, boost::graph_traits<MutableHalfedgeGraph>::vertex_descriptor v, MutableHalfedgeGraph& g);
/*! \relates MutableHalfedgeGraph
Sets the halfedge of `v` to `h`. The target vertex of `h` must be `v`.
*/
template <typename MutableHalfedgeGraph>
void
set_halfedge(boost::graph_traits<MutableHalfedgeGraph>::vertex_descriptor v, boost::graph_traits<MutableHalfedgeGraph>::halfedge_descriptor h, MutableHalfedgeGraph& g);
/*! \relates MutableHalfedgeGraph
Sets the successor of `h1` around a face to `h2`, and the prededecessor of `h2` to `h1`.
*/
template <typename MutableHalfedgeGraph>
void
set_next(boost::graph_traits<MutableHalfedgeGraph>::halfedge_descriptor h1, boost::graph_traits<MutableHalfedgeGraph>::halfede_descriptor h2, MutableHalfedgeGraph& g);

View File

@ -0,0 +1,33 @@
/*!
\ingroup PkgBGLConcepts
\cgalConcept
The concept `VertexListGraph` refines the concept `Graph` and adds
the requirement for traversal of all vertices in a graph.
\cgalRefines `Graph`
\cgalHasModel `CGAL::Polyhedron_3`
\cgalHasModel `CGAL::Surface_mesh`
*/
class VertexListGraph{};
/*! \relates VertexListGraph
* returns an iterator range over all vertices.
*/
template <typename VertexListGraph>
std::pair<boost::graph_traits<VertexListGraph>::vertex_iterator,
boost::graph_traits<VertexListGraph>::vertex_iterator>
vertices(const VertexListGraph& g);
/*! \relates VertexListGraph
returns an upper bound of the number of vertices of the graph.
\attention `num_vertices()` may return a number larger than `std::distance(vertices(g).first, vertices(g).second)`.
This is the case for implementations only marking vertices deleted in the vertex container.
*/
template <typename VertexListGraph>
boost::graph_traits<VertexListGraph>::ver_size_type
num_vertices(const VertexListGraph& g);

View File

@ -1,33 +1,195 @@
/// \defgroup PkgBGL CGAL and the Boost Graph Library Reference /// \defgroup PkgBGL CGAL and the Boost Graph Library Reference
/// \defgroup PkgBGLConcepts Concepts /*! \defgroup PkgBGLConcepts Concepts
/// \ingroup PkgBGL \ingroup PkgBGL
///
/// We extend the Boost Graph Library(\sc{Bgl} for short) with a set of new concepts. We extend the Boost Graph Library (\sc{Bgl} for short) with a set of new concepts.
/// The documentation of the concepts lists at the same time the functions In order to make this documentation self-contained we here also document
/// related to it. Models of the concept and their related functions concepts that are defined in the original version of the \sc{Bgl}.
/// must be in the same namespace (they will be found by Koenig lookup). The documentation of the concepts lists at the same time the functions
/// related to it. Models of the concept and their related functions
///\dot must be in the same namespace (they will be found by Koenig lookup).
///digraph example {
/// node [shape=record, fontname=Helvetica, fontsize=10];
/// rankdir=BT
/// \dot
/// "boost Graph" [ URL="http://www.boost.org/libs/graph/doc/Graph.html" ]; digraph example {
/// HalfedgeGraph [ URL="\ref HalfedgeGraph"]; node [shape=record, fontname=Helvetica, fontsize=10];
/// HalfedgeListGraph [ URL="\ref HalfedgeListGraph"]; rankdir=BT
/// MutableHalfedgeGraph [ URL="\ref MutableHalfedgeGraph"];
/// FaceGraph [ URL="\ref FaceGraph"]; "boost Graph" [ URL="http://www.boost.org/libs/graph/doc/Graph.html" ];
/// FaceListGraph [ URL="\ref FaceListGraph"]; HalfedgeGraph [ URL="\ref HalfedgeGraph"];
/// MutableFaceGraph [ URL="\ref MutableFaceGraph"]; HalfedgeListGraph [ URL="\ref HalfedgeListGraph"];
/// MutableHalfedgeGraph [ URL="\ref MutableHalfedgeGraph"];
/// MutableHalfedgeGraph -> HalfedgeGraph -> "boost Graph" [ arrowhead="open", label="refines" ]; FaceGraph [ URL="\ref FaceGraph"];
/// FaceListGraph -> FaceGraph -> HalfedgeGraph [ arrowhead="open", label="refines" ]; FaceListGraph [ URL="\ref FaceListGraph"];
/// MutableFaceGraph -> MutableHalfedgeGraph [ arrowhead="open", label="refines" ]; MutableFaceGraph [ URL="\ref MutableFaceGraph"];
/// MutableFaceGraph -> FaceGraph [ arrowhead="open", label="refines" ];
/// HalfedgeListGraph -> HalfedgeGraph [ arrowhead="open", label="refines" ]; MutableHalfedgeGraph -> HalfedgeGraph -> "boost Graph" [ arrowhead="open", label="refines" ];
///} FaceListGraph -> FaceGraph -> HalfedgeGraph [ arrowhead="open", label="refines" ];
///\enddot MutableFaceGraph -> MutableHalfedgeGraph [ arrowhead="open", label="refines" ];
MutableFaceGraph -> FaceGraph [ arrowhead="open", label="refines" ];
HalfedgeListGraph -> HalfedgeGraph [ arrowhead="open", label="refines" ];
}
\enddot
\cgalHeading{Notations}
<dl>
<dt>`G`</dt> <dd>A type that is a model of a graph concept.</dd>
<dt>`g`</dt> <dd>An object of type `G`.</dd>
<dt>`u`, `v`</dt> <dd>An object of type `boost::graph_traits<G>::%vertex_descriptor`.</dd>
<dt>`h`</dt> <dd>An object of type `boost::graph_traits<G>::%halfedge_descriptor`.</dd>
<dt>`e`</dt> <dd>An object of type `boost::graph_traits<G>::%edge_descriptor`.</dd>
<dt>`f`</dt> <dd>An object of type `boost::graph_traits<G>::%face_descriptor`.</dd>
</dl>
\cgalHeading{%VertexListGraph}
The concept `VertexListGraph` refines the concept `Graph` and adds
the requirement for traversal of all vertices in a graph.
Associated Type | Description
----------------- | -----------
`boost::graph_traits<G>::%vertex_iterator` | %Iterator over all vertices.
`boost::graph_traits<G>::%vertices_size_type` | Unsigned integer type for number of vertices.
Valid Expression | returns | Description
----------------- | --------------- | -----------------------
`vertices(g)` | `std::pair<vertex_iterator, vertex_iterator>` | An iterator range over all vertices.
`num_vertices(g)` | `vertices_size_type` | An upper bound of the number of vertices of the graph.
\cgalHeading{%EdgeListGraph}
The concept `EdgeListGraph` refines the concept `Graph` and adds
the requirement for traversal of all edges in a graph.
Associated Type | Description
----------------- | -----------
`boost::graph_traits<G>::%edge_iterator` | %Iterator over all edges.
`boost::graph_traits<G>::%edges_size_type` | Unsigned integer type for number of edges.
Valid Expression | returns | Description
----------------- | --------------- | -----------------------
`edges(g)` | `std::pair<edge_iterator, edge_iterator>` | An iterator range over all edges.
`num_edges(g)` | `edges_size_type` | An upper bound of the number of edges of the graph.
`source(e,g)` | `vertex_descriptor` | The source vertex of `e`.
`target(e,g)` | `vertex_descriptor` | The target vertex of `e`.
\cgalHeading{%HalfedgeGraph}
The concept `HalfedgeGraph` refines the concept `Graph` and adds
the notion of halfedges, where each edge corresponds to two opposite halfedges.
Associated Type | Description
--------------------------------------------------------- | ------------
`boost::graph_traits<G>::%halfedge_descriptor` | A `halfedge_descriptor` corresponds to a halfedge in a graph. Must be `DefaultConstructible`, `Assignable`, `EqualityComparable` and `LessThanComparable`.
Valid Expression | Returns | Description
--------------------------------------- | --------------------------------------------| -----------
`edge(h, g)` | `edge_descriptor` | The edge corresponding to halfedges `h` and `opposite(h)`.
`halfedge(e, g)` | `halfedge_descriptor` | One of the halfedges corresponding to `e`.
`halfedge(v, g)` | `halfedge_descriptor` | A halfedge with target `v`.
`halfedge(u, v, g)` | `std::pair<halfedge_descriptor,bool>` | The halfedge with source `u` and target `v`. The Boolean is `true`, iff this halfedge exists.
`opposite(h, g)` | `halfedge_descriptor` | The halfedge with source and target swapped.
`source(h,g)` | `vertex_descriptor` | The source vertex of `h`.
`target(h,g)` | `vertex_descriptor` | The target vertex of `h`.
`next(h, g)` | `halfedge_descriptor` | The next halfedge around its face.
`prev(h, g)` | `halfedge_descriptor` | The previous halfedge around its face.
`boost::graph_traits<G>::%null_halfedge()` | `halfedge_descriptor` | Returns a special halfedge that is not equal to any other halfedge.
The `HalfedgeGraph` has the invariant `halfedge(edge(h,g))==h`.
\cgalHeading{%MutableHalfedgeGraph}
The concept `MutableHalfedgeGraph` refines the concept `HalfedgeGraph`
and adds the requirements for operations to add vertices and edges, and to
update the incidence information between vertices and halfedges.
Valid Expression | returns | Description
------------------------- | ------------ | -----------
`add_vertex(g)` | `vertex_descriptor` | Adds a new vertex to the graph without initializing the connectivity.
`remove_vertex(v, g)` | `void` | Removes `v` from the graph.
`add_edge(g)` | `edge_descriptor` | Adds two opposite halfedges to the graph without initializing the connectivity.
`remove_edge(e, g)` | `void` | Removes the two halfedges corresponding to `e` from the graph.
`set_target(h, v, g)` | `void` | Sets the target vertex of `h` and the source of `opposite(h)` to `v`.
`set_halfedge(v, h, g)` | `void` | Sets the halfedge of `v` to `h`. The target vertex of `h` must be `v`.
`set_next(h1, h2, g)` | `void` | Sets the successor of `h1` around a face to `h2`, and the prededecessor of `h2` to `h1`.
\cgalHeading{%HalfedgeListGraph}
The concept `HalfedgeListGraph` refines the concept `HalfedgeGraph`
and adds the requirements for traversal of all halfedges in the graph.
Associated Type | Description
-------------------- | ------------
`boost::graph_traits<G>::%halfedge_iterator` | A `BidirectionalIterator` over all halfedges in a graph. Must be `DefaultConstructible`, `Assignable`, `EqualityComparable`.
`boost::graph_traits<G>::%halfedges_size_type` | A size type.
Valid Expression | Returns | Description
------------------------------------- | ------------------------------------------| -----------
`num_halfedges(g)` | `halfedges_size_type` | An upper bound of the number of halfedges of the graph.
`halfedges(g)` | `std::pair<halfedge_iterator,halfedge_iterator>` | An iterator range over the halfedges of the graph.
\cgalHeading{%FaceGraph}
The concept `FaceGraph` refines the concept `HalfedgeGraph`.
It adds the requirements for a graph to explicitly
maintain faces described by halfedges, to provide access from a face to
an incident halfedge, and to provide access from a halfedge to its incident
face.
Associated Type | Description
-------------------------------------------- | ------------
`boost::graph_traits<G>::%face_descriptor` | A `face_descriptor` corresponds to a unique face in a graph. Must be `DefaultConstructible`, `Assignable`, `EqualityComparable` and `LessThanComparable`.
Valid Expression | Returns | Description
-------------------------------------- | ------------------------------------------------------------------------ | ------------------------
`face(h, g)` | `face_descriptor` | The face incident to halfedge `h`.
`halfedge(f, g)` | `halfedge_descriptor` | A halfedge incident to face `f`.
`degree(f,g)` | `degree_size_type` | The number of halfedges incident to face `f`.
`boost::graph_traits<G>::%null_face()` | `face_descriptor` | A special face that is not equal to any other face.
\cgalHeading{%MutableFaceGraph}
The concept `MutableFaceGraph` refines the concepts `FaceGraph` and `MutableHalfedgeGraph` and adds
the requirement for operations to add faces and to modify face-halfedge relations.
Valid Expression | returns | Description
----------------------- | ------------ | -----------
`add_face(g)` | `face_descriptor` | Adds a new face to the graph without initializing the connectivity.
`remove_face(f, g)` | `void` | Removes `f` from the graph.
`set_face(h, f, g)` | `void` | Sets the corresponding face of `h` to `f`.
`set_halfedge(f, h, g)` | `void` | Sets the corresponding halfedge of `f` to `h`.
`reserve(g, nv, ne, nf)`| `void` | Called to indicate the expected size of vertices (`nv`), edges (`ed`) and faces (`nf`)
\cgalHeading{%FaceListGraph}
The concept `FaceListGraph` refines the concept `FaceGraph` and adds
the requirement for traversal of all faces in a graph.
Associated Type | Description
------------------------------------------ | -----------
`boost::graph_traits<G>::%face_iterator` | %Iterator over all faces.
`boost::graph_traits<G>::%faces_size_type` | Unsigned integer type for number of faces.
Valid Expression | returns | Description
----------------- | --------------- | -----------------------
`faces(g)` | `std::pair<face_iterator, face_iterator>` | An iterator range over all faces.
`num_faces(g)` | `faces_size_type` | An upper bound of the number of faces of the graph.
*/
/// The property tags model of the boost concept <a href="http://www.boost.org/libs/graph/doc/PropertyTag.html"><code>PropertyTag</code></a>. /// The property tags model of the boost concept <a href="http://www.boost.org/libs/graph/doc/PropertyTag.html"><code>PropertyTag</code></a>.
/// These tags are used to retrieve default property maps using the traits class <a href="http://www.boost.org/libs/graph/doc/property_map.html">boost::property_map</a>. /// These tags are used to retrieve default property maps using the traits class <a href="http://www.boost.org/libs/graph/doc/property_map.html">boost::property_map</a>.
@ -46,10 +208,27 @@
/// \defgroup PkgBGLSelectionFct Selection Functions /// \defgroup PkgBGLSelectionFct Selection Functions
/// \ingroup PkgBGL /// \ingroup PkgBGL
/// \defgroup PkgBGLEulerOperations Euler Operations
/// \ingroup PkgBGL
/*!
\addtogroup PkgBGLHelper
Several classes that enable to store ids in vertices/halfedges/faces of a `CGAL::Polyhedron_3`, as well as adapters such as `CGAL::Dual`.
*/
/*!
\addtogroup PkgBGLHelperFct
Generic convenience functions for testing if an edge is a border edge, if a mesh is triangular,
for conversion between models of different `FaceGraph` concepts, etc.
Most functions are in the header file `<CGAL/boost/graph/helpers.h>`
*/
/*! /*!
\addtogroup PkgBGLIterators \addtogroup PkgBGLIterators
Several iterators and circulators are provided that enable to iterate through the halfedges incident to a given face or vertex. Several iterators and circulators are provided that enable, for example,
to iterate through the halfedges incident to a given face or vertex.
Starting at a halfedge `h`, applying several times `next(h,g)` brings us back Starting at a halfedge `h`, applying several times `next(h,g)` brings us back
to the halfedge where we started. All halfedges traversed on the way are to the halfedge where we started. All halfedges traversed on the way are
@ -59,10 +238,14 @@ in another cycle, namely the cycle of halfedges which are incident to
the same vertex. the same vertex.
For convenience, two iterator and circulator types enable iterating through all the halfedges For convenience, two iterator and circulator types enable iterating through all the halfedges
incident to a given face, and all the halfedges having a given vertex as target. incident to a given face, and all the halfedges having a given vertex as target.
All functions are in the header file `<CGAL/boost/graph/iterator.h>
*/ */
/// \defgroup PkgBGLEulerOperations Euler Operations /*!
/// \ingroup PkgBGL \addtogroup PkgBGLSelectionFct
Several functions to enlarge or reduce a k-ring selection of vertices, edges, or faces.
*/
/*! /*!
\addtogroup PkgBGLTraits \addtogroup PkgBGLTraits
@ -91,6 +274,8 @@ incident to a given face, and all the halfedges having a given vertex as target.
\cgalClassifedRefPages \cgalClassifedRefPages
## Concepts ## ## Concepts ##
- `VertexListGraph`
- `EdgeListGraph`
- `HalfedgeGraph` - `HalfedgeGraph`
- `HalfedgeListGraph` - `HalfedgeListGraph`
- `MutableHalfedgeGraph` - `MutableHalfedgeGraph`

View File

@ -12,6 +12,8 @@
\example BGL_triangulation_2/dijkstra.cpp \example BGL_triangulation_2/dijkstra.cpp
\example BGL_triangulation_2/dijkstra_with_internal_properties.cpp \example BGL_triangulation_2/dijkstra_with_internal_properties.cpp
\example BGL_triangulation_2/emst.cpp \example BGL_triangulation_2/emst.cpp
\example BGL_triangulation_2/emst_regular.cpp
\example BGL_triangulation_2/emst_cdt_plus_hierarchy.cpp
\example BGL_surface_mesh/prim.cpp \example BGL_surface_mesh/prim.cpp
\example BGL_surface_mesh/surface_mesh_dual.cpp \example BGL_surface_mesh/surface_mesh_dual.cpp
\example Surface_mesh_skeletonization/simple_mcfskel_example.cpp \example Surface_mesh_skeletonization/simple_mcfskel_example.cpp

View File

@ -16,7 +16,7 @@ Defined in `<CGAL/boost/graph/graph_traits_Surface_mesh.h>`
We provide partial specialization for the class `CGAL::Surface_mesh` so that it is a model We provide partial specialization for the class `CGAL::Surface_mesh` so that it is a model
of the graph concepts of the graph concepts
<A HREF="http://www.boost.org/libs/graph/doc/BidirectionalGraph.html">`BidirectionalGraph`</A> and <A HREF="http://www.boost.org/libs/graph/doc/BidirectionalGraph.html">`BidirectionalGraph`</A> and
<A HREF="http://www.boost.org/libs/graph/doc/EdgeAndVertexListGraph.html">`EdgeAndVertexListGraph`</A> <A HREF="http://www.boost.org/libs/graph/doc/VertexAndEdgeListGraph.html">`VertexAndEdgeListGraph`</A>
and of the concept `MutableFaceGraph`. and of the concept `MutableFaceGraph`.
The const specialization, `boost::graph_traits< CGAL::Surface_mesh<Traits> const>` The const specialization, `boost::graph_traits< CGAL::Surface_mesh<Traits> const>`
@ -53,7 +53,7 @@ Defined in `<CGAL/boost/graph/graph_traits_Polyhedron_3.h>`
We provide partial specialization for the class `CGAL::Polyhedron_3` so that it is a model We provide partial specialization for the class `CGAL::Polyhedron_3` so that it is a model
of the graph concepts of the graph concepts
<A HREF="http://www.boost.org/libs/graph/doc/BidirectionalGraph.html">`BidirectionalGraph`</A> and <A HREF="http://www.boost.org/libs/graph/doc/BidirectionalGraph.html">`BidirectionalGraph`</A> and
<A HREF="http://www.boost.org/libs/graph/doc/EdgeAndVertexListGraph.html">`EdgeAndVertexListGraph`</A> <A HREF="http://www.boost.org/libs/graph/doc/VertexAndEdgeListGraph.html">`VertexAndEdgeListGraph`</A>
and of the concept `MutableFaceGraph`. and of the concept `MutableFaceGraph`.
The const specialization, `boost::graph_traits< CGAL::Polyhedron_3<Traits> const>` The const specialization, `boost::graph_traits< CGAL::Polyhedron_3<Traits> const>`
@ -148,7 +148,7 @@ Defined in `<CGAL/boost/graph/graph_traits_PolyMesh_ArrayKernelT.h>`
We provide partial specialization for the class `OpenMesh::PolyMesh_ArrayKernelT` so that it is a model We provide partial specialization for the class `OpenMesh::PolyMesh_ArrayKernelT` so that it is a model
of the graph concepts of the graph concepts
<A HREF="http://www.boost.org/libs/graph/doc/BidirectionalGraph.html">`BidirectionalGraph`</A> and <A HREF="http://www.boost.org/libs/graph/doc/BidirectionalGraph.html">`BidirectionalGraph`</A> and
<A HREF="http://www.boost.org/libs/graph/doc/EdgeAndVertexListGraph.html">`EdgeAndVertexListGraph`</A> <A HREF="http://www.boost.org/libs/graph/doc/VertexAndEdgeListGraph.html">`VertexAndEdgeListGraph`</A>
and of the concept `MutableFaceGraph`. and of the concept `MutableFaceGraph`.
The traits class `boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >` provides the following types: The traits class `boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >` provides the following types:
@ -181,7 +181,7 @@ Defined in `<CGAL/boost/graph/graph_traits_TriMesh_ArrayKernelT.h>`
We provide partial specialization for the class `OpenMesh::TriMesh_ArrayKernelT` so that it is a model We provide partial specialization for the class `OpenMesh::TriMesh_ArrayKernelT` so that it is a model
of the graph concepts of the graph concepts
<A HREF="http://www.boost.org/libs/graph/doc/BidirectionalGraph.html">`BidirectionalGraph`</A> and <A HREF="http://www.boost.org/libs/graph/doc/BidirectionalGraph.html">`BidirectionalGraph`</A> and
<A HREF="http://www.boost.org/libs/graph/doc/EdgeAndVertexListGraph.html">`EdgeAndVertexListGraph`</A> <A HREF="http://www.boost.org/libs/graph/doc/VertexAndEdgeListGraph.html">`VertexAndEdgeListGraph`</A>
and of the concept `MutableFaceGraph`. and of the concept `MutableFaceGraph`.
The traits class `boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >` provides the following types: The traits class `boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >` provides the following types:
@ -210,12 +210,22 @@ The traits class `boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >` provi
\section BGLT2GT Specializations for the 2D Triangulation Classes \section BGLT2GT Specializations for the 2D Triangulation Classes
Defined in `<CGAL/boost/graph/graph_traits_Triangulation_2.h>` and `<CGAL/boost/graph/graph_traits_Delaunay_triangulation_2.h>` Defined in `<CGAL/boost/graph/graph_traits_Triangulation_2.h>`,
`<CGAL/boost/graph/graph_traits_Delaunay_triangulation_2.h>`,
`<CGAL/boost/graph/graph_traits_Regular_triangulation_2.h>`,
`<CGAL/boost/graph/graph_traits_Constrained_Delaunay_triangulation_2.h>`,
`<CGAL/boost/graph/graph_traits_Constrained_triangulation_2.h>`,
`<CGAL/boost/graph/graph_traits_Constrained_triangulation_plus_2.h>`, and
`<CGAL/boost/graph/graph_traits_Triangulation_hierarchy_2.h>`.
We provide partial specialization for the classes `CGAL::Triangulation_2` and `CGAL::Delaunay_triangulation_2` We provide partial specialization for the classes
`CGAL::Triangulation_2`, `CGAL::Delaunay_triangulation_2`,
`CGAL::Regular_triangulation_2` `CGAL::Constrained_triangulation_2`,
`CGAL::Constrained_Delaunay_triangulation_2`, `CGAL::Constrained_triangulation_plus_2`,
and `CGAL::Triangulation_hierarchy_2`
so that they are model of the graph concepts so that they are model of the graph concepts
<A HREF="http://www.boost.org/libs/graph/doc/BidirectionalGraph.html">`BidirectionalGraph`</A> and <A HREF="http://www.boost.org/libs/graph/doc/BidirectionalGraph.html">`BidirectionalGraph`</A> and
<A HREF="http://www.boost.org/libs/graph/doc/EdgeAndVertexListGraph.html">`EdgeAndVertexListGraph`</A>. <A HREF="http://www.boost.org/libs/graph/doc/VertexAndEdgeListGraph.html">`VertexAndEdgeListGraph`</A>.
The mapping between vertices and edges of the triangulation and the The mapping between vertices and edges of the triangulation and the
@ -266,7 +276,7 @@ Defined in `<CGAL/boost/graph/graph_traits_Arrangement_2.h>`
We provide partial specialization for the class `Arrangement_2` We provide partial specialization for the class `Arrangement_2`
so that it is model of the graph concepts so that it is model of the graph concepts
<A HREF="http://www.boost.org/libs/graph/doc/BidirectionalGraph.html">`BidirectionalGraph`</A> and <A HREF="http://www.boost.org/libs/graph/doc/BidirectionalGraph.html">`BidirectionalGraph`</A> and
<A HREF="http://www.boost.org/libs/graph/doc/EdgeAndVertexListGraph.html">`EdgeAndVertexListGraph`</A>. <A HREF="http://www.boost.org/libs/graph/doc/VertexAndEdgeListGraph.html">`VertexAndEdgeListGraph`</A>.
The const specialization, `boost::graph_traits< CGAL::Arrangement_2<Traits,Dcel> const>` The const specialization, `boost::graph_traits< CGAL::Arrangement_2<Traits,Dcel> const>`
is also defined, using the constant handles in the arrangement. is also defined, using the constant handles in the arrangement.

View File

@ -2,11 +2,7 @@
#include <CGAL/Exact_predicates_exact_constructions_kernel.h> #include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Polyhedron_3.h> #include <CGAL/Polyhedron_3.h>
#include <CGAL/IO/Polyhedron_iostream.h>
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h>
#include <CGAL/Surface_mesh.h> #include <CGAL/Surface_mesh.h>
#include <CGAL/boost/graph/graph_traits_Surface_mesh.h>
#if defined(CGAL_USE_OPENMESH) #if defined(CGAL_USE_OPENMESH)
#include <OpenMesh/Core/IO/MeshIO.hh> #include <OpenMesh/Core/IO/MeshIO.hh>
@ -80,7 +76,7 @@ int main(int argc, char* argv[])
CGAL::copy_face_graph(T1, S, std::inserter(v2v, v2v.end()), std::inserter(h2h, h2h.end())); CGAL::copy_face_graph(T1, S, std::inserter(v2v, v2v.end()), std::inserter(h2h, h2h.end()));
std::ofstream out("reverse.off"); std::ofstream out("reverse.off");
out << T1; out << S;
} }
return 0; return 0;
} }

View File

@ -1,8 +1,6 @@
#include <CGAL/Simple_cartesian.h> #include <CGAL/Simple_cartesian.h>
#include <CGAL/Polyhedron_3.h> #include <CGAL/Polyhedron_3.h>
#include <CGAL/IO/Polyhedron_iostream.h>
#include <CGAL/Polyhedron_items_with_id_3.h> #include <CGAL/Polyhedron_items_with_id_3.h>
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h>
#include <boost/graph/breadth_first_search.hpp> #include <boost/graph/breadth_first_search.hpp>

View File

@ -1,7 +1,5 @@
#include <CGAL/Simple_cartesian.h> #include <CGAL/Simple_cartesian.h>
#include <CGAL/Polyhedron_3.h> #include <CGAL/Polyhedron_3.h>
#include <CGAL/IO/Polyhedron_iostream.h>
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h>
#include <CGAL/boost/graph/iterator.h> #include <CGAL/boost/graph/iterator.h>
#include <iostream> #include <iostream>
#include <fstream> #include <fstream>

View File

@ -1,7 +1,5 @@
#include <CGAL/Simple_cartesian.h> #include <CGAL/Simple_cartesian.h>
#include <CGAL/Polyhedron_3.h> #include <CGAL/Polyhedron_3.h>
#include <CGAL/IO/Polyhedron_iostream.h>
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h>
#include <iostream> #include <iostream>
#include <list> #include <list>

View File

@ -1,8 +1,6 @@
#include <CGAL/Simple_cartesian.h> #include <CGAL/Simple_cartesian.h>
#include <CGAL/Polyhedron_3.h> #include <CGAL/Polyhedron_3.h>
#include <CGAL/Polyhedron_items_with_id_3.h> #include <CGAL/Polyhedron_items_with_id_3.h>
#include <CGAL/IO/Polyhedron_iostream.h>
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h>
#include <iostream> #include <iostream>
#include <list> #include <list>

View File

@ -9,12 +9,8 @@
// Polyhedron // Polyhedron
#include <CGAL/Cartesian.h> #include <CGAL/Cartesian.h>
#include <CGAL/Polyhedron_3.h> #include <CGAL/Polyhedron_3.h>
#include <CGAL/IO/Polyhedron_iostream.h>
#include <CGAL/Polyhedron_items_with_id_3.h> #include <CGAL/Polyhedron_items_with_id_3.h>
// Graph traits adaptors
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h>
typedef CGAL::Cartesian<double> Kernel; typedef CGAL::Cartesian<double> Kernel;
typedef Kernel::Point_3 Point; typedef Kernel::Point_3 Point;
typedef Kernel::Vector_3 Vector; typedef Kernel::Vector_3 Vector;

View File

@ -1,8 +1,6 @@
#include <CGAL/Simple_cartesian.h> #include <CGAL/Simple_cartesian.h>
#include <CGAL/Polyhedron_3.h> #include <CGAL/Polyhedron_3.h>
#include <CGAL/Iterator_range.h> #include <CGAL/Iterator_range.h>
#include <CGAL/IO/Polyhedron_iostream.h>
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h>
#include <boost/foreach.hpp> #include <boost/foreach.hpp>

View File

@ -1,11 +1,10 @@
#include <CGAL/Simple_cartesian.h> #include <CGAL/Simple_cartesian.h>
#include <CGAL/Polyhedron_3.h> #include <CGAL/Polyhedron_3.h>
#include <CGAL/IO/Polyhedron_iostream.h>
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h>
#include <CGAL/boost/graph/iterator.h>
#include <fstream>
#include <CGAL/boost/graph/iterator.h>
#include <boost/iterator/transform_iterator.hpp> #include <boost/iterator/transform_iterator.hpp>
#include <fstream>
#include <algorithm> #include <algorithm>
typedef CGAL::Simple_cartesian<double> Kernel; typedef CGAL::Simple_cartesian<double> Kernel;

View File

@ -0,0 +1,112 @@
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Delaunay_triangulation_2.h>
#include <CGAL/Constrained_Delaunay_triangulation_2.h>
#include <CGAL/Triangulation_hierarchy_2.h>
#include <CGAL/Constrained_triangulation_plus_2.h>
#include <CGAL/boost/graph/graph_traits_Delaunay_triangulation_2.h>
#include <CGAL/boost/graph/graph_traits_Constrained_Delaunay_triangulation_2.h>
#include <CGAL/boost/graph/graph_traits_Constrained_triangulation_plus_2.h>
#include <CGAL/boost/graph/graph_traits_Triangulation_hierarchy_2.h>
#include <boost/graph/kruskal_min_spanning_tree.hpp>
#include <boost/graph/filtered_graph.hpp>
#include <fstream>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_2 Point;
typedef CGAL::Triangulation_vertex_base_2<K> Vbb;
typedef CGAL::Triangulation_hierarchy_vertex_base_2<Vbb> Vb;
typedef CGAL::Constrained_triangulation_face_base_2<K> Fb;
typedef CGAL::Triangulation_data_structure_2<Vb,Fb> TDS;
typedef CGAL::Exact_predicates_tag Itag;
typedef CGAL::Constrained_Delaunay_triangulation_2<K,TDS,Itag> CDT;
typedef CGAL::Triangulation_hierarchy_2<CDT> CDTH;
typedef CGAL::Constrained_triangulation_plus_2<CDTH> Triangulation;
// As we only consider finite vertices and edges
// we need the following filter
template <typename T>
struct Is_finite {
const T* t_;
Is_finite()
: t_(NULL)
{}
Is_finite(const T& t)
: t_(&t)
{ }
template <typename VertexOrEdge>
bool operator()(const VertexOrEdge& voe) const {
return ! t_->is_infinite(voe);
}
};
typedef Is_finite<Triangulation> Filter;
typedef boost::filtered_graph<Triangulation,Filter,Filter> Finite_triangulation;
typedef boost::graph_traits<Finite_triangulation>::vertex_descriptor vertex_descriptor;
typedef boost::graph_traits<Finite_triangulation>::vertex_iterator vertex_iterator;
typedef boost::graph_traits<Finite_triangulation>::edge_descriptor edge_descriptor;
// The BGL makes use of indices associated to the vertices
// We use a std::map to store the index
typedef std::map<vertex_descriptor,int> VertexIndexMap;
VertexIndexMap vertex_id_map;
// A std::map is not a property map, because it is not lightweight
typedef boost::associative_property_map<VertexIndexMap> VertexIdPropertyMap;
VertexIdPropertyMap vertex_index_pmap(vertex_id_map);
int
main(int argc,char* argv[])
{
const char* filename = (argc > 1) ? argv[1] : "data/points.xy";
std::ifstream input(filename);
Triangulation t;
Filter is_finite(t);
Finite_triangulation ft(t, is_finite, is_finite);
Point p ;
while(input >> p){
t.insert(p);
}
vertex_iterator vit, ve;
// Associate indices to the vertices
int index = 0;
// boost::tie assigns the first and second element of the std::pair
// returned by boost::vertices to the variables vit and ve
for(boost::tie(vit,ve)=boost::vertices(ft); vit!=ve; ++vit ){
vertex_descriptor vd = *vit;
vertex_id_map[vd]= index++;
}
// We use the default edge weight which is the squared length of the edge
// This property map is defined in graph_traits_Triangulation_2.h
// In the function call you can see a named parameter: vertex_index_map
std::list<edge_descriptor> mst;
boost::kruskal_minimum_spanning_tree(ft,
std::back_inserter(mst),
vertex_index_map(vertex_index_pmap));
std::cout << "The edges of the Euclidean mimimum spanning tree:" << std::endl;
for(std::list<edge_descriptor>::iterator it = mst.begin(); it != mst.end(); ++it){
edge_descriptor ed = *it;
vertex_descriptor svd = source(ed,t);
vertex_descriptor tvd = target(ed,t);
Triangulation::Vertex_handle sv = svd;
Triangulation::Vertex_handle tv = tvd;
std::cout << "[ " << sv->point() << " | " << tv->point() << " ] " << std::endl;
}
return 0;
}

View File

@ -0,0 +1,98 @@
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Regular_triangulation_2.h>
#include <CGAL/boost/graph/graph_traits_Regular_triangulation_2.h>
#include <boost/graph/kruskal_min_spanning_tree.hpp>
#include <boost/graph/filtered_graph.hpp>
#include <fstream>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_2 Point;
typedef CGAL::Regular_triangulation_2<K> Triangulation;
// As we only consider finite vertices and edges
// we need the following filter
template <typename T>
struct Is_finite {
const T* t_;
Is_finite()
: t_(NULL)
{}
Is_finite(const T& t)
: t_(&t)
{ }
template <typename VertexOrEdge>
bool operator()(const VertexOrEdge& voe) const {
return ! t_->is_infinite(voe);
}
};
typedef Is_finite<Triangulation> Filter;
typedef boost::filtered_graph<Triangulation,Filter,Filter> Finite_triangulation;
typedef boost::graph_traits<Finite_triangulation>::vertex_descriptor vertex_descriptor;
typedef boost::graph_traits<Finite_triangulation>::vertex_iterator vertex_iterator;
typedef boost::graph_traits<Finite_triangulation>::edge_descriptor edge_descriptor;
// The BGL makes use of indices associated to the vertices
// We use a std::map to store the index
typedef std::map<vertex_descriptor,int> VertexIndexMap;
VertexIndexMap vertex_id_map;
// A std::map is not a property map, because it is not lightweight
typedef boost::associative_property_map<VertexIndexMap> VertexIdPropertyMap;
VertexIdPropertyMap vertex_index_pmap(vertex_id_map);
int
main(int argc,char* argv[])
{
const char* filename = (argc > 1) ? argv[1] : "data/points.xy";
std::ifstream input(filename);
Triangulation t;
Filter is_finite(t);
Finite_triangulation ft(t, is_finite, is_finite);
Point p ;
while(input >> p){
t.insert(p);
}
vertex_iterator vit, ve;
// Associate indices to the vertices
int index = 0;
// boost::tie assigns the first and second element of the std::pair
// returned by boost::vertices to the variables vit and ve
for(boost::tie(vit,ve)=boost::vertices(ft); vit!=ve; ++vit ){
vertex_descriptor vd = *vit;
vertex_id_map[vd]= index++;
}
// We use the default edge weight which is the squared length of the edge
// This property map is defined in graph_traits_Triangulation_2.h
// In the function call you can see a named parameter: vertex_index_map
std::list<edge_descriptor> mst;
boost::kruskal_minimum_spanning_tree(ft,
std::back_inserter(mst),
vertex_index_map(vertex_index_pmap));
std::cout << "The edges of the Euclidean mimimum spanning tree:" << std::endl;
for(std::list<edge_descriptor>::iterator it = mst.begin(); it != mst.end(); ++it){
edge_descriptor ed = *it;
vertex_descriptor svd = source(ed,t);
vertex_descriptor tvd = target(ed,t);
Triangulation::Vertex_handle sv = svd;
Triangulation::Vertex_handle tv = tvd;
std::cout << "[ " << sv->point() << " | " << tv->point() << " ] " << std::endl;
}
return 0;
}

View File

@ -30,10 +30,13 @@ namespace CGAL
{ {
template<typename Graph,typename Descriptor> template<typename Graph_, typename Descriptor_>
struct Gwdwg_descriptor struct Gwdwg_descriptor
{ {
public: public:
typedef Graph_ Graph;
typedef Descriptor_ Descriptor;
Graph* graph; Graph* graph;
Descriptor descriptor; Descriptor descriptor;
@ -124,9 +127,10 @@ Property maps can be wrapped with `Graph_with_descriptor_with_graph_property_map
\cgalModels `MutableFaceGraph` if `Graph` is a model of `MutableFaceGraph` \cgalModels `MutableFaceGraph` if `Graph` is a model of `MutableFaceGraph`
*/ */
template<typename Graph> template<typename Graph_>
struct Graph_with_descriptor_with_graph struct Graph_with_descriptor_with_graph
{ {
typedef Graph_ Graph;
Graph* graph; Graph* graph;
typedef boost::graph_traits<Graph> gt; typedef boost::graph_traits<Graph> gt;
@ -135,11 +139,13 @@ struct Graph_with_descriptor_with_graph
typedef Gwdwg_descriptor<Graph, typename gt::edge_descriptor> edge_descriptor; typedef Gwdwg_descriptor<Graph, typename gt::edge_descriptor> edge_descriptor;
typedef Gwdwg_descriptor<Graph, typename gt::face_descriptor> face_descriptor; typedef Gwdwg_descriptor<Graph, typename gt::face_descriptor> face_descriptor;
Graph_with_descriptor_with_graph()
: graph(NULL)
{}
Graph_with_descriptor_with_graph(Graph& graph) Graph_with_descriptor_with_graph(Graph& graph)
: graph(&graph) : graph(&graph)
{} {}
private:
Graph_with_descriptor_with_graph(const Graph_with_descriptor_with_graph&){} // disable copy-constructor to avoid non-wanted copies
}; };

View File

@ -0,0 +1,22 @@
// Copyright (c) 2017 GeometryFactory (France). All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 3 of the License,
// or (at your option) any later version.
//
// Licensees holding a valid commercial license may use this file in
// accordance with the commercial license agreement provided with the software.
//
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
//
// $URL$
// $Id$
//
//
// Author(s) : Maxime Gimeno
// List the named parameters imported from boost we are using in CGAL
CGAL_add_named_parameter(vertex_index_t, vertex_index, vertex_index_map)
CGAL_add_named_parameter(graph_visitor_t, visitor, visitor)

View File

@ -697,6 +697,32 @@ make_tetrahedron(const P& p0, const P& p1, const P& p2, const P& p3, Graph& g)
return opposite(h2,g); return opposite(h2,g);
} }
/// \cond SKIP_IN_DOC
template <class Traits, class TriangleMesh, class VertexPointMap>
bool is_degenerate_triangle_face(
typename boost::graph_traits<TriangleMesh>::halfedge_descriptor hd,
TriangleMesh& tmesh,
const VertexPointMap& vpmap,
const Traits& traits)
{
CGAL_assertion(!is_border(hd, tmesh));
const typename Traits::Point_3& p1 = get(vpmap, target( hd, tmesh) );
const typename Traits::Point_3& p2 = get(vpmap, target(next(hd, tmesh), tmesh) );
const typename Traits::Point_3& p3 = get(vpmap, source( hd, tmesh) );
return traits.collinear_3_object()(p1, p2, p3);
}
template <class Traits, class TriangleMesh, class VertexPointMap>
bool is_degenerate_triangle_face(
typename boost::graph_traits<TriangleMesh>::face_descriptor fd,
TriangleMesh& tmesh,
const VertexPointMap& vpmap,
const Traits& traits)
{
return is_degenerate_triangle_face(halfedge(fd,tmesh), tmesh, vpmap, traits);
}
/// \endcond
namespace internal { namespace internal {
@ -725,7 +751,7 @@ clear_impl(FaceGraph& g)
} }
} }
} } //end of internal namespace
/** /**
* \ingroup PkgBGLHelperFct * \ingroup PkgBGLHelperFct
@ -751,6 +777,7 @@ void clear(FaceGraph& g)
CGAL_postcondition(num_faces(g) == 0); CGAL_postcondition(num_faces(g) == 0);
} }
} // namespace CGAL } // namespace CGAL
// Include "Euler_operations.h" at the end, because its implementation // Include "Euler_operations.h" at the end, because its implementation

View File

@ -101,17 +101,26 @@ namespace boost{
} //end of namespace boost } //end of namespace boost
#endif #endif
namespace CGAL {
enum vertex_is_fixed_t { vertex_is_fixed } ; namespace CGAL {
enum set_cache_policy_t { set_cache_policy } ; namespace internal_np{
enum get_cost_policy_t { get_cost_policy } ;
enum get_cost_policy_params_t { get_cost_policy_params } ; // for uniformity we import them in this namespace. Note that
enum get_placement_policy_t { get_placement_policy } ; // it is an import so that if we use the named parameter function
enum get_placement_policy_params_t { get_placement_policy_params } ; // from boost it will work
enum edge_is_constrained_t { edge_is_constrained } ; using boost::vertex_index_t;
enum edge_is_constrained_params_t { edge_is_constrained_params } ; using boost::vertex_index;
using boost::graph_visitor_t;
using boost::visitor;
// define enum types and values for new named parameters
#define CGAL_add_named_parameter(X, Y, Z) \
enum X { Y };
#include <CGAL/boost/graph/parameters_interface.h>
#undef CGAL_add_named_parameter
}//internal_np
template <typename T, typename Tag, typename Base = boost::no_property> template <typename T, typename Tag, typename Base = boost::no_property>
struct cgal_bgl_named_params : boost::bgl_named_params<T, Tag, Base> struct cgal_bgl_named_params : boost::bgl_named_params<T, Tag, Base>
{ {
@ -121,232 +130,35 @@ namespace CGAL {
cgal_bgl_named_params(T v = T()) : base(v) {} cgal_bgl_named_params(T v = T()) : base(v) {}
cgal_bgl_named_params(T v, const Base& b) : base(v, b) {} cgal_bgl_named_params(T v, const Base& b) : base(v, b) {}
template <typename IndexMap> // create the functions for new named parameters and the one imported boost
cgal_bgl_named_params<IndexMap, boost::vertex_index_t, self> // used to concatenate several parameters
vertex_index_map(const IndexMap& p) const #define CGAL_add_named_parameter(X, Y, Z) \
{ template<typename K> \
typedef cgal_bgl_named_params<IndexMap, boost::vertex_index_t, self> Params; cgal_bgl_named_params<K, internal_np::X, self> \
return Params(p, *this); Z(const K& k) const \
} { \
typedef cgal_bgl_named_params<K, internal_np::X, self> Params;\
template <typename PointMap> return Params(k, *this); \
cgal_bgl_named_params<PointMap, vertex_point_t, self> }
vertex_point_map(const PointMap& p) const #include <CGAL/boost/graph/parameters_interface.h>
{ #include <CGAL/boost/graph/boost_parameters_interface.h>
typedef cgal_bgl_named_params<PointMap, vertex_point_t, self> Params; #undef CGAL_add_named_parameter
return Params(p, *this);
}
template <typename IsFixedMap>
cgal_bgl_named_params<IsFixedMap, vertex_is_fixed_t, self>
vertex_is_fixed_map(const IsFixedMap& p) const
{
typedef cgal_bgl_named_params<IsFixedMap, vertex_is_fixed_t, self> Params;
return Params(p, *this);
}
template <typename IndexMap>
cgal_bgl_named_params<IndexMap, boost::edge_index_t, self>
edge_index_map(const IndexMap& p) const
{
typedef cgal_bgl_named_params<IndexMap, boost::edge_index_t, self> Params;
return Params(p, *this);
}
template <typename IndexMap>
cgal_bgl_named_params<IndexMap, boost::halfedge_index_t, self>
halfedge_index_map(const IndexMap& p) const
{
typedef cgal_bgl_named_params<IndexMap, boost::halfedge_index_t, self> Params;
return Params(p, *this);
}
template <typename IndexMap>
cgal_bgl_named_params<IndexMap, boost::face_index_t, self>
face_index_map(const IndexMap& p) const
{
typedef cgal_bgl_named_params<IndexMap, boost::face_index_t, self> Params;
return Params(p, *this);
}
template <typename Visitor>
cgal_bgl_named_params<Visitor, boost::graph_visitor_t, self>
visitor(const Visitor& p) const
{
typedef cgal_bgl_named_params<Visitor, boost::graph_visitor_t, self> Params;
return Params(p, *this);
}
template <typename SetCache>
cgal_bgl_named_params<SetCache, set_cache_policy_t, self>
set_cache(const SetCache& p) const
{
typedef cgal_bgl_named_params<SetCache, set_cache_policy_t, self> Params;
return Params(p, *this);
}
template <typename GetCost>
cgal_bgl_named_params<GetCost, get_cost_policy_t, self>
get_cost(const GetCost& p) const
{
typedef cgal_bgl_named_params<GetCost, get_cost_policy_t, self> Params;
return Params(p, *this);
}
template <typename GetCostParams>
cgal_bgl_named_params<GetCostParams, get_cost_policy_params_t, self>
get_cost_params(const GetCostParams& p) const
{
typedef cgal_bgl_named_params<GetCostParams, get_cost_policy_params_t, self> Params;
return Params(p, *this);
}
template <typename GetPlacement>
cgal_bgl_named_params<GetPlacement, get_placement_policy_t, self>
get_placement(const GetPlacement& p) const
{
typedef cgal_bgl_named_params<GetPlacement, get_placement_policy_t, self> Params;
return Params(p, *this);
}
template <typename GetPlacementParams>
cgal_bgl_named_params<GetPlacementParams, get_placement_policy_params_t, self>
get_placement_params(const GetPlacementParams& p) const
{
typedef cgal_bgl_named_params<GetPlacementParams, get_placement_policy_params_t, self> Params;
return Params(p, *this);
}
template <typename EdgeIsConstrained>
cgal_bgl_named_params<EdgeIsConstrained, edge_is_constrained_t, self>
edge_is_constrained_map(const EdgeIsConstrained& em) const
{
typedef cgal_bgl_named_params<EdgeIsConstrained, edge_is_constrained_t, self> Params;
return Params(em, *this);
}
template <typename EdgeIsConstrainedParams>
cgal_bgl_named_params<EdgeIsConstrainedParams, edge_is_constrained_params_t, self>
edge_is_constrained_map_params(const EdgeIsConstrainedParams& em) const
{
typedef cgal_bgl_named_params<EdgeIsConstrainedParams, edge_is_constrained_params_t, self> Params;
return Params(em, *this);
}
}; };
namespace parameters { namespace parameters {
template <typename IndexMap> // define free functions for named parameters
cgal_bgl_named_params<IndexMap, boost::vertex_index_t> #define CGAL_add_named_parameter(X, Y, Z) \
vertex_index_map(IndexMap const& p) template <typename K> \
{ cgal_bgl_named_params<K, internal_np::X> \
typedef cgal_bgl_named_params<IndexMap, boost::vertex_index_t> Params; Z(K const& p) \
return Params(p); { \
} typedef cgal_bgl_named_params<K, internal_np::X> Params;\
return Params(p); \
template <typename IndexMap>
cgal_bgl_named_params<IndexMap, boost::halfedge_index_t>
halfedge_index_map(IndexMap const& p)
{
typedef cgal_bgl_named_params<IndexMap, boost::halfedge_index_t> Params;
return Params(p);
}
template <typename IndexMap>
cgal_bgl_named_params<IndexMap, boost::face_index_t>
face_index_map(IndexMap const& p)
{
typedef cgal_bgl_named_params<IndexMap, boost::face_index_t> Params;
return Params(p);
}
template <typename PointMap>
cgal_bgl_named_params<PointMap, vertex_point_t>
vertex_point_map(PointMap const& p)
{
typedef cgal_bgl_named_params<PointMap, vertex_point_t> Params;
return Params(p);
}
template <typename IsFixedMap>
cgal_bgl_named_params<IsFixedMap, vertex_is_fixed_t>
vertex_is_fixed_map(IsFixedMap const& p)
{
typedef cgal_bgl_named_params<IsFixedMap, vertex_is_fixed_t> Params;
return Params(p);
}
template <typename IndexMap>
cgal_bgl_named_params<IndexMap, boost::edge_index_t>
edge_index_map(IndexMap const& pmap)
{
typedef cgal_bgl_named_params<IndexMap, boost::edge_index_t> Params;
return Params(pmap);
}
template <typename Visitor>
cgal_bgl_named_params<Visitor, boost::graph_visitor_t>
visitor(const Visitor& p)
{
typedef cgal_bgl_named_params<Visitor, boost::graph_visitor_t> Params;
return Params(p);
}
template <typename SetCache>
cgal_bgl_named_params<SetCache, set_cache_policy_t>
set_cache(const SetCache& p)
{
typedef cgal_bgl_named_params<SetCache, set_cache_policy_t> Params;
return Params(p);
}
template <typename GetCost>
cgal_bgl_named_params<GetCost, get_cost_policy_t>
get_cost(const GetCost& p)
{
typedef cgal_bgl_named_params<GetCost, get_cost_policy_t> Params;
return Params(p);
}
template <typename GetCostParams>
cgal_bgl_named_params<GetCostParams, get_cost_policy_params_t>
get_cost_params(const GetCostParams& p)
{
typedef cgal_bgl_named_params<GetCostParams, get_cost_policy_params_t> Params;
return Params(p);
}
template <typename GetPlacement>
cgal_bgl_named_params<GetPlacement, get_placement_policy_t>
get_placement(const GetPlacement& p)
{
typedef cgal_bgl_named_params<GetPlacement, get_placement_policy_t> Params;
return Params(p);
}
template <typename GetPlacementParams>
cgal_bgl_named_params<GetPlacementParams, get_placement_policy_params_t>
get_placement_params(const GetPlacementParams& p)
{
typedef cgal_bgl_named_params<GetPlacementParams, get_placement_policy_params_t> Params;
return Params(p);
}
template <typename EdgeIsConstrained>
cgal_bgl_named_params<EdgeIsConstrained, edge_is_constrained_t>
edge_is_constrained_map(const EdgeIsConstrained& em)
{
typedef cgal_bgl_named_params<EdgeIsConstrained, edge_is_constrained_t> Params;
return Params(em);
}
template <typename EdgeIsConstrainedParams>
cgal_bgl_named_params<EdgeIsConstrainedParams, edge_is_constrained_params_t>
edge_is_constrained_map_params(const EdgeIsConstrainedParams& em)
{
typedef cgal_bgl_named_params<EdgeIsConstrainedParams, edge_is_constrained_params_t> Params;
return Params(em);
} }
#include <CGAL/boost/graph/parameters_interface.h>
#include <CGAL/boost/graph/boost_parameters_interface.h>
#undef CGAL_add_named_parameter
} // namespace parameters } // namespace parameters

View File

@ -0,0 +1,30 @@
// Copyright (c) 2017 GeometryFactory (France). All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 3 of the License,
// or (at your option) any later version.
//
// Licensees holding a valid commercial license may use this file in
// accordance with the commercial license agreement provided with the software.
//
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
//
// $URL$
// $Id$
//
//
// Author(s) : Maxime Gimeno
// List of named parameters that we use in CGAL
CGAL_add_named_parameter(vertex_point_t, vertex_point, vertex_point_map)
CGAL_add_named_parameter(face_index_t, face_index, face_index_map)
CGAL_add_named_parameter(edge_index_t, edge_index, edge_index_map)
CGAL_add_named_parameter(halfedge_index_t, halfedge_index, halfedge_index_map)
CGAL_add_named_parameter(edge_is_constrained_t, edge_is_constrained, edge_is_constrained_map)
CGAL_add_named_parameter(set_cache_policy_t, set_cache_policy, set_cache)
CGAL_add_named_parameter(get_cost_policy_t, get_cost_policy, get_cost)
CGAL_add_named_parameter(get_cost_policy_params_t, get_cost_policy_params, get_cost_params)
CGAL_add_named_parameter(get_placement_policy_t, get_placement_policy, get_placement)
CGAL_add_named_parameter(get_placement_policy_params_t, get_placement_policy_params, get_placement_params)

View File

@ -213,7 +213,7 @@ reduce_face_selection(
/*! /*!
\ingroup PkgBGLSelectionFct \ingroup PkgBGLSelectionFct
discovers and puts in `out` all faces incident to the target vertex Discovers and puts in `out` all faces incident to the target vertex
of a halfedge in `hedges`. Faces are put exactly once in `out`. of a halfedge in `hedges`. Faces are put exactly once in `out`.
\tparam HalfedgeRange a range of halfedge descriptors, model of `Range`. \tparam HalfedgeRange a range of halfedge descriptors, model of `Range`.
Its iterator type is `InputIterator`. Its iterator type is `InputIterator`.
@ -252,7 +252,6 @@ select_incident_faces(
return out; return out;
} }
// Operations on edges
/*! /*!
\ingroup PkgBGLSelectionFct \ingroup PkgBGLSelectionFct
Augments a selection with edges of `fg` that are adjacent Augments a selection with edges of `fg` that are adjacent
@ -406,7 +405,6 @@ reduce_edge_selection(
return out; return out;
} }
// Operations on vertices
/*! /*!
\ingroup PkgBGLSelectionFct \ingroup PkgBGLSelectionFct
Augments a selection with vertices of `fg` that are adjacent Augments a selection with vertices of `fg` that are adjacent

View File

@ -21,11 +21,12 @@
#define CGAL_SPLIT_GRAPH_INTO_POLYLINES #define CGAL_SPLIT_GRAPH_INTO_POLYLINES
#include <map> #include <map>
#include <set> #include <vector>
#include <utility>
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
#include <boost/graph/adjacency_list.hpp> #include <boost/graph/adjacency_list.hpp>
#include <iostream>
#include <CGAL/assertions.h> #include <CGAL/assertions.h>
#include <CGAL/tags.h>
namespace CGAL { namespace CGAL {
@ -318,10 +319,11 @@ split_graph_into_polylines(const Graph& graph,
polyline_visitor.add_node(g_copy[v]); polyline_visitor.add_node(g_copy[v]);
internal::bgl_sgip_maybe_call_visitor_add_edge(polyline_visitor, internal::bgl_sgip_maybe_call_visitor_add_edge(polyline_visitor,
g_copy[*b]); g_copy[*b]);
if (degree(v, g_copy)==1)
terminal.erase(v);
remove_edge(b, g_copy); remove_edge(b, g_copy);
u = v; u = v;
} }
terminal.erase(u);
polyline_visitor.end_polyline(); polyline_visitor.end_polyline();
} }

View File

@ -1,10 +1,21 @@
#include <CGAL/Simple_cartesian.h> #include <CGAL/Simple_cartesian.h>
#include <CGAL/boost/graph/graph_traits_Triangulation_2.h> #include <CGAL/boost/graph/graph_traits_Triangulation_2.h>
#include <CGAL/boost/graph/graph_traits_Constrained_triangulation_2.h>
#include <CGAL/boost/graph/graph_traits_Delaunay_triangulation_2.h>
#include <CGAL/boost/graph/graph_traits_Constrained_Delaunay_triangulation_2.h>
#include <CGAL/boost/graph/graph_traits_Constrained_triangulation_plus_2.h>
#include <CGAL/boost/graph/graph_traits_Triangulation_hierarchy_2.h>
#include <CGAL/boost/graph/graph_concepts.h> #include <CGAL/boost/graph/graph_concepts.h>
typedef CGAL::Simple_cartesian<double> Kernel; typedef CGAL::Simple_cartesian<double> Kernel;
typedef CGAL::Triangulation_2<Kernel> Triangulation; typedef CGAL::Triangulation_2<Kernel> Triangulation;
typedef CGAL::Delaunay_triangulation_2<Kernel> DT2;
typedef CGAL::Constrained_triangulation_2<Kernel> CT2;
typedef CGAL::Constrained_Delaunay_triangulation_2<Kernel> CDT2;
typedef CGAL::Constrained_triangulation_plus_2<CDT2> CDTP2;
typedef CGAL::Triangulation_hierarchy_2<DT2> THDT2;
typedef CGAL::Triangulation_hierarchy_2<CDTP2> THCDTP2;
template<typename T> template<typename T>
void concept_check_triangulation() { void concept_check_triangulation() {
@ -15,5 +26,11 @@ void concept_check_triangulation() {
int main() int main()
{ {
concept_check_triangulation<Triangulation>(); concept_check_triangulation<Triangulation>();
concept_check_triangulation<DT2>();
concept_check_triangulation<CT2>();
concept_check_triangulation<CDT2>();
concept_check_triangulation<CDTP2>();
concept_check_triangulation<THDT2>();
concept_check_triangulation<THCDTP2>();
return 0; return 0;
} }

View File

@ -1,52 +0,0 @@
#include <CGAL/Simple_cartesian.h>
#include <CGAL/boost/graph/graph_traits_Triangulation_2.h>
#include <boost/graph/graph_test.hpp>
#include <boost/graph/random.hpp>
#include <boost/assign.hpp>
typedef CGAL::Simple_cartesian<double> Kernel;
typedef CGAL::Triangulation_2<Kernel> Triangulation;
typedef typename Triangulation::Point Point;
typedef typename Triangulation::Vertex Vertex;
typedef typename Triangulation::Vertex Vertex_handle;
int test_main(int, char*[])
{
using namespace boost::assign;
Triangulation t;
{
std::vector<Point> v;
// taken from the triangulation test cases, should be randomly generated
v += Point(5,6,1), Point(1,9,1), Point(6,14,1), Point(4,12,1), Point(3,29,1), Point(6,7,1),
Point(6,39,1), Point(8,9,1), Point(10,18,1), Point(75625,155625,10000),
Point(10,50,2), Point(6,15,2), Point(6,16,2), Point(10,11,1),
Point(10,40,1), Point(60,-10,1);
t.insert(v.begin(), v.end());
}
typedef typename boost::graph_traits<Triangulation>::vertex_descriptor vertex_t;
std::vector<vertex_t> vv;
for(typename Triangulation::Finite_vertices_iterator it = t.finite_vertices_begin();
it != t.finite_vertices_end(); ++it) {
vv.push_back(it);
}
std::vector< std::pair<vertex_t, vertex_t> > e;
for(Triangulation::All_edges_iterator it = t.all_edges_begin();
it != t.all_edges_end(); ++it) {
e.push_back(
std::make_pair(
it->first->vertex((it->second + 2) % 3)
, it->first->vertex((it->second + 1) % 3)));
}
boost::graph_test<Triangulation> gt;
gt.test_bidirectional_graph(vv, e, t);
return 0;
}

View File

@ -2,6 +2,8 @@
#include <CGAL/assertions.h> #include <CGAL/assertions.h>
#include <boost/type_traits/is_same.hpp> #include <boost/type_traits/is_same.hpp>
template <int i> template <int i>
struct A{ struct A{
A(int v):v(v){} A(int v):v(v){}
@ -20,36 +22,33 @@ template<class NamedParameters>
void test(const NamedParameters& np) void test(const NamedParameters& np)
{ {
// test values // test values
assert( get_param(np,boost::vertex_index).v == 0 ); assert( get_param(np,CGAL::internal_np::vertex_index).v == 0 );
assert( get_param(np,boost::halfedge_index).v == 1 ); assert( get_param(np,CGAL::internal_np::halfedge_index).v == 1 );
assert( get_param(np,boost::face_index).v == 2 ); assert( get_param(np,CGAL::internal_np::face_index).v == 2 );
assert( get_param(np,boost::vertex_point).v == 3 ); assert( get_param(np,CGAL::internal_np::vertex_point).v == 3 );
assert( get_param(np,CGAL::vertex_is_fixed).v == 4 ); assert( get_param(np,CGAL::internal_np::edge_index).v == 5 );
assert( get_param(np,boost::edge_index).v == 5 );
assert( get_param(np,boost::graph_visitor).v == 6 ); assert( get_param(np,boost::graph_visitor).v == 6 );
assert( get_param(np,CGAL::set_cache_policy).v == 7 ); assert( get_param(np,CGAL::internal_np::set_cache_policy).v == 7 );
assert( get_param(np,CGAL::get_cost_policy).v == 8 ); assert( get_param(np,CGAL::internal_np::get_cost_policy).v == 8 );
assert( get_param(np,CGAL::get_cost_policy_params).v == 9 ); assert( get_param(np,CGAL::internal_np::get_cost_policy_params).v == 9 );
assert( get_param(np,CGAL::get_placement_policy).v == 10 ); assert( get_param(np,CGAL::internal_np::get_placement_policy).v == 10 );
assert( get_param(np,CGAL::get_placement_policy_params).v == 11 ); assert( get_param(np,CGAL::internal_np::get_placement_policy_params).v == 11 );
assert( get_param(np,CGAL::edge_is_constrained).v == 12 ); assert( get_param(np,CGAL::internal_np::edge_is_constrained).v == 12 );
assert( get_param(np,CGAL::edge_is_constrained_params).v == 13 );
//test types //test types
check_same_type<0>( get_param(np,boost::vertex_index) ); check_same_type<0>( get_param(np,boost::vertex_index) );
check_same_type<1>( get_param(np,boost::halfedge_index) ); check_same_type<1>( get_param(np,CGAL::internal_np::halfedge_index) );
check_same_type<2>( get_param(np,boost::face_index) ); check_same_type<2>( get_param(np,CGAL::internal_np::face_index) );
check_same_type<3>( get_param(np,boost::vertex_point) ); check_same_type<3>( get_param(np,CGAL::internal_np::vertex_point) );
check_same_type<4>( get_param(np,CGAL::vertex_is_fixed) ); check_same_type<5>( get_param(np,CGAL::internal_np::edge_index) );
check_same_type<5>( get_param(np,boost::edge_index) );
check_same_type<6>( get_param(np,boost::graph_visitor) ); check_same_type<6>( get_param(np,boost::graph_visitor) );
check_same_type<7>( get_param(np,CGAL::set_cache_policy) ); check_same_type<7>( get_param(np,CGAL::internal_np::set_cache_policy) );
check_same_type<8>( get_param(np,CGAL::get_cost_policy) ); check_same_type<8>( get_param(np,CGAL::internal_np::get_cost_policy) );
check_same_type<9>( get_param(np,CGAL::get_cost_policy_params) ); check_same_type<9>( get_param(np,CGAL::internal_np::get_cost_policy_params) );
check_same_type<10>( get_param(np,CGAL::get_placement_policy) ); check_same_type<10>( get_param(np,CGAL::internal_np::get_placement_policy) );
check_same_type<11>( get_param(np,CGAL::get_placement_policy_params) ); check_same_type<11>( get_param(np,CGAL::internal_np::get_placement_policy_params) );
check_same_type<12>( get_param(np,CGAL::edge_is_constrained) ); check_same_type<12>( get_param(np,CGAL::internal_np::edge_is_constrained) );
check_same_type<13>( get_param(np,CGAL::edge_is_constrained_params) );
} }
int main() int main()
@ -59,7 +58,6 @@ int main()
halfedge_index_map(A<1>(1)). halfedge_index_map(A<1>(1)).
face_index_map(A<2>(2)). face_index_map(A<2>(2)).
vertex_point_map(A<3>(3)). vertex_point_map(A<3>(3)).
vertex_is_fixed_map(A<4>(4)).
edge_index_map(A<5>(5)). edge_index_map(A<5>(5)).
visitor(A<6>(6)). visitor(A<6>(6)).
set_cache(A<7>(7)). set_cache(A<7>(7)).
@ -67,7 +65,6 @@ int main()
get_cost_params(A<9>(9)). get_cost_params(A<9>(9)).
get_placement(A<10>(10)). get_placement(A<10>(10)).
get_placement_params(A<11>(11)). get_placement_params(A<11>(11)).
edge_is_constrained_map(A<12>(12)). edge_is_constrained_map(A<12>(12))
edge_is_constrained_map_params(A<13>(13))
); );
} }

View File

@ -9,9 +9,8 @@
typedef boost::unordered_set<std::size_t> id_map; typedef boost::unordered_set<std::size_t> id_map;
template <typename Graph> template <typename Graph>
void test_isolated_vertex(const Graph& g) void test_isolated_vertex()
{ {
std::cerr << typeid(g).name() << std::endl;
Graph G; Graph G;
typedef boost::graph_traits< Graph > Traits; typedef boost::graph_traits< Graph > Traits;
typedef typename Traits::vertex_descriptor vertex_descriptor; typedef typename Traits::vertex_descriptor vertex_descriptor;
@ -273,8 +272,8 @@ test(const std::vector<Graph>& graphs)
test_faces(p); test_faces(p);
test_halfedge_around_vertex_iterator(p); test_halfedge_around_vertex_iterator(p);
test_halfedge_around_face_iterator(p); test_halfedge_around_face_iterator(p);
test_isolated_vertex(p);
} }
test_isolated_vertex<Graph>();
} }
int int

View File

@ -4,6 +4,9 @@
project( Boolean_set_operations_2_GraphicsView_Demo ) project( Boolean_set_operations_2_GraphicsView_Demo )
cmake_minimum_required(VERSION 2.8.11) cmake_minimum_required(VERSION 2.8.11)
if(POLICY CMP0053)
cmake_policy(SET CMP0053 OLD)
endif()
if(POLICY CMP0043) if(POLICY CMP0043)
cmake_policy(SET CMP0043 OLD) cmake_policy(SET CMP0043 OLD)
endif() endif()

View File

@ -43,7 +43,7 @@ Polygon_2 construct_polygon (const Circle_2& circle)
return pgn; return pgn;
} }
// Construct a point from a rectangle. // Construct a polygon from a rectangle.
Polygon_2 construct_polygon (const Point_2& p1, const Point_2& p2, Polygon_2 construct_polygon (const Point_2& p1, const Point_2& p2,
const Point_2& p3, const Point_2& p4) const Point_2& p3, const Point_2& p4)
{ {

View File

@ -1187,6 +1187,13 @@ protected:
// accessor for low-level arrangement fonctionalities // accessor for low-level arrangement fonctionalities
CGAL::Arr_accessor<Aos_2> accessor(*arr); CGAL::Arr_accessor<Aos_2> accessor(*arr);
// the face field of outer and inner ccb are used in the loop to access the old face an halfedge
// used to contribute to. These two vectors are used to delay the association to the new face to
// avoid overwriting a field that is still needed
typedef std::pair<typename Aos_2::Dcel::Outer_ccb*, typename Aos_2::Dcel::Face*> Outer_ccb_and_face;
typedef std::pair<typename Aos_2::Dcel::Inner_ccb*, typename Aos_2::Dcel::Face*> Inner_ccb_and_face;
std::vector<Outer_ccb_and_face> outer_ccb_and_new_face_pairs;
std::vector<Inner_ccb_and_face> inner_ccb_and_new_face_pairs;
// update halfedge ccb pointers // update halfedge ccb pointers
for (Halfedge_iterator itr = arr->halfedges_begin(); itr != arr->halfedges_end(); ++itr) for (Halfedge_iterator itr = arr->halfedges_begin(); itr != arr->halfedges_end(); ++itr)
{ {
@ -1208,11 +1215,12 @@ protected:
f = *(face_handles[ f = *(face_handles[
(*uf_faces.find(face_handles[f->id()]))->id() (*uf_faces.find(face_handles[f->id()]))->id()
]); ]);
if (h->flag()==ON_INNER_CCB || h->flag()==NOT_VISITED) if (h->flag()==ON_INNER_CCB)
{ {
typename Aos_2::Dcel::Inner_ccb* inner_ccb = inner_ccbs_to_remove.empty()? bool reuse_inner_ccb = !inner_ccbs_to_remove.empty();
typename Aos_2::Dcel::Inner_ccb* inner_ccb = !reuse_inner_ccb?
accessor.new_inner_ccb():inner_ccbs_to_remove.back(); accessor.new_inner_ccb():inner_ccbs_to_remove.back();
if ( !inner_ccbs_to_remove.empty() ) inner_ccbs_to_remove.pop_back(); if ( reuse_inner_ccb ) inner_ccbs_to_remove.pop_back();
Halfedge_handle hstart=h; Halfedge_handle hstart=h;
do{ do{
@ -1222,9 +1230,13 @@ protected:
}while(hstart!=h); }while(hstart!=h);
f->add_inner_ccb(inner_ccb,_halfedge(h)); f->add_inner_ccb(inner_ccb,_halfedge(h));
inner_ccb->set_halfedge(_halfedge(h)); inner_ccb->set_halfedge(_halfedge(h));
inner_ccb->set_face(f); if (!reuse_inner_ccb)
inner_ccb->set_face(f);
else
inner_ccb_and_new_face_pairs.push_back( std::make_pair(inner_ccb, f) );
} }
else{ else{
// we never create more outer ccb than what was available
CGAL_assertion(!outer_ccbs_to_remove.empty()); CGAL_assertion(!outer_ccbs_to_remove.empty());
typename Aos_2::Dcel::Outer_ccb* outer_ccb = outer_ccbs_to_remove.back(); typename Aos_2::Dcel::Outer_ccb* outer_ccb = outer_ccbs_to_remove.back();
outer_ccbs_to_remove.pop_back(); outer_ccbs_to_remove.pop_back();
@ -1236,11 +1248,17 @@ protected:
}while(hstart!=h); }while(hstart!=h);
f->add_outer_ccb(outer_ccb,_halfedge(h)); f->add_outer_ccb(outer_ccb,_halfedge(h));
outer_ccb->set_halfedge(_halfedge(h)); outer_ccb->set_halfedge(_halfedge(h));
outer_ccb->set_face(f); outer_ccb_and_new_face_pairs.push_back( std::make_pair(outer_ccb, f) );
} }
} }
} }
// now set the new face for all ccbs
BOOST_FOREACH(Outer_ccb_and_face& ccb_and_face, outer_ccb_and_new_face_pairs)
ccb_and_face.first->set_face(ccb_and_face.second);
BOOST_FOREACH(Inner_ccb_and_face& ccb_and_face, inner_ccb_and_new_face_pairs)
ccb_and_face.first->set_face(ccb_and_face.second);
//remove no longer used edges, vertices and faces //remove no longer used edges, vertices and faces
accessor.delete_vertices( vertices_to_remove ); accessor.delete_vertices( vertices_to_remove );
accessor.delete_edges( edges_to_remove ); accessor.delete_edges( edges_to_remove );

View File

@ -24,10 +24,11 @@
#include <CGAL/license/Bounding_volumes.h> #include <CGAL/license/Bounding_volumes.h>
#define CGAL_DEPRECATED_HEADER "<CGAL/Minimum_enclosing_quadrilateral_traits_2.h>"
#define CGAL_REPLACEMENT_HEADER "<CGAL/Min_quadrilateral_traits_2.h>"
#include <CGAL/internal/deprecation_warning.h>
#ifndef CGAL_NO_DEPRECATED_CODE
#include <CGAL/Min_quadrilateral_traits_2.h> #include <CGAL/Min_quadrilateral_traits_2.h>
#endif // CGAL_NO_DEPRECATED_CODE
#endif // ! (CGAL_MINIMUM_ENCLOSING_QUADRILATERAL_TRAITS_2_H) #endif // ! (CGAL_MINIMUM_ENCLOSING_QUADRILATERAL_TRAITS_2_H)

View File

@ -24,10 +24,11 @@
#include <CGAL/license/Bounding_volumes.h> #include <CGAL/license/Bounding_volumes.h>
#define CGAL_DEPRECATED_HEADER "<CGAL/minimum_enclosing_quadrilateral_2.h>"
#define CGAL_REPLACEMENT_HEADER "<CGAL/min_quadrilateral_2.h>"
#include <CGAL/internal/deprecation_warning.h>
#ifndef CGAL_NO_DEPRECATED_CODE
#include <CGAL/min_quadrilateral_2.h> #include <CGAL/min_quadrilateral_2.h>
#endif // CGAL_NO_DEPRECATED_CODE
#endif // ! (CGAL_MINIMUM_ENCLOSING_QUADRILATERAL_2_H) #endif // ! (CGAL_MINIMUM_ENCLOSING_QUADRILATERAL_2_H)

View File

@ -137,7 +137,7 @@ BigFloatRep::BigFloatRep(double d) : m(0), err(0), exp(0) {
exp--; exp--;
stop++; stop++;
} }
#ifdef CORE_DEBUG #ifdef CGAL_CORE_DEBUG
CGAL_assertion (s >= 0); CGAL_assertion (s >= 0);
#endif #endif
@ -277,7 +277,7 @@ void BigFloatRep::normal() {
// bits of error // bits of error
long f = chunkFloor(--le); // f is roughly equal to floor(le/CHUNK_BIT) long f = chunkFloor(--le); // f is roughly equal to floor(le/CHUNK_BIT)
long bits_f = bits(f); // f chunks will have bits_f many bits long bits_f = bits(f); // f chunks will have bits_f many bits
#ifdef CORE_DEBUG #ifdef CGAL_CORE_DEBUG
CGAL_assertion (bits_f >= 0); CGAL_assertion (bits_f >= 0);
#endif #endif
@ -305,7 +305,7 @@ void BigFloatRep::bigNormal(BigInt& bigErr) {
} else { } else {
long f = chunkFloor(--le); long f = chunkFloor(--le);
long bits_f = bits(f); long bits_f = bits(f);
#ifdef CORE_DEBUG #ifdef CGAL_CORE_DEBUG
CGAL_assertion(bits_f >= 0); CGAL_assertion(bits_f >= 0);
#endif #endif
@ -684,7 +684,7 @@ void BigFloatRep::sqrt(const BigFloatRep& x, const extLong& a, const BigFloat& A
} else { // p > 0 } else { // p > 0
m = chunkShift(z.m, chunkCeil(p)); m = chunkShift(z.m, chunkCeil(p));
long r = CHUNK_BIT - 1 - (p + CHUNK_BIT - 1) % CHUNK_BIT; long r = CHUNK_BIT - 1 - (p + CHUNK_BIT - 1) % CHUNK_BIT;
#ifdef CORE_DEBUG #ifdef CGAL_CORE_DEBUG
CGAL_assertion(r >= 0); CGAL_assertion(r >= 0);
#endif #endif
@ -727,7 +727,7 @@ void BigFloatRep::sqrt(const BigFloatRep& x, const extLong& a, const BigFloat& A
} else { // q > 0 } else { // q > 0
m = chunkShift(z.m, chunkCeil(q)); m = chunkShift(z.m, chunkCeil(q));
long r = CHUNK_BIT - 1 - (q + CHUNK_BIT - 1) % CHUNK_BIT; long r = CHUNK_BIT - 1 - (q + CHUNK_BIT - 1) % CHUNK_BIT;
#ifdef CORE_DEBUG #ifdef CGAL_CORE_DEBUG
CGAL_assertion(r >= 0); CGAL_assertion(r >= 0);
#endif #endif
@ -961,7 +961,7 @@ BigFloatRep::toDecimal(unsigned int width, bool Scientific) const {
} }
decOut.isScientific = false; decOut.isScientific = false;
} }
#ifdef CORE_DEBUG #ifdef CGAL_CORE_DEBUG
CGAL_assertion(decOut.noSignificant >= 0); CGAL_assertion(decOut.noSignificant >= 0);
#endif #endif
@ -1025,7 +1025,7 @@ void BigFloatRep :: fromString(const char *str, extLong prec ) {
// i.e., input is A/10^{e10}. // i.e., input is A/10^{e10}.
else { else {
e = str + strlen(str); e = str + strlen(str);
#ifdef CORE_DEBUG #ifdef CGAL_CORE_DEBUG
CGAL_assertion(*e == '\0'); CGAL_assertion(*e == '\0');
#endif #endif
@ -1116,7 +1116,7 @@ std::istream& BigFloatRep :: operator >>(std::istream& i) {
p = str + size; p = str + size;
size *= 2; size *= 2;
} }
#ifdef CORE_DEBUG #ifdef CGAL_CORE_DEBUG
CGAL_assertion((p-str) < size); CGAL_assertion((p-str) < size);
#endif #endif
@ -1142,7 +1142,7 @@ std::istream& BigFloatRep :: operator >>(std::istream& i) {
p = str + len; p = str + len;
} }
#ifdef CORE_DEBUG #ifdef CGAL_CORE_DEBUG
CGAL_assertion(p - str < size); CGAL_assertion(p - str < size);
#endif #endif
@ -1229,7 +1229,7 @@ BigInt BigFloatRep::toBigInt() const {
long le = clLg(err); long le = clLg(err);
if (le == -1) if (le == -1)
le = 0; le = 0;
#ifdef CORE_DEBUG #ifdef CGAL_CORE_DEBUG
CGAL_assertion (le >= 0); CGAL_assertion (le >= 0);
#endif #endif
@ -1249,7 +1249,7 @@ long BigFloatRep :: toLong() const {
// convert a BigFloat to a long integer, rounded toward -\infty. // convert a BigFloat to a long integer, rounded toward -\infty.
long e2 = bits(exp); long e2 = bits(exp);
long le = clLg(err); long le = clLg(err);
#ifdef CORE_DEBUG #ifdef CGAL_CORE_DEBUG
CGAL_assertion (le >= 0); CGAL_assertion (le >= 0);
#endif #endif

View File

@ -82,7 +82,7 @@ public:
Expr(float f) : RCExpr(NULL) { // check for valid numbers Expr(float f) : RCExpr(NULL) { // check for valid numbers
// (i.e., not infinite and not NaN) // (i.e., not infinite and not NaN)
if (! CGAL_CORE_finite(f)) { if (! CGAL_CORE_finite(f)) {
std::cerr << " ERROR : constructed an invalid float! " << std::endl; core_error(" ERROR : constructed an invalid float! ", __FILE__, __LINE__, false);
if (get_static_AbortFlag()) if (get_static_AbortFlag())
abort(); abort();
get_static_InvalidFlag() = -1; get_static_InvalidFlag() = -1;
@ -93,7 +93,7 @@ public:
Expr(double d) : RCExpr(NULL) { // check for valid numbers Expr(double d) : RCExpr(NULL) { // check for valid numbers
// (i.e., not infinite and not NaN) // (i.e., not infinite and not NaN)
if (! CGAL_CORE_finite(d)) { if (! CGAL_CORE_finite(d)) {
std::cerr << " ERROR : constructed an invalid double! " << std::endl; core_error(" ERROR : constructed an invalid double! ", __FILE__, __LINE__, false);
if (get_static_AbortFlag()) if (get_static_AbortFlag())
abort(); abort();
get_static_InvalidFlag() = -2; get_static_InvalidFlag() = -2;
@ -183,7 +183,7 @@ public:
/// /= operator /// /= operator
Expr& operator/=(const Expr& e) { Expr& operator/=(const Expr& e) {
if ((e.rep)->getSign() == 0) { if ((e.rep)->getSign() == 0) {
std::cerr << " ERROR : division by zero ! " << std::endl; core_error(" ERROR : division by zero ! ",__FILE__, __LINE__, false);
if (get_static_AbortFlag()) if (get_static_AbortFlag())
abort(); abort();
get_static_InvalidFlag() = -3; get_static_InvalidFlag() = -3;
@ -386,7 +386,7 @@ inline Expr operator*(const Expr& e1, const Expr& e2) {
/// division /// division
inline Expr operator/(const Expr& e1, const Expr& e2) { inline Expr operator/(const Expr& e1, const Expr& e2) {
if (e2.sign() == 0) { if (e2.sign() == 0) {
std::cerr << " ERROR : division by zero ! " << std::endl; core_error(" ERROR : division by zero ! ", __FILE__, __LINE__, false);
if (get_static_AbortFlag()) if (get_static_AbortFlag())
abort(); abort();
get_static_InvalidFlag() = -4; get_static_InvalidFlag() = -4;
@ -489,7 +489,7 @@ inline bool isDivisible(const Expr& e1, const Expr& e2) {
/// square root /// square root
inline Expr sqrt(const Expr& e) { inline Expr sqrt(const Expr& e) {
if (e.sign() < 0) { if (e.sign() < 0) {
std::cerr << " ERROR : sqrt of negative value ! " << std::endl; core_error(" ERROR : sqrt of negative value ! ", __FILE__, __LINE__, false);
if (get_static_AbortFlag()) if (get_static_AbortFlag())
abort(); abort();
get_static_InvalidFlag() = -5; get_static_InvalidFlag() = -5;

View File

@ -42,6 +42,7 @@
#include <CGAL/CORE/Real.h> #include <CGAL/CORE/Real.h>
#include <CGAL/CORE/Filter.h> #include <CGAL/CORE/Filter.h>
#include <CGAL/CORE/poly/Sturm.h> #include <CGAL/CORE/poly/Sturm.h>
#include <sstream>
#if defined(BOOST_MSVC) #if defined(BOOST_MSVC)
# pragma warning(push) # pragma warning(push)
@ -51,7 +52,7 @@
namespace CORE { namespace CORE {
#if defined(CORE_DEBUG_BOUND) && !defined(CGAL_HEADER_ONLY) #if defined(CGAL_CORE_DEBUG_BOUND) && !defined(CGAL_HEADER_ONLY)
// These counters are incremented each time each bound is recognized as equal // These counters are incremented each time each bound is recognized as equal
// to the best one in computeBound(). // to the best one in computeBound().
extern unsigned int BFMSS_counter; extern unsigned int BFMSS_counter;
@ -91,7 +92,7 @@ struct NodeInfo {
bool flagsComputed; ///< true if rootBound parameters have been computed bool flagsComputed; ///< true if rootBound parameters have been computed
extLong knownPrecision; ///< Precision achieved by current approx value extLong knownPrecision; ///< Precision achieved by current approx value
#ifdef CORE_DEBUG #ifdef CGAL_CORE_DEBUG
extLong relPrecision; extLong relPrecision;
extLong absPrecision; extLong absPrecision;
unsigned long numNodes; unsigned long numNodes;
@ -229,7 +230,7 @@ public:
return nodeInfo->knownPrecision; return nodeInfo->knownPrecision;
} }
#ifdef CORE_DEBUG #ifdef CGAL_CORE_DEBUG
const extLong& relPrecision() const { const extLong& relPrecision() const {
return nodeInfo->relPrecision; return nodeInfo->relPrecision;
} }
@ -463,7 +464,7 @@ public:
/// reset the flag "visited" /// reset the flag "visited"
virtual void clearFlag() = 0; virtual void clearFlag() = 0;
//@} //@}
#ifdef CORE_DEBUG #ifdef CGAL_CORE_DEBUG
virtual unsigned long dagSize() = 0; virtual unsigned long dagSize() = 0;
virtual void fullClearFlag() = 0; virtual void fullClearFlag() = 0;
#endif #endif
@ -502,7 +503,7 @@ protected:
void clearFlag() { void clearFlag() {
visited() = false; visited() = false;
} }
#ifdef CORE_DEBUG #ifdef CGAL_CORE_DEBUG
unsigned long dagSize(); unsigned long dagSize();
void fullClearFlag(); void fullClearFlag();
#endif #endif
@ -746,7 +747,7 @@ protected:
/// clear visited flag /// clear visited flag
void clearFlag(); void clearFlag();
#ifdef CORE_DEBUG #ifdef CGAL_CORE_DEBUG
unsigned long dagSize(); unsigned long dagSize();
void fullClearFlag(); void fullClearFlag();
#endif #endif
@ -854,7 +855,7 @@ protected:
/** This is now a misnomer, but historically accurate. /** This is now a misnomer, but historically accurate.
*/ */
extLong count(); extLong count();
#ifdef CORE_DEBUG #ifdef CGAL_CORE_DEBUG
unsigned long dagSize(); unsigned long dagSize();
void fullClearFlag(); void fullClearFlag();
#endif #endif
@ -1024,12 +1025,12 @@ void AddSubRep<Operator>::computeExactFlags() {
extLong l = core_max(lf, ls); extLong l = core_max(lf, ls);
extLong u = core_max(uf, us); extLong u = core_max(uf, us);
#ifdef CORE_TRACE #ifdef CGAL_CORE_TRACE
std::cout << "INSIDE Add/sub Rep: " << std::endl; std::cout << "INSIDE Add/sub Rep: " << std::endl;
#endif #endif
if (Op(sf, ss) != 0) { // can't possibly cancel out if (Op(sf, ss) != 0) { // can't possibly cancel out
#ifdef CORE_TRACE #ifdef CGAL_CORE_TRACE
std::cout << "Add/sub Rep: Op(sf, ss) non-zero" << std::endl; std::cout << "Add/sub Rep: Op(sf, ss) non-zero" << std::endl;
#endif #endif
@ -1037,38 +1038,38 @@ void AddSubRep<Operator>::computeExactFlags() {
lMSB() = l; // lMSB = core_min(lf, ls)+1 better lMSB() = l; // lMSB = core_min(lf, ls)+1 better
sign() = sf; sign() = sf;
} else { // might cancel out } else { // might cancel out
#ifdef CORE_TRACE #ifdef CGAL_CORE_TRACE
std::cout << "Add/sub Rep: Op(sf, ss) zero" << std::endl; std::cout << "Add/sub Rep: Op(sf, ss) zero" << std::endl;
#endif #endif
uMSB() = u + EXTLONG_ONE; uMSB() = u + EXTLONG_ONE;
uMSB() = u; uMSB() = u;
if (lf >= us + EXTLONG_TWO) {// one is at least 1 order of magnitude larger if (lf >= us + EXTLONG_TWO) {// one is at least 1 order of magnitude larger
#ifdef CORE_TRACE #ifdef CGAL_CORE_TRACE
std::cout << "Add/sub Rep: Can't cancel" << std::endl; std::cout << "Add/sub Rep: Can't cancel" << std::endl;
#endif #endif
lMSB() = lf - EXTLONG_ONE; // can't possibly cancel out lMSB() = lf - EXTLONG_ONE; // can't possibly cancel out
sign() = sf; sign() = sf;
} else if (ls >= uf + EXTLONG_TWO) { } else if (ls >= uf + EXTLONG_TWO) {
#ifdef CORE_TRACE #ifdef CGAL_CORE_TRACE
std::cout << "Add/sub Rep: Can't cancel" << std::endl; std::cout << "Add/sub Rep: Can't cancel" << std::endl;
#endif #endif
lMSB() = ls - EXTLONG_ONE; lMSB() = ls - EXTLONG_ONE;
sign() = Op(ss); sign() = Op(ss);
} else if (ffVal.isOK()) {// begin filter computation } else if (ffVal.isOK()) {// begin filter computation
#ifdef CORE_TRACE #ifdef CGAL_CORE_TRACE
std::cout << "Add/sub Rep: filter used" << std::endl; std::cout << "Add/sub Rep: filter used" << std::endl;
#endif #endif
#ifdef CORE_DEBUG_FILTER #ifdef CGAL_CORE_DEBUG_FILTER
std::cout << "call filter in " << op() << "Rep" << std::endl; std::cout << "call filter in " << op() << "Rep" << std::endl;
#endif #endif
sign() = ffVal.sign(); sign() = ffVal.sign();
lMSB() = ffVal.lMSB(); lMSB() = ffVal.lMSB();
uMSB() = ffVal.uMSB(); uMSB() = ffVal.uMSB();
} else { // about the same size, might cancel out } else { // about the same size, might cancel out
#ifdef CORE_TRACE #ifdef CGAL_CORE_TRACE
std::cout << "Add/sub Rep: iteration start" << std::endl; std::cout << "Add/sub Rep: iteration start" << std::endl;
#endif #endif
@ -1108,7 +1109,7 @@ void AddSubRep<Operator>::computeExactFlags() {
sign() = 0; sign() = 0;
} }
} else { // else do progressive evaluation } else { // else do progressive evaluation
#ifdef CORE_TRACE #ifdef CGAL_CORE_TRACE
std::cout << "Add/sub Rep: progressive eval" << std::endl; std::cout << "Add/sub Rep: progressive eval" << std::endl;
#endif #endif
// Oct 30, 2002: fixed a bug here! Old versions used relative // Oct 30, 2002: fixed a bug here! Old versions used relative
@ -1124,7 +1125,7 @@ void AddSubRep<Operator>::computeExactFlags() {
extLong ua = lowBound.asLong() + EXTLONG_ONE; extLong ua = lowBound.asLong() + EXTLONG_ONE;
// NOTE: ua is allowed to be CORE_INFTY // NOTE: ua is allowed to be CORE_INFTY
#ifdef CORE_DEBUG_BOUND #ifdef CGAL_CORE_DEBUG_BOUND
std::cout << "DebugBound:" << "ua = " << ua << std::endl; std::cout << "DebugBound:" << "ua = " << ua << std::endl;
#endif #endif
// We initially set the lMSB and sign as if the value is zero: // We initially set the lMSB and sign as if the value is zero:
@ -1135,7 +1136,7 @@ void AddSubRep<Operator>::computeExactFlags() {
// Now we try to determine the real lMSB and sign, // Now we try to determine the real lMSB and sign,
// in case it is not really zero: // in case it is not really zero:
#ifdef CORE_TRACE #ifdef CGAL_CORE_TRACE
std::cout << "Upper bound (ua) for iteration is " << ua << std::endl; std::cout << "Upper bound (ua) for iteration is " << ua << std::endl;
std::cout << "Starting iteration at i = " << i << std::endl; std::cout << "Starting iteration at i = " << i << std::endl;
#endif #endif
@ -1156,7 +1157,7 @@ void AddSubRep<Operator>::computeExactFlags() {
Real newValue = Op(first->getAppValue(CORE_INFTY, i), Real newValue = Op(first->getAppValue(CORE_INFTY, i),
second->getAppValue(CORE_INFTY, i)); second->getAppValue(CORE_INFTY, i));
#ifdef CORE_TRACE #ifdef CGAL_CORE_TRACE
if (newValue.getRep().ID() == REAL_BIGFLOAT) if (newValue.getRep().ID() == REAL_BIGFLOAT)
std::cout << "BigFloat! newValue->rep->ID() = " std::cout << "BigFloat! newValue->rep->ID() = "
<< newValue.getRep().ID() << std::endl; << newValue.getRep().ID() << std::endl;
@ -1180,10 +1181,10 @@ void AddSubRep<Operator>::computeExactFlags() {
lMSB() = newValue.lMSB(); lMSB() = newValue.lMSB();
uMSB() = newValue.uMSB(); uMSB() = newValue.uMSB();
sign() = newValue.sign(); sign() = newValue.sign();
#ifdef CORE_DEBUG_BOUND #ifdef CGAL_CORE_DEBUG_BOUND
std::cout << "DebugBound(Exit Loop): " << "i=" << i << std::endl; std::cout << "DebugBound(Exit Loop): " << "i=" << i << std::endl;
#endif #endif
#ifdef CORE_TRACE #ifdef CGAL_CORE_TRACE
std::cout << "Zero is not in, lMSB() = " << lMSB() std::cout << "Zero is not in, lMSB() = " << lMSB()
<< ", uMSB() = " << uMSB() << ", uMSB() = " << uMSB()
<< ", sign() = " << sign() << std::endl; << ", sign() = " << sign() << std::endl;
@ -1200,7 +1201,7 @@ void AddSubRep<Operator>::computeExactFlags() {
if (get_static_EscapePrecWarning()) if (get_static_EscapePrecWarning())
std::cout<< "Escape Precision triggered at " std::cout<< "Escape Precision triggered at "
<< get_static_EscapePrec() << " bits" << std::endl; << get_static_EscapePrec() << " bits" << std::endl;
#ifdef CORE_DEBUG #ifdef CGAL_CORE_DEBUG
std::cout << "EscapePrecFlags=" << get_static_EscapePrecFlag() << std::endl; std::cout << "EscapePrecFlags=" << get_static_EscapePrecFlag() << std::endl;
std::cout << "ua =" << ua << ",lowBound=" << lowBound << std::endl; std::cout << "ua =" << ua << ",lowBound=" << lowBound << std::endl;
#endif #endif
@ -1208,7 +1209,7 @@ void AddSubRep<Operator>::computeExactFlags() {
}// if }// if
}// for (long i=1...) }// for (long i=1...)
#if defined(CORE_DEBUG_BOUND) && !defined(CGAL_HEADER_ONLY) #if defined(CGAL_CORE_DEBUG_BOUND) && !defined(CGAL_HEADER_ONLY)
rootBoundHitCounter++; rootBoundHitCounter++;
#endif #endif
@ -1243,8 +1244,9 @@ void AddSubRep<Operator>::computeApproxValue(const extLong& relPrec,
// handling overflow and underflow // handling overflow and underflow
if (lMSB() >= EXTLONG_BIG || lMSB() <= EXTLONG_SMALL) if (lMSB() >= EXTLONG_BIG || lMSB() <= EXTLONG_SMALL)
{ {
std::cerr << "lMSB = " << lMSB() << std::endl; // should be in core_error std::ostringstream oss;
core_error("CORE WARNING: a huge lMSB in AddSubRep", oss << "CORE WARNING: a huge lMSB in AddSubRep: " << lMSB();
core_error(oss.str(),
__FILE__, __LINE__, false); __FILE__, __LINE__, false);
} }
@ -1338,7 +1340,7 @@ inline int ExprRep::getExactSign() {
if (!flagsComputed()) { if (!flagsComputed()) {
degreeBound(); degreeBound();
#ifdef CORE_DEBUG #ifdef CGAL_CORE_DEBUG
dagSize(); dagSize();
fullClearFlag(); fullClearFlag();
#endif #endif

View File

@ -42,6 +42,7 @@
#include <CGAL/CORE/Expr.h> #include <CGAL/CORE/Expr.h>
#include <cmath> #include <cmath>
#include <sstream>
namespace CORE { namespace CORE {
@ -1028,8 +1029,9 @@ void MultRep::computeApproxValue(const extLong& relPrec,
// handling overflow and underflow // handling overflow and underflow
if (lMSB() >= EXTLONG_BIG || lMSB() <= EXTLONG_SMALL) if (lMSB() >= EXTLONG_BIG || lMSB() <= EXTLONG_SMALL)
{ {
std::cerr << "lMSB = " << lMSB() << std::endl; // should be in core_error std::ostringstream oss;
core_error("CORE WARNING: a huge lMSB in AddSubRep", oss << "CORE WARNING: a huge lMSB in AddSubRep " << lMSB();
core_error(oss.str(),
__FILE__, __LINE__, false); __FILE__, __LINE__, false);
} }
@ -1050,8 +1052,9 @@ void DivRep::computeApproxValue(const extLong& relPrec,
// handling overflow and underflow // handling overflow and underflow
if (lMSB() >= EXTLONG_BIG || lMSB() <= EXTLONG_SMALL) if (lMSB() >= EXTLONG_BIG || lMSB() <= EXTLONG_SMALL)
{ {
std::cerr << "lMSB = " << lMSB() << std::endl; // should be in core_error std::ostringstream oss;
core_error("CORE WARNING: a huge lMSB in AddSubRep", oss << "CORE WARNING: a huge lMSB in AddSubRep " << lMSB();
core_error(oss.str(),
__FILE__, __LINE__, false); __FILE__, __LINE__, false);
} }

View File

@ -34,6 +34,7 @@
* $Id$ * $Id$
***************************************************************************/ ***************************************************************************/
#include <sstream>
//CONSTRUCTORS FOR THE BIPOLY CLASS //CONSTRUCTORS FOR THE BIPOLY CLASS
//////////////////////////////////////////////////////// ////////////////////////////////////////////////////////
@ -306,7 +307,9 @@ int BiPoly<NT>::getbasicterm(string s, BiPoly<NT> & P){
Polynomial<NT> q(0, cs); Polynomial<NT> q(0, cs);
P.coeffX.push_back(q); P.coeffX.push_back(q);
}else{ }else{
#ifdef CGAL_CORE_TRACE
std::cout <<"ERROR IN PARSING BASIC TERM" << std::endl; std::cout <<"ERROR IN PARSING BASIC TERM" << std::endl;
#endif
} }
//i+1 points to the beginning of next syntaxtic object in the string. //i+1 points to the beginning of next syntaxtic object in the string.
if(cstr[i+1] == '^'){ if(cstr[i+1] == '^'){
@ -404,8 +407,11 @@ BiPoly<NT> BiPoly<NT>::getbipoly(string s){
P += R; P += R;
else if(cstr[oind + 1] == '-') else if(cstr[oind + 1] == '-')
P -= R; P -= R;
else else{
#ifdef CGAL_CORE_TRACE
std::cout << "ERROR IN PARSING BIPOLY! " << std::endl; std::cout << "ERROR IN PARSING BIPOLY! " << std::endl;
#endif
}
} }
return P; return P;
@ -1337,7 +1343,11 @@ cout <<"Number of roots at " << xCurr << " are " << numRoots<<endl;
numPoints++; numPoints++;
}//if }//if
xCurr += eps; xCurr += eps;
if (!xCurr.isExact()) std::cout<<"xCurr has error! xCurr=" << xCurr << std::endl; if (!xCurr.isExact()){
std::ostringstream oss;
oss << "xCurr has error! xCurr=" << xCurr;
core_error(oss.str(), __FILE__, __LINE__, false);
}
}//main while loop }//main while loop
// Need to flush out the final x-interval: // Need to flush out the final x-interval:

View File

@ -257,7 +257,9 @@ int Polynomial<NT>::getbasicterm(string & s, Polynomial<NT> & P){
string t = s.substr(oldi+1, i -oldi -1); string t = s.substr(oldi+1, i -oldi -1);
P = getpoly(t); P = getpoly(t);
}else{ }else{
#ifdef CGAL_CORE_TRACE
std::cout <<"ERROR IN PARSING BASIC TERM" << std::endl; std::cout <<"ERROR IN PARSING BASIC TERM" << std::endl;
#endif
} }
//i+1 points to the beginning of next syntactic object in the string. //i+1 points to the beginning of next syntactic object in the string.
if(cstr[i+1] == '^'){ if(cstr[i+1] == '^'){
@ -352,8 +354,11 @@ Polynomial<NT> Polynomial<NT>::getpoly(string & s){
P += R; P += R;
else if(cstr[oind + 1] == '-') else if(cstr[oind + 1] == '-')
P -= R; P -= R;
else else{
#ifdef CGAL_CORE_TRACE
std::cout << "ERROR IN PARSING POLY! " << std::endl; std::cout << "ERROR IN PARSING POLY! " << std::endl;
#endif
}
} }
return (P); return (P);
@ -677,8 +682,7 @@ Polynomial<NT> Polynomial<NT>::pseudoRemainder (
tmpB.contract(); // local copy of B tmpB.contract(); // local copy of B
C = NT(1); // Initialized to C=1. C = NT(1); // Initialized to C=1.
if (B.degree == -1) { if (B.degree == -1) {
std::cout << "ERROR in Polynomial<NT>::pseudoRemainder :\n" << core_error("ERROR in Polynomial<NT>::pseudoRemainder :\n -- divide by zero polynomial", __FILE__, __LINE__, false);
" -- divide by zero polynomial" << std::endl;
return Polynomial(0); // Unit Polynomial (arbitrary!) return Polynomial(0); // Unit Polynomial (arbitrary!)
} }
if (B.degree > degree) { if (B.degree > degree) {

View File

@ -1,6 +1,9 @@
project(CGALimageIO_Demo) project(CGALimageIO_Demo)
cmake_minimum_required(VERSION 2.8.11) cmake_minimum_required(VERSION 2.8.11)
if(POLICY CMP0053)
cmake_policy(SET CMP0053 OLD)
endif()
if(POLICY CMP0043) if(POLICY CMP0043)
cmake_policy(SET CMP0043 OLD) cmake_policy(SET CMP0043 OLD)
endif() endif()

View File

@ -1,6 +1,9 @@
project(CGAL_ipelets_Demo) project(CGAL_ipelets_Demo)
cmake_minimum_required(VERSION 3.1) cmake_minimum_required(VERSION 3.1)
if(POLICY CMP0053)
cmake_policy(SET CMP0053 OLD)
endif()
if(POLICY CMP0043) if(POLICY CMP0043)
cmake_policy(SET CMP0043 OLD) cmake_policy(SET CMP0043 OLD)
endif() endif()

View File

@ -3,9 +3,6 @@
#include <cassert> #include <cassert>
#include <CGAL/Simple_cartesian.h> #include <CGAL/Simple_cartesian.h>
#include <CGAL/Polygon_2.h> #include <CGAL/Polygon_2.h>
#include <CGAL/Weighted_point.h>
#include <CGAL/grabbers.h> #include <CGAL/grabbers.h>
typedef CGAL::Simple_cartesian<double> Kernel; typedef CGAL::Simple_cartesian<double> Kernel;

View File

@ -29,7 +29,6 @@ typedef unsigned int uint;
#include <ipelib.h> #include <ipelib.h>
#include <CGAL/Polygon_2.h> #include <CGAL/Polygon_2.h>
#include <CGAL/Weighted_point.h>
#include <CGAL/iterator.h> #include <CGAL/iterator.h>
#include <CGAL/Triangulation_2.h> #include <CGAL/Triangulation_2.h>
#include <CGAL/grabbers.h> #include <CGAL/grabbers.h>

View File

@ -1,9 +1,9 @@
// Copyright (c) 1999, 2016 // Copyright (c) 1999, 2016
// Utrecht University (The Netherlands), // Utrecht University (The Netherlands),
// ETH Zurich (Switzerland), // ETH Zurich (Switzerland),
// INRIA Sophia-Antipolis (France), // INRIA Sophia-Antipolis (France),
// Max-Planck-Institute Saarbruecken (Germany), // Max-Planck-Institute Saarbruecken (Germany),
// and Tel-Aviv University (Israel). All rights reserved. // and Tel-Aviv University (Israel). All rights reserved.
// //
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or // This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as // modify it under the terms of the GNU Lesser General Public License as
@ -18,7 +18,6 @@
// //
// $URL$ // $URL$
// $Id$ // $Id$
//
// //
// Author(s) : Mariette Yvinec // Author(s) : Mariette Yvinec
// Sylvain Pion // Sylvain Pion
@ -26,28 +25,34 @@
#ifndef CGAL_CARTESIAN_WEIGHTED_POINT_2_H #ifndef CGAL_CARTESIAN_WEIGHTED_POINT_2_H
#define CGAL_CARTESIAN_WEIGHTED_POINT_2_H #define CGAL_CARTESIAN_WEIGHTED_POINT_2_H
#include <iostream> #include <CGAL/Handle_for.h>
#include <CGAL/Origin.h>
#include <boost/tuple/tuple.hpp> #include <boost/tuple/tuple.hpp>
#include <iostream>
namespace CGAL { namespace CGAL {
template < class R_ > template < class R_ >
class Weighted_pointC2 class Weighted_pointC2
{ {
typedef typename R_::Point_2 Point_2; typedef typename R_::Point_2 Point_2;
typedef typename R_::FT FT; typedef typename R_::FT FT;
typedef typename R_::FT Weight; typedef FT Weight;
typedef boost::tuple<Point_2, Weight> Rep;
typedef boost::tuple<Point_2, Weight> Rep;
typedef typename R_::template Handle<Rep>::type Base; typedef typename R_::template Handle<Rep>::type Base;
Base base; Base base;
public: public:
Weighted_pointC2 () Weighted_pointC2 ()
{} {}
//explicit Weighted_pointC2(const Origin &o)
: base(o, 0) {}
Weighted_pointC2 (const Point_2 &p) Weighted_pointC2 (const Point_2 &p)
: base(p,0) : base(p,0)
{} {}
@ -56,31 +61,27 @@ public:
: base(p,w) : base(p,w)
{} {}
// Constructors from coordinates are also provided for convenience, except // Constructors from coordinates are also provided for convenience, except
// that they are only from Cartesian coordinates, and with no weight, so as // that they are only from Cartesian coordinates, and with no weight, so as
// to avoid any potential ambiguity between the homogeneous weight and the // to avoid any potential ambiguity between the homogeneous weight and the
// power weight (it should be easy enough to pass a Point explicitly in those // power weight (it should be easy enough to pass a Point_2 explicitly in those
// cases). // cases).
Weighted_pointC2(const FT& x, const FT& y) Weighted_pointC2 (const FT& x, const FT& y)
: base(Point_2(x,y),0) : base(Point_2(x,y), 0)
{} {}
const Point_2 & point() const const Point_2 & point() const
{ {
return get_pointee_or_identity(base).template get<0>(); return get_pointee_or_identity(base).template get<0>();
} }
const Weight & weight() const const Weight & weight() const
{ {
return get_pointee_or_identity(base).template get<1>(); return get_pointee_or_identity(base).template get<1>();
} }
}; };
template < class R_ > template < class R_ >
std::ostream & std::ostream &
operator<<(std::ostream &os, const Weighted_pointC2<R_> &p) operator<<(std::ostream &os, const Weighted_pointC2<R_> &p)
@ -94,7 +95,7 @@ operator<<(std::ostream &os, const Weighted_pointC2<R_> &p)
write(os, p.weight()); write(os, p.weight());
return os; return os;
default: default:
return os << "Weighted_point(" << p.point() << ", " << p.weight() << ")"; return os << "Weighted_point_2(" << p.point() << ", " << p.weight() << ")";
} }
} }
@ -103,7 +104,7 @@ std::istream &
operator>>(std::istream &is, Weighted_pointC2<R_> &wp) operator>>(std::istream &is, Weighted_pointC2<R_> &wp)
{ {
typename Weighted_pointC2<R_>::Weight w; typename Weighted_pointC2<R_>::Weight w;
typename Weighted_pointC2<R_>::Point p; typename Weighted_pointC2<R_>::Point_2 p;
is >> p; is >> p;
if(!is) return is; if(!is) return is;
if(is_ascii(is)) if(is_ascii(is))

View File

@ -1,9 +1,9 @@
// Copyright (c) 1999,2016 // Copyright (c) 1999,2016
// Utrecht University (The Netherlands), // Utrecht University (The Netherlands),
// ETH Zurich (Switzerland), // ETH Zurich (Switzerland),
// INRIA Sophia-Antipolis (France), // INRIA Sophia-Antipolis (France),
// Max-Planck-Institute Saarbruecken (Germany), // Max-Planck-Institute Saarbruecken (Germany),
// and Tel-Aviv University (Israel). All rights reserved. // and Tel-Aviv University (Israel). All rights reserved.
// //
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or // This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as // modify it under the terms of the GNU Lesser General Public License as
@ -18,7 +18,6 @@
// //
// $URL$ // $URL$
// $Id$ // $Id$
//
// //
// Author(s) : Mariette Yvinec // Author(s) : Mariette Yvinec
// Sylvain Pion // Sylvain Pion
@ -26,31 +25,34 @@
#ifndef CGAL_CARTESIAN_WEIGHTED_POINT_3_H #ifndef CGAL_CARTESIAN_WEIGHTED_POINT_3_H
#define CGAL_CARTESIAN_WEIGHTED_POINT_3_H #define CGAL_CARTESIAN_WEIGHTED_POINT_3_H
#include <iostream> #include <CGAL/Handle_for.h>
#include <CGAL/Origin.h>
#include <boost/tuple/tuple.hpp> #include <boost/tuple/tuple.hpp>
#include <iostream>
namespace CGAL { namespace CGAL {
template < class R_ > template < class R_ >
class Weighted_pointC3 class Weighted_pointC3
{ {
typedef typename R_::Point_3 Point_3; typedef typename R_::Point_3 Point_3;
typedef typename R_::FT FT;
typedef FT Weight;
typedef typename R_::FT FT; typedef boost::tuple<Point_3, Weight> Rep;
typedef FT Weight;
typedef boost::tuple<Point_3, Weight> Rep;
typedef typename R_::template Handle<Rep>::type Base; typedef typename R_::template Handle<Rep>::type Base;
Base base; Base base;
public: public:
Weighted_pointC3 () Weighted_pointC3 ()
{} {}
//explicit Weighted_pointC3(const Origin &o)
: base(o,0) {}
Weighted_pointC3 (const Point_3 &p) Weighted_pointC3 (const Point_3 &p)
: base(p,0) : base(p,0)
{} {}
@ -59,15 +61,12 @@ public:
: base(p,w) : base(p,w)
{} {}
// Constructors from coordinates are also provided for convenience, except // Constructors from coordinates are also provided for convenience, except
// that they are only from Cartesian coordinates, and with no weight, so as // that they are only from Cartesian coordinates, and with no weight, so as
// to avoid any potential ambiguity between the homogeneous weight and the // to avoid any potential ambiguity between the homogeneous weight and the
// power weight (it should be easy enough to pass a Point_3 explicitly in those // power weight (it should be easy enough to pass a Point_3 explicitly in those
// cases). // cases).
Weighted_pointC3 (const FT &x, const FT &y, const FT &z) Weighted_pointC3 (const FT &x, const FT &y, const FT &z)
: base(Point_3(x, y, z), 0) : base(Point_3(x, y, z), 0)
{} {}
@ -81,10 +80,8 @@ public:
{ {
return get_pointee_or_identity(base).template get<1>(); return get_pointee_or_identity(base).template get<1>();
} }
}; };
template < class R_ > template < class R_ >
std::ostream & std::ostream &
operator<<(std::ostream &os, const Weighted_pointC3<R_> &p) operator<<(std::ostream &os, const Weighted_pointC3<R_> &p)

View File

@ -96,6 +96,13 @@ namespace CartesianKernelFunctors {
r.x(), r.y(), r.z(), r.x(), r.y(), r.z(),
s.x(), s.y(), s.z()); s.x(), s.y(), s.z());
} }
result_type
operator()(const Point_3& p, const Point_3& q,
const Point_3& r, const Vector_3& n) const
{
return enum_cast<Angle>(orientation(p,q,r,r+n));
}
}; };
template <typename K> template <typename K>
@ -507,8 +514,6 @@ namespace CartesianKernelFunctors {
} }
}; };
template < typename K > template < typename K >
class Compare_power_distance_2 class Compare_power_distance_2
{ {
@ -517,11 +522,11 @@ namespace CartesianKernelFunctors {
typedef typename K::Point_2 Point_2; typedef typename K::Point_2 Point_2;
typedef typename K::Comparison_result Comparison_result; typedef typename K::Comparison_result Comparison_result;
typedef Comparison_result result_type; typedef Comparison_result result_type;
Comparison_result operator()(const Point_2& r, Comparison_result operator()(const Point_2& r,
const Weighted_point_2& q, const Weighted_point_2& p,
const Weighted_point_2& p) const const Weighted_point_2& q) const
{ {
return CGAL::compare_power_distanceC2(p.x(), p.y(), p.weight(), return CGAL::compare_power_distanceC2(p.x(), p.y(), p.weight(),
q.x(), q.y(), q.weight(), q.x(), q.y(), q.weight(),
@ -529,7 +534,6 @@ namespace CartesianKernelFunctors {
} }
}; };
template <typename K> template <typename K>
class Compare_squared_radius_3 class Compare_squared_radius_3
{ {
@ -1726,7 +1730,6 @@ namespace CartesianKernelFunctors {
}; };
template <typename K> template <typename K>
class Construct_base_vector_3 class Construct_base_vector_3
{ {
@ -1760,8 +1763,21 @@ namespace CartesianKernelFunctors {
if ( CGAL_NTS is_zero(h.c()) ) // parallel to z-axis if ( CGAL_NTS is_zero(h.c()) ) // parallel to z-axis
return Vector_3(FT(0), FT(0), FT(1)); return Vector_3(FT(0), FT(0), FT(1));
return Vector_3(-h.b(), h.a(), FT(0)); FT a = CGAL::abs(h.a()),
b = CGAL::abs(h.b()),
c = CGAL::abs(h.c());
// to avoid badly defined vectors with coordinates all close
// to 0 when the plane is almost horizontal, we ignore the
// smallest coordinate instead of always ignoring Z
if (CGAL::possibly(a <= b && a <= c))
return Vector_3(FT(0), -h.c(), h.b());
if (CGAL::possibly(b <= a && b <= c))
return Vector_3(-h.c(), FT(0), h.a());
return Vector_3(-h.b(), h.a(), FT(0));
} else { } else {
return cp(co(h), this->operator()(h,1)); return cp(co(h), this->operator()(h,1));
} }
@ -3051,40 +3067,87 @@ namespace CartesianKernelFunctors {
template <typename K> template <typename K>
class Construct_weighted_point_2 class Construct_weighted_point_2
{ {
typedef typename K::RT RT; typedef typename K::FT FT;
typedef typename K::Point_2 Point_2; typedef typename K::Point_2 Point_2;
typedef typename K::Weighted_point_2 Weighted_point_2; typedef typename K::Weighted_point_2 Weighted_point_2;
typedef typename Weighted_point_2::Rep Rep; typedef typename Weighted_point_2::Rep Rep;
public: public:
typedef Weighted_point_2 result_type; typedef Weighted_point_2 result_type;
Rep Rep
operator()(Return_base_tag, const Point_2& p, const RT& w) const operator()(Return_base_tag, Origin o) const
{ return Rep(o); }
Rep
operator()(Return_base_tag, const Point_2& p, const FT& w) const
{ return Rep(p,w); } { return Rep(p,w); }
Rep Rep
operator()(Return_base_tag, const RT& x, const RT& y) const operator()(Return_base_tag, const FT& x, const FT& y) const
{ return Rep(x,y); } { return Rep(x,y); }
Weighted_point_2
operator()(Origin o) const
{ return Weighted_point_2(o); }
Weighted_point_2
operator()(const Point_2& p, const FT& w) const
{ return Weighted_point_2(p,w); }
Weighted_point_2
operator()(const FT& x, const FT& y) const
{ return Weighted_point_2(x, y); }
Weighted_point_2
operator()(const Point_2& p) const
{ return Weighted_point_2(p,0); }
const Weighted_point_2&
operator()(const Weighted_point_2 & wp) const
{ return wp; }
}; };
template <typename K> template <typename K>
class Construct_weighted_point_3 class Construct_weighted_point_3
{ {
typedef typename K::RT RT; typedef typename K::FT FT;
typedef typename K::FT FT; typedef typename K::Point_3 Point_3;
typedef typename K::Point_3 Point_3; typedef typename K::Weighted_point_3 Weighted_point_3;
typedef typename K::Weighted_point_3 Weighted_point_3;
typedef typename Weighted_point_3::Rep Rep; typedef typename Weighted_point_3::Rep Rep;
public: public:
typedef Weighted_point_3 result_type; typedef Weighted_point_3 result_type;
Rep Rep
operator()(Return_base_tag, const Point_3& p, const RT& w) const operator()(Return_base_tag, Origin o) const
{ return Rep(o); }
Rep
operator()(Return_base_tag, const Point_3& p, const FT& w) const
{ return Rep(p,w); } { return Rep(p,w); }
Rep Rep
operator()(Return_base_tag, const FT& x, const FT& y, const FT& z) const operator()(Return_base_tag, const FT& x, const FT& y, const FT& z) const
{ return Rep(x,y,z); } { return Rep(x,y,z); }
Weighted_point_3
operator()(Origin o) const
{ return Weighted_point_3(o); }
Weighted_point_3
operator()(const Point_3& p, const FT& w) const
{ return Rep(p,w); }
Weighted_point_3
operator()(const FT& x, const FT& y, const FT& z) const
{ return Weighted_point_3(x,y,z); }
Weighted_point_3
operator()(const Point_3& p) const
{ return Weighted_point_3(p,0); }
const Weighted_point_3&
operator()(const Weighted_point_3& wp) const
{ return wp; }
}; };
@ -4078,89 +4141,50 @@ namespace CartesianKernelFunctors {
} }
}; };
template < typename K > template < typename K >
class Power_side_of_oriented_power_sphere_3 class Power_side_of_oriented_power_circle_2
{ {
public: public:
typedef typename K::Weighted_point_3 Weighted_point_3; typedef typename K::Weighted_point_2 Weighted_point_2;
typedef typename K::Oriented_side Oriented_side; typedef typename K::Oriented_side Oriented_side;
typedef Oriented_side result_type;
Oriented_side operator() ( const Weighted_point_3 & p, typedef Oriented_side result_type;
const Weighted_point_3 & q,
const Weighted_point_3 & r,
const Weighted_point_3 & s,
const Weighted_point_3 & t) const
{
return power_side_of_oriented_power_sphereC3(p.x(), p.y(), p.z(), p.weight(),
q.x(), q.y(), q.z(), q.weight(),
r.x(), r.y(), r.z(), r.weight(),
s.x(), s.y(), s.z(), s.weight(),
t.x(), t.y(), t.z(), t.weight());
}
Oriented_side operator() ( const Weighted_point_3 & p, Oriented_side operator()(const Weighted_point_2& p,
const Weighted_point_3 & q, const Weighted_point_2& q,
const Weighted_point_3 & r, const Weighted_point_2& r,
const Weighted_point_3 & s) const const Weighted_point_2& t) const
{
return power_side_of_oriented_power_sphereC3(p.x(), p.y(), p.z(), p.weight(),
q.x(), q.y(), q.z(), q.weight(),
r.x(), r.y(), r.z(), r.weight(),
s.x(), s.y(), s.z(), s.weight());
}
Oriented_side operator() ( const Weighted_point_3 & p,
const Weighted_point_3 & q,
const Weighted_point_3 & r) const
{
return power_side_of_oriented_power_sphereC3(p.x(), p.y(), p.z(), p.weight(),
q.x(), q.y(), q.z(), q.weight(),
r.x(), r.y(), r.z(), r.weight());
}
Oriented_side operator() ( const Weighted_point_3 & p,
const Weighted_point_3 & q) const
{
return power_side_of_oriented_power_sphereC3(p.weight(),q.weight());
}
};
template < typename K >
class Power_side_of_oriented_power_circle_2
{
public:
typedef typename K::Weighted_point_2 Weighted_point_2;
typedef typename K::Oriented_side Oriented_side;
typedef Oriented_side result_type;
Oriented_side operator() ( const Weighted_point_2 & p,
const Weighted_point_2 & q,
const Weighted_point_2 & r,
const Weighted_point_2 & t) const
{ {
//CGAL_kernel_precondition( ! collinear(p, q, r) ); //CGAL_kernel_precondition( ! collinear(p, q, r) );
return power_side_of_oriented_power_circleC2(p.x(), p.y(), p.weight(), return power_side_of_oriented_power_circleC2(p.x(), p.y(), p.weight(),
q.x(), q.y(), q.weight(), q.x(), q.y(), q.weight(),
r.x(), r.y(), r.weight(), r.x(), r.y(), r.weight(),
t.x(), t.y(), t.weight()); t.x(), t.y(), t.weight());
} }
Oriented_side operator() ( const Weighted_point_2 & p, // The methods below are currently undocumented because the definition of
const Weighted_point_2 & q, // orientation is unclear for 2 and 1 point configurations in a 2D space.
const Weighted_point_2 & t) const
// One should be (very) careful with the order of vertices when using them,
// as swapping points will change the result and one must therefore have a
// precise idea of what is the positive orientation in the full space.
// For example, these functions are (currently) used safely in the regular
// triangulations classes because we always call them on vertices of
// triangulation cells, which are always positively oriented.
Oriented_side operator()(const Weighted_point_2& p,
const Weighted_point_2& q,
const Weighted_point_2& t) const
{ {
//CGAL_kernel_precondition( collinear(p, q, r) ); //CGAL_kernel_precondition( collinear(p, q, r) );
//CGAL_kernel_precondition( p.point() != q.point() ); //CGAL_kernel_precondition( p.point() != q.point() );
return power_side_of_oriented_power_circleC2(p.point().x(), p.y(), p.weight(), return power_side_of_oriented_power_circleC2(p.point().x(), p.y(), p.weight(),
q.x(), q.y(), q.weight(), q.x(), q.y(), q.weight(),
t.x(), t.y(), t.weight()); t.x(), t.y(), t.weight());
} }
Oriented_side operator() ( const Weighted_point_2 & p, Oriented_side operator()(const Weighted_point_2& p,
const Weighted_point_2 & t) const const Weighted_point_2& t) const
{ {
//CGAL_kernel_precondition( p.point() == r.point() ); //CGAL_kernel_precondition( p.point() == r.point() );
Comparison_result r = CGAL::compare(p.weight(), t.weight()); Comparison_result r = CGAL::compare(p.weight(), t.weight());
@ -4168,7 +4192,7 @@ public:
else if (r == SMALLER) return ON_POSITIVE_SIDE; else if (r == SMALLER) return ON_POSITIVE_SIDE;
return ON_ORIENTED_BOUNDARY; return ON_ORIENTED_BOUNDARY;
} }
}; };
template <typename K> template <typename K>
class Oriented_side_2 class Oriented_side_2

View File

@ -418,12 +418,11 @@ scaled_distance_to_lineC2( const FT &px, const FT &py,
return determinant<FT>(px-rx, py-ry, qx-rx, qy-ry); return determinant<FT>(px-rx, py-ry, qx-rx, qy-ry);
} }
template < class RT > template < class RT >
void void
weighted_circumcenter_translateC2(const RT &dqx, const RT &dqy, const RT &dqw, weighted_circumcenter_translateC2(const RT &dqx, const RT &dqy, const RT &dqw,
const RT &drx, const RT &dry, const RT &drw, const RT &drx, const RT &dry, const RT &drw,
RT &dcx, RT &dcy) RT &dcx, RT &dcy)
{ {
// Given 3 points P, Q, R, this function takes as input: // Given 3 points P, Q, R, this function takes as input:
// qx-px, qy-py,qw-pw, rx-px, ry-py, rw-pw. And returns cx-px, cy-py, // qx-px, qy-py,qw-pw, rx-px, ry-py, rw-pw. And returns cx-px, cy-py,
@ -449,33 +448,76 @@ weighted_circumcenter_translateC2(const RT &dqx, const RT &dqy, const RT &dqw,
template < class RT, class We> template < class RT, class We>
void void
weighted_circumcenterC2( const RT &px, const RT &py, const We &pw, weighted_circumcenterC2( const RT &px, const RT &py, const We &pw,
const RT &qx, const RT &qy, const We &qw, const RT &qx, const RT &qy, const We &qw,
const RT &rx, const RT &ry, const We &rw, const RT &rx, const RT &ry, const We &rw,
RT &x, RT &y ) RT &x, RT &y )
{ {
RT dqw = RT(qw-pw); RT dqw = RT(qw-pw);
RT drw = RT(rw-pw); RT drw = RT(rw-pw);
weighted_circumcenter_translateC2(qx-px, qy-py, dqw,rx-px, ry-py,drw,x, y); weighted_circumcenter_translateC2(qx-px, qy-py, dqw,rx-px, ry-py,drw,x, y);
x += px; x += px;
y += py; y += py;
} }
template< class FT >
FT
power_productC2(const FT &px, const FT &py, const FT &pw,
const FT &qx, const FT &qy, const FT &qw)
{
// computes the power product of two weighted points
FT qpx = qx - px;
FT qpy = qy - py;
FT qp2 = CGAL_NTS square(qpx) + CGAL_NTS square(qpy);
return qp2 - pw - qw;
}
template < class RT , class We> template < class RT , class We>
void void
radical_axisC2(const RT &px, const RT &py, const We &pw, radical_axisC2(const RT &px, const RT &py, const We &pw,
const RT &qx, const RT &qy, const We &qw, const RT &qx, const RT &qy, const We &qw,
RT &a, RT &b, RT& c ) RT &a, RT &b, RT& c )
{ {
a = RT(2)*(px - qx); a = RT(2)*(px - qx);
b = RT(2)*(py - qy); b = RT(2)*(py - qy);
c = - CGAL_NTS square(px) - CGAL_NTS square(py) c = - CGAL_NTS square(px) - CGAL_NTS square(py)
+ CGAL_NTS square(qx) + CGAL_NTS square(qy) + CGAL_NTS square(qx) + CGAL_NTS square(qy)
+RT(pw) - RT(qw); + RT(pw) - RT(qw);
} }
template< class FT >
CGAL_KERNEL_MEDIUM_INLINE
FT
squared_radius_orthogonal_circleC2(const FT &px, const FT &py, const FT &pw,
const FT &qx, const FT &qy, const FT &qw,
const FT &rx, const FT &ry, const FT &rw)
{
FT FT4(4);
FT dpx = px - rx;
FT dpy = py - ry;
FT dqx = qx - rx;
FT dqy = qy - ry;
FT dpp = CGAL_NTS square(dpx) + CGAL_NTS square(dpy) - pw + rw;
FT dqq = CGAL_NTS square(dqx) + CGAL_NTS square(dqy) - qw + rw;
FT det0 = determinant(dpx, dpy, dqx, dqy);
FT det1 = determinant(dpp, dpy, dqq, dqy);
FT det2 = determinant(dpx, dpp, dqx, dqq);
return (CGAL_NTS square(det1) + CGAL_NTS square(det2)) /
(FT4 * CGAL_NTS square(det0)) - rw;
}
template< class FT >
CGAL_KERNEL_MEDIUM_INLINE
FT
squared_radius_smallest_orthogonal_circleC2(const FT &px, const FT &py, const FT &pw,
const FT &qx, const FT &qy, const FT &qw)
{
FT FT4(4);
FT dpz = CGAL_NTS square(px - qx) + CGAL_NTS square(py - qy);
return (CGAL_NTS square(dpz - pw + qw) / (FT4 * dpz) - qw);
}
} //namespace CGAL } //namespace CGAL

View File

@ -1,4 +1,4 @@
// Copyright (c) 2000 // Copyright (c) 2000
// Utrecht University (The Netherlands), // Utrecht University (The Netherlands),
// ETH Zurich (Switzerland), // ETH Zurich (Switzerland),
// INRIA Sophia-Antipolis (France), // INRIA Sophia-Antipolis (France),
@ -403,113 +403,109 @@ squared_areaC3(const FT &px, const FT &py, const FT &pz,
return (CGAL_NTS square(vx) + CGAL_NTS square(vy) + CGAL_NTS square(vz))/4; return (CGAL_NTS square(vx) + CGAL_NTS square(vy) + CGAL_NTS square(vz))/4;
} }
template <class FT> template <class FT>
void void
determinants_for_weighted_circumcenterC3( determinants_for_weighted_circumcenterC3(
const FT &px, const FT &py, const FT &pz, const FT &pw, const FT &px, const FT &py, const FT &pz, const FT &pw,
const FT &qx, const FT &qy, const FT &qz, const FT &qw, const FT &qx, const FT &qy, const FT &qz, const FT &qw,
const FT &rx, const FT &ry, const FT &rz, const FT &rw, const FT &rx, const FT &ry, const FT &rz, const FT &rw,
const FT &sx, const FT &sy, const FT &sz, const FT &sw, const FT &sx, const FT &sy, const FT &sz, const FT &sw,
FT &num_x, FT &num_y, FT &num_z, FT& den) FT &num_x, FT &num_y, FT &num_z, FT& den)
{ {
// translate origin to p // translate origin to p
// and compute determinants for weighted_circumcenter and // and compute determinants for weighted_circumcenter and
// circumradius // circumradius
FT qpx = qx-px; FT qpx = qx - px;
FT qpy = qy-py; FT qpy = qy - py;
FT qpz = qz-pz; FT qpz = qz - pz;
FT qp2 = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) + FT qp2 = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) +
CGAL_NTS square(qpz) - qw + pw; CGAL_NTS square(qpz) - qw + pw;
FT rpx = rx-px; FT rpx = rx - px;
FT rpy = ry-py; FT rpy = ry - py;
FT rpz = rz-pz; FT rpz = rz - pz;
FT rp2 = CGAL_NTS square(rpx) + CGAL_NTS square(rpy) + FT rp2 = CGAL_NTS square(rpx) + CGAL_NTS square(rpy) +
CGAL_NTS square(rpz) - rw + pw; CGAL_NTS square(rpz) - rw + pw;
FT spx = sx-px; FT spx = sx - px;
FT spy = sy-py; FT spy = sy - py;
FT spz = sz-pz; FT spz = sz - pz;
FT sp2 = CGAL_NTS square(spx) + CGAL_NTS square(spy) + FT sp2 = CGAL_NTS square(spx) + CGAL_NTS square(spy) +
CGAL_NTS square(spz) - sw + pw; CGAL_NTS square(spz) - sw + pw;
num_x = determinant(qpy,qpz,qp2, num_x = determinant(qpy,qpz,qp2,
rpy,rpz,rp2, rpy,rpz,rp2,
spy,spz,sp2); spy,spz,sp2);
num_y = determinant(qpx,qpz,qp2, num_y = determinant(qpx,qpz,qp2,
rpx,rpz,rp2, rpx,rpz,rp2,
spx,spz,sp2); spx,spz,sp2);
num_z = determinant(qpx,qpy,qp2, num_z = determinant(qpx,qpy,qp2,
rpx,rpy,rp2, rpx,rpy,rp2,
spx,spy,sp2); spx,spy,sp2);
den = determinant(qpx,qpy,qpz, den = determinant(qpx,qpy,qpz,
rpx,rpy,rpz, rpx,rpy,rpz,
spx,spy,spz); spx,spy,spz);
} }
template <class FT> template <class FT>
void void
determinants_for_circumcenterC3( determinants_for_circumcenterC3(const FT &px, const FT &py, const FT &pz,
const FT &px, const FT &py, const FT &pz, const FT &qx, const FT &qy, const FT &qz,
const FT &qx, const FT &qy, const FT &qz, const FT &rx, const FT &ry, const FT &rz,
const FT &rx, const FT &ry, const FT &rz, const FT &sx, const FT &sy, const FT &sz,
const FT &sx, const FT &sy, const FT &sz, FT &num_x, FT &num_y, FT &num_z, FT& den)
FT &num_x, FT &num_y, FT &num_z, FT& den)
{ {
// translate origin to p // translate origin to p
// and compute determinants for weighted_circumcenter and // and compute determinants for weighted_circumcenter and
// circumradius // circumradius
FT qpx = qx-px; FT qpx = qx - px;
FT qpy = qy-py; FT qpy = qy - py;
FT qpz = qz-pz; FT qpz = qz - pz;
FT qp2 = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) + FT qp2 = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) +
CGAL_NTS square(qpz); CGAL_NTS square(qpz);
FT rpx = rx-px; FT rpx = rx - px;
FT rpy = ry-py; FT rpy = ry - py;
FT rpz = rz-pz; FT rpz = rz - pz;
FT rp2 = CGAL_NTS square(rpx) + CGAL_NTS square(rpy) + FT rp2 = CGAL_NTS square(rpx) + CGAL_NTS square(rpy) +
CGAL_NTS square(rpz); CGAL_NTS square(rpz);
FT spx = sx-px; FT spx = sx - px;
FT spy = sy-py; FT spy = sy - py;
FT spz = sz-pz; FT spz = sz - pz;
FT sp2 = CGAL_NTS square(spx) + CGAL_NTS square(spy) + FT sp2 = CGAL_NTS square(spx) + CGAL_NTS square(spy) +
CGAL_NTS square(spz); CGAL_NTS square(spz);
num_x = determinant(qpy,qpz,qp2, num_x = determinant(qpy,qpz,qp2,
rpy,rpz,rp2, rpy,rpz,rp2,
spy,spz,sp2); spy,spz,sp2);
num_y = determinant(qpx,qpz,qp2, num_y = determinant(qpx,qpz,qp2,
rpx,rpz,rp2, rpx,rpz,rp2,
spx,spz,sp2); spx,spz,sp2);
num_z = determinant(qpx,qpy,qp2, num_z = determinant(qpx,qpy,qp2,
rpx,rpy,rp2, rpx,rpy,rp2,
spx,spy,sp2); spx,spy,sp2);
den = determinant(qpx,qpy,qpz, den = determinant(qpx,qpy,qpz,
rpx,rpy,rpz, rpx,rpy,rpz,
spx,spy,spz); spx,spy,spz);
} }
template < class FT> template < class FT>
void void
weighted_circumcenterC3( weighted_circumcenterC3(const FT &px, const FT &py, const FT &pz, const FT &pw,
const FT &px, const FT &py, const FT &pz, const FT &pw, const FT &qx, const FT &qy, const FT &qz, const FT &qw,
const FT &qx, const FT &qy, const FT &qz, const FT &qw, const FT &rx, const FT &ry, const FT &rz, const FT &rw,
const FT &rx, const FT &ry, const FT &rz, const FT &rw, const FT &sx, const FT &sy, const FT &sz, const FT &sw,
const FT &sx, const FT &sy, const FT &sz, const FT &sw, FT &x, FT &y, FT &z)
FT &x, FT &y, FT &z)
{ {
// this function compute the weighted circumcenter point only // this function computes the weighted circumcenter point only
// Translate p to origin and compute determinants // Translate p to origin and compute determinants
FT num_x, num_y, num_z, den; FT num_x, num_y, num_z, den;
determinants_for_weighted_circumcenterC3(px, py, pz, pw, determinants_for_weighted_circumcenterC3(px, py, pz, pw,
qx, qy, qz, qw, qx, qy, qz, qw,
rx, ry, rz, rw, rx, ry, rz, rw,
sx, sy, sz, sw, sx, sy, sz, sw,
num_x, num_y, num_z,den); num_x, num_y, num_z,den);
CGAL_assertion( ! CGAL_NTS is_zero(den) ); CGAL_assertion( ! CGAL_NTS is_zero(den) );
FT inv = FT(1)/(FT(2) * den); FT inv = FT(1)/(FT(2) * den);
x = px + num_x*inv; x = px + num_x*inv;
y = py - num_y*inv; y = py - num_y*inv;
@ -518,248 +514,231 @@ weighted_circumcenterC3(
template < class FT> template < class FT>
void void
weighted_circumcenterC3( weighted_circumcenterC3(const FT &px, const FT &py, const FT &pz, const FT &pw,
const FT &px, const FT &py, const FT &pz, const FT &pw, const FT &qx, const FT &qy, const FT &qz, const FT &qw,
const FT &qx, const FT &qy, const FT &qz, const FT &qw, const FT &rx, const FT &ry, const FT &rz, const FT &rw,
const FT &rx, const FT &ry, const FT &rz, const FT &rw, const FT &sx, const FT &sy, const FT &sz, const FT &sw,
const FT &sx, const FT &sy, const FT &sz, const FT &sw, FT &x, FT &y, FT &z, FT &w)
FT &x, FT &y, FT &z, FT &w)
{ {
// this function compute the weighted circumcenter point // this function computes the weighted circumcenter point
// and the squared weighted circumradius // and the squared weighted circumradius
// Translate p to origin and compute determinants // Translate p to origin and compute determinants
FT num_x, num_y, num_z, den; FT num_x, num_y, num_z, den;
determinants_for_weighted_circumcenterC3(px, py, pz, pw, determinants_for_weighted_circumcenterC3(px, py, pz, pw,
qx, qy, qz, qw, qx, qy, qz, qw,
rx, ry, rz, rw, rx, ry, rz, rw,
sx, sy, sz, sw, sx, sy, sz, sw,
num_x, num_y, num_z, den); num_x, num_y, num_z, den);
CGAL_assertion( ! CGAL_NTS is_zero(den) ); CGAL_assertion( ! CGAL_NTS is_zero(den) );
FT inv = FT(1)/(FT(2) * den); FT inv = FT(1)/(FT(2) * den);
x = px + num_x*inv; x = px + num_x*inv;
y = py - num_y*inv; y = py - num_y*inv;
z = pz + num_z*inv; z = pz + num_z*inv;
w = (CGAL_NTS square(num_x)+CGAL_NTS square(num_y)+CGAL_NTS square(num_z)) w = (CGAL_NTS square(num_x) + CGAL_NTS square(num_y) + CGAL_NTS square(num_z))
*CGAL_NTS square(inv) - pw; * CGAL_NTS square(inv) - pw;
} }
template< class FT > template< class FT >
FT FT
squared_radius_orthogonal_sphereC3( squared_radius_orthogonal_sphereC3(
const FT &px, const FT &py, const FT &pz, const FT &pw, const FT &px, const FT &py, const FT &pz, const FT &pw,
const FT &qx, const FT &qy, const FT &qz, const FT &qw, const FT &qx, const FT &qy, const FT &qz, const FT &qw,
const FT &rx, const FT &ry, const FT &rz, const FT &rw, const FT &rx, const FT &ry, const FT &rz, const FT &rw,
const FT &sx, const FT &sy, const FT &sz, const FT &sw) const FT &sx, const FT &sy, const FT &sz, const FT &sw)
{ {
// this function computes the squared weighted circumradius only
// this function compute the squared weighted circumradius only
// Translate p to origin and compute determinants // Translate p to origin and compute determinants
FT num_x, num_y, num_z, den; FT num_x, num_y, num_z, den;
determinants_for_weighted_circumcenterC3(px, py, pz, pw, determinants_for_weighted_circumcenterC3(px, py, pz, pw,
qx, qy, qz, qw, qx, qy, qz, qw,
rx, ry, rz, rw, rx, ry, rz, rw,
sx, sy, sz, sw, sx, sy, sz, sw,
num_x, num_y, num_z,den); num_x, num_y, num_z,den);
CGAL_assertion( ! CGAL_NTS is_zero(den) ); CGAL_assertion( ! CGAL_NTS is_zero(den) );
FT inv = FT(1)/(FT(2) * den); FT inv = FT(1)/(FT(2) * den);
return return (CGAL_NTS square(num_x) + CGAL_NTS square(num_y) + CGAL_NTS square(num_z))
(CGAL_NTS square(num_x)+CGAL_NTS square(num_y)+CGAL_NTS square(num_z)) * CGAL_NTS square(inv) - pw;
*CGAL_NTS square(inv) - pw;
} }
template <class FT> template <class FT>
void void
determinants_for_weighted_circumcenterC3( determinants_for_weighted_circumcenterC3(
const FT &px, const FT &py, const FT &pz, const FT &pw, const FT &px, const FT &py, const FT &pz, const FT &pw,
const FT &qx, const FT &qy, const FT &qz, const FT &qw, const FT &qx, const FT &qy, const FT &qz, const FT &qw,
const FT &rx, const FT &ry, const FT &rz, const FT &rw, const FT &rx, const FT &ry, const FT &rz, const FT &rw,
FT &num_x, FT &num_y, FT &num_z, FT &den) FT &num_x, FT &num_y, FT &num_z, FT &den)
{ {
// translate origin to p // translate origin to p and compute determinants for weighted_circumcenter
// and compute determinants for weighted_circumcenter and // and circumradius
// circumradius
// Translate s to origin to simplify the expression. // Translate s to origin to simplify the expression.
FT qpx = qx-px; FT qpx = qx - px;
FT qpy = qy-py; FT qpy = qy - py;
FT qpz = qz-pz; FT qpz = qz - pz;
FT qp2 = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) + FT qp2 = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) +
CGAL_NTS square(qpz) - qw + pw; CGAL_NTS square(qpz) - qw + pw;
FT rpx = rx-px; FT rpx = rx - px;
FT rpy = ry-py; FT rpy = ry - py;
FT rpz = rz-pz; FT rpz = rz - pz;
FT rp2 = CGAL_NTS square(rpx) + CGAL_NTS square(rpy) + FT rp2 = CGAL_NTS square(rpx) + CGAL_NTS square(rpy) +
CGAL_NTS square(rpz) - rw + pw; CGAL_NTS square(rpz) - rw + pw;
FT sx = qpy*rpz-qpz*rpy; FT sx = qpy*rpz - qpz*rpy;
FT sy = qpz*rpx-qpx*rpz; FT sy = qpz*rpx - qpx*rpz;
FT sz = qpx*rpy-qpy*rpx; FT sz = qpx*rpy - qpy*rpx;
// The following determinants can be developped and simplified. // The following determinants can be developped and simplified.
// //
// FT num_x = determinant(qpy,qpz,qp2, // FT num_x = determinant(qpy,qpz,qp2,
// rpy,rpz,rp2, // rpy,rpz,rp2,
// sy,sz,FT(0)); // sy,sz,FT(0));
// FT num_y = determinant(qpx,qpz,qp2, // FT num_y = determinant(qpx,qpz,qp2,
// rpx,rpz,rp2, // rpx,rpz,rp2,
// sx,sz,FT(0)); // sx,sz,FT(0));
// FT num_z = determinant(qpx,qpy,qp2, // FT num_z = determinant(qpx,qpy,qp2,
// rpx,rpy,rp2, // rpx,rpy,rp2,
// sx,sy,FT(0)); // sx,sy,FT(0));
num_x = qp2 * determinant(rpy,rpz,sy,sz) num_x = qp2 * determinant(rpy,rpz,sy,sz)
- rp2 * determinant(qpy,qpz,sy,sz); - rp2 * determinant(qpy,qpz,sy,sz);
num_y = qp2 * determinant(rpx,rpz,sx,sz) num_y = qp2 * determinant(rpx,rpz,sx,sz)
- rp2 * determinant(qpx,qpz,sx,sz); - rp2 * determinant(qpx,qpz,sx,sz);
num_z = qp2 * determinant(rpx,rpy,sx,sy) num_z = qp2 * determinant(rpx,rpy,sx,sy)
- rp2 * determinant(qpx,qpy,sx,sy); - rp2 * determinant(qpx,qpy,sx,sy);
den = determinant(qpx,qpy,qpz, den = determinant(qpx,qpy,qpz,
rpx,rpy,rpz, rpx,rpy,rpz,
sx,sy,sz); sx,sy,sz);
} }
template < class FT > template < class FT >
void void
weighted_circumcenterC3( weighted_circumcenterC3(const FT &px, const FT &py, const FT &pz, const FT &pw,
const FT &px, const FT &py, const FT &pz, const FT &pw, const FT &qx, const FT &qy, const FT &qz, const FT &qw,
const FT &qx, const FT &qy, const FT &qz, const FT &qw, const FT &rx, const FT &ry, const FT &rz, const FT &rw,
const FT &rx, const FT &ry, const FT &rz, const FT &rw, FT &x, FT &y, FT &z)
FT &x, FT &y, FT &z)
{ {
// this function compute the weighted circumcenter point only // this function computes the weighted circumcenter point only
// Translate p to origin and compute determinants // Translate p to origin and compute determinants
FT num_x, num_y, num_z, den; FT num_x, num_y, num_z, den;
determinants_for_weighted_circumcenterC3(px, py, pz, pw, determinants_for_weighted_circumcenterC3(px, py, pz, pw,
qx, qy, qz, qw, qx, qy, qz, qw,
rx, ry, rz, rw, rx, ry, rz, rw,
num_x, num_y, num_z, den); num_x, num_y, num_z, den);
CGAL_assertion( den != FT(0) ); CGAL_assertion( den != FT(0) );
FT inv = FT(1)/(FT(2) * den); FT inv = FT(1) / (FT(2) * den);
x = px + num_x*inv; x = px + num_x*inv;
y = py - num_y*inv; y = py - num_y*inv;
z = pz + num_z*inv; z = pz + num_z*inv;
} }
template < class FT > template < class FT >
void void
weighted_circumcenterC3( weighted_circumcenterC3(const FT &px, const FT &py, const FT &pz, const FT &pw,
const FT &px, const FT &py, const FT &pz, const FT &pw, const FT &qx, const FT &qy, const FT &qz, const FT &qw,
const FT &qx, const FT &qy, const FT &qz, const FT &qw, const FT &rx, const FT &ry, const FT &rz, const FT &rw,
const FT &rx, const FT &ry, const FT &rz, const FT &rw, FT &x, FT &y, FT &z, FT &w)
FT &x, FT &y, FT &z, FT &w)
{ {
// this function compute the weighted circumcenter and // this function computes the weighted circumcenter and
// the weighted squared circumradius // the weighted squared circumradius
// Translate p to origin and compute determinants // Translate p to origin and compute determinants
FT num_x, num_y, num_z, den; FT num_x, num_y, num_z, den;
determinants_for_weighted_circumcenterC3(px, py, pz, pw, determinants_for_weighted_circumcenterC3(px, py, pz, pw,
qx, qy, qz, qw, qx, qy, qz, qw,
rx, ry, rz, rw, rx, ry, rz, rw,
num_x, num_y, num_z, den); num_x, num_y, num_z, den);
CGAL_assertion( den != FT(0) ); CGAL_assertion( den != FT(0) );
FT inv = FT(1)/(FT(2) * den); FT inv = FT(1) / (FT(2) * den);
x = px + num_x*inv; x = px + num_x*inv;
y = py - num_y*inv; y = py - num_y*inv;
z = pz + num_z*inv; z = pz + num_z*inv;
w = (CGAL_NTS square(num_x)+CGAL_NTS square(num_y)+CGAL_NTS square(num_z)) w = (CGAL_NTS square(num_x) + CGAL_NTS square(num_y) + CGAL_NTS square(num_z))
*CGAL_NTS square(inv) - pw; *CGAL_NTS square(inv) - pw;
} }
template< class FT > template< class FT >
CGAL_MEDIUM_INLINE CGAL_MEDIUM_INLINE
FT FT
squared_radius_smallest_orthogonal_sphereC3( squared_radius_smallest_orthogonal_sphereC3(
const FT &px, const FT &py, const FT &pz, const FT &pw, const FT &px, const FT &py, const FT &pz, const FT &pw,
const FT &qx, const FT &qy, const FT &qz, const FT &qw, const FT &qx, const FT &qy, const FT &qz, const FT &qw,
const FT &rx, const FT &ry, const FT &rz, const FT &rw) const FT &rx, const FT &ry, const FT &rz, const FT &rw)
{ {
// this function compute the weighted squared circumradius only // this function computes the weighted squared circumradius only
// Translate p to origin and compute determinants // Translate p to origin and compute determinants
FT num_x, num_y, num_z, den; FT num_x, num_y, num_z, den;
determinants_for_weighted_circumcenterC3(px, py, pz, pw, determinants_for_weighted_circumcenterC3(px, py, pz, pw,
qx, qy, qz, qw, qx, qy, qz, qw,
rx, ry, rz, rw, rx, ry, rz, rw,
num_x, num_y, num_z, den); num_x, num_y, num_z, den);
CGAL_assertion( den != FT(0) ); CGAL_assertion( den != FT(0) );
FT inv = FT(1)/(FT(2) * den); FT inv = FT(1)/(FT(2) * den);
return return (CGAL_NTS square(num_x) + CGAL_NTS square(num_y) + CGAL_NTS square(num_z))
(CGAL_NTS square(num_x)+CGAL_NTS square(num_y)+CGAL_NTS square(num_z)) * CGAL_NTS square(inv) - pw;
*CGAL_NTS square(inv) - pw;
} }
template < class FT > template < class FT >
void void
weighted_circumcenterC3( weighted_circumcenterC3(const FT &px, const FT &py, const FT &pz, const FT &pw,
const FT &px, const FT &py, const FT &pz, const FT &pw, const FT &qx, const FT &qy, const FT &qz, const FT &qw,
const FT &qx, const FT &qy, const FT &qz, const FT &qw, FT &x, FT &y, FT &z)
FT &x, FT &y, FT &z)
{ {
// this function compute the weighted circumcenter point only // this function computes the weighted circumcenter point only
FT qpx = qx-px; FT qpx = qx - px;
FT qpy = qy-py; FT qpy = qy - py;
FT qpz = qz-pz; FT qpz = qz - pz;
FT qp2 = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) + FT qp2 = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) +
CGAL_NTS square(qpz); CGAL_NTS square(qpz);
FT inv = FT(1)/(FT(2)*qp2); FT inv = FT(1) / (FT(2) * qp2);
FT alpha = 1/FT(2) + (pw-qw)*inv; FT alpha = 1 / FT(2) + (pw-qw) * inv;
x = px + alpha * qpx; x = px + alpha * qpx;
y = py + alpha * qpy; y = py + alpha * qpy;
z = pz + alpha * qpz; z = pz + alpha * qpz;
} }
template < class FT > template < class FT >
void void
weighted_circumcenterC3( weighted_circumcenterC3(const FT &px, const FT &py, const FT &pz, const FT &pw,
const FT &px, const FT &py, const FT &pz, const FT &pw, const FT &qx, const FT &qy, const FT &qz, const FT &qw,
const FT &qx, const FT &qy, const FT &qz, const FT &qw, FT &x, FT &y, FT &z, FT &w)
FT &x, FT &y, FT &z, FT &w)
{ {
// this function compute the weighted circumcenter point and // this function computes the weighted circumcenter point and
// the weighted circumradius // the weighted circumradius
FT qpx = qx-px; FT qpx = qx - px;
FT qpy = qy-py; FT qpy = qy - py;
FT qpz = qz-pz; FT qpz = qz - pz;
FT qp2 = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) + FT qp2 = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) +
CGAL_NTS square(qpz); CGAL_NTS square(qpz);
FT inv = FT(1)/(FT(2)*qp2); FT inv = FT(1) / (FT(2) * qp2);
FT alpha = 1/FT(2) + (pw-qw)*inv; FT alpha = 1 / FT(2) + (pw-qw) * inv;
x = px + alpha * qpx; x = px + alpha * qpx;
y = py + alpha * qpy; y = py + alpha * qpy;
z = pz + alpha * qpz; z = pz + alpha * qpz;
w = CGAL_NTS square(alpha)*qp2 - pw; w = CGAL_NTS square(alpha) * qp2 - pw;
} }
template< class FT > template< class FT >
CGAL_MEDIUM_INLINE CGAL_MEDIUM_INLINE
FT FT
@ -767,30 +746,27 @@ squared_radius_smallest_orthogonal_sphereC3(
const FT &px, const FT &py, const FT &pz, const FT &pw, const FT &px, const FT &py, const FT &pz, const FT &pw,
const FT &qx, const FT &qy, const FT &qz, const FT &qw) const FT &qx, const FT &qy, const FT &qz, const FT &qw)
{ {
// this function computes // this function computes the weighted circumradius only
// the weighted circumradius only FT qpx = qx - px;
FT qpx = qx-px; FT qpy = qy - py;
FT qpy = qy-py; FT qpz = qz - pz;
FT qpz = qz-pz;
FT qp2 = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) + FT qp2 = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) +
CGAL_NTS square(qpz); CGAL_NTS square(qpz);
FT inv = FT(1)/(FT(2)*qp2); FT inv = FT(1) / (FT(2) * qp2);
FT alpha = 1/FT(2) + (pw-qw)*inv; FT alpha = 1 / FT(2) + (pw-qw) * inv;
return CGAL_NTS square(alpha)*qp2 - pw; return CGAL_NTS square(alpha)*qp2 - pw;
} }
template< class FT > template< class FT >
FT FT
power_productC3( power_productC3(const FT &px, const FT &py, const FT &pz, const FT &pw,
const FT &px, const FT &py, const FT &pz, const FT &pw, const FT &qx, const FT &qy, const FT &qz, const FT &qw)
const FT &qx, const FT &qy, const FT &qz, const FT &qw)
{ {
// computes the power product of two weighted points // computes the power product of two weighted points
FT qpx = qx-px; FT qpx = qx - px;
FT qpy = qy-py; FT qpy = qy - py;
FT qpz = qz-pz; FT qpz = qz - pz;
FT qp2 = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) + FT qp2 = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) +
CGAL_NTS square(qpz); CGAL_NTS square(qpz);
return qp2 - pw - qw ; return qp2 - pw - qw ;
@ -799,17 +775,17 @@ power_productC3(
template < class RT , class We> template < class RT , class We>
void void
radical_axisC3(const RT &px, const RT &py, const RT &pz, const We & /* pw */, radical_axisC3(const RT &px, const RT &py, const RT &pz, const We & /* pw */,
const RT &qx, const RT &qy, const RT &qz, const We & /* qw */, const RT &qx, const RT &qy, const RT &qz, const We & /* qw */,
const RT &rx, const RT &ry, const RT &rz, const We & /* rw */, const RT &rx, const RT &ry, const RT &rz, const We & /* rw */,
RT &a, RT &b, RT& c ) RT &a, RT &b, RT& c )
{ {
RT dqx=qx-px, dqy=qy-py, dqz=qz-pz, drx=rx-px, dry=ry-py, drz=rz-pz; RT dqx=qx-px, dqy=qy-py, dqz=qz-pz, drx=rx-px, dry=ry-py, drz=rz-pz;
//il manque des tests... //il manque des tests...
a= RT(1)*determinant(dqy, dqz, dry, drz); a = RT(1)*determinant(dqy, dqz, dry, drz);
b= - RT(1)*determinant(dqx, dqz, drx, drz); b = - RT(1)*determinant(dqx, dqz, drx, drz);
c= RT(1)*determinant(dqx, dqy, drx, dry); c = RT(1)*determinant(dqx, dqy, drx, dry);
} }
// function used in critical_squared_radiusC3 // function used in critical_squared_radiusC3
@ -817,77 +793,69 @@ radical_axisC3(const RT &px, const RT &py, const RT &pz, const We & /* pw */,
// circle orthogonal (p,pw), (q,qw), (r,rw), (s,sw) // circle orthogonal (p,pw), (q,qw), (r,rw), (s,sw)
template < class FT> template < class FT>
FT FT
power_to_orthogonal_sphereC3( power_to_orthogonal_sphereC3(const FT &px, const FT &py, const FT &pz, const FT &pw,
const FT &px, const FT &py, const FT &pz, const FT &pw, const FT &qx, const FT &qy, const FT &qz, const FT &qw,
const FT &qx, const FT &qy, const FT &qz, const FT &qw, const FT &rx, const FT &ry, const FT &rz, const FT &rw,
const FT &rx, const FT &ry, const FT &rz, const FT &rw, const FT &sx, const FT &sy, const FT &sz, const FT &sw,
const FT &sx, const FT &sy, const FT &sz, const FT &sw, const FT &tx, const FT &ty, const FT &tz, const FT &tw)
const FT &tx, const FT &ty, const FT &tz, const FT &tw)
{ {
//to get the value of the determinant //to get the value of the determinant
// We translate the points so that t becomes the origin. // We translate the points so that t becomes the origin.
FT dpx = px - tx; FT dpx = px - tx;
FT dpy = py - ty; FT dpy = py - ty;
FT dpz = pz - tz; FT dpz = pz - tz;
FT dpt = CGAL_NTS square(dpx) + CGAL_NTS square(dpy) + FT dpt = CGAL_NTS square(dpx) + CGAL_NTS square(dpy) +
CGAL_NTS square(dpz) - pw + tw ; CGAL_NTS square(dpz) - pw + tw ;
FT dqx = qx - tx; FT dqx = qx - tx;
FT dqy = qy - ty; FT dqy = qy - ty;
FT dqz = qz - tz; FT dqz = qz - tz;
FT dqt = CGAL_NTS square(dqx) + CGAL_NTS square(dqy) + FT dqt = CGAL_NTS square(dqx) + CGAL_NTS square(dqy) +
CGAL_NTS square(dqz) - qw + tw; CGAL_NTS square(dqz) - qw + tw;
FT drx = rx - tx; FT drx = rx - tx;
FT dry = ry - ty; FT dry = ry - ty;
FT drz = rz - tz; FT drz = rz - tz;
FT drt = CGAL_NTS square(drx) + CGAL_NTS square(dry) + FT drt = CGAL_NTS square(drx) + CGAL_NTS square(dry) +
CGAL_NTS square(drz) - rw + tw; CGAL_NTS square(drz) - rw + tw;
FT dsx = sx - tx; FT dsx = sx - tx;
FT dsy = sy - ty; FT dsy = sy - ty;
FT dsz = sz - tz; FT dsz = sz - tz;
FT dst = CGAL_NTS square(dsx) + CGAL_NTS square(dsy) + FT dst = CGAL_NTS square(dsx) + CGAL_NTS square(dsy) +
CGAL_NTS square(dsz) - sw + tw; CGAL_NTS square(dsz) - sw + tw;
return determinant(dpx, dpy, dpz, dpt,
dqx, dqy, dqz, dqt,
drx, dry, drz, drt,
dsx, dsy, dsz, dst);
return determinant(dpx, dpy, dpz, dpt,
dqx, dqy, dqz, dqt,
drx, dry, drz, drt,
dsx, dsy, dsz, dst);
} }
// compute the critical weight tw // compute the critical weight tw
// where weighted point t is orthogonal to weighted points p, q,r,s // where weighted point t is orthogonal to weighted points p, q,r,s
template < class FT> template < class FT>
FT FT
power_distance_to_power_sphereC3( power_distance_to_power_sphereC3(const FT &px, const FT &py, const FT &pz, const FT &pw,
const FT &px, const FT &py, const FT &pz, const FT &pw, const FT &qx, const FT &qy, const FT &qz, const FT &qw,
const FT &qx, const FT &qy, const FT &qz, const FT &qw, const FT &rx, const FT &ry, const FT &rz, const FT &rw,
const FT &rx, const FT &ry, const FT &rz, const FT &rw, const FT &sx, const FT &sy, const FT &sz, const FT &sw,
const FT &sx, const FT &sy, const FT &sz, const FT &sw, const FT &tx, const FT &ty, const FT &tz, const FT & )
const FT &tx, const FT &ty, const FT &tz, const FT & )
{ {
// the 5x5 det is a linear function of tw ff(tw)= ff(0) + tw ff(1) // the 5x5 det is a linear function of tw ff(tw)= ff(0) + tw ff(1)
// the critical value for tw is - ff(0)/( ff(1) - ff(0)) // the critical value for tw is - ff(0)/( ff(1) - ff(0))
FT ff0 = power_to_orthogonal_sphereC3(px, py, pz, pw,
qx, qy, qz, qw,
rx, ry, rz, rw,
sx, sy, sz, sw,
tx, ty, tz, FT(0));
FT ff0 = power_to_orthogonal_sphereC3(px, py, pz, pw, FT ff1 = power_to_orthogonal_sphereC3(px, py, pz, pw,
qx, qy, qz, qw, qx, qy, qz, qw,
rx, ry, rz, rw, rx, ry, rz, rw,
sx, sy, sz, sw, sx, sy, sz, sw,
tx, ty, tz, FT(0)); tx, ty, tz, FT(1));
FT ff1 = power_to_orthogonal_sphereC3(px, py, pz, pw, return -ff0/(ff1 - ff0);
qx, qy, qz, qw,
rx, ry, rz, rw,
sx, sy, sz, sw,
tx, ty, tz, FT(1));
return -ff0/(ff1 - ff0);
} }
// I will use this to test if the radial axis of three spheres // I will use this to test if the radial axis of three spheres
// intersect the triangle formed by the centers. // intersect the triangle formed by the centers.
// // resolution of the system (where we note c the center) // // resolution of the system (where we note c the center)
@ -913,9 +881,7 @@ power_distance_to_power_sphereC3(
// FT Mu = (dqq*dp-dpp*dpdq)/denom; // FT Mu = (dqq*dp-dpp*dpdq)/denom;
// return (CGAL_NTS square(Lambda)*dp+CGAL_NTS square(Mu)*dq // return (CGAL_NTS square(Lambda)*dp+CGAL_NTS square(Mu)*dq
// +FT2*Lambda*Mu*dpdq - rw); // + FT2*Lambda*Mu*dpdq - rw);
} //namespace CGAL } //namespace CGAL

View File

@ -635,12 +635,11 @@ side_of_oriented_lineC2(const FT &a, const FT &b, const FT &c,
return CGAL_NTS sign(a*x+b*y+c); return CGAL_NTS sign(a*x+b*y+c);
} }
template <class FT> template <class FT>
Comparison_result Comparison_result
compare_power_distanceC2(const FT& px, const FT& py, const FT& pwt, compare_power_distanceC2(const FT& px, const FT& py, const FT& pwt,
const FT& qx, const FT& qy, const FT& qwt, const FT& qx, const FT& qy, const FT& qwt,
const FT& rx, const FT& ry) const FT& rx, const FT& ry)
{ {
// returns SMALLER if r is closer to p w.r.t. the power metric // returns SMALLER if r is closer to p w.r.t. the power metric
FT d1 = CGAL_NTS square(rx - px) + CGAL_NTS square(ry - py) - pwt; FT d1 = CGAL_NTS square(rx - px) + CGAL_NTS square(ry - py) - pwt;
@ -648,58 +647,73 @@ compare_power_distanceC2(const FT& px, const FT& py, const FT& pwt,
return CGAL_NTS compare(d1, d2); return CGAL_NTS compare(d1, d2);
} }
template <class FT>
CGAL_KERNEL_MEDIUM_INLINE
Bounded_side
power_side_of_bounded_power_circleC2(const FT &px, const FT &py, const FT &pw,
const FT &qx, const FT &qy, const FT &qw,
const FT &tx, const FT &ty, const FT &tw)
{
FT dpx = px - qx;
FT dpy = py - qy;
FT dtx = tx - qx;
FT dty = ty - qy;
FT dpz = CGAL_NTS square(dpx) + CGAL_NTS square(dpy);
return enum_cast<Bounded_side>
(CGAL_NTS sign(-(CGAL_NTS square(dtx) + CGAL_NTS square(dty)-tw+qw)*dpz
+(dpz-pw+qw)*(dpx*dtx+dpy*dty)));
}
template <class FT> template <class FT>
Oriented_side Oriented_side
power_side_of_oriented_power_circleC2( const FT &px, const FT &py, const FT &pwt, power_side_of_oriented_power_circleC2(const FT &px, const FT &py, const FT &pwt,
const FT &qx, const FT &qy, const FT &qwt, const FT &qx, const FT &qy, const FT &qwt,
const FT &rx, const FT &ry, const FT &rwt, const FT &rx, const FT &ry, const FT &rwt,
const FT &tx, const FT &ty, const FT &twt) const FT &tx, const FT &ty, const FT &twt)
{ {
// Note: maybe this can be further optimized like the usual in_circle() ? // Note: maybe this can be further optimized like the usual in_circle() ?
// We translate the 4 points so that T becomes the origin. // We translate the 4 points so that T becomes the origin.
FT dpx = px - tx; FT dpx = px - tx;
FT dpy = py - ty; FT dpy = py - ty;
FT dpz = CGAL_NTS square(dpx) + CGAL_NTS square(dpy) - pwt + twt; FT dpz = CGAL_NTS square(dpx) + CGAL_NTS square(dpy) - pwt + twt;
FT dqx = qx - tx; FT dqx = qx - tx;
FT dqy = qy - ty; FT dqy = qy - ty;
FT dqz = CGAL_NTS square(dqx) + CGAL_NTS square(dqy) - qwt + twt; FT dqz = CGAL_NTS square(dqx) + CGAL_NTS square(dqy) - qwt + twt;
FT drx = rx - tx; FT drx = rx - tx;
FT dry = ry - ty; FT dry = ry - ty;
FT drz = CGAL_NTS square(drx) + CGAL_NTS square(dry) - rwt + twt; FT drz = CGAL_NTS square(drx) + CGAL_NTS square(dry) - rwt + twt;
return sign_of_determinant(dpx, dpy, dpz, return sign_of_determinant(dpx, dpy, dpz,
dqx, dqy, dqz, dqx, dqy, dqz,
drx, dry, drz); drx, dry, drz);
} }
template <class FT> template <class FT>
Oriented_side Oriented_side
power_side_of_oriented_power_circleC2( const FT &px, const FT &py, const FT &pwt, power_side_of_oriented_power_circleC2(const FT &px, const FT &py, const FT &pwt,
const FT &qx, const FT &qy, const FT &qwt, const FT &qx, const FT &qy, const FT &qwt,
const FT &tx, const FT &ty, const FT &twt) const FT &tx, const FT &ty, const FT &twt)
{ {
// Same translation as above. // Same translation as above.
FT dpx = px - tx; FT dpx = px - tx;
FT dpy = py - ty; FT dpy = py - ty;
FT dpz = CGAL_NTS square(dpx) + CGAL_NTS square(dpy) - pwt + twt; FT dpz = CGAL_NTS square(dpx) + CGAL_NTS square(dpy) - pwt + twt;
FT dqx = qx - tx; FT dqx = qx - tx;
FT dqy = qy - ty; FT dqy = qy - ty;
FT dqz = CGAL_NTS square(dqx) + CGAL_NTS square(dqy) - qwt + twt; FT dqz = CGAL_NTS square(dqx) + CGAL_NTS square(dqy) - qwt + twt;
// We do an orthogonal projection on the (x) axis, if possible. // We do an orthogonal projection on the (x) axis, if possible.
Comparison_result cmpx = CGAL_NTS compare(px, qx); Comparison_result cmpx = CGAL_NTS compare(px, qx);
if (cmpx != EQUAL) if (cmpx != EQUAL)
return cmpx * sign_of_determinant(dpx, dpz, dqx, dqz); return cmpx * sign_of_determinant(dpx, dpz, dqx, dqz);
// If not possible, then on the (y) axis. // If not possible, then on the (y) axis.
Comparison_result cmpy = CGAL_NTS compare(py, qy); Comparison_result cmpy = CGAL_NTS compare(py, qy);
return cmpy * sign_of_determinant(dpy, dpz, dqy, dqz); return cmpy * sign_of_determinant(dpy, dpz, dqy, dqz);
} }
} //namespace CGAL } //namespace CGAL
#endif // CGAL_PREDICATES_KERNEL_FTC2_H #endif // CGAL_PREDICATES_KERNEL_FTC2_H

View File

@ -561,98 +561,99 @@ has_smaller_signed_dist_to_planeC3(
template <class FT> template <class FT>
CGAL_KERNEL_MEDIUM_INLINE CGAL_KERNEL_MEDIUM_INLINE
typename Same_uncertainty_nt<Oriented_side, FT>::type typename Same_uncertainty_nt<Oriented_side, FT>::type
power_side_of_oriented_power_sphereC3( const FT &px, const FT &py, const FT &pz, const FT &pwt, power_side_of_oriented_power_sphereC3(
const FT &qx, const FT &qy, const FT &qz, const FT &qwt, const FT &px, const FT &py, const FT &pz, const FT &pwt,
const FT &rx, const FT &ry, const FT &rz, const FT &rwt, const FT &qx, const FT &qy, const FT &qz, const FT &qwt,
const FT &sx, const FT &sy, const FT &sz, const FT &swt, const FT &rx, const FT &ry, const FT &rz, const FT &rwt,
const FT &tx, const FT &ty, const FT &tz, const FT &twt) const FT &sx, const FT &sy, const FT &sz, const FT &swt,
const FT &tx, const FT &ty, const FT &tz, const FT &twt)
{ {
// We translate the points so that T becomes the origin. // We translate the points so that T becomes the origin.
FT dpx = px - tx; FT dpx = px - tx;
FT dpy = py - ty; FT dpy = py - ty;
FT dpz = pz - tz; FT dpz = pz - tz;
FT dpt = CGAL_NTS square(dpx) + CGAL_NTS square(dpy) + FT dpt = CGAL_NTS square(dpx) + CGAL_NTS square(dpy) +
CGAL_NTS square(dpz) + (twt - pwt); CGAL_NTS square(dpz) + (twt - pwt);
FT dqx = qx - tx; FT dqx = qx - tx;
FT dqy = qy - ty; FT dqy = qy - ty;
FT dqz = qz - tz; FT dqz = qz - tz;
FT dqt = CGAL_NTS square(dqx) + CGAL_NTS square(dqy) + FT dqt = CGAL_NTS square(dqx) + CGAL_NTS square(dqy) +
CGAL_NTS square(dqz) + (twt - qwt); CGAL_NTS square(dqz) + (twt - qwt);
FT drx = rx - tx; FT drx = rx - tx;
FT dry = ry - ty; FT dry = ry - ty;
FT drz = rz - tz; FT drz = rz - tz;
FT drt = CGAL_NTS square(drx) + CGAL_NTS square(dry) + FT drt = CGAL_NTS square(drx) + CGAL_NTS square(dry) +
CGAL_NTS square(drz) + (twt - rwt); CGAL_NTS square(drz) + (twt - rwt);
FT dsx = sx - tx; FT dsx = sx - tx;
FT dsy = sy - ty; FT dsy = sy - ty;
FT dsz = sz - tz; FT dsz = sz - tz;
FT dst = CGAL_NTS square(dsx) + CGAL_NTS square(dsy) + FT dst = CGAL_NTS square(dsx) + CGAL_NTS square(dsy) +
CGAL_NTS square(dsz) + (twt - swt); CGAL_NTS square(dsz) + (twt - swt);
return - sign_of_determinant(dpx, dpy, dpz, dpt, return - sign_of_determinant(dpx, dpy, dpz, dpt,
dqx, dqy, dqz, dqt, dqx, dqy, dqz, dqt,
drx, dry, drz, drt, drx, dry, drz, drt,
dsx, dsy, dsz, dst); dsx, dsy, dsz, dst);
} }
template <class FT> template <class FT>
CGAL_KERNEL_MEDIUM_INLINE CGAL_KERNEL_MEDIUM_INLINE
typename Same_uncertainty_nt<Oriented_side, FT>::type typename Same_uncertainty_nt<Oriented_side, FT>::type
power_side_of_oriented_power_sphereC3(const FT &px, const FT &py, const FT &pz, const FT &pwt, power_side_of_oriented_power_sphereC3(
const FT &qx, const FT &qy, const FT &qz, const FT &qwt, const FT &px, const FT &py, const FT &pz, const FT &pwt,
const FT &rx, const FT &ry, const FT &rz, const FT &rwt, const FT &qx, const FT &qy, const FT &qz, const FT &qwt,
const FT &tx, const FT &ty, const FT &tz, const FT &twt) const FT &rx, const FT &ry, const FT &rz, const FT &rwt,
const FT &tx, const FT &ty, const FT &tz, const FT &twt)
{ {
// Same translation as above. // Same translation as above.
FT dpx = px - tx; FT dpx = px - tx;
FT dpy = py - ty; FT dpy = py - ty;
FT dpz = pz - tz; FT dpz = pz - tz;
FT dpt = CGAL_NTS square(dpx) + CGAL_NTS square(dpy) + FT dpt = CGAL_NTS square(dpx) + CGAL_NTS square(dpy) +
CGAL_NTS square(dpz) + (twt - pwt); CGAL_NTS square(dpz) + (twt - pwt);
FT dqx = qx - tx; FT dqx = qx - tx;
FT dqy = qy - ty; FT dqy = qy - ty;
FT dqz = qz - tz; FT dqz = qz - tz;
FT dqt = CGAL_NTS square(dqx) + CGAL_NTS square(dqy) + FT dqt = CGAL_NTS square(dqx) + CGAL_NTS square(dqy) +
CGAL_NTS square(dqz) + (twt - qwt); CGAL_NTS square(dqz) + (twt - qwt);
FT drx = rx - tx; FT drx = rx - tx;
FT dry = ry - ty; FT dry = ry - ty;
FT drz = rz - tz; FT drz = rz - tz;
FT drt = CGAL_NTS square(drx) + CGAL_NTS square(dry) + FT drt = CGAL_NTS square(drx) + CGAL_NTS square(dry) +
CGAL_NTS square(drz) + (twt - rwt); CGAL_NTS square(drz) + (twt - rwt);
Sign cmp; Sign cmp;
// Projection on the (xy) plane. // Projection on the (xy) plane.
cmp = sign_of_determinant(dpx, dpy, dpt, cmp = sign_of_determinant(dpx, dpy, dpt,
dqx, dqy, dqt, dqx, dqy, dqt,
drx, dry, drt); drx, dry, drt);
if (cmp != ZERO) if (cmp != ZERO)
return cmp * sign_of_determinant(px-rx, py-ry, return cmp * sign_of_determinant(px-rx, py-ry,
qx-rx, qy-ry); qx-rx, qy-ry);
// Projection on the (xz) plane. // Projection on the (xz) plane.
cmp = sign_of_determinant(dpx, dpz, dpt, cmp = sign_of_determinant(dpx, dpz, dpt,
dqx, dqz, dqt, dqx, dqz, dqt,
drx, drz, drt); drx, drz, drt);
if (cmp != ZERO) if (cmp != ZERO)
return cmp * sign_of_determinant(px-rx, pz-rz, return cmp * sign_of_determinant(px-rx, pz-rz,
qx-rx, qz-rz); qx-rx, qz-rz);
// Projection on the (yz) plane. // Projection on the (yz) plane.
cmp = sign_of_determinant(dpy, dpz, dpt, cmp = sign_of_determinant(dpy, dpz, dpt,
dqy, dqz, dqt, dqy, dqz, dqt,
dry, drz, drt); dry, drz, drt);
return cmp * sign_of_determinant(py-ry, pz-rz, return cmp * sign_of_determinant(py-ry, pz-rz,
qy-ry, qz-rz); qy-ry, qz-rz);
} }
template <class FT> template <class FT>
CGAL_KERNEL_MEDIUM_INLINE CGAL_KERNEL_MEDIUM_INLINE
typename Same_uncertainty_nt<Oriented_side, FT>::type typename Same_uncertainty_nt<Oriented_side, FT>::type
power_side_of_oriented_power_sphereC3(const FT &px, const FT &py, const FT &pz, const FT &pwt, power_side_of_oriented_power_sphereC3(
const FT &qx, const FT &qy, const FT &qz, const FT &qwt, const FT &px, const FT &py, const FT &pz, const FT &pwt,
const FT &tx, const FT &ty, const FT &tz, const FT &twt) const FT &qx, const FT &qy, const FT &qz, const FT &qwt,
const FT &tx, const FT &ty, const FT &tz, const FT &twt)
{ {
// Same translation as above. // Same translation as above.
FT dpx = px - tx; FT dpx = px - tx;
@ -687,28 +688,25 @@ CGAL_KERNEL_MEDIUM_INLINE
typename Same_uncertainty_nt<Oriented_side, FT>::type typename Same_uncertainty_nt<Oriented_side, FT>::type
power_side_of_oriented_power_sphereC3(const FT &pwt, const FT &qwt) power_side_of_oriented_power_sphereC3(const FT &pwt, const FT &qwt)
{ {
return CGAL_NTS compare(qwt, pwt); return CGAL_NTS compare(qwt, pwt);
} }
template < class FT > template < class FT >
Comparison_result Comparison_result
compare_power_distanceC3( compare_power_distanceC3(const FT &px, const FT &py, const FT &pz,
const FT &px, const FT &py, const FT &pz, const FT &qx, const FT &qy, const FT &qz, const FT &qw,
const FT &qx, const FT &qy, const FT &qz, const FT &qw, const FT &rx, const FT &ry, const FT &rz, const FT &rw)
const FT &rx, const FT &ry, const FT &rz, const FT &rw)
{ {
FT dqx = qx - px; FT dqx = qx - px;
FT dqy = qy - py; FT dqy = qy - py;
FT dqz = qz - pz; FT dqz = qz - pz;
FT drx = rx - px; FT drx = rx - px;
FT dry = ry - py; FT dry = ry - py;
FT drz = rz - pz; FT drz = rz - pz;
return CGAL_NTS compare(dqx*dqx + dqy*dqy + dqz*dqz - qw, return CGAL_NTS compare(dqx*dqx + dqy*dqy + dqz*dqz - qw,
drx*drx + dry*dry + drz*drz - rw); drx*drx + dry*dry + drz*drz - rw);
} }
//return the sign of the power test of weighted point (sx,sy,sz,sw) //return the sign of the power test of weighted point (sx,sy,sz,sw)
//with respect to the smallest sphere orthogonal to //with respect to the smallest sphere orthogonal to
//p,q,r //p,q,r
@ -716,12 +714,12 @@ template< class FT >
CGAL_KERNEL_MEDIUM_INLINE CGAL_KERNEL_MEDIUM_INLINE
typename Same_uncertainty_nt<Bounded_side, FT>::type typename Same_uncertainty_nt<Bounded_side, FT>::type
power_side_of_bounded_power_sphereC3( power_side_of_bounded_power_sphereC3(
const FT &px, const FT &py, const FT &pz, const FT &pw, const FT &px, const FT &py, const FT &pz, const FT &pw,
const FT &qx, const FT &qy, const FT &qz, const FT &qw, const FT &qx, const FT &qy, const FT &qz, const FT &qw,
const FT &rx, const FT &ry, const FT &rz, const FT &rw, const FT &rx, const FT &ry, const FT &rz, const FT &rw,
const FT &sx, const FT &sy, const FT &sz, const FT &sw) const FT &sx, const FT &sy, const FT &sz, const FT &sw)
{ {
// Translate p to origin and compute determinants // Translate p to origin and compute determinants
FT qpx = qx-px; FT qpx = qx-px;
FT qpy = qy-py; FT qpy = qy-py;
FT qpz = qz-pz; FT qpz = qz-pz;
@ -738,11 +736,11 @@ power_side_of_bounded_power_sphereC3(
FT rpw = rr - rw + pw ; FT rpw = rr - rw + pw ;
FT den = determinant(qq,qr, FT den = determinant(qq,qr,
qr,rr); qr,rr);
FT detq = determinant(qpw,qr, FT detq = determinant(qpw,qr,
rpw,rr); rpw,rr);
FT detr = determinant(qq,qpw, FT detr = determinant(qq,qpw,
qr,rpw); qr,rpw);
// Smallest smallest orthogonal sphere center // Smallest smallest orthogonal sphere center
// c = detq/2*den q + detr/2*den r (origin at p) // c = detq/2*den q + detr/2*den r (origin at p)
@ -751,26 +749,25 @@ power_side_of_bounded_power_sphereC3(
FT spx = sx-px; FT spx = sx-px;
FT spy = sy-py; FT spy = sy-py;
FT spz = sz-pz; FT spz = sz-pz;
FT ss = CGAL_NTS square(spx) + CGAL_NTS square(spy) + CGAL_NTS square(spz); FT ss = CGAL_NTS square(spx) + CGAL_NTS square(spy) + CGAL_NTS square(spz);
FT sq = spx*qpx + spy*qpy + spz*qpz; FT sq = spx*qpx + spy*qpy + spz*qpz;
FT sr = spx*rpx + spy*rpy + spz*rpz; FT sr = spx*rpx + spy*rpy + spz*rpz;
CGAL_assertion( ! CGAL_NTS is_zero(den) ); CGAL_assertion( ! CGAL_NTS is_zero(den) );
// return - sign of (c- s)^2 - (c^2 - pw) - sw note that den >= 0 - // return - sign of (c- s)^2 - (c^2 - pw) - sw note that den >= 0 -
return enum_cast<Bounded_side>( return enum_cast<Bounded_side>(
- CGAL_NTS sign( den*(ss - sw + pw)- detq*sq - detr*sr)); - CGAL_NTS sign( den*(ss - sw + pw)- detq*sq - detr*sr));
} }
// return the sign of the power test of weighted point (rx,ry,rz,rw) // return the sign of the power test of weighted point (rx,ry,rz,rw)
// with respect to the smallest sphere orthogoanal to // with respect to the smallest sphere orthogoanal to
// p,q // p,q
template< class FT > template< class FT >
typename Same_uncertainty_nt<Bounded_side, FT>::type typename Same_uncertainty_nt<Bounded_side, FT>::type
power_side_of_bounded_power_sphereC3( power_side_of_bounded_power_sphereC3(
const FT &px, const FT &py, const FT &pz, const FT &pw, const FT &px, const FT &py, const FT &pz, const FT &pw,
const FT &qx, const FT &qy, const FT &qz, const FT &qw, const FT &qx, const FT &qy, const FT &qz, const FT &qw,
const FT &rx, const FT &ry, const FT &rz, const FT &rw) const FT &rx, const FT &ry, const FT &rz, const FT &rw)
{ {
FT FT2(2); FT FT2(2);
FT FT4(4); FT FT4(4);
@ -789,9 +786,6 @@ power_side_of_bounded_power_sphereC3(
- CGAL_NTS sign (dr2 - dp2/FT4 + dpr*dpw/dp2 - drw )); - CGAL_NTS sign (dr2 - dp2/FT4 + dpr*dpw/dp2 - drw ));
} }
} // namespace CGAL
} //namespace CGAL
#endif // CGAL_PREDICATES_KERNEL_FTC3_H #endif // CGAL_PREDICATES_KERNEL_FTC3_H

View File

@ -832,7 +832,7 @@ void _test_intersection_Line_arc_Circular_arc(CK ck)
do{ do{
p_random4 = Point_2(theRandom.get_int(random_min, random_max), p_random4 = Point_2(theRandom.get_int(random_min, random_max),
theRandom.get_int(random_min, random_max)); theRandom.get_int(random_min, random_max));
}while(p_random4 == center_circle_random1); } while (p_random4 == center_circle_random1 || (p_random3 == p_random4));
std::vector< CGAL::Object > std::vector< CGAL::Object >
vector_for_intersection_random3; vector_for_intersection_random3;

View File

@ -1,6 +1,9 @@
project (Circular_kernel_3_Demo) project (Circular_kernel_3_Demo)
cmake_minimum_required(VERSION 2.8.11) cmake_minimum_required(VERSION 2.8.11)
if(POLICY CMP0053)
cmake_policy(SET CMP0053 OLD)
endif()
if(POLICY CMP0043) if(POLICY CMP0043)
cmake_policy(SET CMP0043 OLD) cmake_policy(SET CMP0043 OLD)
endif() endif()

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