mirror of https://github.com/CGAL/cgal
Merge branch 'master' into CGAL_data-gdamiand
This commit is contained in:
commit
751fb3851d
|
|
@ -92,7 +92,7 @@ jobs:
|
||||||
egrep -v " ${PR_NUMBER}\." index.html > tmp.html || true
|
egrep -v " ${PR_NUMBER}\." index.html > tmp.html || true
|
||||||
echo "<li><a href=https://cgal.github.io/${PR_NUMBER}/$ROUND/Manual/index.html>Manual for PR ${PR_NUMBER} ($ROUND).</a></li>" >> ./tmp.html
|
echo "<li><a href=https://cgal.github.io/${PR_NUMBER}/$ROUND/Manual/index.html>Manual for PR ${PR_NUMBER} ($ROUND).</a></li>" >> ./tmp.html
|
||||||
mv tmp.html index.html
|
mv tmp.html index.html
|
||||||
git add ${PR_NUMBER}/$ROUND && git commit -q --amend -m "base commit" && git push -q -f -u origin master
|
git add ${PR_NUMBER}/$ROUND index.html && git commit -q --amend -m "base commit" && git push -q -f -u origin master
|
||||||
else
|
else
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
|
||||||
79
.travis.yml
79
.travis.yml
|
|
@ -1,79 +0,0 @@
|
||||||
language: cpp
|
|
||||||
dist: bionic
|
|
||||||
sudo: required
|
|
||||||
git:
|
|
||||||
depth: 3
|
|
||||||
env:
|
|
||||||
matrix:
|
|
||||||
- PACKAGE='CHECK'
|
|
||||||
- PACKAGE='AABB_tree Advancing_front_surface_reconstruction Algebraic_foundations '
|
|
||||||
- PACKAGE='Algebraic_kernel_d Algebraic_kernel_for_circles Algebraic_kernel_for_spheres '
|
|
||||||
- PACKAGE='Alpha_shapes_2 Alpha_shapes_3 Apollonius_graph_2 '
|
|
||||||
- PACKAGE='Arithmetic_kernel Arrangement_on_surface_2 BGL '
|
|
||||||
- PACKAGE='Barycentric_coordinates_2 Boolean_set_operations_2 Bounding_volumes '
|
|
||||||
- PACKAGE='Box_intersection_d CGAL_Core CGAL_ImageIO '
|
|
||||||
- PACKAGE='CGAL_ipelets Cartesian_kernel Circular_kernel_2 '
|
|
||||||
- PACKAGE='Circular_kernel_3 Circulator Classification '
|
|
||||||
- PACKAGE='Combinatorial_map Cone_spanners_2 Convex_decomposition_3 '
|
|
||||||
- PACKAGE='Convex_hull_2 Convex_hull_3 Convex_hull_d '
|
|
||||||
- PACKAGE='Distance_2 Distance_3 Envelope_2 '
|
|
||||||
- PACKAGE='Envelope_3 Filtered_kernel Generalized_map '
|
|
||||||
- PACKAGE='Generator Geomview GraphicsView '
|
|
||||||
- PACKAGE='HalfedgeDS Hash_map Heat_method_3 '
|
|
||||||
- PACKAGE='Homogeneous_kernel Hyperbolic_triangulation_2 Inscribed_areas '
|
|
||||||
- PACKAGE='Installation Interpolation Intersections_2 '
|
|
||||||
- PACKAGE='Intersections_3 Interval_skip_list Interval_support '
|
|
||||||
- PACKAGE='Jet_fitting_3 Kernel_23 Kernel_d '
|
|
||||||
- PACKAGE='LEDA Linear_cell_complex MacOSX '
|
|
||||||
- PACKAGE='Maintenance Matrix_search Mesh_2 '
|
|
||||||
- PACKAGE='Mesh_3 Mesher_level Minkowski_sum_2 '
|
|
||||||
- PACKAGE='Minkowski_sum_3 Modifier Modular_arithmetic '
|
|
||||||
- PACKAGE='Nef_2 Nef_3 Nef_S2 '
|
|
||||||
- PACKAGE='NewKernel_d Number_types OpenNL '
|
|
||||||
- PACKAGE='Optimal_bounding_box Optimal_transportation_reconstruction_2 Optimisation_basic '
|
|
||||||
- PACKAGE='Partition_2 Periodic_2_triangulation_2 Periodic_3_mesh_3 '
|
|
||||||
- PACKAGE='Periodic_3_triangulation_3 Periodic_4_hyperbolic_triangulation_2 Point_set_2 '
|
|
||||||
- PACKAGE='Point_set_3 Point_set_processing_3 Poisson_surface_reconstruction_3 '
|
|
||||||
- PACKAGE='Polygon Polygon_mesh_processing Polygonal_surface_reconstruction '
|
|
||||||
- PACKAGE='Polyhedron Polyline_simplification_2 Polynomial '
|
|
||||||
- PACKAGE='Polytope_distance_d Principal_component_analysis Principal_component_analysis_LGPL '
|
|
||||||
- PACKAGE='Profiling_tools Property_map QP_solver '
|
|
||||||
- PACKAGE='Random_numbers Ridges_3 STL_Extension '
|
|
||||||
- PACKAGE='Scale_space_reconstruction_3 Scripts SearchStructures '
|
|
||||||
- PACKAGE='Segment_Delaunay_graph_2 Segment_Delaunay_graph_Linf_2 Set_movable_separability_2 '
|
|
||||||
- PACKAGE='Shape_detection Skin_surface_3 Snap_rounding_2 '
|
|
||||||
- PACKAGE='Solver_interface Spatial_searching Spatial_sorting '
|
|
||||||
- PACKAGE='Straight_skeleton_2 Stream_lines_2 Stream_support '
|
|
||||||
- PACKAGE='Subdivision_method_3 Surface_mesh Surface_mesh_approximation '
|
|
||||||
- PACKAGE='Surface_mesh_deformation Surface_mesh_parameterization Surface_mesh_segmentation '
|
|
||||||
- PACKAGE='Surface_mesh_shortest_path Surface_mesh_simplification Surface_mesh_skeletonization '
|
|
||||||
- PACKAGE='Surface_mesh_topology Surface_mesher Surface_sweep_2 '
|
|
||||||
- PACKAGE='TDS_2 TDS_3 Testsuite '
|
|
||||||
- PACKAGE='Tetrahedral_remeshing Three Triangulation '
|
|
||||||
- PACKAGE='Triangulation_2 Triangulation_3 Union_find '
|
|
||||||
- PACKAGE='Visibility_2 Voronoi_diagram_2 wininst '
|
|
||||||
compiler: clang
|
|
||||||
install:
|
|
||||||
- echo "$PWD"
|
|
||||||
- if [ -n "$TRAVIS_PULL_REQUEST_BRANCH" ] && [ "$PACKAGE" != CHECK ]; then DO_IGNORE=FALSE; for ARG in $(echo "$PACKAGE");do if [ "$ARG" = "Maintenance" ]; then continue; fi; . $PWD/.travis/test_package.sh "$PWD" "$ARG"; echo "DO_IGNORE is $DO_IGNORE"; if [ "$DO_IGNORE" = "FALSE" ]; then break; fi; done; if [ "$DO_IGNORE" = "TRUE" ]; then travis_terminate 0; fi;fi
|
|
||||||
- /usr/bin/time -f 'Spend time of %C -- %E (real)' bash .travis/install.sh
|
|
||||||
- export CXX=clang++-10 CC=clang-10;
|
|
||||||
before_script:
|
|
||||||
- wget -O doxygen_exe https://cgal.geometryfactory.com/~mgimeno/doxygen_exe
|
|
||||||
- sudo mv doxygen_exe /usr/bin/doxygen
|
|
||||||
- sudo chmod +x /usr/bin/doxygen
|
|
||||||
- mkdir -p build
|
|
||||||
- cd build
|
|
||||||
- /usr/bin/time -f 'Spend time of %C -- %E (real)' cmake -DCMAKE_CXX_FLAGS="-std=c++1y" -DCGAL_HEADER_ONLY=ON -DCMAKE_CXX_FLAGS_RELEASE=-DCGAL_NDEBUG -DWITH_examples=ON -DWITH_demos=ON -DWITH_tests=ON ..
|
|
||||||
- /usr/bin/time -f 'Spend time of %C -- %E (real)' make
|
|
||||||
- /usr/bin/time -f 'Spend time of %C -- %E (real)' sudo make install &>/dev/null
|
|
||||||
- cd ..
|
|
||||||
script:
|
|
||||||
- cd ./.travis
|
|
||||||
- /usr/bin/time -f 'Spend time of %C -- %E (real)' bash ./build_package.sh $PACKAGE
|
|
||||||
notifications:
|
|
||||||
email:
|
|
||||||
on_success: change
|
|
||||||
# default: always
|
|
||||||
on_failure: always
|
|
||||||
# default: always
|
|
||||||
|
|
@ -1,144 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
[ -n "$CGAL_DEBUG_TRAVIS" ] && set -x
|
|
||||||
|
|
||||||
CXX_FLAGS="-DCGAL_NDEBUG -ftemplate-backtrace-limit=0"
|
|
||||||
|
|
||||||
function mytime {
|
|
||||||
/usr/bin/time -f "Spend time of %C: %E (real)" "$@"
|
|
||||||
}
|
|
||||||
old_IFS=$IFS
|
|
||||||
IFS=$' '
|
|
||||||
ROOT="$PWD/.."
|
|
||||||
for ARG in $(echo "$@")
|
|
||||||
do
|
|
||||||
#skip package maintenance
|
|
||||||
if [ "$ARG" = "Maintenance" ]; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
cd $ROOT
|
|
||||||
|
|
||||||
#install openmesh only if necessary
|
|
||||||
if [ "$ARG" = "CHECK" ] || [ "$ARG" = BGL ] || [ "$ARG" = Convex_hull_3 ] ||\
|
|
||||||
[ "$ARG" = Polygon_mesh_processing ] || [ "$ARG" = Property_map ] ||\
|
|
||||||
[ "$ARG" = Surface_mesh_deformation ] || [ "$ARG" = Surface_mesh_shortest_path ] ||\
|
|
||||||
[ "$ARG" = Surface_mesh_simplification ]; then
|
|
||||||
mytime sudo bash .travis/install_openmesh.sh
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [ "$ARG" = "CHECK" ]
|
|
||||||
then
|
|
||||||
cd .travis
|
|
||||||
mytime ./generate_travis.sh --check
|
|
||||||
cd ..
|
|
||||||
IFS=$old_IFS
|
|
||||||
mytime zsh $ROOT/Scripts/developer_scripts/test_merge_of_branch HEAD
|
|
||||||
#test dependencies
|
|
||||||
cd $ROOT
|
|
||||||
mytime bash Scripts/developer_scripts/cgal_check_dependencies.sh --check_headers /usr/bin/doxygen
|
|
||||||
|
|
||||||
cd .travis
|
|
||||||
#parse current matrix and check that no package has been forgotten
|
|
||||||
|
|
||||||
IFS=$'\n'
|
|
||||||
COPY=0
|
|
||||||
MATRIX=()
|
|
||||||
for LINE in $(cat "$PWD/packages.txt")
|
|
||||||
do
|
|
||||||
MATRIX+="$LINE "
|
|
||||||
done
|
|
||||||
|
|
||||||
PACKAGES=()
|
|
||||||
cd ..
|
|
||||||
for f in *
|
|
||||||
do
|
|
||||||
if [ -d "$f/package_info/$f" ]
|
|
||||||
then
|
|
||||||
PACKAGES+="$f "
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
DIFFERENCE=$(echo ${MATRIX[@]} ${PACKAGES[@]} | tr ' ' '\n' | sort | uniq -u)
|
|
||||||
IFS=$' '
|
|
||||||
if [ "${DIFFERENCE[0]}" != "" ]
|
|
||||||
then
|
|
||||||
echo "The matrix and the actual package list differ : ."
|
|
||||||
echo ${DIFFERENCE[*]}
|
|
||||||
echo "You should run generate_travis.sh."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "Matrix is up to date."
|
|
||||||
#check if non standard cgal installation works
|
|
||||||
cd $ROOT
|
|
||||||
mkdir build_test
|
|
||||||
cd build_test
|
|
||||||
mytime cmake -DCMAKE_INSTALL_PREFIX=install/ -DCGAL_BUILD_THREE_DOC=TRUE ..
|
|
||||||
mytime make install
|
|
||||||
# test install with minimal downstream example
|
|
||||||
mkdir installtest
|
|
||||||
cd installtest
|
|
||||||
touch main.cpp
|
|
||||||
mkdir build
|
|
||||||
echo 'project(Example)' >> CMakeLists.txt
|
|
||||||
echo 'set(PROJECT_SRCS ${PROJECT_SOURCE_DIR}/main.cpp)' >> CMakeLists.txt
|
|
||||||
echo 'find_package(CGAL REQUIRED)' >> CMakeLists.txt
|
|
||||||
echo 'add_executable(${PROJECT_NAME} ${PROJECT_SRCS})' >> CMakeLists.txt
|
|
||||||
echo 'target_link_libraries(${PROJECT_NAME} CGAL::CGAL)' >> CMakeLists.txt
|
|
||||||
echo '#include "CGAL/remove_outliers.h"' >> main.cpp
|
|
||||||
cd build
|
|
||||||
mytime cmake -DCMAKE_INSTALL_PREFIX=../../install -DCGAL_BUILD_THREE_DOC=TRUE ..
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$ARG" = "Installation" ]
|
|
||||||
then
|
|
||||||
mkdir build_dir
|
|
||||||
cd build_dir
|
|
||||||
cmake -DWITH_tests=ON -DBUILD_TESTING=ON ..
|
|
||||||
ctest -j2 -L CGAL_cmake_testsuite --output-on-failure
|
|
||||||
cd ..
|
|
||||||
rm -rf ./build_dir
|
|
||||||
#==-- configure all CGAL with -DWITH_examples=ON -DWITH_demos=ON -DWITH_tests=ON, and then launch CTest on a few labels. --==
|
|
||||||
mkdir config_dir
|
|
||||||
cd config_dir
|
|
||||||
cmake -DWITH_examples=ON -DWITH_demos=ON -DWITH_tests=ON -DBUILD_TESTING=ON ..
|
|
||||||
ctest -j2 -L AABB_tree --output-on-failure
|
|
||||||
cd ..
|
|
||||||
rm -rf ./config_dir
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
IFS=$old_IFS
|
|
||||||
|
|
||||||
if [ -n "$TRAVIS_PULL_REQUEST_BRANCH" ]; then
|
|
||||||
DO_IGNORE=FALSE
|
|
||||||
. $ROOT/.travis/test_package.sh "$ROOT" "$ARG"
|
|
||||||
echo "DO_IGNORE is $DO_IGNORE"
|
|
||||||
if [ "$DO_IGNORE" = "TRUE" ]; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
IFS=$' '
|
|
||||||
mkdir -p build-travis
|
|
||||||
cd build-travis
|
|
||||||
WITHDEMOS=ON
|
|
||||||
if [ "$ARG" = "Polyhedron" ]; then
|
|
||||||
WITHDEMOS=OFF
|
|
||||||
fi
|
|
||||||
EXTRA_CXX_FLAGS=
|
|
||||||
case "$CC" in
|
|
||||||
clang*)
|
|
||||||
EXTRA_CXX_FLAGS="-Werror=inconsistent-missing-override"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
|
|
||||||
mytime cmake -DCMAKE_CXX_FLAGS="${CXX_FLAGS} ${EXTRA_CXX_FLAGS}" -DCGAL_DONT_OVERRIDE_CMAKE_FLAGS:BOOL=ON -DBUILD_TESTING=ON -DWITH_tests=ON -DWITH_examples=ON -DWITH_demos=$WITHDEMOS ..
|
|
||||||
mytime ctest -j2 -L $ARG'([_][A-Z]|$)' -E execution___of__ --output-on-failure
|
|
||||||
done
|
|
||||||
IFS=$old_IFS
|
|
||||||
# Local Variables:
|
|
||||||
# tab-width: 2
|
|
||||||
# sh-basic-offset: 2
|
|
||||||
# End:
|
|
||||||
|
|
@ -1,94 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
CHECK=
|
|
||||||
case $1 in
|
|
||||||
--check) CHECK=y;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
set -e
|
|
||||||
cd ../
|
|
||||||
|
|
||||||
if [ -f "$PWD/.travis/packages.txt" ]
|
|
||||||
then
|
|
||||||
rm "$PWD/.travis/packages.txt"
|
|
||||||
fi
|
|
||||||
|
|
||||||
#find all the packages
|
|
||||||
PACKAGES=()
|
|
||||||
INDEX=0
|
|
||||||
i=0
|
|
||||||
for f in *
|
|
||||||
do
|
|
||||||
if [ -d "$f/package_info/$f" ]
|
|
||||||
then
|
|
||||||
echo "$f" >> ./tmp.txt
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
LC_ALL=C sort ./tmp.txt > ./.travis/packages.txt
|
|
||||||
rm ./tmp.txt
|
|
||||||
while read p; do
|
|
||||||
PACKAGES[$INDEX]+="$p "
|
|
||||||
i=$[i+1]
|
|
||||||
if [ $i = 3 ]
|
|
||||||
then
|
|
||||||
i=0
|
|
||||||
INDEX=$[INDEX+1]
|
|
||||||
fi
|
|
||||||
done <./.travis/packages.txt
|
|
||||||
if [ -f ".travis.yml" ]
|
|
||||||
then
|
|
||||||
#copy the current .travis.yml for later check
|
|
||||||
mv ./.travis.yml ./.travis.old
|
|
||||||
fi
|
|
||||||
#writes the first part of the file
|
|
||||||
old_IFS=$IFS
|
|
||||||
IFS=$'\n'
|
|
||||||
for LINE in $(cat "$PWD/.travis/template.txt")
|
|
||||||
do
|
|
||||||
if [ "$LINE" != " matrix:" ]
|
|
||||||
then
|
|
||||||
echo "$LINE" >> .travis.yml
|
|
||||||
else
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
echo " matrix:" >> .travis.yml
|
|
||||||
#writes the matrix
|
|
||||||
echo " - PACKAGE='CHECK'" >> .travis.yml
|
|
||||||
for package in ${PACKAGES[@]}
|
|
||||||
do
|
|
||||||
echo " - PACKAGE='$package'" >> .travis.yml
|
|
||||||
done
|
|
||||||
|
|
||||||
#writes the end of the file
|
|
||||||
COPY=0
|
|
||||||
for LINE in $(cat "$PWD/.travis/template.txt")
|
|
||||||
do
|
|
||||||
if [ "$LINE" = "compiler: clang" ]
|
|
||||||
then
|
|
||||||
COPY=1
|
|
||||||
fi
|
|
||||||
if [ $COPY = 1 ]
|
|
||||||
then
|
|
||||||
echo "$LINE" >> .travis.yml
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
IFS=$' '
|
|
||||||
#check if there are differences between the files
|
|
||||||
if ! cmp -s ./.travis.yml ./.travis.old;
|
|
||||||
then
|
|
||||||
echo ".travis.yml has changed : "
|
|
||||||
diff ./.travis.yml ./.travis.old
|
|
||||||
if [ -n "$CHECK" ]; then
|
|
||||||
echo "You should modify the file .travis/template.txt"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
#erase old travis
|
|
||||||
rm ./.travis.old
|
|
||||||
IFS=$old_IFS
|
|
||||||
|
|
||||||
# Local Variables:
|
|
||||||
# tab-width: 2
|
|
||||||
# sh-basic-offset: 2
|
|
||||||
# End:
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
[ -n "$CGAL_DEBUG_TRAVIS" ] && set -x
|
|
||||||
DONE=0
|
|
||||||
sudo add-apt-repository ppa:mikhailnov/pulseeffects -y
|
|
||||||
sudo apt-get update
|
|
||||||
|
|
||||||
while [ $DONE = 0 ]
|
|
||||||
do
|
|
||||||
DONE=1 && sudo -E apt-get -yq --no-install-suggests --no-install-recommends --force-yes install clang-10 zsh \
|
|
||||||
flex bison cmake graphviz libgmp-dev libmpfr-dev libmpfi-dev zlib1g-dev libeigen3-dev \
|
|
||||||
qtbase5-dev libqt5sql5-sqlite libqt5opengl5-dev qtscript5-dev libqt5svg5-dev qttools5-dev qttools5-dev-tools qml-module-qtgraphicaleffects libopencv-dev mesa-common-dev libmetis-dev libglu1-mesa-dev \
|
|
||||||
libboost1.72-dev || DONE=0 && sudo apt-get update
|
|
||||||
done
|
|
||||||
exit 0
|
|
||||||
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
mkdir -p openmesh
|
|
||||||
cd openmesh
|
|
||||||
wget -O openmesh.tar.gz https://www.openmesh.org/media/Releases/6.3/OpenMesh-6.3.tar.gz
|
|
||||||
tar xf openmesh.tar.gz --strip-components=1
|
|
||||||
sed -i '94i #include <sys/time.h>' src/OpenMesh/Tools/Utils/conio.cc
|
|
||||||
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
cmake -DBUILD_APPS=FALSE ..
|
|
||||||
make -j2
|
|
||||||
sudo make -j2 install &>/dev/null
|
|
||||||
|
|
||||||
#clean up
|
|
||||||
cd ../..
|
|
||||||
rm -rf ./openmesh
|
|
||||||
|
|
@ -1,138 +0,0 @@
|
||||||
AABB_tree
|
|
||||||
Advancing_front_surface_reconstruction
|
|
||||||
Algebraic_foundations
|
|
||||||
Algebraic_kernel_d
|
|
||||||
Algebraic_kernel_for_circles
|
|
||||||
Algebraic_kernel_for_spheres
|
|
||||||
Alpha_shapes_2
|
|
||||||
Alpha_shapes_3
|
|
||||||
Apollonius_graph_2
|
|
||||||
Arithmetic_kernel
|
|
||||||
Arrangement_on_surface_2
|
|
||||||
BGL
|
|
||||||
Barycentric_coordinates_2
|
|
||||||
Boolean_set_operations_2
|
|
||||||
Bounding_volumes
|
|
||||||
Box_intersection_d
|
|
||||||
CGAL_Core
|
|
||||||
CGAL_ImageIO
|
|
||||||
CGAL_ipelets
|
|
||||||
Cartesian_kernel
|
|
||||||
Circular_kernel_2
|
|
||||||
Circular_kernel_3
|
|
||||||
Circulator
|
|
||||||
Classification
|
|
||||||
Combinatorial_map
|
|
||||||
Cone_spanners_2
|
|
||||||
Convex_decomposition_3
|
|
||||||
Convex_hull_2
|
|
||||||
Convex_hull_3
|
|
||||||
Convex_hull_d
|
|
||||||
Distance_2
|
|
||||||
Distance_3
|
|
||||||
Envelope_2
|
|
||||||
Envelope_3
|
|
||||||
Filtered_kernel
|
|
||||||
Generalized_map
|
|
||||||
Generator
|
|
||||||
Geomview
|
|
||||||
GraphicsView
|
|
||||||
HalfedgeDS
|
|
||||||
Hash_map
|
|
||||||
Heat_method_3
|
|
||||||
Homogeneous_kernel
|
|
||||||
Hyperbolic_triangulation_2
|
|
||||||
Inscribed_areas
|
|
||||||
Installation
|
|
||||||
Interpolation
|
|
||||||
Intersections_2
|
|
||||||
Intersections_3
|
|
||||||
Interval_skip_list
|
|
||||||
Interval_support
|
|
||||||
Jet_fitting_3
|
|
||||||
Kernel_23
|
|
||||||
Kernel_d
|
|
||||||
LEDA
|
|
||||||
Linear_cell_complex
|
|
||||||
MacOSX
|
|
||||||
Maintenance
|
|
||||||
Matrix_search
|
|
||||||
Mesh_2
|
|
||||||
Mesh_3
|
|
||||||
Mesher_level
|
|
||||||
Minkowski_sum_2
|
|
||||||
Minkowski_sum_3
|
|
||||||
Modifier
|
|
||||||
Modular_arithmetic
|
|
||||||
Nef_2
|
|
||||||
Nef_3
|
|
||||||
Nef_S2
|
|
||||||
NewKernel_d
|
|
||||||
Number_types
|
|
||||||
OpenNL
|
|
||||||
Optimal_bounding_box
|
|
||||||
Optimal_transportation_reconstruction_2
|
|
||||||
Optimisation_basic
|
|
||||||
Partition_2
|
|
||||||
Periodic_2_triangulation_2
|
|
||||||
Periodic_3_mesh_3
|
|
||||||
Periodic_3_triangulation_3
|
|
||||||
Periodic_4_hyperbolic_triangulation_2
|
|
||||||
Point_set_2
|
|
||||||
Point_set_3
|
|
||||||
Point_set_processing_3
|
|
||||||
Poisson_surface_reconstruction_3
|
|
||||||
Polygon
|
|
||||||
Polygon_mesh_processing
|
|
||||||
Polygonal_surface_reconstruction
|
|
||||||
Polyhedron
|
|
||||||
Polyline_simplification_2
|
|
||||||
Polynomial
|
|
||||||
Polytope_distance_d
|
|
||||||
Principal_component_analysis
|
|
||||||
Principal_component_analysis_LGPL
|
|
||||||
Profiling_tools
|
|
||||||
Property_map
|
|
||||||
QP_solver
|
|
||||||
Random_numbers
|
|
||||||
Ridges_3
|
|
||||||
STL_Extension
|
|
||||||
Scale_space_reconstruction_3
|
|
||||||
Scripts
|
|
||||||
SearchStructures
|
|
||||||
Segment_Delaunay_graph_2
|
|
||||||
Segment_Delaunay_graph_Linf_2
|
|
||||||
Set_movable_separability_2
|
|
||||||
Shape_detection
|
|
||||||
Skin_surface_3
|
|
||||||
Snap_rounding_2
|
|
||||||
Solver_interface
|
|
||||||
Spatial_searching
|
|
||||||
Spatial_sorting
|
|
||||||
Straight_skeleton_2
|
|
||||||
Stream_lines_2
|
|
||||||
Stream_support
|
|
||||||
Subdivision_method_3
|
|
||||||
Surface_mesh
|
|
||||||
Surface_mesh_approximation
|
|
||||||
Surface_mesh_deformation
|
|
||||||
Surface_mesh_parameterization
|
|
||||||
Surface_mesh_segmentation
|
|
||||||
Surface_mesh_shortest_path
|
|
||||||
Surface_mesh_simplification
|
|
||||||
Surface_mesh_skeletonization
|
|
||||||
Surface_mesh_topology
|
|
||||||
Surface_mesher
|
|
||||||
Surface_sweep_2
|
|
||||||
TDS_2
|
|
||||||
TDS_3
|
|
||||||
Testsuite
|
|
||||||
Tetrahedral_remeshing
|
|
||||||
Three
|
|
||||||
Triangulation
|
|
||||||
Triangulation_2
|
|
||||||
Triangulation_3
|
|
||||||
Union_find
|
|
||||||
Visibility_2
|
|
||||||
Voronoi_diagram_2
|
|
||||||
wininst
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
language: cpp
|
|
||||||
dist: bionic
|
|
||||||
sudo: required
|
|
||||||
git:
|
|
||||||
depth: 3
|
|
||||||
env:
|
|
||||||
matrix:
|
|
||||||
PACKAGES_MATRIX
|
|
||||||
|
|
||||||
compiler: clang
|
|
||||||
install:
|
|
||||||
- echo "$PWD"
|
|
||||||
- if [ -n "$TRAVIS_PULL_REQUEST_BRANCH" ] && [ "$PACKAGE" != CHECK ]; then DO_IGNORE=FALSE; for ARG in $(echo "$PACKAGE");do if [ "$ARG" = "Maintenance" ]; then continue; fi; . $PWD/.travis/test_package.sh "$PWD" "$ARG"; echo "DO_IGNORE is $DO_IGNORE"; if [ "$DO_IGNORE" = "FALSE" ]; then break; fi; done; if [ "$DO_IGNORE" = "TRUE" ]; then travis_terminate 0; fi;fi
|
|
||||||
- /usr/bin/time -f 'Spend time of %C -- %E (real)' bash .travis/install.sh
|
|
||||||
- export CXX=clang++-10 CC=clang-10;
|
|
||||||
before_script:
|
|
||||||
- wget -O doxygen_exe https://cgal.geometryfactory.com/~mgimeno/doxygen_exe
|
|
||||||
- sudo mv doxygen_exe /usr/bin/doxygen
|
|
||||||
- sudo chmod +x /usr/bin/doxygen
|
|
||||||
- mkdir -p build
|
|
||||||
- cd build
|
|
||||||
- /usr/bin/time -f 'Spend time of %C -- %E (real)' cmake -DCMAKE_CXX_FLAGS="-std=c++1y" -DCGAL_HEADER_ONLY=ON -DCMAKE_CXX_FLAGS_RELEASE=-DCGAL_NDEBUG -DWITH_examples=ON -DWITH_demos=ON -DWITH_tests=ON ..
|
|
||||||
- /usr/bin/time -f 'Spend time of %C -- %E (real)' make
|
|
||||||
- /usr/bin/time -f 'Spend time of %C -- %E (real)' sudo make install &>/dev/null
|
|
||||||
- cd ..
|
|
||||||
script:
|
|
||||||
- cd ./.travis
|
|
||||||
- /usr/bin/time -f 'Spend time of %C -- %E (real)' bash ./build_package.sh $PACKAGE
|
|
||||||
notifications:
|
|
||||||
email:
|
|
||||||
on_success: change
|
|
||||||
# default: always
|
|
||||||
on_failure: always
|
|
||||||
# default: always
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
#Will cd $1 and test package named $2
|
|
||||||
#to find out if it or one of its dependencies has changed in the current branch
|
|
||||||
|
|
||||||
DO_IGNORE=FALSE
|
|
||||||
cd $1
|
|
||||||
|
|
||||||
if [ ! -d "$2" ]; then
|
|
||||||
echo "$2 : MISSING PACKAGE. Ignoring."
|
|
||||||
DO_IGNORE=TRUE
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [ ! -f "$2/package_info/$2/dependencies" ];then
|
|
||||||
echo "No dependencies found for $2"
|
|
||||||
bash Scripts/developer_scripts/cgal_check_dependencies.sh --check_headers /usr/bin/doxygen
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
LIST_OF_FILES=$(git diff --name-only origin/master... |cut -d/ -f1 |uniq |sort)
|
|
||||||
LIST_OF_DEPS=$(cat "$2/package_info/$2/dependencies")
|
|
||||||
echo "$LIST_OF_DEPS"
|
|
||||||
for flie in $LIST_OF_DEPS
|
|
||||||
do
|
|
||||||
[[ $LIST_OF_FILES =~ (^|[[:space:]])$flie($|[[:space:]]) ]] && return
|
|
||||||
done
|
|
||||||
echo "Package ignored because none of its dependencies has been modified."
|
|
||||||
DO_IGNORE=TRUE
|
|
||||||
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
||||||
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
|
|
||||||
#define max(a,b) (((a) > (b)) ? (a) : (b))
|
|
||||||
|
|
||||||
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
|
|
||||||
#define min(a,b) (((a) < (b)) ? (a) : (b))
|
|
||||||
|
|
||||||
|
|
||||||
#define FAR #error named reserved in windows.h
|
|
||||||
#define far #error named reserved in windows.h
|
|
||||||
|
|
||||||
#define Polyline #error named reserved in windows.h
|
|
||||||
#define Polygon #error named reserved in windows.h
|
|
||||||
|
|
@ -19,18 +19,16 @@
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <CGAL/Qt/resources.h>
|
#include <CGAL/Qt/resources.h>
|
||||||
#include <QMimeData>
|
#include <QMimeData>
|
||||||
|
#include <CGAL/Qt/init_ogl_context.h>
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
CGAL::Qt::init_ogl_context(4,3);
|
||||||
QApplication app(argc, argv);
|
QApplication app(argc, argv);
|
||||||
app.setOrganizationDomain("inria.fr");
|
app.setOrganizationDomain("inria.fr");
|
||||||
app.setOrganizationName("INRIA");
|
app.setOrganizationName("INRIA");
|
||||||
app.setApplicationName("AABB tree demo");
|
app.setApplicationName("AABB tree demo");
|
||||||
//for windows
|
|
||||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0))
|
|
||||||
app.setAttribute(Qt::AA_UseDesktopOpenGL);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Import resources from libCGALQt (Qt5).
|
// Import resources from libCGALQt (Qt5).
|
||||||
CGAL_QT_INIT_RESOURCES;
|
CGAL_QT_INIT_RESOURCES;
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ include_directories(BEFORE ./ ./include)
|
||||||
find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5)
|
find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5)
|
||||||
|
|
||||||
# Find Qt5 itself
|
# Find Qt5 itself
|
||||||
find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Gui Svg)
|
find_package(Qt5 QUIET COMPONENTS Script OpenGL Gui Svg)
|
||||||
|
|
||||||
if(CGAL_Qt5_FOUND AND Qt5_FOUND)
|
if(CGAL_Qt5_FOUND AND Qt5_FOUND)
|
||||||
|
|
||||||
|
|
@ -54,7 +54,7 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND)
|
||||||
#${CGAL_Qt5_MOC_FILES}
|
#${CGAL_Qt5_MOC_FILES}
|
||||||
)
|
)
|
||||||
# Link with Qt libraries
|
# Link with Qt libraries
|
||||||
target_link_libraries(AABB_demo PRIVATE Qt5::OpenGL Qt5::Gui Qt5::Xml
|
target_link_libraries(AABB_demo PRIVATE Qt5::OpenGL Qt5::Gui
|
||||||
CGAL::CGAL CGAL::CGAL_Qt5)
|
CGAL::CGAL CGAL::CGAL_Qt5)
|
||||||
|
|
||||||
add_to_cached_list(CGAL_EXECUTABLE_TARGETS AABB_demo)
|
add_to_cached_list(CGAL_EXECUTABLE_TARGETS AABB_demo)
|
||||||
|
|
|
||||||
|
|
@ -22,8 +22,6 @@ MainWindow::MainWindow(QWidget* parent)
|
||||||
// saves some pointers from ui, for latter use.
|
// saves some pointers from ui, for latter use.
|
||||||
m_pViewer = ui->viewer;
|
m_pViewer = ui->viewer;
|
||||||
|
|
||||||
// does not save the state of the viewer
|
|
||||||
m_pViewer->setStateFileName(QString());
|
|
||||||
|
|
||||||
// accepts drop events
|
// accepts drop events
|
||||||
setAcceptDrops(true);
|
setAcceptDrops(true);
|
||||||
|
|
@ -45,6 +43,7 @@ MainWindow::MainWindow(QWidget* parent)
|
||||||
|
|
||||||
MainWindow::~MainWindow()
|
MainWindow::~MainWindow()
|
||||||
{
|
{
|
||||||
|
m_pViewer->makeCurrent();
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -91,8 +91,8 @@ void Scene::compile_shaders()
|
||||||
//Vertex source code
|
//Vertex source code
|
||||||
const char vertex_source[] =
|
const char vertex_source[] =
|
||||||
{
|
{
|
||||||
"#version 120 \n"
|
"#version 150 \n"
|
||||||
"attribute highp vec4 vertex;\n"
|
"in highp vec4 vertex;\n"
|
||||||
"uniform highp mat4 mvp_matrix;\n"
|
"uniform highp mat4 mvp_matrix;\n"
|
||||||
"uniform highp mat4 f_matrix;\n"
|
"uniform highp mat4 f_matrix;\n"
|
||||||
"void main(void)\n"
|
"void main(void)\n"
|
||||||
|
|
@ -103,10 +103,11 @@ void Scene::compile_shaders()
|
||||||
//Vertex source code
|
//Vertex source code
|
||||||
const char fragment_source[] =
|
const char fragment_source[] =
|
||||||
{
|
{
|
||||||
"#version 120 \n"
|
"#version 150 \n"
|
||||||
"uniform highp vec4 color; \n"
|
"uniform highp vec4 color; \n"
|
||||||
|
"out highp vec4 out_color; \n"
|
||||||
"void main(void) { \n"
|
"void main(void) { \n"
|
||||||
"gl_FragColor = color; \n"
|
"out_color = color; \n"
|
||||||
"} \n"
|
"} \n"
|
||||||
"\n"
|
"\n"
|
||||||
};
|
};
|
||||||
|
|
@ -139,12 +140,12 @@ void Scene::compile_shaders()
|
||||||
//Vertex source code
|
//Vertex source code
|
||||||
const char tex_vertex_source[] =
|
const char tex_vertex_source[] =
|
||||||
{
|
{
|
||||||
"#version 120 \n"
|
"#version 150 \n"
|
||||||
"attribute highp vec4 vertex;\n"
|
"in highp vec4 vertex;\n"
|
||||||
"attribute highp vec2 tex_coord; \n"
|
"in highp vec2 tex_coord; \n"
|
||||||
"uniform highp mat4 mvp_matrix;\n"
|
"uniform highp mat4 mvp_matrix;\n"
|
||||||
"uniform highp mat4 f_matrix;\n"
|
"uniform highp mat4 f_matrix;\n"
|
||||||
"varying highp vec2 texc;\n"
|
"out highp vec2 texc;\n"
|
||||||
"void main(void)\n"
|
"void main(void)\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" gl_Position = mvp_matrix * f_matrix * vertex;\n"
|
" gl_Position = mvp_matrix * f_matrix * vertex;\n"
|
||||||
|
|
@ -154,11 +155,12 @@ void Scene::compile_shaders()
|
||||||
//Vertex source code
|
//Vertex source code
|
||||||
const char tex_fragment_source[] =
|
const char tex_fragment_source[] =
|
||||||
{
|
{
|
||||||
"#version 120 \n"
|
"#version 150 \n"
|
||||||
"uniform sampler2D texture;\n"
|
"uniform sampler2D s_texture;\n"
|
||||||
"varying highp vec2 texc;\n"
|
"in highp vec2 texc;\n"
|
||||||
|
"out highp vec4 out_color; \n"
|
||||||
"void main(void) { \n"
|
"void main(void) { \n"
|
||||||
"gl_FragColor = texture2D(texture, texc.st);\n"
|
"out_color = vec4(texture(s_texture, texc));\n"
|
||||||
"} \n"
|
"} \n"
|
||||||
"\n"
|
"\n"
|
||||||
};
|
};
|
||||||
|
|
@ -1319,12 +1321,8 @@ void Scene::deactivate_cutting_plane()
|
||||||
}
|
}
|
||||||
void Scene::initGL()
|
void Scene::initGL()
|
||||||
{
|
{
|
||||||
gl = new QOpenGLFunctions_2_1();
|
gl = new QOpenGLFunctions();
|
||||||
if(!gl->initializeOpenGLFunctions())
|
gl->initializeOpenGLFunctions();
|
||||||
{
|
|
||||||
qFatal("ERROR : OpenGL Functions not initialized. Check your OpenGL Verison (should be >=3.3)");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
gl->glGenTextures(1, &textureId);
|
gl->glGenTextures(1, &textureId);
|
||||||
compile_shaders();
|
compile_shaders();
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// member data
|
// member data
|
||||||
QOpenGLFunctions_2_1 *gl;
|
QOpenGLFunctions *gl;
|
||||||
Bbox m_bbox;
|
Bbox m_bbox;
|
||||||
Polyhedron *m_pPolyhedron;
|
Polyhedron *m_pPolyhedron;
|
||||||
std::list<Point> m_points;
|
std::list<Point> m_points;
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,6 @@
|
||||||
#include <CGAL/internal/AABB_tree/Primitive_helper.h>
|
#include <CGAL/internal/AABB_tree/Primitive_helper.h>
|
||||||
|
|
||||||
#include <boost/optional.hpp>
|
#include <boost/optional.hpp>
|
||||||
#include <boost/bind.hpp>
|
|
||||||
|
|
||||||
/// \file AABB_traits.h
|
/// \file AABB_traits.h
|
||||||
|
|
||||||
|
|
@ -274,13 +273,13 @@ public:
|
||||||
switch(Traits::longest_axis(bbox))
|
switch(Traits::longest_axis(bbox))
|
||||||
{
|
{
|
||||||
case AT::CGAL_AXIS_X: // sort along x
|
case AT::CGAL_AXIS_X: // sort along x
|
||||||
std::nth_element(first, middle, beyond, boost::bind(Traits::less_x,_1,_2,m_traits));
|
std::nth_element(first, middle, beyond, [this](const Primitive& p1, const Primitive& p2){ return Traits::less_x(p1, p2, this->m_traits); });
|
||||||
break;
|
break;
|
||||||
case AT::CGAL_AXIS_Y: // sort along y
|
case AT::CGAL_AXIS_Y: // sort along y
|
||||||
std::nth_element(first, middle, beyond, boost::bind(Traits::less_y,_1,_2,m_traits));
|
std::nth_element(first, middle, beyond, [this](const Primitive& p1, const Primitive& p2){ return Traits::less_y(p1, p2, this->m_traits); });
|
||||||
break;
|
break;
|
||||||
case AT::CGAL_AXIS_Z: // sort along z
|
case AT::CGAL_AXIS_Z: // sort along z
|
||||||
std::nth_element(first, middle, beyond, boost::bind(Traits::less_z,_1,_2,m_traits));
|
std::nth_element(first, middle, beyond, [this](const Primitive& p1, const Primitive& p2){ return Traits::less_z(p1, p2, this->m_traits); });
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CGAL_error();
|
CGAL_error();
|
||||||
|
|
@ -429,6 +428,11 @@ public:
|
||||||
Closest_point closest_point_object() const {return Closest_point(*this);}
|
Closest_point closest_point_object() const {return Closest_point(*this);}
|
||||||
Compare_distance compare_distance_object() const {return Compare_distance();}
|
Compare_distance compare_distance_object() const {return Compare_distance();}
|
||||||
|
|
||||||
|
typedef enum { CGAL_AXIS_X = 0,
|
||||||
|
CGAL_AXIS_Y = 1,
|
||||||
|
CGAL_AXIS_Z = 2} Axis;
|
||||||
|
|
||||||
|
static Axis longest_axis(const Bounding_box& bbox);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
|
|
@ -447,13 +451,6 @@ private:
|
||||||
return internal::Primitive_helper<AT>::get_datum(pr,*this).bbox();
|
return internal::Primitive_helper<AT>::get_datum(pr,*this).bbox();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
typedef enum { CGAL_AXIS_X = 0,
|
|
||||||
CGAL_AXIS_Y = 1,
|
|
||||||
CGAL_AXIS_Z = 2} Axis;
|
|
||||||
|
|
||||||
static Axis longest_axis(const Bounding_box& bbox);
|
|
||||||
|
|
||||||
/// Comparison functions
|
/// Comparison functions
|
||||||
static bool less_x(const Primitive& pr1, const Primitive& pr2,const AABB_traits<GeomTraits,AABBPrimitive, BboxMap>& traits)
|
static bool less_x(const Primitive& pr1, const Primitive& pr2,const AABB_traits<GeomTraits,AABBPrimitive, BboxMap>& traits)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,159 @@
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\ingroup PkgAdvancingFrontSurfaceReconstructionRef
|
||||||
|
\cgalConcept
|
||||||
|
|
||||||
|
The concept `AdvancingFrontSurfaceReconstructionTraits_3` describes the requirements
|
||||||
|
for the the geometric traits of the class `CGAL::Delaunay_triangulation_3`
|
||||||
|
used in the class `CGAL::Advancing_front_surface_reconstruction`.
|
||||||
|
It defines the geometric objects (points, segments...) forming the triangulation
|
||||||
|
together with a few geometric predicates and constructions on these objects.
|
||||||
|
|
||||||
|
\cgalRefines `DelaunayTriangulationTraits_3`
|
||||||
|
|
||||||
|
\cgalHasModel All models of `Kernel`.
|
||||||
|
*/
|
||||||
|
class AdvancingFrontSurfaceReconstructionTraits_3
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// \name Types
|
||||||
|
/// @{
|
||||||
|
|
||||||
|
/*!
|
||||||
|
The coordinate type.
|
||||||
|
*/
|
||||||
|
typedef unspecified_type FT;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
The vector type.
|
||||||
|
*/
|
||||||
|
typedef unspecified_type Vector_3;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
The sphere type.
|
||||||
|
*/
|
||||||
|
typedef unspecified_type Sphere_3;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
A constructor object that must provide the function operator
|
||||||
|
|
||||||
|
`Vector_3 operator()(Point_3 p, Point_3 q)`,
|
||||||
|
|
||||||
|
which constructs the vector `q-p`.
|
||||||
|
*/
|
||||||
|
typedef unspecified_type Construct_vector_3;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
A constructor object that must provide the function operator
|
||||||
|
|
||||||
|
`Vector_3 operator()(Vector_3 v, Vector_3 w)`,
|
||||||
|
|
||||||
|
which returns the cross product of `v` and `w`.
|
||||||
|
*/
|
||||||
|
typedef unspecified_type Construct_cross_product_vector_3;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
A constructor object that must provide the function operator
|
||||||
|
|
||||||
|
`FT operator()(Vector_3 v, Vector_3 w)`,
|
||||||
|
|
||||||
|
which returns the scalar (inner) product of `v` and `w`.
|
||||||
|
*/
|
||||||
|
typedef unspecified_type Compute_scalar_product_3;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
A constructor object that must provide the function operator
|
||||||
|
|
||||||
|
`Sphere_3 operator()(Point_3 p, Point_3 q, Point_3 r)`,
|
||||||
|
|
||||||
|
which constructs a sphere initialized to the smallest sphere which passes
|
||||||
|
through the points `p`, `q`, and `r`.
|
||||||
|
*/
|
||||||
|
typedef unspecified_type Construct_sphere_3;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
A constructor object that must provide the function operator
|
||||||
|
|
||||||
|
`Point_3 operator()(Sphere_3 s)`,
|
||||||
|
|
||||||
|
which returns the center of the sphere `s`.
|
||||||
|
*/
|
||||||
|
typedef unspecified_type Construct_center_3;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
A constructor object that must provide the function operators
|
||||||
|
|
||||||
|
`FT operator()(Point_3 p, Point_3 q, Point_3 r, Point_3 s)`,
|
||||||
|
|
||||||
|
which returns the squared radius of the sphere passing through `p`, `q` and `r`,
|
||||||
|
and whose center is in the plane defined by these three points.
|
||||||
|
|
||||||
|
and
|
||||||
|
|
||||||
|
`FT operator()(Point_3 p, Point_3 q, Point_3 r, Point_3 s)`,
|
||||||
|
|
||||||
|
which returns the squared radius of the sphere passing through `p`, `q`, `r`, and `s`.
|
||||||
|
|
||||||
|
and
|
||||||
|
|
||||||
|
`FT operator()(Sphere_3 s)`,
|
||||||
|
|
||||||
|
which returns the squared radius of the sphere `s`.
|
||||||
|
*/
|
||||||
|
typedef unspecified_type Compute_squared_radius_3;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
A constructor object that must provide the function operator
|
||||||
|
|
||||||
|
`FT operator()(Point_3 p, Point_3 q)`,
|
||||||
|
|
||||||
|
which returns the squared distance between the points `p` and `q`.
|
||||||
|
*/
|
||||||
|
typedef unspecified_type Compute_squared_distance_3;
|
||||||
|
|
||||||
|
/// @}
|
||||||
|
|
||||||
|
/// \name Operations
|
||||||
|
/// The following functions give access to the predicate and construction objects:
|
||||||
|
/// @{
|
||||||
|
|
||||||
|
/*!
|
||||||
|
gives access to the `Construct_vector_3` construction.
|
||||||
|
*/
|
||||||
|
Construct_vector_3 construct_vector_3_object();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
gives access to the `Construct_cross_product_vector_3` construction.
|
||||||
|
*/
|
||||||
|
Construct_cross_product_vector_3 construct_cross_product_vector_3_object();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
gives access to the `Compute_scalar_product_3` construction.
|
||||||
|
*/
|
||||||
|
Compute_scalar_product_3 compute_scalar_product_3_object();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
gives access to the `Construct_sphere_3` construction.
|
||||||
|
*/
|
||||||
|
Construct_sphere_3 construct_sphere_3_object();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
gives access to the `Construct_center_3` construction.
|
||||||
|
*/
|
||||||
|
Construct_center_3 construct_center_3_object();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
gives access to the `Compute_squared_radius_3` construction.
|
||||||
|
*/
|
||||||
|
Compute_squared_radius_3 compute_squared_radius_3_object();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
gives access to the `Compute_squared_distance_3` construction.
|
||||||
|
*/
|
||||||
|
Compute_squared_distance_3 compute_squared_distance_3_object();
|
||||||
|
|
||||||
|
/// @}
|
||||||
|
|
||||||
|
}; /* end AdvancingFrontSurfaceReconstructionTraits_3 */
|
||||||
|
|
||||||
|
|
@ -1,5 +1,8 @@
|
||||||
/// \defgroup PkgAdvancingFrontSurfaceReconstructionRef Advancing Front Surface Reconstruction Reference
|
/// \defgroup PkgAdvancingFrontSurfaceReconstructionRef Advancing Front Surface Reconstruction Reference
|
||||||
|
|
||||||
|
/// \defgroup PkgAdvancingFrontSurfaceReconstructionRefConcepts Concepts
|
||||||
|
/// \ingroup PkgAdvancingFrontSurfaceReconstructionRef
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\addtogroup PkgAdvancingFrontSurfaceReconstructionRef
|
\addtogroup PkgAdvancingFrontSurfaceReconstructionRef
|
||||||
|
|
||||||
|
|
@ -25,6 +28,10 @@ of topological singularities. }
|
||||||
|
|
||||||
\cgalClassifedRefPages
|
\cgalClassifedRefPages
|
||||||
|
|
||||||
|
\cgalCRPSection{Concepts}
|
||||||
|
|
||||||
|
- `AdvancingFrontSurfaceReconstructionTraits_3`
|
||||||
|
|
||||||
\cgalCRPSection{Classes}
|
\cgalCRPSection{Classes}
|
||||||
|
|
||||||
- `CGAL::Advancing_front_surface_reconstruction`
|
- `CGAL::Advancing_front_surface_reconstruction`
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ Algebraic_foundations
|
||||||
Circulator
|
Circulator
|
||||||
Stream_support
|
Stream_support
|
||||||
TDS_2
|
TDS_2
|
||||||
|
TDS_3
|
||||||
Triangulation_2
|
Triangulation_2
|
||||||
Triangulation_3
|
Triangulation_3
|
||||||
Number_types
|
Number_types
|
||||||
|
|
|
||||||
|
|
@ -175,23 +175,42 @@ namespace CGAL {
|
||||||
store handles to the vertices and faces of the 3D triangulation, which enables the user to explore the
|
store handles to the vertices and faces of the 3D triangulation, which enables the user to explore the
|
||||||
2D as well as 3D neighborhood of vertices and facets of the surface.
|
2D as well as 3D neighborhood of vertices and facets of the surface.
|
||||||
|
|
||||||
\tparam Dt must be a `Delaunay_triangulation_3` with
|
\tparam Dt must be a `Delaunay_triangulation_3` whose `Traits` template parameter must be a model of
|
||||||
`Advancing_front_surface_reconstruction_vertex_base_3` and `Advancing_front_surface_reconstruction_cell_base_3` blended into the vertex and cell type.
|
`AdvancingFrontSurfaceReconstructionTraits_3` and whose `Tds` template parameter must be
|
||||||
The default uses the `Exact_predicates_inexact_constructions_kernel` as geometric traits class.
|
a model of `TriangulationDataStructure_3` with `Advancing_front_surface_reconstruction_vertex_base_3` and
|
||||||
|
`Advancing_front_surface_reconstruction_cell_base_3` blended into the vertex and cell type, respectively.
|
||||||
|
The default value is:
|
||||||
|
\code
|
||||||
|
CGAL::Delaunay_triangulation_3<CGAL::Exact_predicates_inexact_constructions_kernel,
|
||||||
|
CGAL::Triangulation_data_structure_3<
|
||||||
|
CGAL::Advancing_front_surface_reconstruction_vertex_base_3<
|
||||||
|
CGAL::Exact_predicates_inexact_constructions_kernel>,
|
||||||
|
CGAL::Advancing_front_surface_reconstruction_cell_base_3<
|
||||||
|
CGAL::Exact_predicates_inexact_constructions_kernel> > >`
|
||||||
|
\endcode
|
||||||
|
|
||||||
\tparam P must be a functor with `double operator()(AdvancingFront,Cell_handle,int)` returning the
|
\tparam P must be a functor offering
|
||||||
priority of the facet `(Cell_handle,int)`. This functor enables the user to choose how candidate
|
\code
|
||||||
triangles are prioritized. If a facet should not appear in the output,
|
FT operator()(Advancing_front_surface_reconstruction,Cell_handle,int)
|
||||||
|
\endcode
|
||||||
|
returning the priority of the facet `(Cell_handle,int)`. This functor enables the user
|
||||||
|
to choose how candidate triangles are prioritized. If a facet should not appear in the output,
|
||||||
`infinity()` must be returned. It defaults to a functor that returns the
|
`infinity()` must be returned. It defaults to a functor that returns the
|
||||||
`smallest_radius_delaunay_sphere()`.
|
`smallest_radius_delaunay_sphere()`.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
template <
|
template <class Dt = Default,
|
||||||
class Dt = Default,
|
|
||||||
class P = Default>
|
class P = Default>
|
||||||
class Advancing_front_surface_reconstruction {
|
class Advancing_front_surface_reconstruction
|
||||||
|
{
|
||||||
typedef typename Default::Get<Dt,Delaunay_triangulation_3<Exact_predicates_inexact_constructions_kernel, Triangulation_data_structure_3<Advancing_front_surface_reconstruction_vertex_base_3<Exact_predicates_inexact_constructions_kernel>, Advancing_front_surface_reconstruction_cell_base_3<Exact_predicates_inexact_constructions_kernel> > > >::type Triangulation;
|
typedef typename Default::Get<Dt,
|
||||||
|
Delaunay_triangulation_3<
|
||||||
|
Exact_predicates_inexact_constructions_kernel,
|
||||||
|
Triangulation_data_structure_3<
|
||||||
|
Advancing_front_surface_reconstruction_vertex_base_3<
|
||||||
|
Exact_predicates_inexact_constructions_kernel>,
|
||||||
|
Advancing_front_surface_reconstruction_cell_base_3<
|
||||||
|
Exact_predicates_inexact_constructions_kernel> > > >::type Triangulation;
|
||||||
typedef typename Default::Get<P,AFSR::Default_priority>::type Priority;
|
typedef typename Default::Get<P,AFSR::Default_priority>::type Priority;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
@ -202,9 +221,9 @@ namespace CGAL {
|
||||||
/*!
|
/*!
|
||||||
The type of the 2D triangulation data structure describing the reconstructed surface, being a model of `TriangulationDataStructure_2`.
|
The type of the 2D triangulation data structure describing the reconstructed surface, being a model of `TriangulationDataStructure_2`.
|
||||||
- The type `Triangulation_data_structure_2::Vertex` is model of the concept `TriangulationDataStructure_2::Vertex` and has additionally the
|
- The type `Triangulation_data_structure_2::Vertex` is model of the concept `TriangulationDataStructure_2::Vertex` and has additionally the
|
||||||
method `vertex_3()` that returns a `#Vertex_handle` to the associated 3D vertex.
|
method `vertex_3()` that returns a `Vertex_handle` to the associated 3D vertex.
|
||||||
- The type `Triangulation_data_structure_2::Face` is model of the concept `TriangulationDataStructure_2::Face` and has additionally the
|
- The type `Triangulation_data_structure_2::Face` is model of the concept `TriangulationDataStructure_2::Face` and has additionally the
|
||||||
method `facet()` that returns the associated `#Facet`, and a method `bool is_on_surface()`
|
method `facet()` that returns the associated `Facet`, and a method `bool is_on_surface()`
|
||||||
for testing if a face is part of the reconstructed surface or a face incident to a boundary edge.
|
for testing if a face is part of the reconstructed surface or a face incident to a boundary edge.
|
||||||
|
|
||||||
In case the surface has boundaries, the 2D surface has one vertex which is associated to the infinite
|
In case the surface has boundaries, the 2D surface has one vertex which is associated to the infinite
|
||||||
|
|
@ -213,15 +232,20 @@ namespace CGAL {
|
||||||
typedef unspecified_type Triangulation_data_structure_2;
|
typedef unspecified_type Triangulation_data_structure_2;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
The type of the 3D triangulation.
|
The type of the 3D Delaunay triangulation (the first template parameter).
|
||||||
*/
|
*/
|
||||||
typedef unspecified_type Triangulation_3;
|
typedef unspecified_type Triangulation_3;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
The type of the facet priority functor.
|
The type of the facet priority functor (the second template parameter).
|
||||||
*/
|
*/
|
||||||
typedef unspecified_type Priority;
|
typedef unspecified_type Priority;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
The number type.
|
||||||
|
*/
|
||||||
|
typedef typename Triangulation_3::Geom_traits::FT FT;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
The point type.
|
The point type.
|
||||||
*/
|
*/
|
||||||
|
|
@ -245,21 +269,21 @@ namespace CGAL {
|
||||||
/*!
|
/*!
|
||||||
A bidirectional iterator range which enables to enumerate all points that were removed
|
A bidirectional iterator range which enables to enumerate all points that were removed
|
||||||
from the 3D Delaunay triangulation during the surface reconstruction. The value type
|
from the 3D Delaunay triangulation during the surface reconstruction. The value type
|
||||||
of the iterator is `#Point`.
|
of the iterator is `Point`.
|
||||||
*/
|
*/
|
||||||
typedef unspecified_type Outlier_range;
|
typedef unspecified_type Outlier_range;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
A bidirectional iterator range which enables to visit all vertices on a boundary.
|
||||||
|
The value type of the iterator is `Vertex_handle`.
|
||||||
|
*/
|
||||||
|
typedef unspecified_type Vertex_on_boundary_range;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
A bidirectional iterator range which enables to visit all boundaries.
|
A bidirectional iterator range which enables to visit all boundaries.
|
||||||
The value type of the iterator is `Vertex_on_boundary_range`.
|
The value type of the iterator is `Vertex_on_boundary_range`.
|
||||||
*/
|
*/
|
||||||
typedef unspecified_type Boundary_range;
|
typedef unspecified_type Boundary_range;
|
||||||
|
|
||||||
/*!
|
|
||||||
A bidirectional iterator range which enables to visit all vertices on a boundary.
|
|
||||||
The value type of the iterator is `#Vertex_handle`
|
|
||||||
*/
|
|
||||||
typedef unspecified_type Vertex_on_boundary_range;
|
|
||||||
/// @}
|
/// @}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -268,6 +292,7 @@ namespace CGAL {
|
||||||
typedef Advancing_front_surface_reconstruction<Dt,P> Extract;
|
typedef Advancing_front_surface_reconstruction<Dt,P> Extract;
|
||||||
typedef typename Triangulation_3::Geom_traits Geom_traits;
|
typedef typename Triangulation_3::Geom_traits Geom_traits;
|
||||||
|
|
||||||
|
typedef typename Kernel::FT FT;
|
||||||
typedef typename Kernel::FT coord_type;
|
typedef typename Kernel::FT coord_type;
|
||||||
|
|
||||||
typedef typename Kernel::Point_3 Point;
|
typedef typename Kernel::Point_3 Point;
|
||||||
|
|
@ -377,7 +402,23 @@ namespace CGAL {
|
||||||
std::list<Next_border_elt> nbe_pool;
|
std::list<Next_border_elt> nbe_pool;
|
||||||
std::list<Intern_successors_type> ist_pool;
|
std::list<Intern_successors_type> ist_pool;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Vector construct_vector(const Point& p, const Point& q) const
|
||||||
|
{
|
||||||
|
return T.geom_traits().construct_vector_3_object()(p, q);
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector construct_cross_product(const Vector& v, const Vector& w) const
|
||||||
|
{
|
||||||
|
return T.geom_traits().construct_cross_product_vector_3_object()(v, w);
|
||||||
|
}
|
||||||
|
|
||||||
|
FT compute_scalar_product(const Vector& v, const Vector& w) const
|
||||||
|
{
|
||||||
|
return T.geom_traits().compute_scalar_product_3_object()(v, w);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
Intern_successors_type* new_border()
|
Intern_successors_type* new_border()
|
||||||
{
|
{
|
||||||
nbe_pool.resize(nbe_pool.size()+1);
|
nbe_pool.resize(nbe_pool.size()+1);
|
||||||
|
|
@ -679,12 +720,14 @@ namespace CGAL {
|
||||||
++it;
|
++it;
|
||||||
}while(collinear(p,q,it->point()));
|
}while(collinear(p,q,it->point()));
|
||||||
const Point& r = it->point();
|
const Point& r = it->point();
|
||||||
Vector u = q-r;
|
Vector u = construct_vector(r, q);
|
||||||
Vector v = q-p;
|
Vector v = construct_vector(p, q);
|
||||||
Vector w = r-p;
|
Vector w = construct_vector(p, r);
|
||||||
Vector vw = cross_product(v,w);
|
Vector vw = construct_cross_product(v,w);
|
||||||
double len = (std::max)(u*u,(std::max)(v*v,w*w));
|
double len = (std::max)(compute_scalar_product(u,u),
|
||||||
Point s = p + 10* len * (vw/(vw*vw));
|
(std::max)(compute_scalar_product(v,v),
|
||||||
|
compute_scalar_product(w,w)));
|
||||||
|
Point s = p + 10 * len * (vw/compute_scalar_product(vw,vw));
|
||||||
added_vertex = T.insert(s);
|
added_vertex = T.insert(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -736,9 +779,9 @@ namespace CGAL {
|
||||||
|
|
||||||
\param radius_ratio_bound candidates incident to surface triangles which are not in the beta-wedge
|
\param radius_ratio_bound candidates incident to surface triangles which are not in the beta-wedge
|
||||||
are discarded, if the ratio of their radius and the radius of the surface triangle is larger than `radius_ratio_bound`.
|
are discarded, if the ratio of their radius and the radius of the surface triangle is larger than `radius_ratio_bound`.
|
||||||
Described in Section \ref AFSR_Boundaries
|
Described in Section \ref AFSR_Boundaries.
|
||||||
\param beta half the angle of the wedge in which only the radius of triangles counts for the plausibility of candidates.
|
\param beta half the angle of the wedge in which only the radius of triangles counts for the plausibility of candidates.
|
||||||
Described in Section \ref AFSR_Selection
|
Described in Section \ref AFSR_Selection.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
void run(double radius_ratio_bound=5, double beta= 0.52)
|
void run(double radius_ratio_bound=5, double beta= 0.52)
|
||||||
|
|
@ -1186,7 +1229,7 @@ namespace CGAL {
|
||||||
\param index index of the facet in `c`
|
\param index index of the facet in `c`
|
||||||
|
|
||||||
*/
|
*/
|
||||||
coord_type
|
FT
|
||||||
smallest_radius_delaunay_sphere(const Cell_handle& c,
|
smallest_radius_delaunay_sphere(const Cell_handle& c,
|
||||||
const int& index) const
|
const int& index) const
|
||||||
{
|
{
|
||||||
|
|
@ -1249,16 +1292,16 @@ namespace CGAL {
|
||||||
const Point& pp2 = cc->vertex(i2)->point();
|
const Point& pp2 = cc->vertex(i2)->point();
|
||||||
const Point& pp3 = cc->vertex(i3)->point();
|
const Point& pp3 = cc->vertex(i3)->point();
|
||||||
|
|
||||||
Sphere facet_sphere(pp1, pp2, pp3);
|
Sphere facet_sphere = T.geom_traits().construct_sphere_3_object()(pp1, pp2, pp3);
|
||||||
if (squared_distance(facet_sphere.center(), pp0) <
|
if (squared_distance(T.geom_traits().construct_center_3_object()(facet_sphere), pp0) <
|
||||||
facet_sphere.squared_radius())
|
T.geom_traits().compute_squared_radius_3_object()(facet_sphere))
|
||||||
{
|
{
|
||||||
#ifdef AFSR_LAZY
|
#ifdef AFSR_LAZY
|
||||||
value = lazy_squared_radius(cc);
|
value = lazy_squared_radius(cc);
|
||||||
#else
|
#else
|
||||||
// qualified with CGAL, to avoid a compilation error with clang
|
// qualified with CGAL, to avoid a compilation error with clang
|
||||||
if(volume(pp0, pp1, pp2, pp3) != 0){
|
if(volume(pp0, pp1, pp2, pp3) != 0){
|
||||||
value = CGAL::squared_radius(pp0, pp1, pp2, pp3);
|
value = T.geom_traits().compute_squared_radius_3_object()(pp0, pp1, pp2, pp3);
|
||||||
} else {
|
} else {
|
||||||
typedef Exact_predicates_exact_constructions_kernel EK;
|
typedef Exact_predicates_exact_constructions_kernel EK;
|
||||||
Cartesian_converter<Kernel, EK> to_exact;
|
Cartesian_converter<Kernel, EK> to_exact;
|
||||||
|
|
@ -1280,26 +1323,30 @@ namespace CGAL {
|
||||||
cc = lazy_circumcenter(c);
|
cc = lazy_circumcenter(c);
|
||||||
cn = lazy_circumcenter(n);
|
cn = lazy_circumcenter(n);
|
||||||
#else
|
#else
|
||||||
cc = CGAL::circumcenter(cp0, cp1, cp2, cp3);
|
cc = T.geom_traits().construct_circumcenter_3_object()(cp0, cp1, cp2, cp3);
|
||||||
cn = CGAL::circumcenter(np0, np1, np2, np3);
|
cn = T.geom_traits().construct_circumcenter_3_object()(np0, np1, np2, np3);
|
||||||
#endif
|
#endif
|
||||||
// computation of the distance of cp1 to the dual segment cc, cn...
|
// computation of the distance of cp1 to the dual segment cc, cn...
|
||||||
Vector V(cc - cn), Vc(cc - cp1), Vn(cp1 - cn);
|
Vector V = construct_vector(cn, cc),
|
||||||
coord_type ac(V * Vc), an(V * Vn), norm_V(V * V);
|
Vc = construct_vector(cp1, cc),
|
||||||
|
Vn = construct_vector(cn, cp1);
|
||||||
|
coord_type ac = compute_scalar_product(V, Vc),
|
||||||
|
an = compute_scalar_product(V, Vn),
|
||||||
|
norm_V = compute_scalar_product(V, V);
|
||||||
if ((ac > 0) && (an > 0))
|
if ((ac > 0) && (an > 0))
|
||||||
{
|
{
|
||||||
value = (Vc*Vc) - ac*ac/norm_V;
|
value = compute_scalar_product(Vc, Vc) - ac*ac/norm_V;
|
||||||
if ((value < 0)||(norm_V > inv_eps_2)){
|
if ((value < 0)||(norm_V > inv_eps_2)){
|
||||||
// qualified with CGAL, to avoid a compilation error with clang
|
// qualified with CGAL, to avoid a compilation error with clang
|
||||||
value = CGAL::squared_radius(cp1, cp2, cp3);
|
value = T.geom_traits().compute_squared_radius_3_object()(cp1, cp2, cp3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (ac <= 0)
|
if (ac <= 0)
|
||||||
value = squared_distance(cc, cp1);
|
value = T.geom_traits().compute_squared_distance_3_object()(cc, cp1);
|
||||||
else // (an <= 0)
|
else // (an <= 0)
|
||||||
value = squared_distance(cn, cp1);
|
value = T.geom_traits().compute_squared_distance_3_object()(cn, cp1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1314,7 +1361,7 @@ namespace CGAL {
|
||||||
|
|
||||||
returns the infinite floating value that prevents a facet to be used.
|
returns the infinite floating value that prevents a facet to be used.
|
||||||
*/
|
*/
|
||||||
coord_type infinity() const { return std::numeric_limits<coord_type>::infinity(); }
|
FT infinity() const { return std::numeric_limits<FT>::infinity(); }
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
|
|
@ -1341,9 +1388,9 @@ namespace CGAL {
|
||||||
const Point& p2 = c->vertex(i2)->point();
|
const Point& p2 = c->vertex(i2)->point();
|
||||||
const Point& pc = c->vertex(i3)->point();
|
const Point& pc = c->vertex(i3)->point();
|
||||||
|
|
||||||
Vector P2P1 = p1-p2, P2Pn, PnP1;
|
Vector P2P1 = construct_vector(p2, p1), P2Pn, PnP1;
|
||||||
|
|
||||||
Vector v2, v1 = cross_product(pc-p2, P2P1);
|
Vector v2, v1 = construct_cross_product(construct_vector(p2, pc), P2P1);
|
||||||
|
|
||||||
coord_type norm, norm1 = v1*v1;
|
coord_type norm, norm1 = v1*v1;
|
||||||
coord_type norm12 = P2P1*P2P1;
|
coord_type norm12 = P2P1*P2P1;
|
||||||
|
|
@ -1375,12 +1422,12 @@ namespace CGAL {
|
||||||
{
|
{
|
||||||
const Point& pn = neigh->vertex(n_i3)->point();
|
const Point& pn = neigh->vertex(n_i3)->point();
|
||||||
|
|
||||||
P2Pn = pn-p2;
|
P2Pn = construct_vector(p2, pn);
|
||||||
v2 = cross_product(P2P1,P2Pn);
|
v2 = construct_cross_product(P2P1,P2Pn);
|
||||||
|
|
||||||
//pas necessaire de normer pour un bon echantillon:
|
//pas necessaire de normer pour un bon echantillon:
|
||||||
// on peut alors tester v1*v2 >= 0
|
// on peut alors tester v1*v2 >= 0
|
||||||
norm = sqrt(norm1 * (v2*v2));
|
norm = sqrt(norm1 * compute_scalar_product(v2,v2));
|
||||||
pscal = v1*v2;
|
pscal = v1*v2;
|
||||||
// check if the triangle will produce a sliver on the surface
|
// check if the triangle will produce a sliver on the surface
|
||||||
bool sliver_facet = (pscal <= COS_ALPHA_SLIVER*norm);
|
bool sliver_facet = (pscal <= COS_ALPHA_SLIVER*norm);
|
||||||
|
|
@ -1394,10 +1441,9 @@ namespace CGAL {
|
||||||
// We skip triangles having an internal angle along e
|
// We skip triangles having an internal angle along e
|
||||||
// whose cosinus is smaller than -DELTA
|
// whose cosinus is smaller than -DELTA
|
||||||
// that is the angle is larger than arcos(-DELTA)
|
// that is the angle is larger than arcos(-DELTA)
|
||||||
border_facet = !((P2P1*P2Pn >=
|
border_facet =
|
||||||
-DELTA*sqrt(norm12*(P2Pn*P2Pn)))&&
|
!((P2P1*P2Pn >= -DELTA*sqrt(norm12*compute_scalar_product(P2Pn,P2Pn))) &&
|
||||||
(P2P1*PnP1 >=
|
(P2P1*PnP1 >= -DELTA*sqrt(norm12*compute_scalar_product(PnP1,PnP1))));
|
||||||
-DELTA*sqrt(norm12*(PnP1*PnP1))));
|
|
||||||
// \todo investigate why we simply do not skip this triangle
|
// \todo investigate why we simply do not skip this triangle
|
||||||
// but continue looking for a better candidate
|
// but continue looking for a better candidate
|
||||||
// if (!border_facet){
|
// if (!border_facet){
|
||||||
|
|
@ -1569,9 +1615,11 @@ namespace CGAL {
|
||||||
int n_i3 = (6 - n_ind - n_i1 - n_i2);
|
int n_i3 = (6 - n_ind - n_i1 - n_i2);
|
||||||
|
|
||||||
const Point& pn = neigh->vertex(n_i3)->point();
|
const Point& pn = neigh->vertex(n_i3)->point();
|
||||||
Vector v1 = cross_product(pc-p2,p1-p2),
|
Vector v1 = construct_cross_product(construct_vector(p2, pc),
|
||||||
v2 = cross_product(p1-p2,pn-p2);
|
construct_vector(p2, p1)),
|
||||||
coord_type norm = sqrt((v1*v1)*(v2*v2));
|
v2 = construct_cross_product(construct_vector(p2, p1),
|
||||||
|
construct_vector(p2, pn));
|
||||||
|
coord_type norm = sqrt(compute_scalar_product(v1, v1) * compute_scalar_product(v2, v2));
|
||||||
|
|
||||||
if (v1*v2 > COS_BETA*norm)
|
if (v1*v2 > COS_BETA*norm)
|
||||||
return 1; // label bonne pliure sinon:
|
return 1; // label bonne pliure sinon:
|
||||||
|
|
@ -2487,9 +2535,9 @@ namespace CGAL {
|
||||||
\param out output iterator
|
\param out output iterator
|
||||||
\param radius_ratio_bound candidates incident to surface triangles which are not in the beta-wedge
|
\param radius_ratio_bound candidates incident to surface triangles which are not in the beta-wedge
|
||||||
are discarded, if the ratio of their radius and the radius of the surface triangle is larger than `radius_ratio_bound`.
|
are discarded, if the ratio of their radius and the radius of the surface triangle is larger than `radius_ratio_bound`.
|
||||||
Described in Section \ref AFSR_Boundaries
|
Described in Section \ref AFSR_Boundaries.
|
||||||
\param beta half the angle of the wedge in which only the radius of triangles counts for the plausibility of candidates.
|
\param beta half the angle of the wedge in which only the radius of triangles counts for the plausibility of candidates.
|
||||||
Described in Section \ref AFSR_Selection
|
Described in Section \ref AFSR_Selection.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
template <typename PointInputIterator, typename IndicesOutputIterator>
|
template <typename PointInputIterator, typename IndicesOutputIterator>
|
||||||
|
|
@ -2533,7 +2581,7 @@ namespace CGAL {
|
||||||
be convertible to `Exact_predicates_inexact_constructions_kernel::Point_3` with the `Cartesian_converter`.
|
be convertible to `Exact_predicates_inexact_constructions_kernel::Point_3` with the `Cartesian_converter`.
|
||||||
\tparam IndicesOutputIterator must be an output iterator to which
|
\tparam IndicesOutputIterator must be an output iterator to which
|
||||||
`std::array<std::size_t, 3>` can be assigned.
|
`std::array<std::size_t, 3>` can be assigned.
|
||||||
\tparam Priority must be a functor with `double operator()(AdvancingFront,Cell_handle,int)` returning the
|
\tparam Priority must be a functor with `double operator()(Advancing_front_surface_reconstruction,Cell_handle,int)` returning the
|
||||||
priority of the facet `(Cell_handle,int)`.
|
priority of the facet `(Cell_handle,int)`.
|
||||||
|
|
||||||
\param b iterator on the first point of the sequence
|
\param b iterator on the first point of the sequence
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ namespace CGAL {
|
||||||
\ingroup PkgAlgebraicFoundationsRef
|
\ingroup PkgAlgebraicFoundationsRef
|
||||||
|
|
||||||
The template function `compare()` compares the first argument with respect to
|
The template function `compare()` compares the first argument with respect to
|
||||||
the second, i.e.\ it returns `CGAL::LARGER` if \f$ x\f$ is larger then \f$ y\f$.
|
the second, i.e.\ it returns `CGAL::LARGER` if \f$ x\f$ is larger than \f$ y\f$.
|
||||||
|
|
||||||
In case the argument types `NT1` and `NT2` differ,
|
In case the argument types `NT1` and `NT2` differ,
|
||||||
`compare` is performed with the semantic of the type determined via
|
`compare` is performed with the semantic of the type determined via
|
||||||
|
|
|
||||||
|
|
@ -302,13 +302,13 @@ to_interval( const Real_embeddable& x) {
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename NT>
|
template <typename NT>
|
||||||
NT approximate_sqrt(const NT& nt, CGAL::Field_tag)
|
NT approximate_sqrt(const NT& nt, CGAL::Null_functor)
|
||||||
{
|
{
|
||||||
return NT(sqrt(CGAL::to_double(nt)));
|
return NT(sqrt(CGAL::to_double(nt)));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename NT>
|
template <typename NT, typename Sqrt>
|
||||||
NT approximate_sqrt(const NT& nt, CGAL::Field_with_sqrt_tag)
|
NT approximate_sqrt(const NT& nt, Sqrt sqrt)
|
||||||
{
|
{
|
||||||
return sqrt(nt);
|
return sqrt(nt);
|
||||||
}
|
}
|
||||||
|
|
@ -316,9 +316,12 @@ NT approximate_sqrt(const NT& nt, CGAL::Field_with_sqrt_tag)
|
||||||
template <typename NT>
|
template <typename NT>
|
||||||
NT approximate_sqrt(const NT& nt)
|
NT approximate_sqrt(const NT& nt)
|
||||||
{
|
{
|
||||||
|
// the initial version of this function was using Algebraic_category
|
||||||
|
// for the dispatch but some ring type (like Gmpz) provides a Sqrt
|
||||||
|
// functor even if not being Field_with_sqrt.
|
||||||
typedef CGAL::Algebraic_structure_traits<NT> AST;
|
typedef CGAL::Algebraic_structure_traits<NT> AST;
|
||||||
typedef typename AST::Algebraic_category Algebraic_category;
|
typedef typename AST::Sqrt Sqrt;
|
||||||
return approximate_sqrt(nt, Algebraic_category());
|
return approximate_sqrt(nt, Sqrt());
|
||||||
}
|
}
|
||||||
|
|
||||||
CGAL_NTS_END_NAMESPACE
|
CGAL_NTS_END_NAMESPACE
|
||||||
|
|
|
||||||
|
|
@ -5,23 +5,15 @@ find_package(CGAL REQUIRED COMPONENTS Core)
|
||||||
|
|
||||||
find_package(MPFI QUIET)
|
find_package(MPFI QUIET)
|
||||||
|
|
||||||
if(MPFI_FOUND)
|
if(MPFI_FOUND AND NOT CGAL_DISABLE_GMP)
|
||||||
|
|
||||||
include(${CGAL_USE_FILE})
|
include(${CGAL_USE_FILE})
|
||||||
include(${MPFI_USE_FILE})
|
include(${MPFI_USE_FILE})
|
||||||
include(CGAL_VersionUtils)
|
include(CGAL_VersionUtils)
|
||||||
|
|
||||||
create_single_source_cgal_program("Compare_1.cpp")
|
create_single_source_cgal_program("Compare_1.cpp")
|
||||||
create_single_source_cgal_program("Construct_algebraic_real_1.cpp")
|
create_single_source_cgal_program("Construct_algebraic_real_1.cpp")
|
||||||
create_single_source_cgal_program("Isolate_1.cpp")
|
create_single_source_cgal_program("Isolate_1.cpp")
|
||||||
create_single_source_cgal_program("Sign_at_1.cpp")
|
create_single_source_cgal_program("Sign_at_1.cpp")
|
||||||
create_single_source_cgal_program("Solve_1.cpp")
|
create_single_source_cgal_program("Solve_1.cpp")
|
||||||
|
|
||||||
else()
|
else()
|
||||||
|
message(STATUS "This program requires the CGAL, CGAL_Core and MPFI libraries, and will not be compiled.")
|
||||||
message(
|
|
||||||
STATUS
|
|
||||||
"This program requires the CGAL library and MPFI, and will not be compiled."
|
|
||||||
)
|
|
||||||
|
|
||||||
endif()
|
endif()
|
||||||
|
|
|
||||||
|
|
@ -2007,7 +2007,7 @@ public:
|
||||||
*
|
*
|
||||||
* For each status line at an event and each status line that represents
|
* For each status line at an event and each status line that represents
|
||||||
* an interval, all y-coordinates are approximated such that their
|
* an interval, all y-coordinates are approximated such that their
|
||||||
* isolating interval has absolute size smaller then \c precision.
|
* isolating interval has absolute size smaller than \c precision.
|
||||||
*/
|
*/
|
||||||
void refine_all(Bound precision) {
|
void refine_all(Bound precision) {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,8 @@ include(${CGAL_USE_FILE})
|
||||||
# ##########################################################
|
# ##########################################################
|
||||||
|
|
||||||
create_single_source_cgal_program("cyclic.cpp")
|
create_single_source_cgal_program("cyclic.cpp")
|
||||||
|
create_single_source_cgal_program("Descartes.cpp")
|
||||||
|
if(NOT CGAL_DISABLE_GMP)
|
||||||
create_single_source_cgal_program("Algebraic_curve_kernel_2.cpp")
|
create_single_source_cgal_program("Algebraic_curve_kernel_2.cpp")
|
||||||
create_single_source_cgal_program("algebraic_curve_kernel_2_tools.cpp")
|
create_single_source_cgal_program("algebraic_curve_kernel_2_tools.cpp")
|
||||||
create_single_source_cgal_program("Algebraic_kernel_d_1_LEDA.cpp")
|
create_single_source_cgal_program("Algebraic_kernel_d_1_LEDA.cpp")
|
||||||
|
|
@ -53,7 +55,6 @@ create_single_source_cgal_program("Algebraic_real_d_1.cpp")
|
||||||
create_single_source_cgal_program("Bitstream_descartes.cpp")
|
create_single_source_cgal_program("Bitstream_descartes.cpp")
|
||||||
create_single_source_cgal_program("Curve_analysis_2.cpp")
|
create_single_source_cgal_program("Curve_analysis_2.cpp")
|
||||||
create_single_source_cgal_program("Curve_pair_analysis_2.cpp")
|
create_single_source_cgal_program("Curve_pair_analysis_2.cpp")
|
||||||
create_single_source_cgal_program("Descartes.cpp")
|
|
||||||
create_single_source_cgal_program("Real_embeddable_traits_extension.cpp")
|
create_single_source_cgal_program("Real_embeddable_traits_extension.cpp")
|
||||||
if(RS_FOUND)
|
if(RS_FOUND)
|
||||||
create_single_source_cgal_program("Algebraic_kernel_rs_gmpq_d_1.cpp")
|
create_single_source_cgal_program("Algebraic_kernel_rs_gmpq_d_1.cpp")
|
||||||
|
|
@ -63,3 +64,6 @@ else()
|
||||||
STATUS
|
STATUS
|
||||||
"NOTICE: Some tests require the RS library, and will not be compiled.")
|
"NOTICE: Some tests require the RS library, and will not be compiled.")
|
||||||
endif()
|
endif()
|
||||||
|
else()
|
||||||
|
message(STATUS "NOTICE: Some tests require the CGAL_Core library, and will not be compiled.")
|
||||||
|
endif()
|
||||||
|
|
|
||||||
|
|
@ -30,19 +30,19 @@ namespace CGAL {
|
||||||
template <typename RT>
|
template <typename RT>
|
||||||
Comparison_result
|
Comparison_result
|
||||||
compare_x(const CGAL::Root_for_spheres_2_3<RT>& r1, const CGAL::Root_for_spheres_2_3<RT>& r2){
|
compare_x(const CGAL::Root_for_spheres_2_3<RT>& r1, const CGAL::Root_for_spheres_2_3<RT>& r2){
|
||||||
return compare(r1.x(), r2.x());
|
return CGAL::compare(r1.x(), r2.x());
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename RT>
|
template <typename RT>
|
||||||
Comparison_result
|
Comparison_result
|
||||||
compare_y(const CGAL::Root_for_spheres_2_3<RT>& r1, const CGAL::Root_for_spheres_2_3<RT>& r2){
|
compare_y(const CGAL::Root_for_spheres_2_3<RT>& r1, const CGAL::Root_for_spheres_2_3<RT>& r2){
|
||||||
return compare(r1.y(), r2.y());
|
return CGAL::compare(r1.y(), r2.y());
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename RT>
|
template <typename RT>
|
||||||
Comparison_result
|
Comparison_result
|
||||||
compare_z(const CGAL::Root_for_spheres_2_3<RT>& r1, const CGAL::Root_for_spheres_2_3<RT>& r2){
|
compare_z(const CGAL::Root_for_spheres_2_3<RT>& r1, const CGAL::Root_for_spheres_2_3<RT>& r2){
|
||||||
return compare(r1.z(), r2.z());
|
return CGAL::compare(r1.z(), r2.z());
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename RT>
|
template <typename RT>
|
||||||
|
|
|
||||||
|
|
@ -134,9 +134,8 @@ All \cgal kernels are models of both concepts.
|
||||||
|
|
||||||
The triangulation data structure of the triangulation
|
The triangulation data structure of the triangulation
|
||||||
has to be a model of the concept `TriangulationDataStructure_2`,
|
has to be a model of the concept `TriangulationDataStructure_2`,
|
||||||
and it must be parameterized with
|
whose vertex and face classes are models of the concepts
|
||||||
vertex and face classes which are models of the concepts
|
`AlphaShapeVertex_2` and `AlphaShapeFace_2`, respectively.
|
||||||
`AlphaShapeVertex_2` and `AlphaShapeFace_2`.
|
|
||||||
The classes `Alpha_shape_vertex_base_2<Gt, Vb>` and `Alpha_shape_face_base_2<Gt, Fb>`
|
The classes `Alpha_shape_vertex_base_2<Gt, Vb>` and `Alpha_shape_face_base_2<Gt, Fb>`
|
||||||
are models of these concepts and can be used for all type of alpha shapes,
|
are models of these concepts and can be used for all type of alpha shapes,
|
||||||
provided that the template parameters `Vb` and `Fb` are appropriately chosen,
|
provided that the template parameters `Vb` and `Fb` are appropriately chosen,
|
||||||
|
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
||||||
|
|
||||||
namespace CGAL {
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\ingroup PkgAlphaShapes2Ref
|
|
||||||
|
|
||||||
\deprecated The class is deprecated since \cgal 4.10, as the weighted point and the function
|
|
||||||
objects for weighted points are part of the concept `Kernel`. The class is kept for backward
|
|
||||||
compatibility.
|
|
||||||
|
|
||||||
The class `Weighted_alpha_shape_euclidean_traits_2` was the default model for the concept
|
|
||||||
`AlphaShapeTraits_2` for the regular version of Alpha Shapes.
|
|
||||||
|
|
||||||
\tparam K must be a model of `Kernel`.
|
|
||||||
|
|
||||||
\cgalModels `AlphaShapeTraits_2`
|
|
||||||
|
|
||||||
*/
|
|
||||||
template< typename K >
|
|
||||||
class Weighted_alpha_shape_euclidean_traits_2
|
|
||||||
: public K
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
}; /* end Weighted_alpha_shape_euclidean_traits_2 */
|
|
||||||
} /* end namespace CGAL */
|
|
||||||
|
|
@ -45,7 +45,7 @@ typedef unspecified_type FT;
|
||||||
/*!
|
/*!
|
||||||
A default constructor.
|
A default constructor.
|
||||||
*/
|
*/
|
||||||
AlphaShapeTraits_2();
|
WeightedAlphaShapeTraits_2();
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -70,12 +70,12 @@ finite number of different \f$ \alpha\f$-shapes and corresponding
|
||||||
|
|
||||||
\cgalCRPSection{Concepts}
|
\cgalCRPSection{Concepts}
|
||||||
- `AlphaShapeTraits_2`
|
- `AlphaShapeTraits_2`
|
||||||
|
- `WeightedAlphaShapeTraits_2`
|
||||||
- `AlphaShapeFace_2`
|
- `AlphaShapeFace_2`
|
||||||
- `AlphaShapeVertex_2`
|
- `AlphaShapeVertex_2`
|
||||||
|
|
||||||
\cgalCRPSection{Classes}
|
\cgalCRPSection{Classes}
|
||||||
- `CGAL::Alpha_shape_2<Dt>`
|
- `CGAL::Alpha_shape_2<Dt>`
|
||||||
- `CGAL::Weighted_alpha_shape_euclidean_traits_2<K>`
|
|
||||||
- `CGAL::Alpha_shape_vertex_base_2<AlphaShapeTraits_2>`
|
- `CGAL::Alpha_shape_vertex_base_2<AlphaShapeTraits_2>`
|
||||||
- `CGAL::Alpha_shape_face_base_2<AlphaShapeTraits_2, TriangulationFaceBase_2>`
|
- `CGAL::Alpha_shape_face_base_2<AlphaShapeTraits_2, TriangulationFaceBase_2>`
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
// Copyright (c) 1997 INRIA Sophia-Antipolis (France).
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// This file is part of CGAL (www.cgal.org).
|
|
||||||
//
|
|
||||||
// $URL$
|
|
||||||
// $Id$
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Author(s) : Tran Kai Frank DA <Frank.Da@sophia.inria.fr>
|
|
||||||
// Andreas Fabri <Andreas.Fabri@geometryfactory.com>
|
|
||||||
|
|
||||||
#ifndef CGAL_ALPHA_SHAPE_EUCLIDEAN_TRAITS_H
|
|
||||||
#define CGAL_ALPHA_SHAPE_EUCLIDEAN_TRAITS_H
|
|
||||||
|
|
||||||
#include <CGAL/license/Alpha_shapes_2.h>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace CGAL {
|
|
||||||
|
|
||||||
template < class R >
|
|
||||||
class Alpha_shape_euclidean_traits_2 : public R
|
|
||||||
{};
|
|
||||||
|
|
||||||
} //namespace CGAL
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
||||||
// Copyright (c) 1997 INRIA Sophia-Antipolis (France).
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// This file is part of CGAL (www.cgal.org).
|
|
||||||
//
|
|
||||||
// $URL$
|
|
||||||
// $Id$
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
|
|
||||||
//
|
|
||||||
// Author(s) : Tran Kai Frank DA <Frank.Da@sophia.inria.fr>
|
|
||||||
// Andreas Fabri <Andreas.Fabri@geometryfactory.com>
|
|
||||||
|
|
||||||
#ifndef CGAL_WEIGHTED_ALPHA_SHAPE_EUCLIDEAN_TRAITS_2_H
|
|
||||||
#define CGAL_WEIGHTED_ALPHA_SHAPE_EUCLIDEAN_TRAITS_2_H
|
|
||||||
|
|
||||||
#include <CGAL/license/Alpha_shapes_2.h>
|
|
||||||
|
|
||||||
#define CGAL_DEPRECATED_HEADER "<CGAL/Weighted_alpha_shape_euclidean_traits_2.h>"
|
|
||||||
#define CGAL_DEPRECATED_MESSAGE_DETAILS \
|
|
||||||
"The kernel K can be used directly as traits since weighted points and "\
|
|
||||||
"the associated function objects are now part of the concept Kernel."
|
|
||||||
#include <CGAL/internal/deprecation_warning.h>
|
|
||||||
|
|
||||||
namespace CGAL {
|
|
||||||
|
|
||||||
template< class K_ >
|
|
||||||
class Weighted_alpha_shape_euclidean_traits_2
|
|
||||||
: public K_
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Weighted_alpha_shape_euclidean_traits_2() { }
|
|
||||||
Weighted_alpha_shape_euclidean_traits_2(const K_& k) : K_(k) { }
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace CGAL
|
|
||||||
|
|
||||||
#endif // CGAL_WEIGHTED_ALPHA_SHAPE_EUCLIDEAN_TRAITS_2_H
|
|
||||||
|
|
@ -12,14 +12,6 @@ when alpha is given as an int.
|
||||||
Alpha_shape_3(Dt& dt, bool swap=true, NT alpha = 0, Mode m = REGULARIZED)
|
Alpha_shape_3(Dt& dt, bool swap=true, NT alpha = 0, Mode m = REGULARIZED)
|
||||||
The triangulation is swapped if swap=true and copied otherwise.
|
The triangulation is swapped if swap=true and copied otherwise.
|
||||||
|
|
||||||
- suppress the traits classes Alpha_shape_euclidean_traits_3.h
|
|
||||||
and Weighted_alpha_shape_euclidean_traits_3.h
|
|
||||||
their purpose was to rename the Compute_squared_radius_3 constructor.
|
|
||||||
The same can be achieved in class Alpha_shapes_3 using the Weighted_tag
|
|
||||||
of the triangulation
|
|
||||||
|
|
||||||
- same as previous for Alpha_shapes_2
|
|
||||||
|
|
||||||
- test the taking into account of paramater alpha in functions
|
- test the taking into account of paramater alpha in functions
|
||||||
get_alpha_shape_edges
|
get_alpha_shape_edges
|
||||||
get_alpha_shape_facets
|
get_alpha_shape_facets
|
||||||
|
|
|
||||||
|
|
@ -5,18 +5,16 @@
|
||||||
|
|
||||||
|
|
||||||
#include <CGAL/Qt/resources.h>
|
#include <CGAL/Qt/resources.h>
|
||||||
|
#include <CGAL/Qt/init_ogl_context.h>
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
QApplication application(argc,argv);
|
CGAL::Qt::init_ogl_context(4,3);
|
||||||
|
|
||||||
|
QApplication application(argc,argv);
|
||||||
application.setOrganizationDomain("geometryfactory.com");
|
application.setOrganizationDomain("geometryfactory.com");
|
||||||
application.setOrganizationName("GeometryFactory");
|
application.setOrganizationName("GeometryFactory");
|
||||||
application.setApplicationName("Alpha Shape Reconstruction");
|
application.setApplicationName("Alpha Shape Reconstruction");
|
||||||
//for Windows
|
|
||||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0))
|
|
||||||
application.setAttribute(Qt::AA_UseDesktopOpenGL);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Import resources from libCGALQt (Qt5).
|
// Import resources from libCGALQt (Qt5).
|
||||||
// See https://doc.qt.io/qt-5/qdir.html#Q_INIT_RESOURCE
|
// See https://doc.qt.io/qt-5/qdir.html#Q_INIT_RESOURCE
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ endif()
|
||||||
|
|
||||||
find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5)
|
find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5)
|
||||||
|
|
||||||
find_package(Qt5 QUIET COMPONENTS Xml Script OpenGL Svg)
|
find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg)
|
||||||
|
|
||||||
if(CGAL_Qt5_FOUND AND Qt5_FOUND)
|
if(CGAL_Qt5_FOUND AND Qt5_FOUND)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,14 +29,14 @@ void Viewer::compile_shaders()
|
||||||
//Vertex source code
|
//Vertex source code
|
||||||
const char vertex_source[] =
|
const char vertex_source[] =
|
||||||
{
|
{
|
||||||
"#version 120 \n"
|
"#version 150 \n"
|
||||||
"attribute highp vec4 vertex;\n"
|
"in highp vec4 vertex;\n"
|
||||||
"attribute highp vec3 normal;\n"
|
"in highp vec3 normal;\n"
|
||||||
|
|
||||||
"uniform highp mat4 mvp_matrix;\n"
|
"uniform highp mat4 mvp_matrix;\n"
|
||||||
"uniform highp mat4 mv_matrix; \n"
|
"uniform highp mat4 mv_matrix; \n"
|
||||||
"varying highp vec4 fP; \n"
|
"out highp vec4 fP; \n"
|
||||||
"varying highp vec3 fN; \n"
|
"out highp vec3 fN; \n"
|
||||||
"void main(void)\n"
|
"void main(void)\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" fP = mv_matrix * vertex; \n"
|
" fP = mv_matrix * vertex; \n"
|
||||||
|
|
@ -47,15 +47,16 @@ void Viewer::compile_shaders()
|
||||||
//Fragment source code
|
//Fragment source code
|
||||||
const char fragment_source[] =
|
const char fragment_source[] =
|
||||||
{
|
{
|
||||||
"#version 120 \n"
|
"#version 150 \n"
|
||||||
"varying highp vec4 fP; \n"
|
"in highp vec4 fP; \n"
|
||||||
"varying highp vec3 fN; \n"
|
"in highp vec3 fN; \n"
|
||||||
"uniform highp vec4 color; \n"
|
"uniform highp vec4 color; \n"
|
||||||
"uniform highp vec4 light_pos; \n"
|
"uniform highp vec4 light_pos; \n"
|
||||||
"uniform highp vec4 light_diff; \n"
|
"uniform highp vec4 light_diff; \n"
|
||||||
"uniform highp vec4 light_spec; \n"
|
"uniform highp vec4 light_spec; \n"
|
||||||
"uniform highp vec4 light_amb; \n"
|
"uniform highp vec4 light_amb; \n"
|
||||||
"uniform float spec_power ; \n"
|
"uniform float spec_power ; \n"
|
||||||
|
"out highp vec4 out_color; \n"
|
||||||
|
|
||||||
"void main(void) { \n"
|
"void main(void) { \n"
|
||||||
|
|
||||||
|
|
@ -70,7 +71,7 @@ void Viewer::compile_shaders()
|
||||||
" highp vec4 diffuse = abs(dot(N,L)) * light_diff * color; \n"
|
" highp vec4 diffuse = abs(dot(N,L)) * light_diff * color; \n"
|
||||||
" highp vec4 specular = pow(max(dot(R,V), 0.0), spec_power) * light_spec; \n"
|
" highp vec4 specular = pow(max(dot(R,V), 0.0), spec_power) * light_spec; \n"
|
||||||
|
|
||||||
"gl_FragColor = light_amb*color + diffuse + specular ; \n"
|
"out_color = light_amb*color + diffuse + specular ; \n"
|
||||||
"} \n"
|
"} \n"
|
||||||
"\n"
|
"\n"
|
||||||
};
|
};
|
||||||
|
|
@ -105,8 +106,8 @@ rendering_program.bind();
|
||||||
//Vertex source code
|
//Vertex source code
|
||||||
const char vertex_source_points[] =
|
const char vertex_source_points[] =
|
||||||
{
|
{
|
||||||
"#version 120 \n"
|
"#version 150 \n"
|
||||||
"attribute highp vec4 vertex;\n"
|
"in highp vec4 vertex;\n"
|
||||||
|
|
||||||
"uniform highp mat4 mvp_matrix;\n"
|
"uniform highp mat4 mvp_matrix;\n"
|
||||||
"uniform highp float point_size;\n"
|
"uniform highp float point_size;\n"
|
||||||
|
|
@ -119,11 +120,12 @@ const char vertex_source_points[] =
|
||||||
//Vertex source code
|
//Vertex source code
|
||||||
const char fragment_source_points[] =
|
const char fragment_source_points[] =
|
||||||
{
|
{
|
||||||
"#version 120 \n"
|
"#version 150 \n"
|
||||||
"uniform highp vec4 color; \n"
|
"uniform highp vec4 color; \n"
|
||||||
|
"out highp vec4 out_color; \n"
|
||||||
|
|
||||||
"void main(void) { \n"
|
"void main(void) { \n"
|
||||||
"gl_FragColor = color; \n"
|
"out_color = color; \n"
|
||||||
"} \n"
|
"} \n"
|
||||||
"\n"
|
"\n"
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ public:
|
||||||
Viewer(QWidget* parent);
|
Viewer(QWidget* parent);
|
||||||
~Viewer()
|
~Viewer()
|
||||||
{
|
{
|
||||||
|
makeCurrent();
|
||||||
buffers[0].destroy();
|
buffers[0].destroy();
|
||||||
buffers[1].destroy();
|
buffers[1].destroy();
|
||||||
buffers[2].destroy();
|
buffers[2].destroy();
|
||||||
|
|
|
||||||
|
|
@ -219,8 +219,8 @@ in the non-weighted case and `WeightedAlphaShapeTraits_3` in the weighted case.
|
||||||
All \cgal kernels are models of both concepts.
|
All \cgal kernels are models of both concepts.
|
||||||
|
|
||||||
The triangulation data structure of the triangulation
|
The triangulation data structure of the triangulation
|
||||||
has to be a model of the concept `TriangulationDataStructure_3`,
|
has to be a model of the concept `TriangulationDataStructure_3`
|
||||||
and it must be parameterized with vertex and cell classes, which are model of the concepts
|
whose vertex and cell classes are model of the concepts
|
||||||
`AlphaShapeVertex_3` and `AlphaShapeCell_3`.
|
`AlphaShapeVertex_3` and `AlphaShapeCell_3`.
|
||||||
The classes `Alpha_shape_vertex_base_3<Gt>` and `Alpha_shape_cell_base_3<Gt>`
|
The classes `Alpha_shape_vertex_base_3<Gt>` and `Alpha_shape_cell_base_3<Gt>`
|
||||||
are models of these concepts and can be used for all type of alpha shapes,
|
are models of these concepts and can be used for all type of alpha shapes,
|
||||||
|
|
@ -234,8 +234,8 @@ the traits class are described in the concepts `FixedAlphaShapeTraits_3`
|
||||||
in the non-weighted case and `FixedWeightedAlphaShapeTraits_3` in the weighted case.
|
in the non-weighted case and `FixedWeightedAlphaShapeTraits_3` in the weighted case.
|
||||||
All \cgal kernels are models of both concepts.
|
All \cgal kernels are models of both concepts.
|
||||||
The triangulation data structure of the triangulation
|
The triangulation data structure of the triangulation
|
||||||
has to be a model of the concept `TriangulationDataStructure_3`,
|
has to be a model of the concept `TriangulationDataStructure_3`
|
||||||
and it must be parameterized with vertex and cell classes, which are model of the concepts
|
whose vertex and cell classes are model of the concepts
|
||||||
`FixedAlphaShapeVertex_3` and `FixedAlphaShapeCell_3`.
|
`FixedAlphaShapeVertex_3` and `FixedAlphaShapeCell_3`.
|
||||||
The package provides models `Fixed_alpha_shape_vertex_base_3<Gt>`
|
The package provides models `Fixed_alpha_shape_vertex_base_3<Gt>`
|
||||||
and `Fixed_alpha_shape_cell_base_3<Gt>`, respectively.
|
and `Fixed_alpha_shape_cell_base_3<Gt>`, respectively.
|
||||||
|
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
||||||
// Copyright (c) 1997 INRIA Sophia-Antipolis (France).
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// This file is part of CGAL (www.cgal.org).
|
|
||||||
//
|
|
||||||
// $URL$
|
|
||||||
// $Id$
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Author(s) : Tran Kai Frank DA <Frank.Da@sophia.inria.fr>
|
|
||||||
|
|
||||||
#ifndef CGAL_ALPHA_SHAPE_EUCLIDEAN_TRAITS_3_H
|
|
||||||
#define CGAL_ALPHA_SHAPE_EUCLIDEAN_TRAITS_3_H
|
|
||||||
|
|
||||||
#include <CGAL/license/Alpha_shapes_3.h>
|
|
||||||
|
|
||||||
|
|
||||||
namespace CGAL {
|
|
||||||
|
|
||||||
template <class K>
|
|
||||||
class Alpha_shape_euclidean_traits_3 : public K {};
|
|
||||||
|
|
||||||
|
|
||||||
} //namespace CGAL
|
|
||||||
|
|
||||||
#endif //CGAL_ALPHA_SHAPE_EUCLIDEAN_TRAITS_3_H
|
|
||||||
|
|
@ -1,36 +0,0 @@
|
||||||
// Copyright (c) 1997 INRIA Sophia-Antipolis (France).
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// This file is part of CGAL (www.cgal.org).
|
|
||||||
//
|
|
||||||
// $URL$
|
|
||||||
// $Id$
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
|
|
||||||
//
|
|
||||||
// Author(s) : Tran Kai Frank DA <Frank.Da@sophia.inria.fr>
|
|
||||||
|
|
||||||
#ifndef CGAL_WEIGHTED_ALPHA_SHAPE_EUCLIDEAN_TRAITS_3_H
|
|
||||||
#define CGAL_WEIGHTED_ALPHA_SHAPE_EUCLIDEAN_TRAITS_3_H
|
|
||||||
|
|
||||||
#include <CGAL/license/Alpha_shapes_3.h>
|
|
||||||
|
|
||||||
#define CGAL_DEPRECATED_HEADER "<CGAL/Weighted_alpha_shape_euclidean_traits_3.h>"
|
|
||||||
#define CGAL_DEPRECATED_MESSAGE_DETAILS \
|
|
||||||
"The kernel K can be used directly as traits since weighted points and "\
|
|
||||||
"the associated function objects are now part of the concept Kernel."
|
|
||||||
#include <CGAL/internal/deprecation_warning.h>
|
|
||||||
|
|
||||||
namespace CGAL {
|
|
||||||
|
|
||||||
template < class K_ >
|
|
||||||
class Weighted_alpha_shape_euclidean_traits_3
|
|
||||||
: public K_
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Weighted_alpha_shape_euclidean_traits_3() { }
|
|
||||||
Weighted_alpha_shape_euclidean_traits_3(const K_& k) : K_(k) { }
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace CGAL
|
|
||||||
|
|
||||||
#endif // CGAL_WEIGHTED_ALPHA_SHAPE_EUCLIDEAN_TRAITS_3_H
|
|
||||||
|
|
@ -181,7 +181,7 @@ two visible circles.
|
||||||
|
|
||||||
The 2D Apollonius graph class
|
The 2D Apollonius graph class
|
||||||
`Apollonius_graph_2<ApolloniusGraphTraits_2,ApolloniusGraphDataStructure_2>`
|
`Apollonius_graph_2<ApolloniusGraphTraits_2,ApolloniusGraphDataStructure_2>`
|
||||||
follows the design of the triangulation package of \cgal. It is
|
follows the design of the triangulation packages of \cgal. It is
|
||||||
parametrized by two arguments:
|
parametrized by two arguments:
|
||||||
<UL>
|
<UL>
|
||||||
<LI>the <B>geometric traits</B> class. It provides the basic
|
<LI>the <B>geometric traits</B> class. It provides the basic
|
||||||
|
|
|
||||||
|
|
@ -4,14 +4,20 @@ namespace CGAL {
|
||||||
/*!
|
/*!
|
||||||
\ingroup PkgApolloniusGraph2Ref
|
\ingroup PkgApolloniusGraph2Ref
|
||||||
|
|
||||||
The class `Apollonius_graph_2` represents the
|
The class `Apollonius_graph_2` represents the Apollonius graph.
|
||||||
Apollonius graph. It supports insertions and deletions of sites.
|
It supports insertions and deletions of sites.
|
||||||
It is templated by two template arguments `Gt`, which
|
|
||||||
must be a model of `ApolloniusGraphTraits_2`, and `Agds`,
|
\tparam Gt is the geometric traits class and must be a model of `ApolloniusGraphTraits_2`.
|
||||||
which must be a model of `ApolloniusGraphDataStructure_2`.
|
|
||||||
The second template argument defaults to
|
\tparam Agds is the Apollonius graph data structure and must be a model of `ApolloniusGraphDataStructure_2`
|
||||||
`CGAL::Triangulation_data_structure_2< CGAL::Apollonius_graph_vertex_base_2<Gt,true>, CGAL::Triangulation_face_base_2<Gt> >`.
|
whose vertex and face must be models of `ApolloniusGraphVertexBase_2` and `TriangulationFaceBase_2`,
|
||||||
\cgalModels `DelaunayGraph_2`
|
respectively.
|
||||||
|
It defaults to:
|
||||||
|
\code
|
||||||
|
CGAL::Triangulation_data_structure_2<
|
||||||
|
CGAL::Apollonius_graph_vertex_base_2<Gt,true>,
|
||||||
|
CGAL::Triangulation_face_base_2<Gt> >`
|
||||||
|
\endcode
|
||||||
|
|
||||||
\cgalHeading{Traversal of the Apollonius Graph}
|
\cgalHeading{Traversal of the Apollonius Graph}
|
||||||
|
|
||||||
|
|
@ -40,17 +46,11 @@ ag.incident_edges(ag.infinite_vertex());
|
||||||
ag.incident_edges(ag.infinite_vertex(), f);
|
ag.incident_edges(ag.infinite_vertex(), f);
|
||||||
\endcode
|
\endcode
|
||||||
|
|
||||||
\sa `DelaunayGraph_2`
|
\cgalModels `DelaunayGraph_2`
|
||||||
\sa `ApolloniusGraphTraits_2`
|
|
||||||
\sa `ApolloniusGraphDataStructure_2`
|
|
||||||
\sa `ApolloniusGraphVertexBase_2`
|
|
||||||
\sa `TriangulationFaceBase_2`
|
|
||||||
\sa `CGAL::Apollonius_graph_traits_2<K,Method_tag>`
|
\sa `CGAL::Apollonius_graph_traits_2<K,Method_tag>`
|
||||||
\sa `CGAL::Apollonius_graph_filtered_traits_2<CK,CM,EK,EM,FK,FM>`
|
\sa `CGAL::Apollonius_graph_filtered_traits_2<CK,CM,EK,EM,FK,FM>`
|
||||||
\sa `CGAL::Triangulation_data_structure_2<Vb,Fb>`
|
\sa `CGAL::Apollonius_graph_hierarchy_2<Gt,Agds>`
|
||||||
\sa `CGAL::Apollonius_graph_vertex_base_2<Gt,StoreHidden>`
|
|
||||||
\sa `CGAL::Triangulation_face_base_2<Gt>`
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
template< typename Gt, typename Agds >
|
template< typename Gt, typename Agds >
|
||||||
class Apollonius_graph_2 {
|
class Apollonius_graph_2 {
|
||||||
|
|
@ -92,7 +92,7 @@ typedef Gt::Site_2 Site_2;
|
||||||
|
|
||||||
/// \name Handles And Iterators
|
/// \name Handles And Iterators
|
||||||
/// The vertices and faces of the Apollonius graph are accessed
|
/// The vertices and faces of the Apollonius graph are accessed
|
||||||
/// through `handles`, `iterators` and `circulators`. The iterators
|
/// through `handles`, `iterators`, and `circulators`. The iterators
|
||||||
/// and circulators are all bidirectional and non-mutable. The
|
/// and circulators are all bidirectional and non-mutable. The
|
||||||
/// circulators and iterators are assignable to the corresponding
|
/// circulators and iterators are assignable to the corresponding
|
||||||
/// handle types, and they are also convertible to the corresponding
|
/// handle types, and they are also convertible to the corresponding
|
||||||
|
|
@ -261,63 +261,62 @@ operator=(const Apollonius_graph_2<Gt,Agds>& other);
|
||||||
/*!
|
/*!
|
||||||
Returns a reference to the Apollonius graph traits object.
|
Returns a reference to the Apollonius graph traits object.
|
||||||
*/
|
*/
|
||||||
Geom_traits geom_traits();
|
const Geom_traits& geom_traits() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Returns a reference to the
|
Returns a reference to the
|
||||||
underlying data structure.
|
underlying data structure.
|
||||||
*/
|
*/
|
||||||
Data_structure data_structure();
|
const Data_structure& data_structure() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Same as `data_structure()`. This
|
Same as `data_structure()`. This
|
||||||
method has been added in compliance with the `DelaunayGraph_2`
|
method has been added in compliance with the `DelaunayGraph_2`
|
||||||
concept.
|
concept.
|
||||||
*/
|
*/
|
||||||
Data_structure tds();
|
const Data_structure& tds() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Returns the dimension of the Apollonius graph.
|
Returns the dimension of the Apollonius graph.
|
||||||
*/
|
*/
|
||||||
int dimension();
|
int dimension() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Returns the number of finite vertices.
|
Returns the number of finite vertices.
|
||||||
*/
|
*/
|
||||||
size_type number_of_vertices();
|
size_type number_of_vertices() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Returns the number of visible sites.
|
Returns the number of visible sites.
|
||||||
*/
|
*/
|
||||||
size_type number_of_visible_sites();
|
size_type number_of_visible_sites() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Returns the number of hidden sites.
|
Returns the number of hidden sites.
|
||||||
*/
|
*/
|
||||||
size_type number_of_hidden_sites();
|
size_type number_of_hidden_sites() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Returns the number of faces (both finite and infinite) of the
|
Returns the number of faces (both finite and infinite) of the
|
||||||
Apollonius graph.
|
Apollonius graph.
|
||||||
*/
|
*/
|
||||||
size_type number_of_faces();
|
size_type number_of_faces() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Returns a face incident to the `infinite_vertex`.
|
Returns a face incident to the `infinite_vertex`.
|
||||||
*/
|
*/
|
||||||
Face_handle infinite_face();
|
Face_handle infinite_face() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Returns the `infinite_vertex`.
|
Returns the `infinite_vertex`.
|
||||||
*/
|
*/
|
||||||
Vertex_handle
|
Vertex_handle infinite_vertex() const;
|
||||||
infinite_vertex();
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Returns a vertex distinct from the `infinite_vertex`.
|
Returns a vertex distinct from the `infinite_vertex`.
|
||||||
\pre The number of (visible) vertices in the Apollonius graph must be at least one.
|
\pre The number of (visible) vertices in the Apollonius graph must be at least one.
|
||||||
*/
|
*/
|
||||||
Vertex_handle finite_vertex();
|
Vertex_handle finite_vertex() const;
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
|
@ -337,63 +336,62 @@ Vertex_handle finite_vertex();
|
||||||
/*!
|
/*!
|
||||||
Starts at an arbitrary finite vertex.
|
Starts at an arbitrary finite vertex.
|
||||||
*/
|
*/
|
||||||
Finite_vertices_iterator finite_vertices_begin();
|
Finite_vertices_iterator finite_vertices_begin() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Past-the-end iterator.
|
Past-the-end iterator.
|
||||||
*/
|
*/
|
||||||
Finite_vertices_iterator finite_vertices_end();
|
Finite_vertices_iterator finite_vertices_end() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Starts at an arbitrary finite edge.
|
Starts at an arbitrary finite edge.
|
||||||
*/
|
*/
|
||||||
Finite_edges_iterator finite_edges_begin();
|
Finite_edges_iterator finite_edges_begin() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Past-the-end iterator.
|
Past-the-end iterator.
|
||||||
*/
|
*/
|
||||||
Finite_edges_iterator finite_edges_end();
|
Finite_edges_iterator finite_edges_end() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Starts at an arbitrary finite face.
|
Starts at an arbitrary finite face.
|
||||||
*/
|
*/
|
||||||
Finite_faces_iterator finite_faces_begin();
|
Finite_faces_iterator finite_faces_begin() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Past-the-end iterator.
|
Past-the-end iterator.
|
||||||
*/
|
*/
|
||||||
Finite_faces_iterator finite_faces_end()
|
Finite_faces_iterator finite_faces_end() const;
|
||||||
const;
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Starts at an arbitrary vertex.
|
Starts at an arbitrary vertex.
|
||||||
*/
|
*/
|
||||||
All_vertices_iterator all_vertices_begin();
|
All_vertices_iterator all_vertices_begin() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Past-the-end iterator.
|
Past-the-end iterator.
|
||||||
*/
|
*/
|
||||||
All_vertices_iterator all_vertices_end();
|
All_vertices_iterator all_vertices_end() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Starts at an arbitrary edge.
|
Starts at an arbitrary edge.
|
||||||
*/
|
*/
|
||||||
All_edges_iterator all_edges_begin();
|
All_edges_iterator all_edges_begin() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Past-the-end iterator.
|
Past-the-end iterator.
|
||||||
*/
|
*/
|
||||||
All_edges_iterator all_edges_end();
|
All_edges_iterator all_edges_end() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Starts at an arbitrary face.
|
Starts at an arbitrary face.
|
||||||
*/
|
*/
|
||||||
All_faces_iterator all_faces_begin();
|
All_faces_iterator all_faces_begin() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Past-the-end iterator.
|
Past-the-end iterator.
|
||||||
*/
|
*/
|
||||||
All_faces_iterator all_faces_end();
|
All_faces_iterator all_faces_end() const;
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
|
@ -407,32 +405,32 @@ All_faces_iterator all_faces_end();
|
||||||
/*!
|
/*!
|
||||||
Starts at an arbitrary site.
|
Starts at an arbitrary site.
|
||||||
*/
|
*/
|
||||||
Sites_iterator sites_begin();
|
Sites_iterator sites_begin() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Past-the-end iterator.
|
Past-the-end iterator.
|
||||||
*/
|
*/
|
||||||
Sites_iterator sites_end();
|
Sites_iterator sites_end() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Starts at an arbitrary visible site.
|
Starts at an arbitrary visible site.
|
||||||
*/
|
*/
|
||||||
Visible_sites_iterator visible_sites_begin();
|
Visible_sites_iterator visible_sites_begin() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Past-the-end iterator.
|
Past-the-end iterator.
|
||||||
*/
|
*/
|
||||||
Visible_sites_iterator visible_sites_end();
|
Visible_sites_iterator visible_sites_end() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Starts at an arbitrary hidden site.
|
Starts at an arbitrary hidden site.
|
||||||
*/
|
*/
|
||||||
Hidden_sites_iterator hidden_sites_begin();
|
Hidden_sites_iterator hidden_sites_begin() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Past-the-end iterator.
|
Past-the-end iterator.
|
||||||
*/
|
*/
|
||||||
Hidden_sites_iterator hidden_sites_end();
|
Hidden_sites_iterator hidden_sites_end() const;
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
|
@ -454,39 +452,39 @@ Hidden_sites_iterator hidden_sites_end();
|
||||||
Starts at an arbitrary face incident
|
Starts at an arbitrary face incident
|
||||||
to `v`.
|
to `v`.
|
||||||
*/
|
*/
|
||||||
Face_circulator incident_faces(Vertex_handle v);
|
Face_circulator incident_faces(Vertex_handle v) const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Starts at face `f`.
|
Starts at face `f`.
|
||||||
\pre Face `f` is incident to vertex `v`.
|
\pre Face `f` is incident to vertex `v`.
|
||||||
*/
|
*/
|
||||||
Face_circulator incident_faces(Vertex_handle v, Face_handle f);
|
Face_circulator incident_faces(Vertex_handle v, Face_handle f) const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Starts at an arbitrary edge incident
|
Starts at an arbitrary edge incident
|
||||||
to `v`.
|
to `v`.
|
||||||
*/
|
*/
|
||||||
Edge_circulator incident_edges(Vertex_handle v);
|
Edge_circulator incident_edges(Vertex_handle v) const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Starts at the first edge of `f` incident to
|
Starts at the first edge of `f` incident to
|
||||||
`v`, in counterclockwise order around `v`.
|
`v`, in counterclockwise order around `v`.
|
||||||
\pre Face `f` is incident to vertex `v`.
|
\pre Face `f` is incident to vertex `v`.
|
||||||
*/
|
*/
|
||||||
Edge_circulator incident_edges(Vertex_handle v, Face_handle f);
|
Edge_circulator incident_edges(Vertex_handle v, Face_handle f) const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Starts at an arbitrary vertex incident
|
Starts at an arbitrary vertex incident
|
||||||
to `v`.
|
to `v`.
|
||||||
*/
|
*/
|
||||||
Vertex_circulator incident_vertices(Vertex_handle v);
|
Vertex_circulator incident_vertices(Vertex_handle v) const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Starts at the first vertex of `f` adjacent to `v`
|
Starts at the first vertex of `f` adjacent to `v`
|
||||||
in counterclockwise order around `v`.
|
in counterclockwise order around `v`.
|
||||||
\pre Face `f` is incident to vertex `v`.
|
\pre Face `f` is incident to vertex `v`.
|
||||||
*/
|
*/
|
||||||
Vertex_circulator incident_vertices(Vertex_handle v, Face_handle f);
|
Vertex_circulator incident_vertices(Vertex_handle v, Face_handle f) const;
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
|
@ -516,7 +514,7 @@ bool is_infinite(Face_handle f, int i) const;
|
||||||
`true`, iff edge `e` is infinite.
|
`true`, iff edge `e` is infinite.
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
is_infinite(Edge e) const;
|
is_infinite(const Edge& e) const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
`true`, iff edge `*ec` is infinite.
|
`true`, iff edge `*ec` is infinite.
|
||||||
|
|
@ -544,7 +542,7 @@ site `s` in the Apollonius graph. If `s` is visible then the
|
||||||
vertex handle of `s` is returned, otherwise
|
vertex handle of `s` is returned, otherwise
|
||||||
`Vertex_handle(nullptr)` is returned.
|
`Vertex_handle(nullptr)` is returned.
|
||||||
*/
|
*/
|
||||||
Vertex_handle insert(Site_2 s);
|
Vertex_handle insert(const Site_2& s);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Inserts `s` in the Apollonius graph using the site
|
Inserts `s` in the Apollonius graph using the site
|
||||||
|
|
@ -553,8 +551,7 @@ the center of `s`. If `s` is visible then the vertex handle of
|
||||||
`s` is returned, otherwise `Vertex_handle(nullptr)` is
|
`s` is returned, otherwise `Vertex_handle(nullptr)` is
|
||||||
returned.
|
returned.
|
||||||
*/
|
*/
|
||||||
Vertex_handle insert(Site_2 s, Vertex_handle
|
Vertex_handle insert(const Site_2& s, Vertex_handle vnear);
|
||||||
vnear);
|
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
|
@ -581,7 +578,7 @@ arbitrarily and one of the nearest neighbors of `p` is
|
||||||
returned. If there are no visible sites in the Apollonius diagram
|
returned. If there are no visible sites in the Apollonius diagram
|
||||||
`Vertex_handle(nullptr)` is returned.
|
`Vertex_handle(nullptr)` is returned.
|
||||||
*/
|
*/
|
||||||
Vertex_handle nearest_neighbor(Point_2 p);
|
Vertex_handle nearest_neighbor(const Point_2& p) const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Finds the nearest neighbor of the point
|
Finds the nearest neighbor of the point
|
||||||
|
|
@ -591,8 +588,7 @@ arbitrarily and one of the nearest neighbors of `p` is
|
||||||
returned. If there are no visible sites in the Apollonius diagram
|
returned. If there are no visible sites in the Apollonius diagram
|
||||||
`Vertex_handle(nullptr)` is returned.
|
`Vertex_handle(nullptr)` is returned.
|
||||||
*/
|
*/
|
||||||
Vertex_handle nearest_neighbor(Point_2 p,
|
Vertex_handle nearest_neighbor(const Point_2& p, Vertex_handle vnear) const;
|
||||||
Vertex_handle vnear);
|
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
|
@ -645,7 +641,7 @@ the stream `str`.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
template< class Stream >
|
template< class Stream >
|
||||||
Stream& draw_primal(Stream& str);
|
Stream& draw_primal(Stream& str) const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Draws the dual of the
|
Draws the dual of the
|
||||||
|
|
@ -658,7 +654,7 @@ Apollonius graph, i.e., the Apollonius diagram, to the stream
|
||||||
|
|
||||||
*/
|
*/
|
||||||
template < class Stream >
|
template < class Stream >
|
||||||
Stream& draw_dual(Stream& str);
|
Stream& draw_dual(Stream& str) const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Draws the edge
|
Draws the edge
|
||||||
|
|
@ -669,7 +665,7 @@ Draws the edge
|
||||||
|
|
||||||
*/
|
*/
|
||||||
template< class Stream >
|
template< class Stream >
|
||||||
Stream& draw_primal_edge(Edge e, Stream& str);
|
Stream& draw_primal_edge(const Edge& e, Stream& str) const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Draws the dual of the
|
Draws the dual of the
|
||||||
|
|
@ -682,7 +678,7 @@ of the Apollonius diagram.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
template< class Stream >
|
template< class Stream >
|
||||||
Stream& draw_dual_edge(Edge e, Stream& str);
|
Stream& draw_dual_edge(const Edge& e, Stream& str) const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Writes the current
|
Writes the current
|
||||||
|
|
@ -690,7 +686,7 @@ state of the Apollonius graph to an output stream. In particular,
|
||||||
all visible and hidden sites are written as well as the
|
all visible and hidden sites are written as well as the
|
||||||
underlying combinatorial data structure.
|
underlying combinatorial data structure.
|
||||||
*/
|
*/
|
||||||
void file_output(std::ostream& os);
|
void file_output(std::ostream& os) const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Reads the state of the
|
Reads the state of the
|
||||||
|
|
@ -701,14 +697,12 @@ void file_input(std::istream& is);
|
||||||
/*!
|
/*!
|
||||||
Writes the current state of the Apollonius graph to an output stream.
|
Writes the current state of the Apollonius graph to an output stream.
|
||||||
*/
|
*/
|
||||||
std::ostream& operator<<(std::ostream& os,
|
std::ostream& operator<<(std::ostream& os, const Apollonius_graph_2<Gt,Agds>& ag) const;
|
||||||
Apollonius_graph_2<Gt,Agds> ag);
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Reads the state of the Apollonius graph from an input stream.
|
Reads the state of the Apollonius graph from an input stream.
|
||||||
*/
|
*/
|
||||||
std::istream& operator>>(std::istream& is,
|
std::istream& operator>>(std::istream& is, const Apollonius_graph_2<Gt,Agds>& ag);
|
||||||
Apollonius_graph_2<Gt,Agds> ag);
|
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
|
@ -721,9 +715,9 @@ Checks the validity of the Apollonius graph. If `verbose` is
|
||||||
is 0, only the data structure is validated. If `level` is 1, then
|
is 0, only the data structure is validated. If `level` is 1, then
|
||||||
both the data structure and the Apollonius graph are
|
both the data structure and the Apollonius graph are
|
||||||
validated. Negative values of `level` always return true, and
|
validated. Negative values of `level` always return true, and
|
||||||
values greater then 1 are equivalent to `level` being 1.
|
values greater than 1 are equivalent to `level` being 1.
|
||||||
*/
|
*/
|
||||||
bool is_valid(bool verbose = false, int level = 1);
|
bool is_valid(bool verbose = false, int level = 1) const;
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
|
@ -737,12 +731,11 @@ void clear();
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
The Apollonius graphs
|
The Apollonius graphs
|
||||||
`other` and `ag` are swapped. `ag`.`swap(other)` should
|
`other` and `ag` are swapped. `ag.swap(other)` should
|
||||||
be preferred to `ag`` = other` or to `ag``(other)` if
|
be preferred to `ag = other` or to `ag(other)` if
|
||||||
`other` is deleted afterwards.
|
`other` is deleted afterwards.
|
||||||
*/
|
*/
|
||||||
void swap(Apollonius_graph_2<Gt,Agds>
|
void swap(Apollonius_graph_2<Gt,Agds>& other);
|
||||||
other);
|
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,36 +19,34 @@ find the nearest neighbor of \f$ p\f$ as in the
|
||||||
we use the nearest neighbor found at level \f$ i+1\f$ to find the nearest
|
we use the nearest neighbor found at level \f$ i+1\f$ to find the nearest
|
||||||
neighbor at level \f$ i\f$. This is a variant of the corresponding
|
neighbor at level \f$ i\f$. This is a variant of the corresponding
|
||||||
hierarchy for points found in \cgalCite{d-iirdt-98}.
|
hierarchy for points found in \cgalCite{d-iirdt-98}.
|
||||||
|
|
||||||
The class has two template parameters which have essentially the same
|
The class has two template parameters which have essentially the same
|
||||||
meaning as in the `Apollonius_graph_2<Gt,Agds>` class. The first
|
meaning as in the `Apollonius_graph_2<Gt,Agds>` class.
|
||||||
template parameter must be a model of the
|
|
||||||
`ApolloniusGraphTraits_2` concept.
|
\tparam Gt is the geometric traits class and must be a model of `ApolloniusGraphTraits_2`.
|
||||||
The second template parameter must be a model of the
|
|
||||||
`ApolloniusGraphDataStructure_2` concept. However, the vertex base
|
\tparam Agds is the Apollonius graph data structure and must be a model of `ApolloniusGraphDataStructure_2`
|
||||||
class that is to be used in the Apollonius graph data structure must
|
whose vertex and face must be models of `ApolloniusGraphHierarchyVertexBase_2` and `TriangulationFaceBase_2`, respectively.
|
||||||
be a model of the `ApolloniusGraphHierarchyVertexBase_2` concept.
|
It defaults to:
|
||||||
The second template parameter defaults to
|
\code
|
||||||
`Triangulation_data_structure_2< Apollonius_graph_hierarchy_vertex_base_2< Apollonius_graph_vertex_base_2<Gt,true> >, Triangulation_face_base_2<Gt> >`.
|
CGAL::Triangulation_data_structure_2<
|
||||||
|
CGAL::Apollonius_graph_hierarchy_vertex_base_2<CGAL::Apollonius_graph_vertex_base_2<Gt,true> >,
|
||||||
|
CGAL::Triangulation_face_base_2<Gt> >
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
\cgalHeading{Heritage}
|
||||||
|
|
||||||
The `Apollonius_graph_hierarchy_2` class derives publicly from the
|
The `Apollonius_graph_hierarchy_2` class derives publicly from the
|
||||||
`Apollonius_graph_2<Gt,Agds>` class. The interface is
|
`Apollonius_graph_2<Gt,Agds>` class. The interface is
|
||||||
the same with its base class. In the sequel only the methods
|
the same with its base class. In the sequel only the methods
|
||||||
overridden are documented.
|
overridden are documented.
|
||||||
|
|
||||||
\cgalHeading{Types}
|
|
||||||
|
|
||||||
`Apollonius_graph_hierarchy_2` does not introduce other types than those introduced by
|
`Apollonius_graph_hierarchy_2` does not introduce other types than those introduced by
|
||||||
its base class `Apollonius_graph_2<Gt,Agds>`.
|
its base class `Apollonius_graph_2<Gt,Agds>`.
|
||||||
|
|
||||||
\sa `ApolloniusGraphDataStructure_2`
|
|
||||||
\sa `ApolloniusGraphTraits_2`
|
|
||||||
\sa `ApolloniusGraphHierarchyVertexBase_2`
|
|
||||||
\sa `CGAL::Apollonius_graph_2<Gt,Agds>`
|
\sa `CGAL::Apollonius_graph_2<Gt,Agds>`
|
||||||
\sa `CGAL::Triangulation_data_structure_2<Vb,Fb>`
|
|
||||||
\sa `CGAL::Apollonius_graph_traits_2<K,Method_tag>`
|
\sa `CGAL::Apollonius_graph_traits_2<K,Method_tag>`
|
||||||
\sa `CGAL::Apollonius_graph_filtered_traits_2<CK,CM,EK,EM,FK,FM>`
|
\sa `CGAL::Apollonius_graph_filtered_traits_2<CK,CM,EK,EM,FK,FM>`
|
||||||
\sa `CGAL::Apollonius_graph_hierarchy_vertex_base_2<Agvb>`
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
template< typename Gt, typename Agds >
|
template< typename Gt, typename Agds >
|
||||||
class Apollonius_graph_hierarchy_2 : public CGAL::Apollonius_graph_2<Gt,Agds> {
|
class Apollonius_graph_hierarchy_2 : public CGAL::Apollonius_graph_2<Gt,Agds> {
|
||||||
|
|
@ -61,8 +59,7 @@ public:
|
||||||
Creates an hierarchy of Apollonius graphs using `gt` as
|
Creates an hierarchy of Apollonius graphs using `gt` as
|
||||||
geometric traits.
|
geometric traits.
|
||||||
*/
|
*/
|
||||||
Apollonius_graph_hierarchy_2(Gt
|
Apollonius_graph_hierarchy_2(Gt gt=Gt());
|
||||||
gt=Gt());
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Creates an Apollonius graph hierarchy using
|
Creates an Apollonius graph hierarchy using
|
||||||
|
|
@ -70,17 +67,15 @@ Creates an Apollonius graph hierarchy using
|
||||||
range [`first`, `beyond`).
|
range [`first`, `beyond`).
|
||||||
*/
|
*/
|
||||||
template< class Input_iterator >
|
template< class Input_iterator >
|
||||||
Apollonius_graph_hierarchy_2<Gt,Agds>(Input_iterator
|
Apollonius_graph_hierarchy_2(Input_iterator first, Input_iterator beyond, Gt gt=Gt());
|
||||||
first, Input_iterator beyond, Gt gt=Gt());
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Copy constructor. All faces, vertices and inter-level pointers
|
Copy constructor. All faces, vertices, and inter-level pointers
|
||||||
are duplicated. After the construction, `agh` and `other` refer
|
are duplicated. After the construction, `agh` and `other` refer
|
||||||
to two different Apollonius graph hierarchies: if
|
to two different Apollonius graph hierarchies: if
|
||||||
`other` is modified, `agh` is not.
|
`other` is modified, `agh` is not.
|
||||||
*/
|
*/
|
||||||
Apollonius_graph_hierarchy_2<Gt,Agds>
|
Apollonius_graph_hierarchy_2(const Apollonius_graph_hierarchy_2<Gt,Agds>& other);
|
||||||
(Apollonius_graph_hierarchy_2<Gt,Agds> other);
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Assignment. All faces, vertices and inter-level pointers
|
Assignment. All faces, vertices and inter-level pointers
|
||||||
|
|
@ -112,7 +107,7 @@ site `s` in the Apollonius graph hierarchy. If `s`
|
||||||
is visible then the vertex handle of `s` is returned, otherwise
|
is visible then the vertex handle of `s` is returned, otherwise
|
||||||
`Vertex_handle(nullptr)` is returned.
|
`Vertex_handle(nullptr)` is returned.
|
||||||
*/
|
*/
|
||||||
Vertex_handle insert(Site_2 s);
|
Vertex_handle insert(const Site_2& s);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Inserts `s` in the Apollonius graph hierarchy using the
|
Inserts `s` in the Apollonius graph hierarchy using the
|
||||||
|
|
@ -124,8 +119,7 @@ A call to this method is equivalent to `agh.insert(s);` and it has
|
||||||
been added for the sake of conformity with the interface of the
|
been added for the sake of conformity with the interface of the
|
||||||
`Apollonius_graph_2<Gt,Agds>` class.
|
`Apollonius_graph_2<Gt,Agds>` class.
|
||||||
*/
|
*/
|
||||||
Vertex_handle insert(Site_2 s, Vertex_handle
|
Vertex_handle insert(const Site_2& s, Vertex_handle vnear);
|
||||||
vnear);
|
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
|
@ -152,7 +146,7 @@ arbitrarily and one of the nearest neighbors of `p` is
|
||||||
returned. If there are no visible sites in the Apollonius diagram
|
returned. If there are no visible sites in the Apollonius diagram
|
||||||
`Vertex_handle(nullptr)` is returned.
|
`Vertex_handle(nullptr)` is returned.
|
||||||
*/
|
*/
|
||||||
Vertex_handle nearest_neighbor(Point p);
|
Vertex_handle nearest_neighbor(const Point_2& p) const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Finds the nearest neighbor of the point
|
Finds the nearest neighbor of the point
|
||||||
|
|
@ -163,8 +157,7 @@ A call to this method is equivalent to
|
||||||
conformity with the interface of the
|
conformity with the interface of the
|
||||||
`Apollonius_graph_2<Gt,Agds>` class.
|
`Apollonius_graph_2<Gt,Agds>` class.
|
||||||
*/
|
*/
|
||||||
Vertex_handle nearest_neighbor(Point p,
|
Vertex_handle nearest_neighbor(const Point_2& p, Vertex_handle vnear) const;
|
||||||
Vertex_handle vnear);
|
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
|
@ -177,7 +170,7 @@ state of the Apollonius graph hierarchy to an output stream. In particular,
|
||||||
all visible and hidden sites are written as well as the
|
all visible and hidden sites are written as well as the
|
||||||
underlying combinatorial hierarchical data structure.
|
underlying combinatorial hierarchical data structure.
|
||||||
*/
|
*/
|
||||||
void file_output(std::ostream& os);
|
void file_output(std::ostream& os) const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Reads the state of the
|
Reads the state of the
|
||||||
|
|
@ -189,7 +182,7 @@ void file_input(std::istream& is);
|
||||||
Writes the current state of the Apollonius graph hierarchy to an
|
Writes the current state of the Apollonius graph hierarchy to an
|
||||||
output stream.
|
output stream.
|
||||||
*/
|
*/
|
||||||
std::ostream& operator<<(std::ostream& os, Apollonius_graph_hierarchy_2<Gt,Agds> agh);
|
std::ostream& operator<<(std::ostream& os, Apollonius_graph_hierarchy_2<Gt,Agds> agh) const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Reads the state of the Apollonius graph hierarchy from an input stream.
|
Reads the state of the Apollonius graph hierarchy from an input stream.
|
||||||
|
|
@ -209,7 +202,7 @@ is validated, as well as the inter-level pointers. If `level` is
|
||||||
1, then the data structure at all levels is validated, the inter-level
|
1, then the data structure at all levels is validated, the inter-level
|
||||||
pointers are validated and all levels of the Apollonius graph
|
pointers are validated and all levels of the Apollonius graph
|
||||||
hierarchy are also validated. Negative values of `level` always
|
hierarchy are also validated. Negative values of `level` always
|
||||||
return `true`, and values greater then 1 are equivalent to
|
return `true`, and values greater than 1 are equivalent to
|
||||||
`level` being 1.
|
`level` being 1.
|
||||||
*/
|
*/
|
||||||
bool is_valid(bool verbose = false, int level = 1) const;
|
bool is_valid(bool verbose = false, int level = 1) const;
|
||||||
|
|
@ -227,11 +220,10 @@ void clear();
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
The Apollonius graph hierarchies `other` and `agh` are
|
The Apollonius graph hierarchies `other` and `agh` are
|
||||||
swapped. `agh`.`swap(other)` should be preferred to `agh`` =
|
swapped. `agh.swap(other)` should be preferred to `agh = other`
|
||||||
other` or to `agh``(other)` if `other` is deleted afterwards.
|
or to `agh(other)` if `other` is deleted afterwards.
|
||||||
*/
|
*/
|
||||||
void swap(Apollonius_graph_hierarchy_2<Gt,Agds>
|
void swap(Apollonius_graph_hierarchy_2<Gt,Agds>& other);
|
||||||
other);
|
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,10 +13,9 @@ of the `ApolloniusGraphVertexBase_2` concept.
|
||||||
|
|
||||||
\cgalModels `ApolloniusGraphHierarchyVertexBase_2`
|
\cgalModels `ApolloniusGraphHierarchyVertexBase_2`
|
||||||
|
|
||||||
\sa `ApolloniusGraphVertexBase_2`
|
|
||||||
\sa `ApolloniusGraphHierarchyVertexBase_2`
|
|
||||||
\sa `CGAL::Apollonius_graph_vertex_base_2<Gt,StoreHidden>`
|
\sa `CGAL::Apollonius_graph_vertex_base_2<Gt,StoreHidden>`
|
||||||
|
\sa `CGAL::Triangulation_data_structure_2<Vb,Fb>`
|
||||||
|
\sa `CGAL::Apollonius_graph_hierarchy_2<Gt,Agds>`
|
||||||
*/
|
*/
|
||||||
template< typename Agvb >
|
template< typename Agvb >
|
||||||
class Apollonius_graph_hierarchy_vertex_base_2 : Agvb {
|
class Apollonius_graph_hierarchy_vertex_base_2 : Agvb {
|
||||||
|
|
@ -34,7 +33,7 @@ Apollonius_graph_hierarchy_vertex_base_2();
|
||||||
Constructs a vertex associated with the site `s` and
|
Constructs a vertex associated with the site `s` and
|
||||||
embedded at the center of `s`.
|
embedded at the center of `s`.
|
||||||
*/
|
*/
|
||||||
Apollonius_graph_hierarchy_vertex_base_2(Site_2 s);
|
Apollonius_graph_hierarchy_vertex_base_2(const Site_2& s);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Constructs a vertex associated with
|
Constructs a vertex associated with
|
||||||
|
|
@ -42,7 +41,7 @@ the site `s`, embedded at the center of `s`,
|
||||||
and pointing to the face associated with the face
|
and pointing to the face associated with the face
|
||||||
handle `f`.
|
handle `f`.
|
||||||
*/
|
*/
|
||||||
Apollonius_graph_vertex_base_2(Site_2 s, Face_handle f);
|
Apollonius_graph_hierarchy_vertex_base_2(const Site_2& s, Face_handle f);
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,13 +22,8 @@ The way the predicates are evaluated is discussed in
|
||||||
|
|
||||||
\cgalModels `ApolloniusGraphTraits_2`
|
\cgalModels `ApolloniusGraphTraits_2`
|
||||||
|
|
||||||
\sa `Kernel`
|
|
||||||
\sa `ApolloniusGraphTraits_2`
|
|
||||||
\sa `CGAL::Integral_domain_without_division_tag`
|
|
||||||
\sa `CGAL::Field_with_sqrt_tag`
|
|
||||||
\sa `CGAL::Apollonius_graph_2<Gt,Agds>`
|
\sa `CGAL::Apollonius_graph_2<Gt,Agds>`
|
||||||
\sa `CGAL::Apollonius_graph_filtered_traits_2<CK,CM,EK,EM,FK,FM>`
|
\sa `CGAL::Apollonius_graph_filtered_traits_2<CK,CM,EK,EM,FK,FM>`
|
||||||
|
|
||||||
*/
|
*/
|
||||||
template< typename K, typename Method_tag >
|
template< typename K, typename Method_tag >
|
||||||
class Apollonius_graph_traits_2 {
|
class Apollonius_graph_traits_2 {
|
||||||
|
|
@ -45,14 +40,13 @@ Apollonius_graph_traits_2<K,Method_tag>();
|
||||||
/*!
|
/*!
|
||||||
Copy constructor.
|
Copy constructor.
|
||||||
*/
|
*/
|
||||||
Apollonius_graph_traits_2<K,Method_tag>(Apollonius_graph_traits_2<K,Method_tag> other);
|
Apollonius_graph_traits_2<K,Method_tag>(const Apollonius_graph_traits_2<K,Method_tag>& other);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Assignment operator.
|
Assignment operator.
|
||||||
*/
|
*/
|
||||||
Apollonius_graph_traits_2<K,Method_tag>
|
Apollonius_graph_traits_2<K,Method_tag>
|
||||||
operator=(Apollonius_graph_traits_2<K,Method_tag>
|
operator=(const Apollonius_graph_traits_2<K,Method_tag>& other);
|
||||||
other);
|
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,13 +19,8 @@ discarded. By default `StoreHidden` is set to `true`.
|
||||||
|
|
||||||
\cgalModels `ApolloniusGraphVertexBase_2`
|
\cgalModels `ApolloniusGraphVertexBase_2`
|
||||||
|
|
||||||
\sa `ApolloniusGraphVertexBase_2`
|
|
||||||
\sa `ApolloniusGraphDataStructure_2`
|
|
||||||
\sa `ApolloniusGraphTraits_2`
|
|
||||||
\sa `CGAL::Triangulation_data_structure_2<Vb,Fb>`
|
\sa `CGAL::Triangulation_data_structure_2<Vb,Fb>`
|
||||||
\sa `CGAL::Apollonius_graph_traits_2<K,Method_tag>`
|
\sa `CGAL::Apollonius_graph_hierarchy_vertex_base_2<Gt>`
|
||||||
\sa `CGAL::Apollonius_graph_filtered_traits_2<CK,CM,EK,EM,FK,FM>`
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
template< typename Gt, typename StoreHidden >
|
template< typename Gt, typename StoreHidden >
|
||||||
class Apollonius_graph_vertex_base_2 {
|
class Apollonius_graph_vertex_base_2 {
|
||||||
|
|
@ -37,13 +32,13 @@ public:
|
||||||
/*!
|
/*!
|
||||||
%Default constructor.
|
%Default constructor.
|
||||||
*/
|
*/
|
||||||
Apollonius_graph_bertex_base_2();
|
Apollonius_graph_vertex_base_2();
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Constructs a vertex associated with the site `s` and
|
Constructs a vertex associated with the site `s` and
|
||||||
embedded at the center of `s`.
|
embedded at the center of `s`.
|
||||||
*/
|
*/
|
||||||
Apollonius_graph_vertex_base_2(Site_2 s);
|
Apollonius_graph_vertex_base_2(const Site_2& s);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Constructs a vertex associated with
|
Constructs a vertex associated with
|
||||||
|
|
@ -51,7 +46,7 @@ the site `s`, embedded at the center of `s`,
|
||||||
and pointing to the face associated with the face
|
and pointing to the face associated with the face
|
||||||
handle `f`.
|
handle `f`.
|
||||||
*/
|
*/
|
||||||
Apollonius_graph_vertex_base_2(Site_2 s, Face_handle f);
|
Apollonius_graph_vertex_base_2(const Site_2& s, Face_handle f);
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,12 +22,9 @@ The I/O operators are defined for `iostream`.
|
||||||
The information output in the `iostream` is: the point of the
|
The information output in the `iostream` is: the point of the
|
||||||
Apollonius site and its weight.
|
Apollonius site and its weight.
|
||||||
|
|
||||||
\sa `Kernel`
|
|
||||||
\sa `ApolloniusSite_2`
|
|
||||||
\sa `CGAL::Qt_widget`
|
\sa `CGAL::Qt_widget`
|
||||||
\sa `CGAL::Apollonius_graph_traits_2<K,Method_tag>`
|
\sa `CGAL::Apollonius_graph_traits_2<K,Method_tag>`
|
||||||
\sa `CGAL::Apollonius_graph_filtered_traits_2<CK,CM,EK,EM,FK,FM>`
|
\sa `CGAL::Apollonius_graph_filtered_traits_2<CK,CM,EK,EM,FK,FM>`
|
||||||
|
|
||||||
*/
|
*/
|
||||||
template< typename K >
|
template< typename K >
|
||||||
class Apollonius_site_2 {
|
class Apollonius_site_2 {
|
||||||
|
|
@ -44,7 +41,7 @@ Apollonius_site_2(Point_2 p=Point_2(), Weight w= Weight(0));
|
||||||
/*!
|
/*!
|
||||||
Copy constructor.
|
Copy constructor.
|
||||||
*/
|
*/
|
||||||
Apollonius_site_2(Apollonius_site_2<K> other);
|
Apollonius_site_2(const Apollonius_site_2<K>& other);
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
|
@ -57,8 +54,7 @@ Apollonius site `s` into the stream `os`.
|
||||||
\pre The insert operator must be defined for `Point_2` and `Weight`.
|
\pre The insert operator must be defined for `Point_2` and `Weight`.
|
||||||
\relates Apollonius_site_2
|
\relates Apollonius_site_2
|
||||||
*/
|
*/
|
||||||
std::ostream& operator<<(std::ostream& os,
|
std::ostream& operator<<(std::ostream& os, const Apollonius_site_2<K>& s) const;
|
||||||
const Apollonius_site_2<K>& s);
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Reads an Apollonius site from the stream `is` and assigns it
|
Reads an Apollonius site from the stream `is` and assigns it
|
||||||
|
|
@ -67,8 +63,7 @@ to `s`.
|
||||||
\pre The extract operator must be defined for `Point_2` and `Weight`.
|
\pre The extract operator must be defined for `Point_2` and `Weight`.
|
||||||
\relates Apollonius_site_2
|
\relates Apollonius_site_2
|
||||||
*/
|
*/
|
||||||
std::istream& operator>>(std::istream& is,
|
std::istream& operator>>(std::istream& is, const Apollonius_site_2<K>& s);
|
||||||
const Apollonius_site_2<K>& s);
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Inserts the Apollonius site `s` into the `Qt_widget` stream `w`.
|
Inserts the Apollonius site `s` into the `Qt_widget` stream `w`.
|
||||||
|
|
@ -76,7 +71,6 @@ Inserts the Apollonius site `s` into the `Qt_widget` stream `w`.
|
||||||
\pre The insert operator must be defined for `K::Circle_2`.
|
\pre The insert operator must be defined for `K::Circle_2`.
|
||||||
\relates Apollonius_site_2
|
\relates Apollonius_site_2
|
||||||
*/
|
*/
|
||||||
Qt_widget& operator<<(Qt_widget& w,
|
Qt_widget& operator<<(Qt_widget& w, const Apollonius_site_2<K>& s) const;
|
||||||
const Apollonius_site_2<K>& s);
|
|
||||||
|
|
||||||
} /* end namespace CGAL */
|
} /* end namespace CGAL */
|
||||||
|
|
|
||||||
|
|
@ -42,10 +42,10 @@ public:
|
||||||
/// @{
|
/// @{
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Inserts
|
inserts a degree two vertex and two faces adjacent to it that have two common edges.
|
||||||
a degree two vertex and two faces adjacent to it that have two common
|
|
||||||
edges. The edge defined by the face handle `f` and the integer
|
The edge defined by the face handle `f` and the integer `i` is duplicated. It returns a handle
|
||||||
`i` is duplicated. It returns a handle to the vertex created.
|
to the vertex created.
|
||||||
*/
|
*/
|
||||||
Vertex_handle insert_degree_2(Face_handle f, int i);
|
Vertex_handle insert_degree_2(Face_handle f, int i);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,17 +19,12 @@ next and previous level graphs.
|
||||||
`ApolloniusGraphHierarchyVertexBase_2` does not introduce any
|
`ApolloniusGraphHierarchyVertexBase_2` does not introduce any
|
||||||
types in addition to those of `ApolloniusGraphVertexBase_2`.
|
types in addition to those of `ApolloniusGraphVertexBase_2`.
|
||||||
|
|
||||||
\cgalHasModel CGAL::Apollonius_graph_hierarchy_vertex_base_2<CGAL::Apollonius_graph_vertex_base_2<Gt,StoreHidden> >
|
\cgalHasModel `CGAL::Apollonius_graph_hierarchy_vertex_base_2<CGAL::Apollonius_graph_vertex_base_2<Gt,StoreHidden> >`
|
||||||
|
|
||||||
\sa `ApolloniusGraphDataStructure_2`
|
\sa `ApolloniusGraphDataStructure_2`
|
||||||
\sa `ApolloniusGraphVertexBase_2`
|
|
||||||
\sa `CGAL::Apollonius_graph_hierarchy_2<Gt,Agds>`
|
\sa `CGAL::Apollonius_graph_hierarchy_2<Gt,Agds>`
|
||||||
\sa `CGAL::Triangulation_data_structure_2<Vb,Fb>`
|
\sa `CGAL::Triangulation_data_structure_2<Vb,Fb>`
|
||||||
\sa `CGAL::Apollonius_graph_vertex_base_2<Gt,StoreHidden>`
|
|
||||||
\sa `CGAL::Apollonius_graph_hierarchy_vertex_base_2<Agvb>`
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class ApolloniusGraphHierarchyVertexBase_2 {
|
class ApolloniusGraphHierarchyVertexBase_2 {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
@ -37,8 +32,7 @@ public:
|
||||||
/// @{
|
/// @{
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Default
|
%Default constructor.
|
||||||
constructor.
|
|
||||||
*/
|
*/
|
||||||
ApolloniusGraphHierarchyVertexBase_2();
|
ApolloniusGraphHierarchyVertexBase_2();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,6 @@
|
||||||
\ingroup PkgApolloniusGraph2Concepts
|
\ingroup PkgApolloniusGraph2Concepts
|
||||||
\cgalConcept
|
\cgalConcept
|
||||||
|
|
||||||
\cgalRefines `TriangulationVertexBase_2`
|
|
||||||
|
|
||||||
The concept `ApolloniusGraphVertexBase_2` describes the
|
The concept `ApolloniusGraphVertexBase_2` describes the
|
||||||
requirements for the vertex base class of the
|
requirements for the vertex base class of the
|
||||||
`ApolloniusGraphDataStructure_2` concept. A vertex stores an
|
`ApolloniusGraphDataStructure_2` concept. A vertex stores an
|
||||||
|
|
@ -12,14 +10,14 @@ Apollonius site and provides access to one of its incident faces
|
||||||
through a `Face_handle`. In addition, it maintains a container of
|
through a `Face_handle`. In addition, it maintains a container of
|
||||||
sites. The container stores the hidden sites related to the vertex.
|
sites. The container stores the hidden sites related to the vertex.
|
||||||
|
|
||||||
|
\cgalRefines `TriangulationVertexBase_2`
|
||||||
|
|
||||||
\cgalHasModel `CGAL::Apollonius_graph_vertex_base_2<Gt,StoreHidden>`
|
\cgalHasModel `CGAL::Apollonius_graph_vertex_base_2<Gt,StoreHidden>`
|
||||||
|
|
||||||
\sa `ApolloniusGraphDataStructure_2`
|
\sa `ApolloniusGraphDataStructure_2`
|
||||||
\sa `ApolloniusGraphTraits_2`
|
\sa `CGAL::Apollonius_graph_2<Gt,Agds>`
|
||||||
\sa `CGAL::Apollonius_graph_vertex_base_2<Gt,StoreHidden>`
|
\sa `CGAL::Triangulation_data_structure_2<Vb,Fb>`
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class ApolloniusGraphVertexBase_2 {
|
class ApolloniusGraphVertexBase_2 {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
@ -77,7 +75,7 @@ typedef unspecified_type Hidden_sites_iterator;
|
||||||
/// @{
|
/// @{
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Default constructor.
|
%Default constructor.
|
||||||
*/
|
*/
|
||||||
ApolloniusGraphVertexBase_2();
|
ApolloniusGraphVertexBase_2();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -43,18 +43,18 @@ aforementioned concepts.
|
||||||
\cgalCRPSection{Concepts}
|
\cgalCRPSection{Concepts}
|
||||||
|
|
||||||
- `ApolloniusSite_2`
|
- `ApolloniusSite_2`
|
||||||
|
- `ApolloniusGraphTraits_2`
|
||||||
- `ApolloniusGraphDataStructure_2`
|
- `ApolloniusGraphDataStructure_2`
|
||||||
- `ApolloniusGraphVertexBase_2`
|
- `ApolloniusGraphVertexBase_2`
|
||||||
- `ApolloniusGraphTraits_2`
|
|
||||||
- `ApolloniusGraphHierarchyVertexBase_2`
|
- `ApolloniusGraphHierarchyVertexBase_2`
|
||||||
|
|
||||||
\cgalCRPSection{Classes}
|
\cgalCRPSection{Classes}
|
||||||
|
|
||||||
- `CGAL::Apollonius_graph_2<Gt,Agds>`
|
- `CGAL::Apollonius_graph_2<Gt,Agds>`
|
||||||
- `CGAL::Apollonius_site_2<K>`
|
- `CGAL::Apollonius_site_2<K>`
|
||||||
- `CGAL::Apollonius_graph_vertex_base_2<Gt,StoreHidden>`
|
|
||||||
- `CGAL::Apollonius_graph_traits_2<K,Method_tag>`
|
- `CGAL::Apollonius_graph_traits_2<K,Method_tag>`
|
||||||
- `CGAL::Apollonius_graph_filtered_traits_2<CK,CM,EK,EM,FK,FM>`
|
- `CGAL::Apollonius_graph_filtered_traits_2<CK,CM,EK,EM,FK,FM>`
|
||||||
|
- `CGAL::Apollonius_graph_vertex_base_2<Gt,StoreHidden>`
|
||||||
- `CGAL::Apollonius_graph_hierarchy_2<Gt,Agds>`
|
- `CGAL::Apollonius_graph_hierarchy_2<Gt,Agds>`
|
||||||
- `CGAL::Apollonius_graph_hierarchy_vertex_base_2<Agvb>`
|
- `CGAL::Apollonius_graph_hierarchy_vertex_base_2<Agvb>`
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,6 @@
|
||||||
cmake_minimum_required(VERSION 3.1...3.15)
|
cmake_minimum_required(VERSION 3.1...3.15)
|
||||||
project(Arrangement_on_surface_2_Demo)
|
project(Arrangement_on_surface_2_Demo)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 14)
|
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
|
|
||||||
|
|
||||||
if(NOT POLICY CMP0070 AND POLICY CMP0053)
|
if(NOT POLICY CMP0070 AND POLICY CMP0053)
|
||||||
# Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning.
|
# Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning.
|
||||||
cmake_policy(SET CMP0053 OLD)
|
cmake_policy(SET CMP0053 OLD)
|
||||||
|
|
@ -23,6 +20,8 @@ if (CGAL_FOUND AND CGAL_Qt5_FOUND AND Qt5_FOUND)
|
||||||
add_compile_definitions(QT_NO_KEYWORDS)
|
add_compile_definitions(QT_NO_KEYWORDS)
|
||||||
include_directories( BEFORE ./ )
|
include_directories( BEFORE ./ )
|
||||||
|
|
||||||
|
# Arrangement package includes
|
||||||
|
add_definitions(-DQT_NO_KEYWORDS)
|
||||||
option(COMPILE_UTILS_INCREMENTALLY
|
option(COMPILE_UTILS_INCREMENTALLY
|
||||||
"Compile files in Utils directory incrementally, or compile them all as a unit. \
|
"Compile files in Utils directory incrementally, or compile them all as a unit. \
|
||||||
Incremental compilation will be better for development and consume less \
|
Incremental compilation will be better for development and consume less \
|
||||||
|
|
|
||||||
|
|
@ -34,11 +34,11 @@ conveniently embedded as a planar graph, whose vertices are associated
|
||||||
with curve endpoints or with isolated points, and whose edges are
|
with curve endpoints or with isolated points, and whose edges are
|
||||||
associated with subcurves. It is easy to see that
|
associated with subcurves. It is easy to see that
|
||||||
\f$ \cal A(\cal C) = \cal A(\cal C'')\f$. This graph can be represented using a
|
\f$ \cal A(\cal C) = \cal A(\cal C'')\f$. This graph can be represented using a
|
||||||
<I>doubly-connected edge list</I> data-structure (\sc{Dcel} for short),
|
<I>doubly-connected edge list</I> data-structure (\dcel for short),
|
||||||
which consists of containers of vertices, edges and faces and
|
which consists of containers of vertices, edges and faces and
|
||||||
maintains the incidence relations among these objects.
|
maintains the incidence relations among these objects.
|
||||||
|
|
||||||
The main idea behind the \sc{Dcel} data-structure is to represent
|
The main idea behind the \dcel data-structure is to represent
|
||||||
each edge using a pair of directed <I>halfedges</I>, one going from
|
each edge using a pair of directed <I>halfedges</I>, one going from
|
||||||
the \f$ xy\f$-lexicographically smaller (left) endpoint of the curve toward
|
the \f$ xy\f$-lexicographically smaller (left) endpoint of the curve toward
|
||||||
its the \f$ xy\f$-lexicographically larger (right) endpoint, and the other,
|
its the \f$ xy\f$-lexicographically larger (right) endpoint, and the other,
|
||||||
|
|
@ -75,11 +75,11 @@ as it may have no area, or alternatively it may consist of several
|
||||||
connected faces. Every face can have several holes contained in its
|
connected faces. Every face can have several holes contained in its
|
||||||
interior (or no holes at all). In addition, every face may contain
|
interior (or no holes at all). In addition, every face may contain
|
||||||
isolated vertices in its interior. See \cgalFigureRef{arr_figseg_dcel}
|
isolated vertices in its interior. See \cgalFigureRef{arr_figseg_dcel}
|
||||||
for an illustration of the various \sc{Dcel} features. For more details
|
for an illustration of the various \dcel features. For more details
|
||||||
on the \sc{Dcel} data structure see \cgalCite{bkos-cgaa-00} Chapter 2.
|
on the \dcel data structure see \cgalCite{bkos-cgaa-00} Chapter 2.
|
||||||
|
|
||||||
\cgalFigureBegin{arr_figseg_dcel,arr_segs.png}
|
\cgalFigureBegin{arr_figseg_dcel,arr_segs.png}
|
||||||
An arrangement of interior-disjoint line segments with some of the \sc{Dcel} records that represent it. The unbounded face \f$ f_0\f$ has a single connected component that forms a hole inside it, and this hole is comprised of several faces. The half-edge \f$ e\f$ is directed from its source vertex \f$ v_1\f$ to its target vertex \f$ v_2\f$. This edge, together with its twin \f$ e'\f$, correspond to a line segment that connects the points associated with \f$ v_1\f$ and \f$ v_2\f$ and separates the face \f$ f_1\f$ from \f$ f_2\f$. The predecessor \f$ e_{\rm prev}\f$ and successor \f$ e_{\rm next}\f$ of \f$ e\f$ are part of the chain that form the outer boundary of the face \f$ f_2\f$. The face \f$ f_1\f$ has a more complicated structure as it contains two holes in its interior: One hole consists of two adjacent faces \f$ f_3\f$ and \f$ f_4\f$, while the other hole is comprised of two edges. \f$ f_1\f$ also contains two isolated vertices \f$ u_1\f$ and \f$ u_2\f$ in its interior.
|
An arrangement of interior-disjoint line segments with some of the \dcel records that represent it. The unbounded face \f$ f_0\f$ has a single connected component that forms a hole inside it, and this hole is comprised of several faces. The half-edge \f$ e\f$ is directed from its source vertex \f$ v_1\f$ to its target vertex \f$ v_2\f$. This edge, together with its twin \f$ e'\f$, correspond to a line segment that connects the points associated with \f$ v_1\f$ and \f$ v_2\f$ and separates the face \f$ f_1\f$ from \f$ f_2\f$. The predecessor \f$ e_{\rm prev}\f$ and successor \f$ e_{\rm next}\f$ of \f$ e\f$ are part of the chain that form the outer boundary of the face \f$ f_2\f$. The face \f$ f_1\f$ has a more complicated structure as it contains two holes in its interior: One hole consists of two adjacent faces \f$ f_3\f$ and \f$ f_4\f$, while the other hole is comprised of two edges. \f$ f_1\f$ also contains two isolated vertices \f$ u_1\f$ and \f$ u_2\f$ in its interior.
|
||||||
\cgalFigureEnd
|
\cgalFigureEnd
|
||||||
|
|
||||||
The \f$ x\f$-monotone curves of an arrangement are embedded in an
|
The \f$ x\f$-monotone curves of an arrangement are embedded in an
|
||||||
|
|
@ -110,7 +110,7 @@ to construct arrangements of different families of curves. In
|
||||||
Section \ref arr_secnotif we review the notification mechanism
|
Section \ref arr_secnotif we review the notification mechanism
|
||||||
that allows external classes to keep track of the changes that an
|
that allows external classes to keep track of the changes that an
|
||||||
arrangement instance goes through. Section \ref arr_secex_dcel
|
arrangement instance goes through. Section \ref arr_secex_dcel
|
||||||
explains how to extend the \sc{Dcel} records, to store extra data
|
explains how to extend the \dcel records, to store extra data
|
||||||
with them, and to efficiently update this data.
|
with them, and to efficiently update this data.
|
||||||
In Section \ref arr_secoverlay we introduce the fundamental
|
In Section \ref arr_secoverlay we introduce the fundamental
|
||||||
operation of overlaying two arrangements.
|
operation of overlaying two arrangements.
|
||||||
|
|
@ -127,7 +127,7 @@ the arrangement package. It is used to represent planar
|
||||||
arrangements and it provides the interface needed to construct them,
|
arrangements and it provides the interface needed to construct them,
|
||||||
traverse them, and maintain them. An arrangement is defined by
|
traverse them, and maintain them. An arrangement is defined by
|
||||||
a geometric <I>traits</I> class that determines the family of planar
|
a geometric <I>traits</I> class that determines the family of planar
|
||||||
curves that form the arrangement, and a \sc{Dcel} class, which
|
curves that form the arrangement, and a \dcel class, which
|
||||||
represents the <I>topological structure</I> of the planar subdivision.
|
represents the <I>topological structure</I> of the planar subdivision.
|
||||||
It supplies a minimal set of geometric operations (predicates and
|
It supplies a minimal set of geometric operations (predicates and
|
||||||
constructions) required to construct and maintain the arrangement
|
constructions) required to construct and maintain the arrangement
|
||||||
|
|
@ -159,7 +159,7 @@ parameters of the `Arrangement_2` template:
|
||||||
<LI>The `Dcel` template-parameter should be instantiated with a class
|
<LI>The `Dcel` template-parameter should be instantiated with a class
|
||||||
that is a model of the `ArrangementDcel` concept. The value of this
|
that is a model of the `ArrangementDcel` concept. The value of this
|
||||||
parameter is `Arr_default_dcel<Traits>` by default. However, in
|
parameter is `Arr_default_dcel<Traits>` by default. However, in
|
||||||
many applications it is necessary to extend the \sc{Dcel} features;
|
many applications it is necessary to extend the \dcel features;
|
||||||
see Section \ref arr_secex_dcel for further explanations and
|
see Section \ref arr_secex_dcel for further explanations and
|
||||||
examples.
|
examples.
|
||||||
</UL>
|
</UL>
|
||||||
|
|
@ -212,7 +212,7 @@ The simplest and most fundamental arrangement operations are the
|
||||||
various traversal methods, which allow users to systematically go
|
various traversal methods, which allow users to systematically go
|
||||||
over the relevant features of the arrangement at hand.
|
over the relevant features of the arrangement at hand.
|
||||||
|
|
||||||
As mentioned above, the arrangement is represented as a \sc{Dcel},
|
As mentioned above, the arrangement is represented as a \dcel,
|
||||||
which stores three containers of vertices, halfedges and faces. Thus,
|
which stores three containers of vertices, halfedges and faces. Thus,
|
||||||
the `Arrangement_2` class supplies iterators for these
|
the `Arrangement_2` class supplies iterators for these
|
||||||
containers. For example, the methods `vertices_begin()` and
|
containers. For example, the methods `vertices_begin()` and
|
||||||
|
|
@ -486,7 +486,7 @@ for more details and examples.
|
||||||
|
|
||||||
|
|
||||||
\cgalFigureBegin{arr_figex_1,insert.png}
|
\cgalFigureBegin{arr_figex_1,insert.png}
|
||||||
The various specialized insertion procedures. The inserted \f$ x\f$-monotone curve is drawn with a light dashed line, surrounded by two solid arrows that represent the pair of twin half-edges added to the \sc{Dcel}. Existing vertices are shown as black dots while new vertices are shown as light dots. Existing half-edges that are affected by the insertion operations are drawn as dashed arrows. (a) Inserting a curve as a new hole inside the face \f$ f\f$. (b) Inserting a curve from an existing vertex \f$ u\f$ that corresponds to one of its endpoints. (c) Inserting an \f$ x\f$-monotone curve whose endpoints are the already existing vertices \f$ u_1\f$ and \f$ u_2\f$. In our case, the new pair of half-edges close a new face \f$ f'\f$, where the hole \f$ h_1\f$, which used to belong to \f$ f\f$, now becomes an enclave in this new face.
|
The various specialized insertion procedures. The inserted \f$ x\f$-monotone curve is drawn with a light dashed line, surrounded by two solid arrows that represent the pair of twin half-edges added to the \dcel. Existing vertices are shown as black dots while new vertices are shown as light dots. Existing half-edges that are affected by the insertion operations are drawn as dashed arrows. (a) Inserting a curve as a new hole inside the face \f$ f\f$. (b) Inserting a curve from an existing vertex \f$ u\f$ that corresponds to one of its endpoints. (c) Inserting an \f$ x\f$-monotone curve whose endpoints are the already existing vertices \f$ u_1\f$ and \f$ u_2\f$. In our case, the new pair of half-edges close a new face \f$ f'\f$, where the hole \f$ h_1\f$, which used to belong to \f$ f\f$, now becomes an enclave in this new face.
|
||||||
\cgalFigureEnd
|
\cgalFigureEnd
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1349,7 +1349,7 @@ construct it from scratch. (ii) We have to insert \f$ m\f$ input curves
|
||||||
to a non-empty arrangement `arr`.
|
to a non-empty arrangement `arr`.
|
||||||
|
|
||||||
In the first case, we sweep over the input curves, compute
|
In the first case, we sweep over the input curves, compute
|
||||||
their intersection points and construct the \sc{Dcel} that represents
|
their intersection points and construct the \dcel that represents
|
||||||
their planar arrangement. This process is performed in
|
their planar arrangement. This process is performed in
|
||||||
\f$ O\left((m + k)\log m\right)\f$ time, where \f$ k\f$ is the total number
|
\f$ O\left((m + k)\log m\right)\f$ time, where \f$ k\f$ is the total number
|
||||||
of intersection points. The running time is asymptotically better
|
of intersection points. The running time is asymptotically better
|
||||||
|
|
@ -1567,7 +1567,7 @@ exists. This implied that collinearity indeed exists as explained above.
|
||||||
\cgalAdvancedBegin
|
\cgalAdvancedBegin
|
||||||
|
|
||||||
\cgalFigureBegin{typenormal,unb_dcel.png}
|
\cgalFigureBegin{typenormal,unb_dcel.png}
|
||||||
A \sc{Dcel} representing an arrangement of four lines. Halfedges are drawn as thin arrows. The vertices \f$ v_1, \ldots, v_8\f$ lie at infinity, and are not associated with valid points. The halfedges that connect them are fictitious, and are not associated with concrete curves. The face denoted \f$ f_0\f$ (lightly shaded) is the fictitious "unbounded face" which lies outside the bounding rectangle (dashed) that bounds the actual arrangement. The four fictitious vertices \f$ v_{\rm bl}, v_{\rm tl}, v_{\rm br}\f$ and \f$ v_{\rm tr}\f$ represent the four corners of the bounding rectangle.
|
A \dcel representing an arrangement of four lines. Halfedges are drawn as thin arrows. The vertices \f$ v_1, \ldots, v_8\f$ lie at infinity, and are not associated with valid points. The halfedges that connect them are fictitious, and are not associated with concrete curves. The face denoted \f$ f_0\f$ (lightly shaded) is the fictitious "unbounded face" which lies outside the bounding rectangle (dashed) that bounds the actual arrangement. The four fictitious vertices \f$ v_{\rm bl}, v_{\rm tl}, v_{\rm br}\f$ and \f$ v_{\rm tr}\f$ represent the four corners of the bounding rectangle.
|
||||||
\cgalFigureEnd
|
\cgalFigureEnd
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1580,7 +1580,7 @@ finite curve endpoints and intersection points between curves in
|
||||||
straightforward to compute the arrangement induced by this set.
|
straightforward to compute the arrangement induced by this set.
|
||||||
However, we would like to operate directly on the unbounded curves
|
However, we would like to operate directly on the unbounded curves
|
||||||
without having to preprocess them. Therefore, we use an implicit
|
without having to preprocess them. Therefore, we use an implicit
|
||||||
bounding rectangle embedded in the \sc{Dcel} structure.
|
bounding rectangle embedded in the \dcel structure.
|
||||||
\cgalFigureRef{arr_figunb_dcel} shows the arrangement of four lines
|
\cgalFigureRef{arr_figunb_dcel} shows the arrangement of four lines
|
||||||
that subdivide the plane into eight unbounded faces and two bounded
|
that subdivide the plane into eight unbounded faces and two bounded
|
||||||
ones. Notice that in this case the unbounded faces have outer
|
ones. Notice that in this case the unbounded faces have outer
|
||||||
|
|
@ -1881,7 +1881,7 @@ of the `ArrangementXMonotoneTraits_2` concept.
|
||||||
\subsection Arrangement_on_surface_2SupportingUnbounded Supporting Unbounded Curves
|
\subsection Arrangement_on_surface_2SupportingUnbounded Supporting Unbounded Curves
|
||||||
|
|
||||||
An arrangement that supports unbounded \f$ x\f$-monotone curves maintains
|
An arrangement that supports unbounded \f$ x\f$-monotone curves maintains
|
||||||
an implicit bounding rectangle in the \sc{Dcel} structure; see
|
an implicit bounding rectangle in the \dcel structure; see
|
||||||
Section \ref arr_ssecunb_rep. The unbounded ends of vertical rays,
|
Section \ref arr_ssecunb_rep. The unbounded ends of vertical rays,
|
||||||
vertical lines, and curves with vertical asymptotes are represented
|
vertical lines, and curves with vertical asymptotes are represented
|
||||||
by vertices that lie on the bottom or top sides of this bounding
|
by vertices that lie on the bottom or top sides of this bounding
|
||||||
|
|
@ -2840,7 +2840,7 @@ Geometric traits-class decorators allow you to attach auxiliary
|
||||||
data to curves and to points. The data is automatically manipulated
|
data to curves and to points. The data is automatically manipulated
|
||||||
by the decorators and distributed to the constructed geometric entities.
|
by the decorators and distributed to the constructed geometric entities.
|
||||||
Note that additional information can alternatively be maintained by extending
|
Note that additional information can alternatively be maintained by extending
|
||||||
the vertex, halfedge, or face types provided by the \sc{Dcel} class used
|
the vertex, halfedge, or face types provided by the \dcel class used
|
||||||
by the arrangement; see the details in Section \ref arr_secex_dcel.
|
by the arrangement; see the details in Section \ref arr_secex_dcel.
|
||||||
|
|
||||||
The arrangement package includes a generic traits-class decorator
|
The arrangement package includes a generic traits-class decorator
|
||||||
|
|
@ -3065,7 +3065,7 @@ depicted in \cgalFigureRef{arr_figex_19} :
|
||||||
|
|
||||||
\cgalExample{Arrangement_on_surface_2/observer.cpp}
|
\cgalExample{Arrangement_on_surface_2/observer.cpp}
|
||||||
|
|
||||||
Observers are especially useful when the \sc{Dcel} records are
|
Observers are especially useful when the \dcel records are
|
||||||
extended and store additional data, as they help updating this
|
extended and store additional data, as they help updating this
|
||||||
data on-line. See Section \ref arr_secex_dcel for more details
|
data on-line. See Section \ref arr_secex_dcel for more details
|
||||||
and examples.
|
and examples.
|
||||||
|
|
@ -3080,28 +3080,28 @@ objects and edges (halfedge pairs) are associated with
|
||||||
it is possible to extend the traits-class type by using a traits-class
|
it is possible to extend the traits-class type by using a traits-class
|
||||||
decorator, as explained in Section \ref arr_ssecmeta_tr, which may
|
decorator, as explained in Section \ref arr_ssecmeta_tr, which may
|
||||||
be a sufficient solution for some applications.
|
be a sufficient solution for some applications.
|
||||||
However, the \sc{Dcel} faces are not associated with any geometric object,
|
However, the \dcel faces are not associated with any geometric object,
|
||||||
so it is impossible to extend them using a traits-class decorator.
|
so it is impossible to extend them using a traits-class decorator.
|
||||||
Extending the \sc{Dcel} face records comes handy is such cases. As a matter
|
Extending the \dcel face records comes handy is such cases. As a matter
|
||||||
of fact, it is possible to conveniently extend all \sc{Dcel} records
|
of fact, it is possible to conveniently extend all \dcel records
|
||||||
(namely vertices, halfedges and faces), which can also be advantageous
|
(namely vertices, halfedges and faces), which can also be advantageous
|
||||||
for some applications.
|
for some applications.
|
||||||
|
|
||||||
All examples presented so far use the default `Arr_default_dcel<Traits>`.
|
All examples presented so far use the default `Arr_default_dcel<Traits>`.
|
||||||
This is done implicitly, as this class serves as a default parameter for
|
This is done implicitly, as this class serves as a default parameter for
|
||||||
the `Arrangement_2` template. The default \sc{Dcel} class just associates
|
the `Arrangement_2` template. The default \dcel class just associates
|
||||||
points with vertices and \f$ x\f$-monotone curves with halfedge, but nothing more.
|
points with vertices and \f$ x\f$-monotone curves with halfedge, but nothing more.
|
||||||
In this section we show how to use alternative \sc{Dcel} types to extend the
|
In this section we show how to use alternative \dcel types to extend the
|
||||||
desired \sc{Dcel} records.
|
desired \dcel records.
|
||||||
|
|
||||||
\subsection arr_ssecex_dcel_face Extending the DCEL Faces
|
\subsection arr_ssecex_dcel_face Extending the DCEL Faces
|
||||||
|
|
||||||
The `Arr_face_extended_dcel<Traits, FaceData>` class-template
|
The `Arr_face_extended_dcel<Traits, FaceData>` class-template
|
||||||
is used to associate auxiliary data field of type `FaceData` to
|
is used to associate auxiliary data field of type `FaceData` to
|
||||||
each face record in the \sc{Dcel}.
|
each face record in the \dcel.
|
||||||
|
|
||||||
When an `Arrangement_2` object is parameterized by this
|
When an `Arrangement_2` object is parameterized by this
|
||||||
\sc{Dcel} class, its nested `Face` type is extended with the access function
|
\dcel class, its nested `Face` type is extended with the access function
|
||||||
`data()` and with the modifier `set_data()`. Using these extra
|
`data()` and with the modifier `set_data()`. Using these extra
|
||||||
functions it is straightforward to access and maintain the auxiliary
|
functions it is straightforward to access and maintain the auxiliary
|
||||||
face-data field.
|
face-data field.
|
||||||
|
|
@ -3135,14 +3135,14 @@ segments:\cgalFootnote{For simplicity, the particular observer used must be atta
|
||||||
The `Arr_extended_dcel<Traits, VertexData, HalfedgeData, FaceData>`
|
The `Arr_extended_dcel<Traits, VertexData, HalfedgeData, FaceData>`
|
||||||
class-template is used to associate auxiliary data fields of
|
class-template is used to associate auxiliary data fields of
|
||||||
types `VertexData` `HalfedgeData`, and `FaceData` to
|
types `VertexData` `HalfedgeData`, and `FaceData` to
|
||||||
each \sc{Dcel} vertex, halfedge, and face record types, respectively.
|
each \dcel vertex, halfedge, and face record types, respectively.
|
||||||
|
|
||||||
When an `Arrangement_2` object is injected with this
|
When an `Arrangement_2` object is injected with this
|
||||||
\sc{Dcel} class, each one of its nested `Vertex`, `Halfedge` and
|
\dcel class, each one of its nested `Vertex`, `Halfedge` and
|
||||||
`Face` classes is extended by the access function `data()`
|
`Face` classes is extended by the access function `data()`
|
||||||
and by the modifier `set_data()`.
|
and by the modifier `set_data()`.
|
||||||
|
|
||||||
The next example shows how to use a \sc{Dcel} with extended vertex,
|
The next example shows how to use a \dcel with extended vertex,
|
||||||
halfedge, and face records. In this example each vertex is associated
|
halfedge, and face records. In this example each vertex is associated
|
||||||
with a color, which may be blue, red, or white, depending on whether the
|
with a color, which may be blue, red, or white, depending on whether the
|
||||||
vertex is isolated, represents a segment endpoint, or whether it
|
vertex is isolated, represents a segment endpoint, or whether it
|
||||||
|
|
@ -3161,11 +3161,11 @@ is copied to another arrangement instance:
|
||||||
\cgalExample{Arrangement_on_surface_2/dcel_extension.cpp}
|
\cgalExample{Arrangement_on_surface_2/dcel_extension.cpp}
|
||||||
|
|
||||||
\cgalAdvancedBegin
|
\cgalAdvancedBegin
|
||||||
The various \sc{Dcel} classes presented in this section are perfectly
|
The various \dcel classes presented in this section are perfectly
|
||||||
sufficient for most applications based on the arrangement package.
|
sufficient for most applications based on the arrangement package.
|
||||||
However, users may also use their own implementation of a \sc{Dcel} class
|
However, users may also use their own implementation of a \dcel class
|
||||||
to instantiate the `Arrangement_2` class-template, in case they need
|
to instantiate the `Arrangement_2` class-template, in case they need
|
||||||
special functionality from their \sc{Dcel}. Such a class must be a model of the
|
special functionality from their \dcel. Such a class must be a model of the
|
||||||
concept `ArrangementDcel`, whose exact specification is listed in the
|
concept `ArrangementDcel`, whose exact specification is listed in the
|
||||||
Reference Manual.
|
Reference Manual.
|
||||||
\cgalAdvancedEnd
|
\cgalAdvancedEnd
|
||||||
|
|
@ -3197,16 +3197,16 @@ types nested in geometry traits `Traits_R`. The same holds for all
|
||||||
types nested in geometry traits `Traits_B`.
|
types nested in geometry traits `Traits_B`.
|
||||||
The `ovl_traits` parameter is
|
The `ovl_traits` parameter is
|
||||||
an instance of an <I>overlay traits-class</I>, which enables the creation of
|
an instance of an <I>overlay traits-class</I>, which enables the creation of
|
||||||
`Dcel_R` records in the overlaid arrangement from the \sc{Dcel} features
|
`Dcel_R` records in the overlaid arrangement from the \dcel features
|
||||||
of `arr_a` and `arr_b` that they correspond to.
|
of `arr_a` and `arr_b` that they correspond to.
|
||||||
|
|
||||||
In principle, we distinguish between three levels of overlay:
|
In principle, we distinguish between three levels of overlay:
|
||||||
<DL>
|
<DL>
|
||||||
<DT><B>Simple overlay:</B><DD>
|
<DT><B>Simple overlay:</B><DD>
|
||||||
An overlay of two arrangements that store no additional data
|
An overlay of two arrangements that store no additional data
|
||||||
with their \sc{Dcel} records. That is, they are defined using the default
|
with their \dcel records. That is, they are defined using the default
|
||||||
\sc{Dcel} class `Arr_default_dcel`. Typically, the overlaid
|
\dcel class `Arr_default_dcel`. Typically, the overlaid
|
||||||
arrangement in this case stores no extra data with its \sc{Dcel} records as
|
arrangement in this case stores no extra data with its \dcel records as
|
||||||
well (or if it does, the additional data fields cannot be computed by
|
well (or if it does, the additional data fields cannot be computed by
|
||||||
the overlay operation), so by overlaying the two arrangement we just
|
the overlay operation), so by overlaying the two arrangement we just
|
||||||
compute the arrangement of all curves that induce `arr_a` and `arr_b`.
|
compute the arrangement of all curves that induce `arr_a` and `arr_b`.
|
||||||
|
|
@ -3227,7 +3227,7 @@ the overlaid face.
|
||||||
|
|
||||||
The `Arr_face_overlay_traits` class should be used as an overlay
|
The `Arr_face_overlay_traits` class should be used as an overlay
|
||||||
traits-class for face-overlay operations. It operates on arrangement, whose
|
traits-class for face-overlay operations. It operates on arrangement, whose
|
||||||
\sc{Dcel} representation is based on the `Arr_face_extended_dcel`
|
\dcel representation is based on the `Arr_face_extended_dcel`
|
||||||
class-template (see Section \ref arr_ssecex_dcel_face). The face-overlay
|
class-template (see Section \ref arr_ssecex_dcel_face). The face-overlay
|
||||||
traits-class is parameterized by a functor that is capable of combining two
|
traits-class is parameterized by a functor that is capable of combining two
|
||||||
face-data fields of types `Dcel_A::Face_data` and
|
face-data fields of types `Dcel_A::Face_data` and
|
||||||
|
|
@ -3236,11 +3236,11 @@ object. The overlay traits-class uses this functor to properly construct
|
||||||
the overlaid faces.
|
the overlaid faces.
|
||||||
<DT><B>Full overlay:</B><DD>
|
<DT><B>Full overlay:</B><DD>
|
||||||
An overlay of two arrangements that store additional data
|
An overlay of two arrangements that store additional data
|
||||||
fields with all their \sc{Dcel} records. That is, their \sc{Dcel} classes
|
fields with all their \dcel records. That is, their \dcel classes
|
||||||
are instantiations of the `Arr_extended_dcel` class-template (see
|
are instantiations of the `Arr_extended_dcel` class-template (see
|
||||||
Section \ref arr_ssecex_dcel_all), where the resulting arrangement
|
Section \ref arr_ssecex_dcel_all), where the resulting arrangement
|
||||||
also extends it \sc{Dcel} records with data fields computed on the basis
|
also extends it \dcel records with data fields computed on the basis
|
||||||
of the overlapping \sc{Dcel} features of the two input arrangements.
|
of the overlapping \dcel features of the two input arrangements.
|
||||||
</DL>
|
</DL>
|
||||||
|
|
||||||
In the following subsections we give some examples for the simple and the
|
In the following subsections we give some examples for the simple and the
|
||||||
|
|
@ -3263,8 +3263,8 @@ The next program constructs two simple arrangements, as depicted in
|
||||||
\subsection arr_ssecface_ovl Examples for a Face Overlay
|
\subsection arr_ssecface_ovl Examples for a Face Overlay
|
||||||
|
|
||||||
The following example shows how to compute the intersection of two polygons
|
The following example shows how to compute the intersection of two polygons
|
||||||
using the `overlay()` function. It uses a face-extended \sc{Dcel} class
|
using the `overlay()` function. It uses a face-extended \dcel class
|
||||||
to define our arrangement class. The \sc{Dcel} extends each face with a Boolean
|
to define our arrangement class. The \dcel extends each face with a Boolean
|
||||||
flag. A polygon is represented as a <I>marked</I> arrangement face, (whose
|
flag. A polygon is represented as a <I>marked</I> arrangement face, (whose
|
||||||
flag is set). The example uses a face-overlay traits class, instantiated with
|
flag is set). The example uses a face-overlay traits class, instantiated with
|
||||||
a functor that simply performs a logical <I>and</I> operations on Boolean flags.
|
a functor that simply performs a logical <I>and</I> operations on Boolean flags.
|
||||||
|
|
@ -3295,7 +3295,7 @@ when one constructs an arrangement induced by a set \f$ \cal C\f$ of arbitrary
|
||||||
planar curves, she or he constructs a collection \f$ \cal C''\f$ of \f$ x\f$-monotone
|
planar curves, she or he constructs a collection \f$ \cal C''\f$ of \f$ x\f$-monotone
|
||||||
subcurves of \f$ \cal C\f$ that are pairwise disjoint in their interior, and these
|
subcurves of \f$ \cal C\f$ that are pairwise disjoint in their interior, and these
|
||||||
subcurves are associated with the arrangement edges (more precisely, with the
|
subcurves are associated with the arrangement edges (more precisely, with the
|
||||||
\sc{Dcel} halfedges). Doing so, the connection between the originating input
|
\dcel halfedges). Doing so, the connection between the originating input
|
||||||
curves and the arrangement edges is lost. This loss might be acceptable for
|
curves and the arrangement edges is lost. This loss might be acceptable for
|
||||||
some applications. However, in many practical cases it is important to
|
some applications. However, in many practical cases it is important to
|
||||||
determine the input curves that give rise to the final subcurves.
|
determine the input curves that give rise to the final subcurves.
|
||||||
|
|
@ -3308,8 +3308,8 @@ used for instantiating the template should be a model of the
|
||||||
`ArrangementTraits_2` concept (see Section \ref arr_sssecinsert_gen).
|
`ArrangementTraits_2` concept (see Section \ref arr_sssecinsert_gen).
|
||||||
That is, it should define the `Curve_2` type (and not just the
|
That is, it should define the `Curve_2` type (and not just the
|
||||||
`X_monotone_curve_2` type). The `Dcel` parameter should model the
|
`X_monotone_curve_2` type). The `Dcel` parameter should model the
|
||||||
`ArrangementDcel` concept. Users can use the default \sc{Dcel} class or
|
`ArrangementDcel` concept. Users can use the default \dcel class or
|
||||||
an extended \sc{Dcel} class according to their needs.
|
an extended \dcel class according to their needs.
|
||||||
|
|
||||||
\subsection arr_ssecarrwh_traverse Traversing an Arrangement with History
|
\subsection arr_ssecarrwh_traverse Traversing an Arrangement with History
|
||||||
|
|
||||||
|
|
@ -3362,7 +3362,7 @@ instantiated by the same traits class. In this case, the resulting
|
||||||
arrangement will store a consolidated container of input curves, and
|
arrangement will store a consolidated container of input curves, and
|
||||||
automatically preserve the cross-mapping between the arrangement edges
|
automatically preserve the cross-mapping between the arrangement edges
|
||||||
and the consolidated curve set. Users can employ an overlay-traits class
|
and the consolidated curve set. Users can employ an overlay-traits class
|
||||||
to maintain any type of auxiliary data stored with the \sc{Dcel} features
|
to maintain any type of auxiliary data stored with the \dcel features
|
||||||
(see Section \ref arr_secoverlay).
|
(see Section \ref arr_secoverlay).
|
||||||
|
|
||||||
\subsection arr_ssecmodif_traverse Modifying an Arrangement with History
|
\subsection arr_ssecmodif_traverse Modifying an Arrangement with History
|
||||||
|
|
@ -3503,7 +3503,7 @@ the arrangement features. Thus, they are ideal for arrangements
|
||||||
instantiated using the `Arr_default_dcel` class.
|
instantiated using the `Arr_default_dcel` class.
|
||||||
However, as explained in Section \ref arr_secex_dcel, one can easily
|
However, as explained in Section \ref arr_secex_dcel, one can easily
|
||||||
extend the arrangement faces by using the `Arr_face_extended_dcel`
|
extend the arrangement faces by using the `Arr_face_extended_dcel`
|
||||||
template, or extend all \sc{Dcel} records by using the `Arr_extended_dcel`
|
template, or extend all \dcel records by using the `Arr_extended_dcel`
|
||||||
template. In such cases, it might be crucial that the auxiliary data fields
|
template. In such cases, it might be crucial that the auxiliary data fields
|
||||||
are written to the file and read from there.
|
are written to the file and read from there.
|
||||||
|
|
||||||
|
|
@ -3520,13 +3520,13 @@ auxiliary data that may be associated with the arrangement features.
|
||||||
This is the default formatter used by the arrangement inserter and the
|
This is the default formatter used by the arrangement inserter and the
|
||||||
arrangement extractor, as defined above.
|
arrangement extractor, as defined above.
|
||||||
<LI>`Arr_face_extended_text_formatter<Arrangement>` operates on
|
<LI>`Arr_face_extended_text_formatter<Arrangement>` operates on
|
||||||
arrangements whose \sc{Dcel} representation is based on the
|
arrangements whose \dcel representation is based on the
|
||||||
`Arr_face_extended_dcel<Traits,FaceData>` class (see
|
`Arr_face_extended_dcel<Traits,FaceData>` class (see
|
||||||
Section \ref arr_ssecex_dcel_face). It supports reading and writing
|
Section \ref arr_ssecex_dcel_face). It supports reading and writing
|
||||||
the auxiliary data objects stored with the arrangement faces provided
|
the auxiliary data objects stored with the arrangement faces provided
|
||||||
that the `FaceData` class supports an inserter and an extractor.
|
that the `FaceData` class supports an inserter and an extractor.
|
||||||
<LI>`Arr_extended_dcel_text_formatter<Arrangement>` operates on
|
<LI>`Arr_extended_dcel_text_formatter<Arrangement>` operates on
|
||||||
arrangements whose \sc{Dcel} representation is based on the
|
arrangements whose \dcel representation is based on the
|
||||||
`Arr_extended_dcel<Traits,VertexData,HalfedgeData,FaceData>` class
|
`Arr_extended_dcel<Traits,VertexData,HalfedgeData,FaceData>` class
|
||||||
(see Section \ref arr_ssecex_dcel_all). It supports reading and writing
|
(see Section \ref arr_ssecex_dcel_all). It supports reading and writing
|
||||||
the auxiliary data objects stored with the arrangement vertices, edges
|
the auxiliary data objects stored with the arrangement vertices, edges
|
||||||
|
|
@ -3599,10 +3599,10 @@ the graph algorithms implemented in the <span class="textsc">bgl</span> to `Arra
|
||||||
An instance of `Arrangement_2` is adapted to a <span class="textsc">Boost</span> graph through the
|
An instance of `Arrangement_2` is adapted to a <span class="textsc">Boost</span> graph through the
|
||||||
provision of a set of free functions that operate on the arrangement features
|
provision of a set of free functions that operate on the arrangement features
|
||||||
and conform with the relevant BGL concepts. Besides the straightforward
|
and conform with the relevant BGL concepts. Besides the straightforward
|
||||||
adaptation, which associates a vertex with each \sc{Dcel} vertex and an edge
|
adaptation, which associates a vertex with each \dcel vertex and an edge
|
||||||
with each \sc{Dcel} halfedge, the package also offer a <I>dual</I> adaptor, which
|
with each \dcel halfedge, the package also offer a <I>dual</I> adaptor, which
|
||||||
associates a graph vertex with each \sc{Dcel} face, such that two vertices are
|
associates a graph vertex with each \dcel face, such that two vertices are
|
||||||
connected, iff there is a \sc{Dcel} halfedge that connects the two corresponding
|
connected, iff there is a \dcel halfedge that connects the two corresponding
|
||||||
faces.
|
faces.
|
||||||
|
|
||||||
\subsection arr_ssecbgl_primal The Primal Arrangement Representation
|
\subsection arr_ssecbgl_primal The Primal Arrangement Representation
|
||||||
|
|
@ -3706,7 +3706,7 @@ used for associating arbitrary data with the arrangement faces.
|
||||||
In the following example we construct the same arrangement as in
|
In the following example we construct the same arrangement as in
|
||||||
example `bgl_primal_adapter.cpp` (see \cgalFigureRef{arr_figex_bgl}),
|
example `bgl_primal_adapter.cpp` (see \cgalFigureRef{arr_figex_bgl}),
|
||||||
and perform breadth-first search on the graph faces, starting from the
|
and perform breadth-first search on the graph faces, starting from the
|
||||||
unbounded face. We extend the \sc{Dcel} faces
|
unbounded face. We extend the \dcel faces
|
||||||
with an unsigned integer, marking the discover time of the face
|
with an unsigned integer, marking the discover time of the face
|
||||||
using `boost` visitors and a property-map class that directly accesses
|
using `boost` visitors and a property-map class that directly accesses
|
||||||
the extended data of the faces:
|
the extended data of the faces:
|
||||||
|
|
@ -3728,7 +3728,7 @@ of the general ones; e.g., `insert()`.
|
||||||
|
|
||||||
<LI>When the curves to be inserted into an arrangement are segments that
|
<LI>When the curves to be inserted into an arrangement are segments that
|
||||||
are pairwise disjoint in their interior, it is more efficient to use
|
are pairwise disjoint in their interior, it is more efficient to use
|
||||||
the traits class `Arr_non_caching_segment_traits_2` rather then
|
the traits class `Arr_non_caching_segment_traits_2` rather than
|
||||||
the default one (`Arr_segment_traits_2`).
|
the default one (`Arr_segment_traits_2`).
|
||||||
|
|
||||||
If the segments may intersect each other, the default traits class
|
If the segments may intersect each other, the default traits class
|
||||||
|
|
@ -3751,7 +3751,7 @@ arrangement. The specialized insertion functions, i.e.,
|
||||||
can be used according to the available information. These functions
|
can be used according to the available information. These functions
|
||||||
hardly involve any geometric operations, if at all. They accept
|
hardly involve any geometric operations, if at all. They accept
|
||||||
topologically related parameters, and use them to operate directly on
|
topologically related parameters, and use them to operate directly on
|
||||||
the \sc{Dcel} records, thus saving algebraic operations, which are
|
the \dcel records, thus saving algebraic operations, which are
|
||||||
especially expensive when high-degree curves are involved.
|
especially expensive when high-degree curves are involved.
|
||||||
|
|
||||||
A polygon, represented by a list of segments along its boundary, can
|
A polygon, represented by a list of segments along its boundary, can
|
||||||
|
|
|
||||||
|
|
@ -408,7 +408,7 @@ namespace CGAL {
|
||||||
size_type number_of_subcurves() const;
|
size_type number_of_subcurves() const;
|
||||||
|
|
||||||
/*! Obtain the \f$ k\f$th subcurve 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 than or equal to \f$n-1\f$, where
|
||||||
* \f$n\f$ is the number of subcurves.
|
* \f$n\f$ is the number of subcurves.
|
||||||
*/
|
*/
|
||||||
typename SubcurveTraits_2::X_monotone_curve_2
|
typename SubcurveTraits_2::X_monotone_curve_2
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@ int main()
|
||||||
// but not for this instance
|
// but not for this instance
|
||||||
for(size_t i = 0; i < pre_segs.size(); ++i) {
|
for(size_t i = 0; i < pre_segs.size(); ++i) {
|
||||||
auto* curr_p = boost::get<X_monotone_curve_2>(&pre_segs[i]);;
|
auto* curr_p = boost::get<X_monotone_curve_2>(&pre_segs[i]);;
|
||||||
CGAL_assertion(curr_p);
|
CGAL_assertion(curr_p != nullptr);
|
||||||
segs.push_back(*curr_p);
|
segs.push_back(*curr_p);
|
||||||
}
|
}
|
||||||
// Construct an ellipse with equation 2*x^2+5*y^2-7=0
|
// Construct an ellipse with equation 2*x^2+5*y^2-7=0
|
||||||
|
|
|
||||||
|
|
@ -159,11 +159,11 @@ namespace CGAL {
|
||||||
{ return CK_Equal_2()(a0, a1); }
|
{ return CK_Equal_2()(a0, a1); }
|
||||||
|
|
||||||
result_type
|
result_type
|
||||||
operator() ( const Line_arc_2 &a0, const Circular_arc_2 &a1) const
|
operator() ( const Line_arc_2 &/*a0*/, const Circular_arc_2 &/*a1*/) const
|
||||||
{ return false; }
|
{ return false; }
|
||||||
|
|
||||||
result_type
|
result_type
|
||||||
operator() ( const Circular_arc_2 &a0, const Line_arc_2 &a1) const
|
operator() ( const Circular_arc_2 &/*a0*/, const Line_arc_2 &/*a1*/) const
|
||||||
{ return false; }
|
{ return false; }
|
||||||
|
|
||||||
result_type
|
result_type
|
||||||
|
|
|
||||||
|
|
@ -479,7 +479,18 @@ public:
|
||||||
const Inner_ccb* inner_ccb() const
|
const Inner_ccb* inner_ccb() const
|
||||||
{
|
{
|
||||||
CGAL_precondition(is_on_inner_ccb());
|
CGAL_precondition(is_on_inner_ccb());
|
||||||
return (reinterpret_cast<const Inner_ccb*>(_clean_pointer(this->p_comp)));
|
|
||||||
|
const Inner_ccb* out = reinterpret_cast<const Inner_ccb*>(_clean_pointer(this->p_comp));
|
||||||
|
if (out->is_valid())
|
||||||
|
return out;
|
||||||
|
|
||||||
|
// else reduce path and get valid iccb
|
||||||
|
const Inner_ccb* valid = out->next();
|
||||||
|
while (!valid->is_valid())
|
||||||
|
valid = valid->next();
|
||||||
|
const_cast<Inner_ccb*>(out)->set_next(const_cast<Inner_ccb*>(valid));
|
||||||
|
const_cast<Halfedge*>(this)->set_inner_ccb(valid);
|
||||||
|
return valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! Get an incident inner CCB (non-const version).
|
/*! Get an incident inner CCB (non-const version).
|
||||||
|
|
@ -488,11 +499,28 @@ public:
|
||||||
Inner_ccb* inner_ccb()
|
Inner_ccb* inner_ccb()
|
||||||
{
|
{
|
||||||
CGAL_precondition(is_on_inner_ccb());
|
CGAL_precondition(is_on_inner_ccb());
|
||||||
return (reinterpret_cast<Inner_ccb*>(_clean_pointer(this->p_comp)));
|
|
||||||
|
Inner_ccb* out = reinterpret_cast<Inner_ccb*>(_clean_pointer(this->p_comp));
|
||||||
|
if (out->is_valid())
|
||||||
|
return out;
|
||||||
|
|
||||||
|
// else reduce path and get valid iccb
|
||||||
|
Inner_ccb* valid = out->next();
|
||||||
|
while (!valid->is_valid())
|
||||||
|
valid = valid->next();
|
||||||
|
out->set_next(valid);
|
||||||
|
set_inner_ccb(valid);
|
||||||
|
return valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
Inner_ccb* inner_ccb_no_redirect()
|
||||||
|
{
|
||||||
|
CGAL_precondition(is_on_inner_ccb());
|
||||||
|
return reinterpret_cast<Inner_ccb*>(_clean_pointer(this->p_comp));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! Set the incident inner CCB. */
|
/*! Set the incident inner CCB. */
|
||||||
void set_inner_ccb(Inner_ccb *ic)
|
void set_inner_ccb(const Inner_ccb *ic)
|
||||||
{
|
{
|
||||||
// Set the component pointer and set its LSB.
|
// Set the component pointer and set its LSB.
|
||||||
this->p_comp = _set_lsb(ic);
|
this->p_comp = _set_lsb(ic);
|
||||||
|
|
@ -769,57 +797,111 @@ public:
|
||||||
typedef typename Face::Inner_ccb_iterator Inner_ccb_iterator;
|
typedef typename Face::Inner_ccb_iterator Inner_ccb_iterator;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Face* p_f; // The face the contains the CCB in its interior.
|
union
|
||||||
|
{
|
||||||
|
Face* f; // The face the contains the CCB in its interior.
|
||||||
|
Arr_inner_ccb* icc; // next inner CCB in chain to valid icc
|
||||||
|
} f_or_icc;
|
||||||
Inner_ccb_iterator iter; // The inner CCB identifier.
|
Inner_ccb_iterator iter; // The inner CCB identifier.
|
||||||
bool iter_is_not_singular;
|
enum
|
||||||
|
{
|
||||||
|
ITER_IS_SINGULAR, // singular = default iterator, not initialized
|
||||||
|
ITER_IS_NOT_SINGULAR, // not singular = iterator was assigned and is valid
|
||||||
|
INVALID // invalid = the inner CCB is invalid and
|
||||||
|
// only links to another inner CCB
|
||||||
|
// in chain to valid CCB
|
||||||
|
} status;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/*! Default constructor. */
|
/*! Default constructor. */
|
||||||
Arr_inner_ccb() : p_f(nullptr), iter_is_not_singular(false) {}
|
Arr_inner_ccb() : status(ITER_IS_SINGULAR) { f_or_icc.f = nullptr; }
|
||||||
|
|
||||||
/*! Copy constructor. */
|
/*! Copy constructor. */
|
||||||
Arr_inner_ccb(const Arr_inner_ccb& other) :
|
Arr_inner_ccb(const Arr_inner_ccb& other) :
|
||||||
p_f(other.p_f), iter_is_not_singular(other.iter_is_not_singular)
|
f_or_icc(other.f_or_icc), status(other.status)
|
||||||
{ if (other.iter_is_not_singular) iter = other.iter; }
|
{ if (other.status == ITER_IS_NOT_SINGULAR) iter = other.iter; }
|
||||||
|
|
||||||
/*! Get a halfedge along the component (const version). */
|
/*! Get a halfedge along the component (const version). */
|
||||||
const Halfedge* halfedge() const { return (*iter); }
|
const Halfedge* halfedge() const
|
||||||
|
{
|
||||||
|
CGAL_assertion (is_valid());
|
||||||
|
return (*iter);
|
||||||
|
}
|
||||||
|
|
||||||
/*! Get a halfedge along the component (non-const version). */
|
/*! Get a halfedge along the component (non-const version). */
|
||||||
Halfedge* halfedge() { return (*iter); }
|
Halfedge* halfedge()
|
||||||
|
{
|
||||||
|
CGAL_assertion (is_valid());
|
||||||
|
return (*iter);
|
||||||
|
}
|
||||||
|
|
||||||
/*! Set a representative halfedge for the component. */
|
/*! Set a representative halfedge for the component. */
|
||||||
void set_halfedge(Halfedge *he) { *iter = he; }
|
void set_halfedge(Halfedge *he)
|
||||||
|
{
|
||||||
|
CGAL_assertion (is_valid());
|
||||||
|
*iter = he;
|
||||||
|
}
|
||||||
|
|
||||||
/*! Get the incident face (const version). */
|
/*! Get the incident face (const version). */
|
||||||
const Face* face() const { return (p_f); }
|
const Face* face() const
|
||||||
|
{
|
||||||
|
CGAL_assertion (status != INVALID);
|
||||||
|
return f_or_icc.f;
|
||||||
|
}
|
||||||
|
|
||||||
/*! Get the incident face (non-const version). */
|
/*! Get the incident face (non-const version). */
|
||||||
Face* face() { return (p_f); }
|
Face* face()
|
||||||
|
{
|
||||||
|
CGAL_assertion (status != INVALID);
|
||||||
|
return f_or_icc.f;
|
||||||
|
}
|
||||||
|
|
||||||
/*! Set the incident face. */
|
/*! Set the incident face. */
|
||||||
void set_face(Face* f) { p_f = f; }
|
void set_face(Face* f)
|
||||||
|
{
|
||||||
|
CGAL_assertion (status != INVALID);
|
||||||
|
f_or_icc.f = f;
|
||||||
|
}
|
||||||
|
|
||||||
/*! Get the iterator (const version). */
|
/*! Get the iterator (const version). */
|
||||||
Inner_ccb_iterator iterator() const
|
Inner_ccb_iterator iterator() const
|
||||||
{
|
{
|
||||||
CGAL_assertion(iter_is_not_singular);
|
CGAL_assertion(status == ITER_IS_NOT_SINGULAR);
|
||||||
return (iter);
|
return (iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! Get the iterator (non-const version). */
|
/*! Get the iterator (non-const version). */
|
||||||
Inner_ccb_iterator iterator()
|
Inner_ccb_iterator iterator()
|
||||||
{
|
{
|
||||||
CGAL_assertion(iter_is_not_singular);
|
CGAL_assertion(status == ITER_IS_NOT_SINGULAR);
|
||||||
return (iter);
|
return (iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! Set the inner CCB iterator. */
|
/*! Set the inner CCB iterator. */
|
||||||
void set_iterator(Inner_ccb_iterator it)
|
void set_iterator(Inner_ccb_iterator it)
|
||||||
{
|
{
|
||||||
|
CGAL_assertion (is_valid());
|
||||||
iter = it;
|
iter = it;
|
||||||
iter_is_not_singular = true;
|
status = ITER_IS_NOT_SINGULAR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*! Check validity */
|
||||||
|
bool is_valid() const { return (status != INVALID); }
|
||||||
|
|
||||||
|
/*! Get the next CCB to primary chain. */
|
||||||
|
Arr_inner_ccb* next() const
|
||||||
|
{
|
||||||
|
CGAL_assertion (status == INVALID);
|
||||||
|
return f_or_icc.icc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! Set the next CCB to primary chain. */
|
||||||
|
void set_next(Arr_inner_ccb* next)
|
||||||
|
{
|
||||||
|
status = INVALID;
|
||||||
|
f_or_icc.icc = next;
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*! \class
|
/*! \class
|
||||||
|
|
@ -943,6 +1025,7 @@ public:
|
||||||
typedef typename Face_list::iterator Face_iterator;
|
typedef typename Face_list::iterator Face_iterator;
|
||||||
typedef CGAL::N_step_adaptor_derived<Halfedge_iterator, 2>
|
typedef CGAL::N_step_adaptor_derived<Halfedge_iterator, 2>
|
||||||
Edge_iterator;
|
Edge_iterator;
|
||||||
|
typedef typename Inner_ccb_list::iterator Inner_ccb_iterator;
|
||||||
|
|
||||||
// Definitions of const iterators.
|
// Definitions of const iterators.
|
||||||
typedef typename Vertex_list::const_iterator Vertex_const_iterator;
|
typedef typename Vertex_list::const_iterator Vertex_const_iterator;
|
||||||
|
|
@ -1019,6 +1102,9 @@ public:
|
||||||
{
|
{
|
||||||
return make_prevent_deref_range(edges_begin(), edges_end());
|
return make_prevent_deref_range(edges_begin(), edges_end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Inner_ccb_iterator inner_ccbs_begin() { return in_ccbs.begin(); }
|
||||||
|
Inner_ccb_iterator inner_ccbs_end() { return in_ccbs.end(); }
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
/// \name Obtaining constant iterators.
|
/// \name Obtaining constant iterators.
|
||||||
|
|
|
||||||
|
|
@ -168,7 +168,7 @@ overlay(const Arrangement_on_surface_2<GeometryTraitsA_2, TopologyTraitsA>& arr1
|
||||||
typedef Arrangement_on_surface_2<Rgt2, Rtt> Arr_res;
|
typedef Arrangement_on_surface_2<Rgt2, Rtt> Arr_res;
|
||||||
typedef typename Arr_res::Allocator Allocator;
|
typedef typename Arr_res::Allocator Allocator;
|
||||||
|
|
||||||
// some type assertions (not all, but better then nothing).
|
// some type assertions (not all, but better than nothing).
|
||||||
#if !defined(CGAL_NO_ASSERTIONS)
|
#if !defined(CGAL_NO_ASSERTIONS)
|
||||||
typedef typename Agt2::Point_2 A_point;
|
typedef typename Agt2::Point_2 A_point;
|
||||||
typedef typename Bgt2::Point_2 B_point;
|
typedef typename Bgt2::Point_2 B_point;
|
||||||
|
|
|
||||||
|
|
@ -2741,14 +2741,24 @@ _insert_at_vertices(DHalfedge* he_to,
|
||||||
he1->set_inner_ccb(ic1);
|
he1->set_inner_ccb(ic1);
|
||||||
he2->set_inner_ccb(ic1);
|
he2->set_inner_ccb(ic1);
|
||||||
|
|
||||||
|
if (m_sweep_mode)
|
||||||
|
{
|
||||||
|
// Inner CCB are obtained using Halfedge::inner_ccb() which
|
||||||
|
// performs path reduction and always return valid iCCB
|
||||||
|
CGAL_assertion(ic1->is_valid());
|
||||||
|
CGAL_assertion(ic2->is_valid());
|
||||||
|
ic2->set_next(ic1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
// Make all halfedges along ic2 to point to ic1.
|
// Make all halfedges along ic2 to point to ic1.
|
||||||
DHalfedge* curr;
|
DHalfedge* curr;
|
||||||
|
|
||||||
for (curr = he2->next(); curr != he1; curr = curr->next())
|
for (curr = he2->next(); curr != he1; curr = curr->next())
|
||||||
curr->set_inner_ccb(ic1);
|
curr->set_inner_ccb(ic1);
|
||||||
|
|
||||||
// Delete the redundant inner CCB.
|
// Delete the redundant inner CCB.
|
||||||
_dcel().delete_inner_ccb(ic2);
|
_dcel().delete_inner_ccb(ic2);
|
||||||
|
}
|
||||||
|
|
||||||
// Notify the observers that we have merged the two inner CCBs.
|
// Notify the observers that we have merged the two inner CCBs.
|
||||||
_notify_after_merge_inner_ccb(fh, (Halfedge_handle(he1))->ccb());
|
_notify_after_merge_inner_ccb(fh, (Halfedge_handle(he1))->ccb());
|
||||||
|
|
@ -4042,7 +4052,7 @@ _defines_outer_ccb_of_new_face(const DHalfedge* he_to,
|
||||||
// - No smallest has bin recorded so far, or
|
// - No smallest has bin recorded so far, or
|
||||||
// - The current target vertex and the recorded vertex are the same and
|
// - The current target vertex and the recorded vertex are the same and
|
||||||
// * The current curve is smaller than the recorded curve, or
|
// * The current curve is smaller than the recorded curve, or
|
||||||
// - The current curve end is smaller then the recorded curve end.
|
// - The current curve end is smaller than the recorded curve end.
|
||||||
// smaller than its source, so we should check whether it is also smaller
|
// smaller than its source, so we should check whether it is also smaller
|
||||||
// Note that we compare the vertices lexicographically: first by the
|
// Note that we compare the vertices lexicographically: first by the
|
||||||
// indices, then by x, then by y.
|
// indices, then by x, then by y.
|
||||||
|
|
|
||||||
|
|
@ -911,6 +911,14 @@ protected:
|
||||||
bool m_own_traits; // inidicates whether the geometry
|
bool m_own_traits; // inidicates whether the geometry
|
||||||
// traits should be freed up.
|
// traits should be freed up.
|
||||||
|
|
||||||
|
bool m_sweep_mode = false;
|
||||||
|
// sweep mode efficiently
|
||||||
|
// merges inner CCB but
|
||||||
|
// keeps invalid inner CCB
|
||||||
|
// and memory overhead that
|
||||||
|
// should be cleaned
|
||||||
|
// afterwards
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// \name Constructors.
|
/// \name Constructors.
|
||||||
//@{
|
//@{
|
||||||
|
|
@ -941,6 +949,9 @@ public:
|
||||||
/*! Destructor. */
|
/*! Destructor. */
|
||||||
virtual ~Arrangement_on_surface_2();
|
virtual ~Arrangement_on_surface_2();
|
||||||
|
|
||||||
|
/*! Change mode. */
|
||||||
|
void set_sweep_mode (bool mode) { m_sweep_mode = mode; }
|
||||||
|
|
||||||
/*! Clear the arrangement. */
|
/*! Clear the arrangement. */
|
||||||
virtual void clear();
|
virtual void clear();
|
||||||
//@}
|
//@}
|
||||||
|
|
@ -1518,6 +1529,39 @@ public:
|
||||||
|
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Cleans the inner CCB if sweep mode was used, by removing all
|
||||||
|
* non-valid inner CCBs
|
||||||
|
*/
|
||||||
|
void clean_inner_ccbs_after_sweep()
|
||||||
|
{
|
||||||
|
for (DHalfedge_iter he = _dcel().halfedges_begin();
|
||||||
|
he != _dcel().halfedges_end(); ++ he)
|
||||||
|
{
|
||||||
|
if (!he->is_on_inner_ccb())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
DInner_ccb* ic1 = he->inner_ccb_no_redirect();
|
||||||
|
if (ic1->is_valid())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Calling Halfedge::inner_ccb() reduces the path and makes the
|
||||||
|
// halfedge point to a correct CCB
|
||||||
|
DInner_ccb* ic2 = he->inner_ccb();
|
||||||
|
CGAL_USE(ic2);
|
||||||
|
CGAL_assertion (ic2->halfedge()->is_on_inner_ccb()
|
||||||
|
&& ic2->halfedge()->inner_ccb_no_redirect() == ic2);
|
||||||
|
}
|
||||||
|
|
||||||
|
typename Dcel::Inner_ccb_iterator it = _dcel().inner_ccbs_begin();
|
||||||
|
while (it != _dcel().inner_ccbs_end())
|
||||||
|
{
|
||||||
|
typename Dcel::Inner_ccb_iterator current = it ++;
|
||||||
|
if (!current->is_valid())
|
||||||
|
_dcel().delete_inner_ccb(&*current);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/// \name Determining the boundary-side conditions.
|
/// \name Determining the boundary-side conditions.
|
||||||
//@{
|
//@{
|
||||||
|
|
|
||||||
|
|
@ -295,13 +295,6 @@ public:
|
||||||
return y;
|
return y;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! \brief the same as \c evaluate but arguments are passed by value
|
|
||||||
//! (needed to substitute variables in bivariate polynomial)
|
|
||||||
inline static NT binded_eval(Poly_1 poly, NT x)
|
|
||||||
{
|
|
||||||
return evaluate(poly, x);
|
|
||||||
}
|
|
||||||
|
|
||||||
//! \brief evalutates a polynomial at certain x-coordinate
|
//! \brief evalutates a polynomial at certain x-coordinate
|
||||||
static NT evaluate(const Poly_1& poly, const NT& x,
|
static NT evaluate(const Poly_1& poly, const NT& x,
|
||||||
bool *error_bounds_ = nullptr)
|
bool *error_bounds_ = nullptr)
|
||||||
|
|
@ -913,10 +906,9 @@ void get_precached_poly(int var, const NT& key, int /* level */, Poly_1& poly)
|
||||||
// }
|
// }
|
||||||
|
|
||||||
if(not_cached||not_found) {
|
if(not_cached||not_found) {
|
||||||
poly = Poly_1(::boost::make_transform_iterator(coeffs->begin(),
|
auto fn = [&key1](const Poly_1& poly){ return evaluate(poly, key1); };
|
||||||
boost::bind2nd(std::ptr_fun(binded_eval), key1)),
|
poly = Poly_1(::boost::make_transform_iterator(coeffs->begin(), fn),
|
||||||
::boost::make_transform_iterator(coeffs->end(),
|
::boost::make_transform_iterator(coeffs->end(), fn));
|
||||||
boost::bind2nd(std::ptr_fun(binded_eval), key1)));
|
|
||||||
if(not_cached)
|
if(not_cached)
|
||||||
return;
|
return;
|
||||||
// all available space consumed: drop the least recently used entry
|
// all available space consumed: drop the least recently used entry
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,6 @@
|
||||||
|
|
||||||
#include <CGAL/basic.h>
|
#include <CGAL/basic.h>
|
||||||
#include <CGAL/function_objects.h>
|
#include <CGAL/function_objects.h>
|
||||||
#include <boost/functional.hpp>
|
|
||||||
|
|
||||||
/*! \file CGAL/Curved_kernel_via_analysis_2/gfx/Curve_renderer_traits.h
|
/*! \file CGAL/Curved_kernel_via_analysis_2/gfx/Curve_renderer_traits.h
|
||||||
* \brief
|
* \brief
|
||||||
|
|
@ -107,11 +106,13 @@ struct Transform {
|
||||||
|
|
||||||
template <class X>
|
template <class X>
|
||||||
OutputPoly_2 operator()(const CGAL::Polynomial<X>& p, Op op = Op()) const {
|
OutputPoly_2 operator()(const CGAL::Polynomial<X>& p, Op op = Op()) const {
|
||||||
|
typedef typename InputPoly_2::NT NT_in;
|
||||||
Transform<typename OutputPoly_2::NT, typename InputPoly_2::NT, Op> tr;
|
typedef typename OutputPoly_2::NT NT_out;
|
||||||
|
Transform<NT_out, NT_in, Op> tr;
|
||||||
|
auto fn = [&op, &tr](const NT_in& v){ return tr(v, op); };
|
||||||
return OutputPoly_2(
|
return OutputPoly_2(
|
||||||
::boost::make_transform_iterator(p.begin(), boost::bind2nd(tr, op)),
|
::boost::make_transform_iterator(p.begin(), fn),
|
||||||
::boost::make_transform_iterator(p.end(), boost::bind2nd(tr, op)));
|
::boost::make_transform_iterator(p.end(), fn));
|
||||||
}
|
}
|
||||||
|
|
||||||
OutputPoly_2 operator()(
|
OutputPoly_2 operator()(
|
||||||
|
|
|
||||||
|
|
@ -142,6 +142,9 @@ public:
|
||||||
/* A notification issued before the sweep process starts. */
|
/* A notification issued before the sweep process starts. */
|
||||||
inline void before_sweep();
|
inline void before_sweep();
|
||||||
|
|
||||||
|
/* A notification issued after the sweep process stops. */
|
||||||
|
inline void after_sweep();
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* A notification invoked before the sweep-line starts handling the given
|
* A notification invoked before the sweep-line starts handling the given
|
||||||
* event.
|
* event.
|
||||||
|
|
@ -267,7 +270,21 @@ private:
|
||||||
// Notifies the helper that the sweep process now starts.
|
// Notifies the helper that the sweep process now starts.
|
||||||
template <typename Hlpr, typename Vis>
|
template <typename Hlpr, typename Vis>
|
||||||
void Arr_construction_ss_visitor<Hlpr, Vis>::before_sweep()
|
void Arr_construction_ss_visitor<Hlpr, Vis>::before_sweep()
|
||||||
{ m_helper.before_sweep(); }
|
{
|
||||||
|
m_helper.before_sweep();
|
||||||
|
m_arr->set_sweep_mode(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// A notification issued after the sweep process stops.
|
||||||
|
template <typename Hlpr, typename Vis>
|
||||||
|
void Arr_construction_ss_visitor<Hlpr, Vis>::after_sweep()
|
||||||
|
{
|
||||||
|
m_arr->clean_inner_ccbs_after_sweep();
|
||||||
|
m_arr->set_sweep_mode(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// A notification invoked before the sweep-line starts handling the given
|
// A notification invoked before the sweep-line starts handling the given
|
||||||
|
|
|
||||||
|
|
@ -552,6 +552,8 @@ Arr_overlay_ss_visitor<OvlHlpr, OvlTr, Vis>::update_event(Event* e,
|
||||||
template <typename OvlHlpr, typename OvlTr, typename Vis>
|
template <typename OvlHlpr, typename OvlTr, typename Vis>
|
||||||
void Arr_overlay_ss_visitor<OvlHlpr, OvlTr, Vis>::after_sweep()
|
void Arr_overlay_ss_visitor<OvlHlpr, OvlTr, Vis>::after_sweep()
|
||||||
{
|
{
|
||||||
|
Base::after_sweep();
|
||||||
|
|
||||||
// Notify boundary vertices:
|
// Notify boundary vertices:
|
||||||
typename Vertex_map::iterator it;
|
typename Vertex_map::iterator it;
|
||||||
for (it = m_vertices_map.begin(); it != m_vertices_map.end(); ++it) {
|
for (it = m_vertices_map.begin(); it != m_vertices_map.end(); ++it) {
|
||||||
|
|
|
||||||
|
|
@ -9,20 +9,6 @@ enable_testing()
|
||||||
find_package(CGAL REQUIRED COMPONENTS Core)
|
find_package(CGAL REQUIRED COMPONENTS Core)
|
||||||
|
|
||||||
include(${CGAL_USE_FILE})
|
include(${CGAL_USE_FILE})
|
||||||
|
|
||||||
if(COMMAND target_compile_options)
|
|
||||||
# Since CMake-2.8.12: New CMake script, that defines the targets and
|
# Since CMake-2.8.12: New CMake script, that defines the targets and
|
||||||
# the CTest test cases.
|
# the CTest test cases.
|
||||||
include(${CMAKE_CURRENT_SOURCE_DIR}/cgal_test.cmake)
|
include(${CMAKE_CURRENT_SOURCE_DIR}/cgal_test.cmake)
|
||||||
else()
|
|
||||||
# If CMake version is <= 2.8.11, use the usual CMake script.
|
|
||||||
|
|
||||||
# create a target per cppfile
|
|
||||||
file(
|
|
||||||
GLOB cppfiles
|
|
||||||
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
|
|
||||||
foreach(cppfile ${cppfiles})
|
|
||||||
create_single_source_cgal_program("${cppfile}")
|
|
||||||
endforeach()
|
|
||||||
endif()
|
|
||||||
|
|
|
||||||
|
|
@ -1424,3 +1424,9 @@ compile_and_run(test_io)
|
||||||
compile_and_run(test_sgm)
|
compile_and_run(test_sgm)
|
||||||
|
|
||||||
compile_and_run(test_polycurve_intersection)
|
compile_and_run(test_polycurve_intersection)
|
||||||
|
if(CGAL_DISABLE_GMP)
|
||||||
|
get_directory_property(LIST_OF_TESTS TESTS)
|
||||||
|
foreach(_test ${LIST_OF_TESTS})
|
||||||
|
set_property(TEST ${_test} APPEND PROPERTY ENVIRONMENT CGAL_DISABLE_GMP=1)
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
|
|
|
||||||
|
|
@ -129,6 +129,19 @@ configure()
|
||||||
{
|
{
|
||||||
echo "Configuring... "
|
echo "Configuring... "
|
||||||
rm -rf CMakeCache.txt CMakeFiles/
|
rm -rf CMakeCache.txt CMakeFiles/
|
||||||
|
if [ -f "$INIT_FILE" ]
|
||||||
|
then
|
||||||
|
if eval 'cmake --no-warn-unused-cli ${INIT_FILE:+"-C${INIT_FILE}"} "$CMAKE_GENERATOR" -DRUNNING_CGAL_AUTO_TEST=TRUE \
|
||||||
|
-DCGAL_DIR="$CGAL_DIR" \
|
||||||
|
-DCGAL_CXX_FLAGS:STRING="$CGAL_CXX_FLAGS $TESTSUITE_CXXFLAGS -I../../include" \
|
||||||
|
-DCGAL_EXE_LINKER_FLAGS="$CGAL_EXE_LINKER_FLAGS $TESTSUITE_LDFLAGS" \
|
||||||
|
.' ; then
|
||||||
|
|
||||||
|
echo " successful configuration" >> $ERRORFILE
|
||||||
|
else
|
||||||
|
echo " ERROR: configuration" >> $ERRORFILE
|
||||||
|
fi
|
||||||
|
else
|
||||||
echo "cmake --no-warn-unused-cli ${INIT_FILE:+"-C${INIT_FILE}"} "$CMAKE_GENERATOR" -DRUNNING_CGAL_AUTO_TEST=TRUE \
|
echo "cmake --no-warn-unused-cli ${INIT_FILE:+"-C${INIT_FILE}"} "$CMAKE_GENERATOR" -DRUNNING_CGAL_AUTO_TEST=TRUE \
|
||||||
-DCGAL_DIR=\"$CGAL_DIR\" \
|
-DCGAL_DIR=\"$CGAL_DIR\" \
|
||||||
-DCGAL_CXX_FLAGS:STRING=\"$TESTSUITE_CXXFLAGS -I../../include\" \
|
-DCGAL_CXX_FLAGS:STRING=\"$TESTSUITE_CXXFLAGS -I../../include\" \
|
||||||
|
|
@ -146,6 +159,7 @@ configure()
|
||||||
else
|
else
|
||||||
echo " ERROR: configuration" >> $ERRORFILE
|
echo " ERROR: configuration" >> $ERRORFILE
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
compile_test_with_flags()
|
compile_test_with_flags()
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
#include <CGAL/Arr_polyline_traits_2.h>
|
#include <CGAL/Arr_polyline_traits_2.h>
|
||||||
#include <CGAL/Arrangement_2.h>
|
#include <CGAL/Arrangement_2.h>
|
||||||
|
|
||||||
#include <boost/function_output_iterator.hpp>
|
#include <boost/iterator/function_output_iterator.hpp>
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,9 +16,9 @@ faces as edges of the dual graph.
|
||||||
The scope of \cgal is geometry and not graph algorithms. Nevertheless, this package
|
The scope of \cgal is geometry and not graph algorithms. Nevertheless, this package
|
||||||
provides the necessary classes and functions that enable using the
|
provides the necessary classes and functions that enable using the
|
||||||
algorithms of the <A HREF="https://www.boost.org/libs/graph/doc/index.html">Boost Graph Library</A> \cgalCite{cgal:sll-bgl-02}
|
algorithms of the <A HREF="https://www.boost.org/libs/graph/doc/index.html">Boost Graph Library</A> \cgalCite{cgal:sll-bgl-02}
|
||||||
(\sc{Bgl} for short) with \cgal data structures.
|
(\bgl for short) with \cgal data structures.
|
||||||
|
|
||||||
Furthermore, this package extends the \sc{Bgl}
|
Furthermore, this package extends the \bgl
|
||||||
by introducing concepts such as `HalfedgeGraph` and `FaceGraph`
|
by introducing concepts such as `HalfedgeGraph` and `FaceGraph`
|
||||||
allowing to handle *halfedges* and *faces*.
|
allowing to handle *halfedges* and *faces*.
|
||||||
These concepts reflect the design of the halfedge data structure described
|
These concepts reflect the design of the halfedge data structure described
|
||||||
|
|
@ -26,7 +26,7 @@ in Chapter \ref PkgHalfedgeDS, with opposite halfedges and circular
|
||||||
sequences of halfedges around vertices and around faces.
|
sequences of halfedges around vertices and around faces.
|
||||||
|
|
||||||
This chapter is organized as follows:
|
This chapter is organized as follows:
|
||||||
- The first section, Section \ref BGLA, summarizes the main ideas of the \sc{Bgl}.
|
- The first section, Section \ref BGLA, summarizes the main ideas of the \bgl.
|
||||||
- Section \ref BGLHeader then explains where to find header files and the chosen naming conventions, as we blend two
|
- Section \ref BGLHeader then explains where to find header files and the chosen naming conventions, as we blend two
|
||||||
different libraries.
|
different libraries.
|
||||||
- The four following sections give examples on how to use CGAL graph and mesh data structures
|
- The four following sections give examples on how to use CGAL graph and mesh data structures
|
||||||
|
|
@ -34,13 +34,13 @@ such as
|
||||||
\link PkgSurfaceMesh Surface_mesh \endlink,
|
\link PkgSurfaceMesh Surface_mesh \endlink,
|
||||||
\link PkgPolyhedron Polyhedron \endlink,
|
\link PkgPolyhedron Polyhedron \endlink,
|
||||||
\link PkgArrangementOnSurface2 Arrangement_2 \endlink, and the
|
\link PkgArrangementOnSurface2 Arrangement_2 \endlink, and the
|
||||||
\link PkgTriangulation2 2D triangulation \endlink classes as models of the \sc{Bgl} concepts.
|
\link PkgTriangulation2 2D triangulation \endlink classes as models of the \bgl concepts.
|
||||||
- Starting with Section \ref BGLExtensions, we introduce new graph concepts, classes,
|
- Starting with Section \ref BGLExtensions, we introduce new graph concepts, classes,
|
||||||
and functions that extend the functionalities of the \sc{Bgl}.
|
and functions that extend the functionalities of the \bgl.
|
||||||
|
|
||||||
\section BGLA A Short Introduction to the Boost Graph Library
|
\section BGLA A Short Introduction to the Boost Graph Library
|
||||||
|
|
||||||
The algorithms of the \sc{Bgl} operate on models of various <I>graph concepts</I>.
|
The algorithms of the \bgl operate on models of various <I>graph concepts</I>.
|
||||||
The <I>traits class</I> `boost::graph_traits` enable algorithms to determine the types of vertices and edges
|
The <I>traits class</I> `boost::graph_traits` enable algorithms to determine the types of vertices and edges
|
||||||
(similar to `std::iterator_traits` for iterators).
|
(similar to `std::iterator_traits` for iterators).
|
||||||
<I>Free functions</I> that operate on graphs enable algorithms to obtain,
|
<I>Free functions</I> that operate on graphs enable algorithms to obtain,
|
||||||
|
|
@ -53,7 +53,7 @@ arbitrary order.
|
||||||
|
|
||||||
\subsection BGLGraphConcepts Graph Concepts
|
\subsection BGLGraphConcepts Graph Concepts
|
||||||
|
|
||||||
The \sc{Bgl} introduces several <a href="https://www.boost.org/libs/graph/doc/graph_concepts.html">graph concepts</a>,
|
The \bgl introduces several <a href="https://www.boost.org/libs/graph/doc/graph_concepts.html">graph concepts</a>,
|
||||||
which have different sets of characteristics and requirements.
|
which have different sets of characteristics and requirements.
|
||||||
For example, iterating through all vertices or all edges in a graph, obtaining the outgoing
|
For example, iterating through all vertices or all edges in a graph, obtaining the outgoing
|
||||||
or in-going edges of a vertex, inserting vertices and edges into a graph,
|
or in-going edges of a vertex, inserting vertices and edges into a graph,
|
||||||
|
|
@ -101,16 +101,16 @@ std::pair<vertex_iterator,vertex_iterator> vertices(const Graph& g);
|
||||||
|
|
||||||
\subsection BGLPropertyMaps Property Maps
|
\subsection BGLPropertyMaps Property Maps
|
||||||
|
|
||||||
Another feature extensively used in the \sc{Bgl} is the *property map*,
|
Another feature extensively used in the \bgl is the *property map*,
|
||||||
which is offered by the <a href="https://www.boost.org/libs/property_map/doc/property_map.html">Boost Property Map Library</a>. Property maps
|
which is offered by the <a href="https://www.boost.org/libs/property_map/doc/property_map.html">Boost Property Map Library</a>. Property maps
|
||||||
are a general purpose interface for mapping key objects to
|
are a general purpose interface for mapping key objects to
|
||||||
corresponding value objects.
|
corresponding value objects.
|
||||||
|
|
||||||
The \sc{Bgl} uses property maps to associate information with vertices and edges.
|
The \bgl uses property maps to associate information with vertices and edges.
|
||||||
This mechanism uses a traits class (`boost::property_traits`) and free
|
This mechanism uses a traits class (`boost::property_traits`) and free
|
||||||
functions to read (`get`) and write (`put`) information in vertices,
|
functions to read (`get`) and write (`put`) information in vertices,
|
||||||
edges, and also in halfedges and faces for models of the \cgal graph concepts.
|
edges, and also in halfedges and faces for models of the \cgal graph concepts.
|
||||||
For example, the \sc{Bgl}
|
For example, the \bgl
|
||||||
Dijksta's shortest path algorithm writes the predecessor of each vertex, as
|
Dijksta's shortest path algorithm writes the predecessor of each vertex, as
|
||||||
well as the distance to the source in such a property map.
|
well as the distance to the source in such a property map.
|
||||||
|
|
||||||
|
|
@ -138,14 +138,14 @@ Examples of such event points in graph algorithms are when a vertex is traversed
|
||||||
or when all outgoing edges of a vertex have been traversed.<BR>
|
or when all outgoing edges of a vertex have been traversed.<BR>
|
||||||
|
|
||||||
See also Section <A HREF="https://www.boost.org/libs/graph/doc/visitor_concepts.html">Visitor Concepts</A>
|
See also Section <A HREF="https://www.boost.org/libs/graph/doc/visitor_concepts.html">Visitor Concepts</A>
|
||||||
in the \sc{Bgl} manual.
|
in the \bgl manual.
|
||||||
|
|
||||||
\subsection BGLNamedParameters Named Parameters
|
\subsection BGLNamedParameters Named Parameters
|
||||||
|
|
||||||
The notion of <I>named parameters</I> was introduced in the \sc{Bgl},
|
The notion of <I>named parameters</I> was introduced in the \bgl,
|
||||||
and allow the user to specify only those parameters which are really needed, by name, making the parameter ordering unimportant.
|
and allow the user to specify only those parameters which are really needed, by name, making the parameter ordering unimportant.
|
||||||
See also <a href="https://www.boost.org/libs/graph/doc/bgl_named_params.html">this page</a>
|
See also <a href="https://www.boost.org/libs/graph/doc/bgl_named_params.html">this page</a>
|
||||||
in the manual of the \sc{Bgl} for more information.
|
in the manual of the \bgl for more information.
|
||||||
|
|
||||||
Say there is a function `f()` that takes 3 parameters called name, age and gender,
|
Say there is a function `f()` that takes 3 parameters called name, age and gender,
|
||||||
and you have variables `n`, `a` and `g` to pass as parameters to that function.
|
and you have variables `n`, `a` and `g` to pass as parameters to that function.
|
||||||
|
|
@ -186,32 +186,32 @@ refine(pmesh,
|
||||||
\section BGLHeader Header Files, Namespaces, and Naming Conventions
|
\section BGLHeader Header Files, Namespaces, and Naming Conventions
|
||||||
|
|
||||||
This package provides the necessary classes and functions that enable using
|
This package provides the necessary classes and functions that enable using
|
||||||
\cgal data structures as models of the \sc{Bgl} graph concepts.
|
\cgal data structures as models of the \bgl graph concepts.
|
||||||
To this end, we offer partial specializations of the `boost::graph_traits<Graph>` for various \cgal packages.
|
To this end, we offer partial specializations of the `boost::graph_traits<Graph>` for various \cgal packages.
|
||||||
For each such package, denoted `PACKAGE`, the partial specializations live in
|
For each such package, denoted `PACKAGE`, the partial specializations live in
|
||||||
the namespace `boost` and are located in the header file `CGAL/boost/graph/graph_traits_PACKAGE.h`.
|
the namespace `boost` and are located in the header file `CGAL/boost/graph/graph_traits_PACKAGE.h`.
|
||||||
Free functions are in the namespace `CGAL`, and the compiler uses argument-dependent lookup to find them.
|
Free functions are in the namespace `CGAL`, and the compiler uses argument-dependent lookup to find them.
|
||||||
%Euler operations, described in Section \ref BGLEulerOperations, are in the namespace `CGAL::Euler`, as the function `remove_face()` is at
|
%Euler operations, described in Section \ref BGLEulerOperations, are in the namespace `CGAL::Euler`, as the function `remove_face()` is at
|
||||||
the same time a low-level and an %Euler operation.
|
the same time a low-level and an %Euler operation.
|
||||||
Concerning the naming conventions, we have to use those of the \sc{Bgl},
|
Concerning the naming conventions, we have to use those of the \bgl,
|
||||||
as to fulfill the requirements of the concepts defined in the \sc{Bgl}.
|
as to fulfill the requirements of the concepts defined in the \bgl.
|
||||||
|
|
||||||
Note that these partial specializations are often providing more than
|
Note that these partial specializations are often providing more than
|
||||||
is required, making these classes not only models of the graph concepts
|
is required, making these classes not only models of the graph concepts
|
||||||
of the \sc{Bgl}, but also models of the CGAL graph concepts, that will be
|
of the \bgl, but also models of the CGAL graph concepts, that will be
|
||||||
described in detail in Section \ref BGLExtensions. Correspondence tables
|
described in detail in Section \ref BGLExtensions. Correspondence tables
|
||||||
between the types of a \cgal data structure and their \sc{Bgl} equivalents
|
between the types of a \cgal data structure and their \bgl equivalents
|
||||||
can be found in the \ref PkgBGLTraits documentation page.
|
can be found in the \ref PkgBGLTraits documentation page.
|
||||||
|
|
||||||
We present in the following sections some examples of utilization of some
|
We present in the following sections some examples of utilization of some
|
||||||
\cgal data structures as \sc{Bgl} graphs.
|
\cgal data structures as \bgl graphs.
|
||||||
|
|
||||||
\section BGLSurface_mesh The Class Surface_mesh as Model of the Boost Graph Concept
|
\section BGLSurface_mesh The Class Surface_mesh as Model of the Boost Graph Concept
|
||||||
|
|
||||||
The class `Surface_mesh` is a model of most of the graph concepts of the \sc{Bgl}
|
The class `Surface_mesh` is a model of most of the graph concepts of the \bgl
|
||||||
as well as the concepts provided by \cgal. A complete list can
|
as well as the concepts provided by \cgal. A complete list can
|
||||||
be found in the documentation of \link BGLSMGT boost::graph_traits \endlink.
|
be found in the documentation of \link BGLSMGT boost::graph_traits \endlink.
|
||||||
The examples show how to use some of the \sc{Bgl} algorithms with `Surface_mesh` and show how to use
|
The examples show how to use some of the \bgl algorithms with `Surface_mesh` and show how to use
|
||||||
the concepts provided by \cgal to implement a simple algorithm.
|
the concepts provided by \cgal to implement a simple algorithm.
|
||||||
|
|
||||||
\subsection BGLExampleMinimumSpanningTreeofaSurfaceMesh Example: Minimum Spanning Tree of a Surface_mesh
|
\subsection BGLExampleMinimumSpanningTreeofaSurfaceMesh Example: Minimum Spanning Tree of a Surface_mesh
|
||||||
|
|
@ -221,16 +221,16 @@ More examples can be found in Chapters
|
||||||
\ref PkgSurfaceMeshSimplification, \ref PkgSurfaceMeshSegmentation, and \ref PkgSurfaceMeshDeformation.
|
\ref PkgSurfaceMeshSimplification, \ref PkgSurfaceMeshSegmentation, and \ref PkgSurfaceMeshDeformation.
|
||||||
|
|
||||||
The surface mesh class uses integer indices to address vertices and edges,
|
The surface mesh class uses integer indices to address vertices and edges,
|
||||||
and it comes with a built-in property mechanism that maps nicely on the \sc{Bgl}.
|
and it comes with a built-in property mechanism that maps nicely on the \bgl.
|
||||||
|
|
||||||
\cgalExample{BGL_surface_mesh/prim.cpp}
|
\cgalExample{BGL_surface_mesh/prim.cpp}
|
||||||
|
|
||||||
\section BGLPolyhedral The Class Polyhedron_3 as Model of the Boost Graph Concept
|
\section BGLPolyhedral The Class Polyhedron_3 as Model of the Boost Graph Concept
|
||||||
|
|
||||||
The class `Polyhedron_3` is a model of most of the graph concepts of the \sc{Bgl}
|
The class `Polyhedron_3` is a model of most of the graph concepts of the \bgl
|
||||||
as well as the concepts provided by \cgal. A complete list can
|
as well as the concepts provided by \cgal. A complete list can
|
||||||
be found in the documentation of \link BGLPolyGT boost::graph_traits \endlink.
|
be found in the documentation of \link BGLPolyGT boost::graph_traits \endlink.
|
||||||
The examples show how to use some of the \sc{Bgl} algorithms with `Polyhedron_3` and show how to use
|
The examples show how to use some of the \bgl algorithms with `Polyhedron_3` and show how to use
|
||||||
the concepts provided by \cgal to implement a simple algorithm.
|
the concepts provided by \cgal to implement a simple algorithm.
|
||||||
|
|
||||||
\subsection BGLExampleMinimumSpanningTreeofaPolyhedral Example: Minimum Spanning Tree of a Polyhedral Surface
|
\subsection BGLExampleMinimumSpanningTreeofaPolyhedral Example: Minimum Spanning Tree of a Polyhedral Surface
|
||||||
|
|
@ -243,7 +243,7 @@ More examples can be found in the Chapter
|
||||||
|
|
||||||
\subsection BGLExampleUsingVerticesandEdgeswithanID Example: Using Vertices, and Edges with an ID
|
\subsection BGLExampleUsingVerticesandEdgeswithanID Example: Using Vertices, and Edges with an ID
|
||||||
|
|
||||||
The following example program shows a call to the \sc{Bgl}
|
The following example program shows a call to the \bgl
|
||||||
Kruskal's minimum spanning tree algorithm accessing the `id()`
|
Kruskal's minimum spanning tree algorithm accessing the `id()`
|
||||||
field stored in a polyhedron vertex.
|
field stored in a polyhedron vertex.
|
||||||
|
|
||||||
|
|
@ -275,7 +275,7 @@ integers in the range `[0, t.number_of_vertices())`.
|
||||||
|
|
||||||
\subsection BGLExampleStoringtheVertexIDintheVertex Example: Storing the Vertex ID in the Vertex
|
\subsection BGLExampleStoringtheVertexIDintheVertex Example: Storing the Vertex ID in the Vertex
|
||||||
|
|
||||||
The algorithms of the \sc{Bgl} extensively use of the indices of
|
The algorithms of the \bgl extensively use of the indices of
|
||||||
vertices. In the previous example we stored the indices in a `std::map`
|
vertices. In the previous example we stored the indices in a `std::map`
|
||||||
and turned that map in a property map. This property map was then
|
and turned that map in a property map. This property map was then
|
||||||
passed as argument to the shortest path function.
|
passed as argument to the shortest path function.
|
||||||
|
|
@ -316,7 +316,7 @@ edges in our <I>boost</I> graph.
|
||||||
|
|
||||||
Given an `Arrangement_2` instance, we can efficiently traverse its
|
Given an `Arrangement_2` instance, we can efficiently traverse its
|
||||||
vertices and halfedges. Thus, the arrangement graph is a model of the concepts
|
vertices and halfedges. Thus, the arrangement graph is a model of the concepts
|
||||||
`VertexListGraph` and `EdgeListGraph` introduced by the \sc{Bgl}.
|
`VertexListGraph` and `EdgeListGraph` introduced by the \bgl.
|
||||||
At the same time, we use an iterator adapter of the circulator over the
|
At the same time, we use an iterator adapter of the circulator over the
|
||||||
halfedges incident to a vertex (`Halfedge_around_target_circulator` - see
|
halfedges incident to a vertex (`Halfedge_around_target_circulator` - see
|
||||||
Section \ref arr_sssectr_vertex "Traversal Methods for an Arrangement Vertex"
|
Section \ref arr_sssectr_vertex "Traversal Methods for an Arrangement Vertex"
|
||||||
|
|
@ -327,11 +327,11 @@ is a model of the concept `BidirectionalGraph` (this concept refines
|
||||||
|
|
||||||
It is important to notice that the vertex descriptors we use are
|
It is important to notice that the vertex descriptors we use are
|
||||||
`Vertex_handle` objects and <I>not</I> vertex indices. However, in order
|
`Vertex_handle` objects and <I>not</I> vertex indices. However, in order
|
||||||
to gain more efficiency in most \sc{Bgl} algorithm, it is better to have them
|
to gain more efficiency in most \bgl algorithm, it is better to have them
|
||||||
indexed \f$ 0, 1, \ldots, (n-1)\f$, where \f$ n\f$ is the number of vertices. We
|
indexed \f$ 0, 1, \ldots, (n-1)\f$, where \f$ n\f$ is the number of vertices. We
|
||||||
therefore introduce the `Arr_vertex_index_map<Arrangement>` class-template,
|
therefore introduce the `Arr_vertex_index_map<Arrangement>` class-template,
|
||||||
which maintains a mapping of vertex handles to indices, as required by the
|
which maintains a mapping of vertex handles to indices, as required by the
|
||||||
\sc{Bgl}. An instance of this class must be attached to a valid arrangement
|
\bgl. An instance of this class must be attached to a valid arrangement
|
||||||
vertex when it is created. It uses the notification mechanism (see
|
vertex when it is created. It uses the notification mechanism (see
|
||||||
Section \ref arr_secnotif) to automatically maintain the mapping of vertices
|
Section \ref arr_secnotif) to automatically maintain the mapping of vertices
|
||||||
to indices, even when new vertices are inserted into the arrangement or
|
to indices, even when new vertices are inserted into the arrangement or
|
||||||
|
|
@ -340,7 +340,7 @@ existing vertices are removed.
|
||||||
A complete description of the types correspondences
|
A complete description of the types correspondences
|
||||||
can be found in the documentation of \link BGLArgtGT boost::graph_traits \endlink.
|
can be found in the documentation of \link BGLArgtGT boost::graph_traits \endlink.
|
||||||
|
|
||||||
In most algorithm provided by the \sc{Bgl}, the output is given by
|
In most algorithm provided by the \bgl, the output is given by
|
||||||
<I>property maps</I>, such that each map entry corresponds to a vertex.
|
<I>property maps</I>, such that each map entry corresponds to a vertex.
|
||||||
For example, when we compute the shortest paths from a given source vertex
|
For example, when we compute the shortest paths from a given source vertex
|
||||||
\f$ s\f$ to all other vertices we can obtain a map of distances and a map of
|
\f$ s\f$ to all other vertices we can obtain a map of distances and a map of
|
||||||
|
|
@ -353,7 +353,7 @@ template allows for an efficient mapping of `Vertex_handle` objects to
|
||||||
properties of type `Type`. Note however that unlike the
|
properties of type `Type`. Note however that unlike the
|
||||||
`Arr_vertex_index_map` class, the vertex property-map class is not
|
`Arr_vertex_index_map` class, the vertex property-map class is not
|
||||||
kept synchronized with the number of vertices in the arrangement, so it
|
kept synchronized with the number of vertices in the arrangement, so it
|
||||||
should not be reused in calls to the \sc{Bgl} functions in case the arrangement
|
should not be reused in calls to the \bgl functions in case the arrangement
|
||||||
is modified in between these calls.
|
is modified in between these calls.
|
||||||
|
|
||||||
\cgalFigureBegin{figex_bgl,ex_bgl.png}
|
\cgalFigureBegin{figex_bgl,ex_bgl.png}
|
||||||
|
|
@ -362,7 +362,7 @@ An arrangement of 7 line segments, as constructed by `ex_bgl_primal_adapter.cpp`
|
||||||
|
|
||||||
In the following example we construct an arrangement of 7 line segments,
|
In the following example we construct an arrangement of 7 line segments,
|
||||||
as shown in \cgalFigureRef{figex_bgl},
|
as shown in \cgalFigureRef{figex_bgl},
|
||||||
then use the \sc{Bgl} Dijkstra's shortest-paths algorithm to compute
|
then use the \bgl Dijkstra's shortest-paths algorithm to compute
|
||||||
the graph distance of all vertices from the leftmost vertex in the
|
the graph distance of all vertices from the leftmost vertex in the
|
||||||
arrangement \f$ v_0\f$. Note the usage of the `Arr_vertex_index_map` and
|
arrangement \f$ v_0\f$. Note the usage of the `Arr_vertex_index_map` and
|
||||||
the `Arr_vertex_property_map` classes. The latter one, instantiated by
|
the `Arr_vertex_property_map` classes. The latter one, instantiated by
|
||||||
|
|
@ -400,7 +400,7 @@ data with the arrangement faces.
|
||||||
In the following example we construct the same arrangement as in
|
In the following example we construct the same arrangement as in
|
||||||
example `ex_bgl_primal_adapter.cpp` (see \cgalFigureRef{arr_figex_bgl}),
|
example `ex_bgl_primal_adapter.cpp` (see \cgalFigureRef{arr_figex_bgl}),
|
||||||
and perform breadth-first search on the graph faces, starting from the
|
and perform breadth-first search on the graph faces, starting from the
|
||||||
unbounded face. We extend the \sc{Dcel} faces
|
unbounded face. We extend the \dcel faces
|
||||||
with an unsigned integer, marking the discover time of the face and use a
|
with an unsigned integer, marking the discover time of the face and use a
|
||||||
breadth-first-search visitor to obtain these times and update the faces
|
breadth-first-search visitor to obtain these times and update the faces
|
||||||
accordingly:
|
accordingly:
|
||||||
|
|
@ -411,9 +411,9 @@ accordingly:
|
||||||
|
|
||||||
The previous sections introduced partial specializations
|
The previous sections introduced partial specializations
|
||||||
and free functions so that several \cgal data structures are adapted as models of some
|
and free functions so that several \cgal data structures are adapted as models of some
|
||||||
of the \sc{Bgl} graph concepts.
|
of the \bgl graph concepts.
|
||||||
In this section, we introduce new concepts, iterators, and property maps inspired
|
In this section, we introduce new concepts, iterators, and property maps inspired
|
||||||
by the functionalities of the \sc{Bgl}.
|
by the functionalities of the \bgl.
|
||||||
|
|
||||||
\subsection BGLExtensionsGraphConcepts Graph concepts
|
\subsection BGLExtensionsGraphConcepts Graph concepts
|
||||||
|
|
||||||
|
|
@ -485,7 +485,7 @@ stored in the vertex record.)
|
||||||
\subsubsection BGLExampleNormalHalfedgeGraph Example: Calculating Facet Normals using HalfedgeGraph
|
\subsubsection BGLExampleNormalHalfedgeGraph Example: Calculating Facet Normals using HalfedgeGraph
|
||||||
|
|
||||||
The following example program shows a simple algorithm for calculating
|
The following example program shows a simple algorithm for calculating
|
||||||
facet normals for a polyhedron using the \sc{Bgl} API. A
|
facet normals for a polyhedron using the \bgl API. A
|
||||||
<a href="https://www.boost.org/libs/property_map/doc/vector_property_map.html">boost::vector_property_map</a>
|
<a href="https://www.boost.org/libs/property_map/doc/vector_property_map.html">boost::vector_property_map</a>
|
||||||
is used to to store the calculated normals instead of changing the Polyhedron items class.
|
is used to to store the calculated normals instead of changing the Polyhedron items class.
|
||||||
|
|
||||||
|
|
@ -579,13 +579,13 @@ as shown in the following example.
|
||||||
\subsection BGLSeamMesh The Seam Mesh
|
\subsection BGLSeamMesh The Seam Mesh
|
||||||
|
|
||||||
The class `Seam_mesh` allows to mark edges of a mesh as <em>seam edges</em>
|
The class `Seam_mesh` allows to mark edges of a mesh as <em>seam edges</em>
|
||||||
so that they <em>virtually</em> become border edges when exploring a seam mesh with the \sc{Bgl} API.
|
so that they <em>virtually</em> become border edges when exploring a seam mesh with the \bgl API.
|
||||||
The input mesh is referred to as <em>underlying</em> mesh of the seam mesh.
|
The input mesh is referred to as <em>underlying</em> mesh of the seam mesh.
|
||||||
We denote `tm` and `sm` the underlying mesh and the seam mesh respectively.
|
We denote `tm` and `sm` the underlying mesh and the seam mesh respectively.
|
||||||
|
|
||||||
Figure \cgalFigureRef{fig_Seam_mesh_1} shows an example of mesh on which two
|
Figure \cgalFigureRef{fig_Seam_mesh_1} shows an example of mesh on which two
|
||||||
edges, defined by the halfedge pairs `h2-h3` and `h6-h7`, are marked as seams.
|
edges, defined by the halfedge pairs `h2-h3` and `h6-h7`, are marked as seams.
|
||||||
The introduction of virtual borders modifies the elementary \sc{Bgl} graph traversal
|
The introduction of virtual borders modifies the elementary \bgl graph traversal
|
||||||
operations: when we circulate around the target of `h7` in the underlying mesh,
|
operations: when we circulate around the target of `h7` in the underlying mesh,
|
||||||
we traverse `h7`, `h1`, `h3`, `h5`, before arriving at `h7` again.
|
we traverse `h7`, `h1`, `h3`, `h5`, before arriving at `h7` again.
|
||||||
However, when we circulate in the seam mesh, we traverse `h7`, `h1`, `h3*`,
|
However, when we circulate in the seam mesh, we traverse `h7`, `h1`, `h3*`,
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ concept.
|
||||||
|
|
||||||
It is equivalent to `HalfedgeDS_face_base< Refs, Tag_true>`
|
It is equivalent to `HalfedgeDS_face_base< Refs, Tag_true>`
|
||||||
with an added integer field which can be used to index faces
|
with an added integer field which can be used to index faces
|
||||||
in \sc{Bgl} algorithms.
|
in \bgl algorithms.
|
||||||
The class contains support for the incident halfedge pointer
|
The class contains support for the incident halfedge pointer
|
||||||
and the required type definitions.
|
and the required type definitions.
|
||||||
It can be used for deriving own faces.
|
It can be used for deriving own faces.
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ namespace CGAL {
|
||||||
The class `HalfedgeDS_halfedge_max_base_with_id` is a model of the `HalfedgeDSHalfedge`
|
The class `HalfedgeDS_halfedge_max_base_with_id` is a model of the `HalfedgeDSHalfedge`
|
||||||
concept.
|
concept.
|
||||||
It is equivalent to `HalfedgeDS_halfedge_base< Refs, Tag_true, Tag_true, Tag_true>` with an added integer
|
It is equivalent to `HalfedgeDS_halfedge_base< Refs, Tag_true, Tag_true, Tag_true>` with an added integer
|
||||||
field which can be used to index halfedges in \sc{Bgl} algorithms.
|
field which can be used to index halfedges in \bgl algorithms.
|
||||||
The class contains support for the previous, next, opposite, vertex and
|
The class contains support for the previous, next, opposite, vertex and
|
||||||
face pointers and the required type definitions.
|
face pointers and the required type definitions.
|
||||||
It can be used for deriving own halfedges.
|
It can be used for deriving own halfedges.
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ The class `HalfedgeDS_vertex_max_base_with_id` is a model of the `HalfedgeDSVert
|
||||||
concept. It is
|
concept. It is
|
||||||
equivalent to `HalfedgeDS_vertex_base< Refs, Tag_true>`
|
equivalent to `HalfedgeDS_vertex_base< Refs, Tag_true>`
|
||||||
with an added integer field which can be used to index vertices
|
with an added integer field which can be used to index vertices
|
||||||
in \sc{Bgl} algorithms..
|
in \bgl algorithms..
|
||||||
The class contains support for the point and the required type definitions.
|
The class contains support for the point and the required type definitions.
|
||||||
It can be used for deriving own vertices.
|
It can be used for deriving own vertices.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ namespace CGAL {
|
||||||
The class `Polyhedron_items_with_id_3` is a model of the `PolyhedronItems_3`
|
The class `Polyhedron_items_with_id_3` is a model of the `PolyhedronItems_3`
|
||||||
concept. It provides definitions for vertices with points, halfedges,
|
concept. It provides definitions for vertices with points, halfedges,
|
||||||
and faces with plane equations, all of them with an additional integer
|
and faces with plane equations, all of them with an additional integer
|
||||||
field which can be used to index the items in a \sc{Bgl} algorithm.
|
field which can be used to index the items in a \bgl algorithm.
|
||||||
The polyhedron traits class must provide the respective types for
|
The polyhedron traits class must provide the respective types for
|
||||||
the point and the plane equation.
|
the point and the plane equation.
|
||||||
Vertices and facets both contain a halfedge handle to an incident
|
Vertices and facets both contain a halfedge handle to an incident
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ namespace CGAL {
|
||||||
The class `Triangulation_face_base_with_id_2` is a model of the
|
The class `Triangulation_face_base_with_id_2` is a model of the
|
||||||
concept `TriangulationFaceBase_2`, the base face of a
|
concept `TriangulationFaceBase_2`, the base face of a
|
||||||
2D-triangulation. It provides an integer field that can be used to
|
2D-triangulation. It provides an integer field that can be used to
|
||||||
index faces for \sc{Bgl} algorithms.
|
index faces for \bgl algorithms.
|
||||||
|
|
||||||
Note that the user is in charge of setting indices correctly before
|
Note that the user is in charge of setting indices correctly before
|
||||||
running a graph algorithm, by calling the function
|
running a graph algorithm, by calling the function
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ namespace CGAL {
|
||||||
The class `Triangulation_vertex_base_with_id_2` is a model of the
|
The class `Triangulation_vertex_base_with_id_2` is a model of the
|
||||||
concept `TriangulationVertexBase_2`, the base vertex of a
|
concept `TriangulationVertexBase_2`, the base vertex of a
|
||||||
2D-triangulation. It provides an integer field that can be used to
|
2D-triangulation. It provides an integer field that can be used to
|
||||||
index vertices for \sc{Bgl} algorithms.
|
index vertices for \bgl algorithms.
|
||||||
|
|
||||||
Note that the user is in charge of setting indices correctly before
|
Note that the user is in charge of setting indices correctly before
|
||||||
running a graph algorithm, by calling the function
|
running a graph algorithm, by calling the function
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ namespace CGAL {
|
||||||
/// \ingroup PkgBGLProperties
|
/// \ingroup PkgBGLProperties
|
||||||
/// @{
|
/// @{
|
||||||
|
|
||||||
/// The constant `vertex_index` is a property tag which identifies the <i>index</i> property of a vertex of a \sc{Bgl}
|
/// The constant `vertex_index` is a property tag which identifies the <i>index</i> property of a vertex of a \bgl
|
||||||
/// <a href="https://www.boost.org/libs/graph/doc/Graph.html"><code>Graph</code></a>.
|
/// <a href="https://www.boost.org/libs/graph/doc/Graph.html"><code>Graph</code></a>.
|
||||||
/// \cgalModels <a href="https://www.boost.org/libs/graph/doc/PropertyTag.html"><code>PropertyTag</code></a>
|
/// \cgalModels <a href="https://www.boost.org/libs/graph/doc/PropertyTag.html"><code>PropertyTag</code></a>
|
||||||
enum vertex_index_t { vertex_index };
|
enum vertex_index_t { vertex_index };
|
||||||
|
|
@ -15,7 +15,7 @@ enum vertex_index_t { vertex_index };
|
||||||
/// \cgalModels <a href="https://www.boost.org/libs/graph/doc/PropertyTag.html"><code>PropertyTag</code></a>
|
/// \cgalModels <a href="https://www.boost.org/libs/graph/doc/PropertyTag.html"><code>PropertyTag</code></a>
|
||||||
enum halfedge_index_t { halfedge_index };
|
enum halfedge_index_t { halfedge_index };
|
||||||
|
|
||||||
/// The constant `edge_index` is a property tag which identifies the <i>index</i> property of an edge of a \sc{Bgl}
|
/// The constant `edge_index` is a property tag which identifies the <i>index</i> property of an edge of a \bgl
|
||||||
/// <a href="https://www.boost.org/libs/graph/doc/Graph.html"><code>Graph</code></a>.
|
/// <a href="https://www.boost.org/libs/graph/doc/Graph.html"><code>Graph</code></a>.
|
||||||
/// \cgalModels <a href="https://www.boost.org/libs/graph/doc/PropertyTag.html"><code>PropertyTag</code></a>
|
/// \cgalModels <a href="https://www.boost.org/libs/graph/doc/PropertyTag.html"><code>PropertyTag</code></a>
|
||||||
enum edge_index_t { edge_index };
|
enum edge_index_t { edge_index };
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
\ingroup PkgBGLConcepts
|
\ingroup PkgBGLConcepts
|
||||||
\cgalConcept
|
\cgalConcept
|
||||||
|
|
||||||
The concept `HalfedgeGraph` is a refinement of the \sc{Bgl} concept
|
The concept `HalfedgeGraph` is a refinement of the \bgl concept
|
||||||
`IncidenceGraph` and adds the notion of a *halfedge*: Each edge is
|
`IncidenceGraph` and adds the notion of a *halfedge*: Each edge is
|
||||||
associated with two *opposite* halfedges with source and target vertices swapped.
|
associated with two *opposite* halfedges with source and target vertices swapped.
|
||||||
Furthermore, halfedges have a *successor* and *predecessor*,
|
Furthermore, halfedges have a *successor* and *predecessor*,
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
\defgroup bgl_namedparameters Named Parameters
|
\defgroup bgl_namedparameters Named Parameters
|
||||||
\ingroup PkgBGLRef
|
\ingroup PkgBGLRef
|
||||||
|
|
||||||
The algorithms of the Boost Graph Library (\sc{Bgl}) often have many parameters with default
|
The algorithms of the Boost Graph Library (\bgl) often have many parameters with default
|
||||||
values that are appropriate for most cases. In general, when no
|
values that are appropriate for most cases. In general, when no
|
||||||
special treatment is applied, the values of such parameters are passed
|
special treatment is applied, the values of such parameters are passed
|
||||||
as a sequence. Deviating from the default for a certain parameter
|
as a sequence. Deviating from the default for a certain parameter
|
||||||
|
|
@ -18,7 +18,7 @@ vertex_descriptor s = vertex(A, g);
|
||||||
dijkstra_shortest_paths(g, s, predecessor_map(&p[0]).distance_map(&d[0]));
|
dijkstra_shortest_paths(g, s, predecessor_map(&p[0]).distance_map(&d[0]));
|
||||||
\endcode
|
\endcode
|
||||||
|
|
||||||
In the \sc{Bgl} manual, this is called
|
In the \bgl manual, this is called
|
||||||
<a href="https://www.boost.org/libs/graph/doc/bgl_named_params.html">named parameters</a>.
|
<a href="https://www.boost.org/libs/graph/doc/bgl_named_params.html">named parameters</a>.
|
||||||
The named parameters in the snippet use the tags `predecessor_map` and `distance_map`
|
The named parameters in the snippet use the tags `predecessor_map` and `distance_map`
|
||||||
and they are concatenated using the dot operator.<BR>
|
and they are concatenated using the dot operator.<BR>
|
||||||
|
|
@ -26,7 +26,7 @@ and they are concatenated using the dot operator.<BR>
|
||||||
A similar mechanism was introduced in \cgal, with the small difference that the named parameters
|
A similar mechanism was introduced in \cgal, with the small difference that the named parameters
|
||||||
tag live in the `CGAL::parameters::` namespace and `CGAL::parameters::all_default()` can be used to indicate
|
tag live in the `CGAL::parameters::` namespace and `CGAL::parameters::all_default()` can be used to indicate
|
||||||
that default values of optional named parameters must be used.
|
that default values of optional named parameters must be used.
|
||||||
As in the \sc{BGL}, named parameters in \cgal are also concatenated using
|
As in the \bgl, named parameters in \cgal are also concatenated using
|
||||||
the dot operator, and a typical usage is thus:
|
the dot operator, and a typical usage is thus:
|
||||||
|
|
||||||
\code {.cpp}
|
\code {.cpp}
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,9 @@
|
||||||
/*! \defgroup PkgBGLConcepts Concepts
|
/*! \defgroup PkgBGLConcepts Concepts
|
||||||
\ingroup PkgBGLRef
|
\ingroup PkgBGLRef
|
||||||
|
|
||||||
We extend the Boost Graph Library (\sc{Bgl} for short) with a set of new concepts.
|
We extend the Boost Graph Library (\bgl for short) with a set of new concepts.
|
||||||
In order to make this documentation self-contained we here also document
|
In order to make this documentation self-contained we here also document
|
||||||
concepts that are defined in the original version of the \sc{Bgl}.
|
concepts that are defined in the original version of the \bgl.
|
||||||
The documentation of the concepts lists at the same time the functions
|
The documentation of the concepts lists at the same time the functions
|
||||||
related to it. Models of the concept and their related functions
|
related to it. Models of the concept and their related functions
|
||||||
must be in the same namespace (they will be found by Koenig lookup).
|
must be in the same namespace (they will be found by Koenig lookup).
|
||||||
|
|
@ -586,9 +586,9 @@ Methods to read and write graphs.
|
||||||
\cgalPkgSummaryBegin
|
\cgalPkgSummaryBegin
|
||||||
\cgalPkgAuthors{Andreas Fabri, Fernando Cacciola, Philipp Moeller, and Ron Wein}
|
\cgalPkgAuthors{Andreas Fabri, Fernando Cacciola, Philipp Moeller, and Ron Wein}
|
||||||
\cgalPkgDesc{This package provides a framework for interfacing \cgal data structures
|
\cgalPkgDesc{This package provides a framework for interfacing \cgal data structures
|
||||||
with the algorithms of the Boost Graph Library, or \sc{BGL} for short.
|
with the algorithms of the Boost Graph Library, or \bgl for short.
|
||||||
It allows to run graph algorithms directly on \cgal data structures which are model
|
It allows to run graph algorithms directly on \cgal data structures which are model
|
||||||
of the \sc{BGL} graph concepts, for example the shortest path algorithm
|
of the \bgl graph concepts, for example the shortest path algorithm
|
||||||
on a Delaunay triangulation in order to compute the Euclidean minimum spanning tree.
|
on a Delaunay triangulation in order to compute the Euclidean minimum spanning tree.
|
||||||
Furthermore, it introduces several new graph concepts describing halfedge data structures.}
|
Furthermore, it introduces several new graph concepts describing halfedge data structures.}
|
||||||
\cgalPkgManuals{Chapter_CGAL_and_the_Boost_Graph_Library,PkgBGLRef}
|
\cgalPkgManuals{Chapter_CGAL_and_the_Boost_Graph_Library,PkgBGLRef}
|
||||||
|
|
@ -621,7 +621,7 @@ Methods to read and write graphs.
|
||||||
|
|
||||||
\cgalCRPSection{%CGAL Classes Adapted for the Graph API}
|
\cgalCRPSection{%CGAL Classes Adapted for the Graph API}
|
||||||
|
|
||||||
A number of \cgal structures have been adapted as graphs for the \sc{Bgl}. All
|
A number of \cgal structures have been adapted as graphs for the \bgl. All
|
||||||
adapted types are listed here. The pages document which concepts they
|
adapted types are listed here. The pages document which concepts they
|
||||||
model, the properties they support, and any possible caveats that a
|
model, the properties they support, and any possible caveats that a
|
||||||
user might encounter.
|
user might encounter.
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
\ingroup PkgBGLRef
|
\ingroup PkgBGLRef
|
||||||
|
|
||||||
The \sc{Bgl} defines the class template
|
The \bgl defines the class template
|
||||||
<A HREF="https://www.boost.org/libs/graph/doc/graph_traits.html">`boost::graph_traits`</A>
|
<A HREF="https://www.boost.org/libs/graph/doc/graph_traits.html">`boost::graph_traits`</A>
|
||||||
as a uniform interface to the properties and types of %graph types.
|
as a uniform interface to the properties and types of %graph types.
|
||||||
|
|
||||||
|
|
@ -156,7 +156,7 @@ vertex, or walking through the faces container.
|
||||||
|
|
||||||
The mapping between vertices, edges, and faces of the triangulation and the
|
The mapping between vertices, edges, and faces of the triangulation and the
|
||||||
graph is rather straightforward, but there are some subtleties. The
|
graph is rather straightforward, but there are some subtleties. The
|
||||||
value type of the \sc{Bgl} iterators is the vertex or edge descriptor,
|
value type of the \bgl iterators is the vertex or edge descriptor,
|
||||||
whereas in \cgal all iterators and circulators are also handles and
|
whereas in \cgal all iterators and circulators are also handles and
|
||||||
hence have as value type Vertex or Edge.
|
hence have as value type Vertex or Edge.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,23 +19,6 @@ if(NOT Boost_FOUND)
|
||||||
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
find_package(OpenMesh QUIET)
|
|
||||||
|
|
||||||
if(OpenMesh_FOUND)
|
|
||||||
include(UseOpenMesh)
|
|
||||||
add_definitions(-DCGAL_USE_OPENMESH)
|
|
||||||
else()
|
|
||||||
message(STATUS "Examples that use OpenMesh will not be compiled.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_package(METIS)
|
|
||||||
|
|
||||||
if(METIS_FOUND)
|
|
||||||
include_directories(${METIS_INCLUDE_DIRS})
|
|
||||||
else()
|
|
||||||
message(STATUS "Examples that use the METIS library will not be compiled.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# include for local directory
|
# include for local directory
|
||||||
|
|
||||||
# include for local package
|
# include for local package
|
||||||
|
|
@ -59,12 +42,21 @@ create_single_source_cgal_program("transform_iterator.cpp")
|
||||||
|
|
||||||
create_single_source_cgal_program("copy_polyhedron.cpp")
|
create_single_source_cgal_program("copy_polyhedron.cpp")
|
||||||
|
|
||||||
|
find_package( OpenMesh QUIET )
|
||||||
if(OpenMesh_FOUND)
|
if(OpenMesh_FOUND)
|
||||||
target_link_libraries( copy_polyhedron PRIVATE ${OPENMESH_LIBRARIES} )
|
target_link_libraries( copy_polyhedron PRIVATE ${OPENMESH_LIBRARIES} )
|
||||||
target_compile_definitions( copy_polyhedron PRIVATE -DCGAL_USE_OPENMESH )
|
target_compile_definitions( copy_polyhedron PRIVATE -DCGAL_USE_OPENMESH )
|
||||||
|
else()
|
||||||
|
message(STATUS "Examples that use OpenMesh will not be compiled.")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
find_package( METIS )
|
||||||
if( METIS_FOUND )
|
if( METIS_FOUND )
|
||||||
create_single_source_cgal_program( "polyhedron_partition.cpp" )
|
create_single_source_cgal_program( "polyhedron_partition.cpp" )
|
||||||
|
if( METIS_FOUND )
|
||||||
|
target_include_directories( polyhedron_partition PRIVATE ${METIS_INCLUDE_DIRS} )
|
||||||
target_link_libraries( polyhedron_partition PRIVATE ${METIS_LIBRARIES} )
|
target_link_libraries( polyhedron_partition PRIVATE ${METIS_LIBRARIES} )
|
||||||
|
else()
|
||||||
|
message( STATUS "Examples that use the METIS library will not be compiled." )
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
|
||||||
|
|
@ -13,11 +13,9 @@ create_single_source_cgal_program("surface_mesh_dual.cpp")
|
||||||
create_single_source_cgal_program("connected_components.cpp")
|
create_single_source_cgal_program("connected_components.cpp")
|
||||||
|
|
||||||
find_package(METIS)
|
find_package(METIS)
|
||||||
|
|
||||||
if( METIS_FOUND )
|
if( METIS_FOUND )
|
||||||
include_directories(${METIS_INCLUDE_DIRS})
|
|
||||||
|
|
||||||
create_single_source_cgal_program( "surface_mesh_partition.cpp" )
|
create_single_source_cgal_program( "surface_mesh_partition.cpp" )
|
||||||
|
target_include_directories( surface_mesh_partition PRIVATE ${METIS_INCLUDE_DIRS} )
|
||||||
target_link_libraries( surface_mesh_partition PRIVATE ${METIS_LIBRARIES} )
|
target_link_libraries( surface_mesh_partition PRIVATE ${METIS_LIBRARIES} )
|
||||||
else()
|
else()
|
||||||
message(STATUS "Examples that use the METIS library will not be compiled.")
|
message(STATUS "Examples that use the METIS library will not be compiled.")
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@
|
||||||
#include <CGAL/boost/graph/IO/Generic_facegraph_builder.h>
|
#include <CGAL/boost/graph/IO/Generic_facegraph_builder.h>
|
||||||
#include <CGAL/boost/graph/iterator.h>
|
#include <CGAL/boost/graph/iterator.h>
|
||||||
#include <CGAL/boost/graph/Named_function_parameters.h>
|
#include <CGAL/boost/graph/Named_function_parameters.h>
|
||||||
|
#include <CGAL/boost/graph/named_params_helper.h>
|
||||||
#include <boost/container/flat_map.hpp>
|
#include <boost/container/flat_map.hpp>
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
@ -271,7 +271,7 @@ bool read_GOCAD(const std::string& fname, Graph& g,
|
||||||
/// \cgalParamNBegin{stream_precision}
|
/// \cgalParamNBegin{stream_precision}
|
||||||
/// \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream}
|
/// \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream}
|
||||||
/// \cgalParamType{int}
|
/// \cgalParamType{int}
|
||||||
/// \cgalParamDefault{`6`}
|
/// \cgalParamDefault{`the precision of the stream `os``}
|
||||||
/// \cgalParamNEnd
|
/// \cgalParamNEnd
|
||||||
/// \cgalNamedParamsEnd
|
/// \cgalNamedParamsEnd
|
||||||
///
|
///
|
||||||
|
|
@ -303,8 +303,7 @@ bool write_GOCAD(std::ostream& os,
|
||||||
if(!os.good())
|
if(!os.good())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
const int precision = choose_parameter(get_parameter(np, internal_np::stream_precision), 6);
|
set_stream_precision_from_NP(os, np);
|
||||||
os.precision(precision);
|
|
||||||
|
|
||||||
os << "GOCAD TSurf 1\n"
|
os << "GOCAD TSurf 1\n"
|
||||||
"HEADER {\n"
|
"HEADER {\n"
|
||||||
|
|
@ -380,7 +379,7 @@ bool write_GOCAD(std::ostream& os, const char* name, const Graph& g,
|
||||||
/// \cgalParamNBegin{stream_precision}
|
/// \cgalParamNBegin{stream_precision}
|
||||||
/// \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream}
|
/// \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream}
|
||||||
/// \cgalParamType{int}
|
/// \cgalParamType{int}
|
||||||
/// \cgalParamDefault{`6`}
|
/// \cgalParamDefault{`the precision of the stream `os``}
|
||||||
/// \cgalParamNEnd
|
/// \cgalParamNEnd
|
||||||
/// \cgalNamedParamsEnd
|
/// \cgalNamedParamsEnd
|
||||||
///
|
///
|
||||||
|
|
@ -454,6 +453,7 @@ bool write_GOCAD(const std::string& fname,
|
||||||
{
|
{
|
||||||
std::ofstream os(fname);
|
std::ofstream os(fname);
|
||||||
CGAL::set_mode(os, CGAL::IO::ASCII);
|
CGAL::set_mode(os, CGAL::IO::ASCII);
|
||||||
|
|
||||||
return write_GOCAD(os, fname.c_str(), g, np);
|
return write_GOCAD(os, fname.c_str(), g, np);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -117,8 +117,7 @@ public:
|
||||||
if(!m_os.good())
|
if(!m_os.good())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
const int precision = choose_parameter(get_parameter(np, internal_np::stream_precision), 6);
|
set_stream_precision_from_NP(m_os, np);
|
||||||
m_os.precision(precision);
|
|
||||||
|
|
||||||
VPM vpm = choose_parameter(get_parameter(np, internal_np::vertex_point),
|
VPM vpm = choose_parameter(get_parameter(np, internal_np::vertex_point),
|
||||||
get_const_property_map(CGAL::vertex_point, g));
|
get_const_property_map(CGAL::vertex_point, g));
|
||||||
|
|
|
||||||
|
|
@ -231,7 +231,7 @@ bool read_OBJ(const std::string& fname, Graph& g,
|
||||||
\cgalParamNBegin{stream_precision}
|
\cgalParamNBegin{stream_precision}
|
||||||
\cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream}
|
\cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream}
|
||||||
\cgalParamType{int}
|
\cgalParamType{int}
|
||||||
\cgalParamDefault{`6`}
|
\cgalParamDefault{`the precision of the stream `os``}
|
||||||
\cgalParamNEnd
|
\cgalParamNEnd
|
||||||
\cgalNamedParamsEnd
|
\cgalNamedParamsEnd
|
||||||
|
|
||||||
|
|
@ -285,6 +285,11 @@ bool write_OBJ(std::ostream& os, const Graph& g,
|
||||||
\cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t`
|
\cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t`
|
||||||
must be available in `Graph`.}
|
must be available in `Graph`.}
|
||||||
\cgalParamNEnd
|
\cgalParamNEnd
|
||||||
|
\cgalParamNBegin{stream_precision}
|
||||||
|
\cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream}
|
||||||
|
\cgalParamType{int}
|
||||||
|
\cgalParamDefault{`6`}
|
||||||
|
\cgalParamNEnd
|
||||||
\cgalNamedParamsEnd
|
\cgalNamedParamsEnd
|
||||||
|
|
||||||
\returns `true` if writing was successful, `false` otherwise.
|
\returns `true` if writing was successful, `false` otherwise.
|
||||||
|
|
|
||||||
|
|
@ -284,9 +284,9 @@ bool read_OFF(const std::string& fname, Graph& g,
|
||||||
\deprecated This function is deprecated since \cgal 5.2, `CGAL::read_OFF()` should be used instead.
|
\deprecated This function is deprecated since \cgal 5.2, `CGAL::read_OFF()` should be used instead.
|
||||||
*/
|
*/
|
||||||
template <typename Graph, typename CGAL_BGL_NP_TEMPLATE_PARAMETERS>
|
template <typename Graph, typename CGAL_BGL_NP_TEMPLATE_PARAMETERS>
|
||||||
CGAL_DEPRECATED bool read_off(std::ostream& os, Graph& g, const CGAL_BGL_NP_CLASS& np)
|
CGAL_DEPRECATED bool read_off(std::istream& is, Graph& g, const CGAL_BGL_NP_CLASS& np)
|
||||||
{
|
{
|
||||||
return read_OFF(os, g, np);
|
return read_OFF(is, g, np);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|
@ -300,6 +300,18 @@ CGAL_DEPRECATED bool read_off(const char* fname, Graph& g, const CGAL_BGL_NP_CLA
|
||||||
return read_OFF(fname, g, np);
|
return read_OFF(fname, g, np);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Graph>
|
||||||
|
CGAL_DEPRECATED bool read_off(std::istream& is, Graph& g)
|
||||||
|
{
|
||||||
|
return read_off(is, g, parameters::all_default());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Graph>
|
||||||
|
CGAL_DEPRECATED bool read_off(const char* fname, Graph& g)
|
||||||
|
{
|
||||||
|
return read_off(fname, g, parameters::all_default());
|
||||||
|
}
|
||||||
|
|
||||||
#endif // CGAL_NO_DEPRECATED_CODE
|
#endif // CGAL_NO_DEPRECATED_CODE
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
@ -374,7 +386,7 @@ bool write_OFF_BGL(std::ostream& os,
|
||||||
\cgalParamNBegin{stream_precision}
|
\cgalParamNBegin{stream_precision}
|
||||||
\cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream}
|
\cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream}
|
||||||
\cgalParamType{int}
|
\cgalParamType{int}
|
||||||
\cgalParamDefault{`6`}
|
\cgalParamDefault{`the precision of the stream `os``}
|
||||||
\cgalParamNEnd
|
\cgalParamNEnd
|
||||||
\cgalNamedParamsEnd
|
\cgalNamedParamsEnd
|
||||||
|
|
||||||
|
|
@ -483,6 +495,7 @@ bool write_OFF(const std::string& fname,
|
||||||
std::cerr<<"Could not create file.";
|
std::cerr<<"Could not create file.";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return write_OFF(os, g, np);
|
return write_OFF(os, g, np);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -510,6 +523,11 @@ CGAL_DEPRECATED bool write_off(std::ostream& os, const Graph& g, const CGAL_BGL_
|
||||||
return write_OFF(os, g, np);
|
return write_OFF(os, g, np);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Graph>
|
||||||
|
CGAL_DEPRECATED bool write_off(std::ostream& os, const Graph& g)
|
||||||
|
{
|
||||||
|
return write_off(os, g, CGAL::parameters::all_default());
|
||||||
|
}
|
||||||
/*!
|
/*!
|
||||||
\ingroup PkgBGLIOFctDeprecated
|
\ingroup PkgBGLIOFctDeprecated
|
||||||
|
|
||||||
|
|
@ -521,6 +539,11 @@ CGAL_DEPRECATED bool write_off(const char* fname, const Graph& g, const CGAL_BGL
|
||||||
return write_OFF(fname, g, np);
|
return write_OFF(fname, g, np);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Graph>
|
||||||
|
CGAL_DEPRECATED bool write_off(const char* fname, const Graph& g)
|
||||||
|
{
|
||||||
|
return write_off(fname, g, parameters::all_default());
|
||||||
|
}
|
||||||
#endif // CGAL_NO_DEPRECATED_CODE
|
#endif // CGAL_NO_DEPRECATED_CODE
|
||||||
|
|
||||||
} // namespace CGAL
|
} // namespace CGAL
|
||||||
|
|
|
||||||
|
|
@ -311,7 +311,7 @@ bool read_PLY(const std::string& fname, Graph& g,
|
||||||
\cgalParamNBegin{stream_precision}
|
\cgalParamNBegin{stream_precision}
|
||||||
\cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream}
|
\cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream}
|
||||||
\cgalParamType{int}
|
\cgalParamType{int}
|
||||||
\cgalParamDefault{`6`}
|
\cgalParamDefault{`the precision of the stream `os``}
|
||||||
\cgalParamExtra{This parameter is only meaningful while using ASCII encoding.}
|
\cgalParamExtra{This parameter is only meaningful while using ASCII encoding.}
|
||||||
\cgalParamNEnd
|
\cgalParamNEnd
|
||||||
\cgalNamedParamsEnd
|
\cgalNamedParamsEnd
|
||||||
|
|
@ -361,8 +361,7 @@ bool write_PLY(std::ostream& os,
|
||||||
if(!os.good())
|
if(!os.good())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
const int precision = choose_parameter(get_parameter(np, internal_np::stream_precision), 6);
|
set_stream_precision_from_NP(os, np);
|
||||||
os.precision(precision);
|
|
||||||
|
|
||||||
// Write header
|
// Write header
|
||||||
os << "ply" << std::endl
|
os << "ply" << std::endl
|
||||||
|
|
@ -550,6 +549,7 @@ bool write_PLY(const std::string& fname,
|
||||||
{
|
{
|
||||||
std::ofstream os(fname);
|
std::ofstream os(fname);
|
||||||
CGAL::set_mode(os, CGAL::IO::ASCII);
|
CGAL::set_mode(os, CGAL::IO::ASCII);
|
||||||
|
|
||||||
return write_PLY(os, g, comments, np);
|
return write_PLY(os, g, comments, np);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -231,7 +231,7 @@ bool read_STL(const std::string& fname, Graph& g) { return read_STL(fname, g, pa
|
||||||
\cgalParamNBegin{stream_precision}
|
\cgalParamNBegin{stream_precision}
|
||||||
\cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream}
|
\cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream}
|
||||||
\cgalParamType{int}
|
\cgalParamType{int}
|
||||||
\cgalParamDefault{`6`}
|
\cgalParamDefault{`the precision of the stream `os``}
|
||||||
\cgalParamExtra{This parameter is only meaningful while using ASCII encoding.}
|
\cgalParamExtra{This parameter is only meaningful while using ASCII encoding.}
|
||||||
\cgalParamNEnd
|
\cgalParamNEnd
|
||||||
\cgalNamedParamsEnd
|
\cgalNamedParamsEnd
|
||||||
|
|
@ -262,8 +262,7 @@ bool write_STL(std::ostream& os,
|
||||||
if(!os.good())
|
if(!os.good())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
const int precision = choose_parameter(get_parameter(np, internal_np::stream_precision), 6);
|
set_stream_precision_from_NP(os, np);
|
||||||
os.precision(precision);
|
|
||||||
|
|
||||||
if(get_mode(os) == IO::BINARY)
|
if(get_mode(os) == IO::BINARY)
|
||||||
{
|
{
|
||||||
|
|
@ -372,6 +371,7 @@ bool write_STL(const std::string& fname, const Graph& g, const CGAL_BGL_NP_CLASS
|
||||||
{
|
{
|
||||||
std::ofstream os(fname);
|
std::ofstream os(fname);
|
||||||
CGAL::set_mode(os, CGAL::IO::ASCII);
|
CGAL::set_mode(os, CGAL::IO::ASCII);
|
||||||
|
|
||||||
return write_STL(os, g, np);
|
return write_STL(os, g, np);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -420,7 +420,7 @@ void write_polys_points(std::ostream& os,
|
||||||
* \cgalParamNBegin{stream_precision}
|
* \cgalParamNBegin{stream_precision}
|
||||||
* \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream}
|
* \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream}
|
||||||
* \cgalParamType{int}
|
* \cgalParamType{int}
|
||||||
* \cgalParamDefault{`6`}
|
* \cgalParamDefault{`the precision of the stream `os``}
|
||||||
* \cgalParamNEnd
|
* \cgalParamNEnd
|
||||||
* \cgalNamedParamsEnd
|
* \cgalNamedParamsEnd
|
||||||
*
|
*
|
||||||
|
|
@ -439,8 +439,7 @@ bool write_VTP(std::ostream& os,
|
||||||
if(!os.good())
|
if(!os.good())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
const int precision = choose_parameter(get_parameter(np, internal_np::stream_precision), 6);
|
set_stream_precision_from_NP(os, np);
|
||||||
os.precision(precision);
|
|
||||||
|
|
||||||
os << "<?xml version=\"1.0\"?>\n"
|
os << "<?xml version=\"1.0\"?>\n"
|
||||||
<< "<VTKFile type=\"PolyData\" version=\"0.1\"";
|
<< "<VTKFile type=\"PolyData\" version=\"0.1\"";
|
||||||
|
|
@ -539,6 +538,7 @@ bool write_VTP(const std::string& fname, const Graph& g, const CGAL_BGL_NP_CLASS
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
os.open(fname);
|
os.open(fname);
|
||||||
|
|
||||||
return write_VTP(os, g, np);
|
return write_VTP(os, g, np);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -564,6 +564,12 @@ CGAL_DEPRECATED bool write_vtp(std::ostream& os, const Graph& g, const CGAL_BGL_
|
||||||
return write_VTP(os, g, np);
|
return write_VTP(os, g, np);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Graph>
|
||||||
|
CGAL_DEPRECATED bool write_vtp(std::ostream& os, const Graph& g)
|
||||||
|
{
|
||||||
|
return write_vtp(os, g, parameters::all_default());
|
||||||
|
}
|
||||||
|
|
||||||
#endif // CGAL_NO_DEPRECATED_CODE
|
#endif // CGAL_NO_DEPRECATED_CODE
|
||||||
|
|
||||||
} // namespace CGAL
|
} // namespace CGAL
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ namespace CGAL {
|
||||||
\cgalParamNBegin{stream_precision}
|
\cgalParamNBegin{stream_precision}
|
||||||
\cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream}
|
\cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream}
|
||||||
\cgalParamType{int}
|
\cgalParamType{int}
|
||||||
\cgalParamDefault{`6`}
|
\cgalParamDefault{`the precision of the stream `os``}
|
||||||
\cgalParamNEnd
|
\cgalParamNEnd
|
||||||
\cgalNamedParamsEnd
|
\cgalNamedParamsEnd
|
||||||
|
|
||||||
|
|
@ -70,7 +70,8 @@ bool write_WRL(std::ostream& os,
|
||||||
const Graph& g,
|
const Graph& g,
|
||||||
const CGAL_BGL_NP_CLASS& np)
|
const CGAL_BGL_NP_CLASS& np)
|
||||||
{
|
{
|
||||||
IO::internal::Generic_facegraph_printer<std::ostream, Graph, CGAL::File_writer_VRML_2> printer(os);
|
CGAL::VRML_2_ostream vos(os);
|
||||||
|
IO::internal::Generic_facegraph_printer<CGAL::VRML_2_ostream, Graph, CGAL::File_writer_VRML_2> printer(vos);
|
||||||
return printer(g, np);
|
return printer(g, np);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -108,8 +109,8 @@ bool write_WRL(std::ostream& os,
|
||||||
template <typename Graph, typename CGAL_BGL_NP_TEMPLATE_PARAMETERS>
|
template <typename Graph, typename CGAL_BGL_NP_TEMPLATE_PARAMETERS>
|
||||||
bool write_WRL(const std::string& fname, const Graph& g, const CGAL_BGL_NP_CLASS& np)
|
bool write_WRL(const std::string& fname, const Graph& g, const CGAL_BGL_NP_CLASS& np)
|
||||||
{
|
{
|
||||||
std::ifstream is(fname);
|
std::ofstream os(fname);
|
||||||
return write_WRL(is, g, np);
|
return write_WRL(os, g, np);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Graph>
|
template <typename Graph>
|
||||||
|
|
@ -130,6 +131,12 @@ CGAL_DEPRECATED bool write_wrl(std::ostream& os, const Graph& g, const CGAL_BGL_
|
||||||
return write_WRL(os, g, np);
|
return write_WRL(os, g, np);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Graph>
|
||||||
|
CGAL_DEPRECATED bool write_wrl(std::ostream& os, const Graph& g)
|
||||||
|
{
|
||||||
|
return write_wrl(os, g, parameters::all_default());
|
||||||
|
}
|
||||||
|
|
||||||
#endif // CGAL_NO_DEPRECATED_CODE
|
#endif // CGAL_NO_DEPRECATED_CODE
|
||||||
|
|
||||||
} // namespace CGAL
|
} // namespace CGAL
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@
|
||||||
#include <CGAL/property_map.h>
|
#include <CGAL/property_map.h>
|
||||||
#include <boost/unordered_map.hpp>
|
#include <boost/unordered_map.hpp>
|
||||||
#include <boost/utility/enable_if.hpp>
|
#include <boost/utility/enable_if.hpp>
|
||||||
#include <boost/function_output_iterator.hpp>
|
#include <boost/iterator/function_output_iterator.hpp>
|
||||||
|
|
||||||
namespace CGAL {
|
namespace CGAL {
|
||||||
|
|
||||||
|
|
@ -167,6 +167,8 @@ void copy_face_graph_impl(const SourceMesh& sm, TargetMesh& tm,
|
||||||
for(tm_vertex_descriptor v : vertices(tm))
|
for(tm_vertex_descriptor v : vertices(tm))
|
||||||
{
|
{
|
||||||
tm_halfedge_descriptor h = halfedge(v, tm);
|
tm_halfedge_descriptor h = halfedge(v, tm);
|
||||||
|
if (h==boost::graph_traits<TargetMesh>::null_halfedge())
|
||||||
|
continue;
|
||||||
tm_halfedge_descriptor next_around_vertex=h;
|
tm_halfedge_descriptor next_around_vertex=h;
|
||||||
do{
|
do{
|
||||||
next_around_vertex=opposite(next(next_around_vertex, tm), tm);
|
next_around_vertex=opposite(next(next_around_vertex, tm), tm);
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,20 @@
|
||||||
|
|
||||||
namespace CGAL {
|
namespace CGAL {
|
||||||
|
|
||||||
|
namespace parameters
|
||||||
|
{
|
||||||
|
template <class Parameter, class NamedParameters>
|
||||||
|
struct Is_default
|
||||||
|
{
|
||||||
|
typedef typename internal_np::Lookup_named_param_def <
|
||||||
|
Parameter,
|
||||||
|
NamedParameters,
|
||||||
|
internal_np::Param_not_found > ::type NP_type;
|
||||||
|
static const bool value = boost::is_same<NP_type, internal_np::Param_not_found>::value;
|
||||||
|
typedef CGAL::Boolean_tag<value> type;
|
||||||
|
};
|
||||||
|
} // end of parameters namespace
|
||||||
|
|
||||||
// forward declarations to avoid dependency to Solver_interface
|
// forward declarations to avoid dependency to Solver_interface
|
||||||
template <typename FT, unsigned int dim>
|
template <typename FT, unsigned int dim>
|
||||||
class Default_diagonalize_traits;
|
class Default_diagonalize_traits;
|
||||||
|
|
@ -560,6 +574,21 @@ CGAL_DEF_GET_INITIALIZED_INDEX_MAP(face, typename boost::graph_traits<Graph>::fa
|
||||||
Alpha_expansion_boost_adjacency_list_tag
|
Alpha_expansion_boost_adjacency_list_tag
|
||||||
>::type type;
|
>::type type;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename NP>
|
||||||
|
void set_stream_precision_from_NP(std::ostream& os, const NP& np)
|
||||||
|
{
|
||||||
|
using parameters::get_parameter;
|
||||||
|
using parameters::choose_parameter;
|
||||||
|
using parameters::is_default_parameter;
|
||||||
|
|
||||||
|
if(!is_default_parameter(get_parameter(np, internal_np::stream_precision)))
|
||||||
|
{
|
||||||
|
const int precision = choose_parameter<int>(get_parameter(np,
|
||||||
|
internal_np::stream_precision));
|
||||||
|
os.precision(precision);
|
||||||
|
}
|
||||||
|
}
|
||||||
} //namespace CGAL
|
} //namespace CGAL
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,7 @@ CGAL_add_named_parameter(geom_traits_t, geom_traits, geom_traits)
|
||||||
CGAL_add_named_parameter(vertex_incident_patches_t, vertex_incident_patches, vertex_incident_patches_map)
|
CGAL_add_named_parameter(vertex_incident_patches_t, vertex_incident_patches, vertex_incident_patches_map)
|
||||||
CGAL_add_named_parameter(density_control_factor_t, density_control_factor, density_control_factor)
|
CGAL_add_named_parameter(density_control_factor_t, density_control_factor, density_control_factor)
|
||||||
CGAL_add_named_parameter(use_delaunay_triangulation_t, use_delaunay_triangulation, use_delaunay_triangulation)
|
CGAL_add_named_parameter(use_delaunay_triangulation_t, use_delaunay_triangulation, use_delaunay_triangulation)
|
||||||
|
CGAL_add_named_parameter(use_2d_constrained_delaunay_triangulation_t, use_2d_constrained_delaunay_triangulation, use_2d_constrained_delaunay_triangulation)
|
||||||
CGAL_add_named_parameter(fairing_continuity_t, fairing_continuity, fairing_continuity)
|
CGAL_add_named_parameter(fairing_continuity_t, fairing_continuity, fairing_continuity)
|
||||||
CGAL_add_named_parameter(sparse_linear_solver_t, sparse_linear_solver, sparse_linear_solver)
|
CGAL_add_named_parameter(sparse_linear_solver_t, sparse_linear_solver, sparse_linear_solver)
|
||||||
CGAL_add_named_parameter(number_of_relaxation_steps_t, number_of_relaxation_steps, number_of_relaxation_steps)
|
CGAL_add_named_parameter(number_of_relaxation_steps_t, number_of_relaxation_steps, number_of_relaxation_steps)
|
||||||
|
|
@ -117,6 +118,7 @@ CGAL_add_named_parameter(volume_threshold_t, volume_threshold, volume_threshold)
|
||||||
CGAL_add_named_parameter(dry_run_t, dry_run, dry_run)
|
CGAL_add_named_parameter(dry_run_t, dry_run, dry_run)
|
||||||
CGAL_add_named_parameter(do_not_modify_t, do_not_modify, do_not_modify)
|
CGAL_add_named_parameter(do_not_modify_t, do_not_modify, do_not_modify)
|
||||||
CGAL_add_named_parameter(allow_self_intersections_t, allow_self_intersections, allow_self_intersections)
|
CGAL_add_named_parameter(allow_self_intersections_t, allow_self_intersections, allow_self_intersections)
|
||||||
|
CGAL_add_named_parameter(non_manifold_feature_map_t, non_manifold_feature_map, non_manifold_feature_map)
|
||||||
CGAL_add_named_parameter(polyhedral_envelope_epsilon_t, polyhedral_envelope_epsilon, polyhedral_envelope_epsilon)
|
CGAL_add_named_parameter(polyhedral_envelope_epsilon_t, polyhedral_envelope_epsilon, polyhedral_envelope_epsilon)
|
||||||
|
|
||||||
// List of named parameters that we use in the package 'Surface Mesh Simplification'
|
// List of named parameters that we use in the package 'Surface Mesh Simplification'
|
||||||
|
|
|
||||||
|
|
@ -561,6 +561,9 @@ regularize_face_selection_borders(
|
||||||
/// \endcond
|
/// \endcond
|
||||||
|
|
||||||
/// \cond SKIP_IN_MANUAL
|
/// \cond SKIP_IN_MANUAL
|
||||||
|
|
||||||
|
namespace experimental {
|
||||||
|
|
||||||
// TODO: improve and document if useful
|
// TODO: improve and document if useful
|
||||||
//
|
//
|
||||||
// Variant of regularization without graphcut but with brut-force
|
// Variant of regularization without graphcut but with brut-force
|
||||||
|
|
@ -703,6 +706,8 @@ regularize_face_selection_borders(
|
||||||
put(is_selected, fd, true);
|
put(is_selected, fd, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
/// \endcond
|
/// \endcond
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -98,6 +98,8 @@ create_single_source_cgal_program(
|
||||||
|
|
||||||
create_single_source_cgal_program( "graph_traits_inheritance.cpp" )
|
create_single_source_cgal_program( "graph_traits_inheritance.cpp" )
|
||||||
|
|
||||||
|
create_single_source_cgal_program("test_deprecated_io.cpp")
|
||||||
|
|
||||||
if(OpenMesh_FOUND)
|
if(OpenMesh_FOUND)
|
||||||
target_link_libraries(test_clear PRIVATE ${OPENMESH_LIBRARIES})
|
target_link_libraries(test_clear PRIVATE ${OPENMESH_LIBRARIES})
|
||||||
target_compile_definitions(test_clear PRIVATE -DCGAL_USE_OPENMESH)
|
target_compile_definitions(test_clear PRIVATE -DCGAL_USE_OPENMESH)
|
||||||
|
|
@ -129,6 +131,8 @@ if (VTK_FOUND)
|
||||||
if(VTK_LIBRARIES)
|
if(VTK_LIBRARIES)
|
||||||
target_link_libraries(test_bgl_read_write PRIVATE ${VTK_LIBRARIES})
|
target_link_libraries(test_bgl_read_write PRIVATE ${VTK_LIBRARIES})
|
||||||
target_compile_definitions(test_bgl_read_write PRIVATE -DCGAL_USE_VTK)
|
target_compile_definitions(test_bgl_read_write PRIVATE -DCGAL_USE_VTK)
|
||||||
|
target_link_libraries(test_deprecated_io PRIVATE ${VTK_LIBRARIES})
|
||||||
|
target_compile_definitions(test_deprecated_io PRIVATE -DCGAL_USE_VTK)
|
||||||
else()
|
else()
|
||||||
message(STATUS "Tests that use VTK will not be compiled.")
|
message(STATUS "Tests that use VTK will not be compiled.")
|
||||||
endif()
|
endif()
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,57 @@ test_copy_face_graph_nm_umbrella()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void
|
||||||
|
test_copy_face_graph_isolated_vertices()
|
||||||
|
{
|
||||||
|
typedef Kernel::Point_3 Point_3;
|
||||||
|
|
||||||
|
{
|
||||||
|
T s, t;
|
||||||
|
add_vertex(s);
|
||||||
|
CGAL::copy_face_graph(s, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
T s, t;
|
||||||
|
add_vertex(t);
|
||||||
|
CGAL::copy_face_graph(s, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
T s, t;
|
||||||
|
CGAL::make_triangle(Point_3(), Point_3(), Point_3(), s);
|
||||||
|
add_vertex(s);
|
||||||
|
t=s;
|
||||||
|
CGAL::copy_face_graph(s, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
T s, t;
|
||||||
|
CGAL::make_triangle(Point_3(), Point_3(), Point_3(), s);
|
||||||
|
add_vertex(s);
|
||||||
|
add_vertex(t);
|
||||||
|
CGAL::copy_face_graph(s, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
T s, t;
|
||||||
|
CGAL::make_tetrahedron(Point_3(), Point_3(), Point_3(), Point_3(), s);
|
||||||
|
add_vertex(s);
|
||||||
|
t=s;
|
||||||
|
CGAL::copy_face_graph(s, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
T s, t;
|
||||||
|
CGAL::make_tetrahedron(Point_3(), Point_3(), Point_3(), Point_3(), s);
|
||||||
|
add_vertex(s);
|
||||||
|
add_vertex(t);
|
||||||
|
CGAL::copy_face_graph(s, t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void
|
void
|
||||||
join_face_test()
|
join_face_test()
|
||||||
|
|
@ -619,6 +670,7 @@ void
|
||||||
test_Euler_operations()
|
test_Euler_operations()
|
||||||
{
|
{
|
||||||
test_copy_face_graph_nm_umbrella<Graph>();
|
test_copy_face_graph_nm_umbrella<Graph>();
|
||||||
|
test_copy_face_graph_isolated_vertices<Graph>();
|
||||||
join_face_test<Graph>();
|
join_face_test<Graph>();
|
||||||
add_vertex_and_face_to_border_test<Graph>();
|
add_vertex_and_face_to_border_test<Graph>();
|
||||||
add_face_to_border_test<Graph>();
|
add_face_to_border_test<Graph>();
|
||||||
|
|
|
||||||
|
|
@ -171,10 +171,10 @@ void test_bgl_OFF(const char* filename)
|
||||||
assert(ok);
|
assert(ok);
|
||||||
assert(num_vertices(fg) == 8 && num_faces(fg) == 4);
|
assert(num_vertices(fg) == 8 && num_faces(fg) == 4);
|
||||||
|
|
||||||
for(const auto v : vertices(fg))
|
for(auto v : vertices(fg))
|
||||||
assert(get(vcm, v) != CGAL::Color());
|
assert(get(vcm, v) != CGAL::Color());
|
||||||
|
|
||||||
for(const auto f : faces(fg))
|
for(auto f : faces(fg))
|
||||||
assert(get(fcm, f) != CGAL::Color());
|
assert(get(fcm, f) != CGAL::Color());
|
||||||
|
|
||||||
// write with OFF
|
// write with OFF
|
||||||
|
|
@ -192,10 +192,10 @@ void test_bgl_OFF(const char* filename)
|
||||||
assert(ok);
|
assert(ok);
|
||||||
assert(are_equal_meshes(fg, fg2));
|
assert(are_equal_meshes(fg, fg2));
|
||||||
|
|
||||||
for(const auto v : vertices(fg2))
|
for(auto v : vertices(fg2))
|
||||||
assert(get(vcm2, v) != CGAL::Color());
|
assert(get(vcm2, v) != CGAL::Color());
|
||||||
|
|
||||||
for(const auto f : faces(fg2))
|
for(auto f : faces(fg2))
|
||||||
assert(get(fcm2, f) != CGAL::Color());
|
assert(get(fcm2, f) != CGAL::Color());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -211,7 +211,7 @@ void test_bgl_OFF(const char* filename)
|
||||||
assert(ok);
|
assert(ok);
|
||||||
assert(are_equal_meshes(fg, fg2));
|
assert(are_equal_meshes(fg, fg2));
|
||||||
|
|
||||||
for(const auto v : vertices(fg2))
|
for(auto v : vertices(fg2))
|
||||||
assert(get(vcm2, v) != CGAL::Color());
|
assert(get(vcm2, v) != CGAL::Color());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -224,7 +224,7 @@ void test_bgl_OFF(const char* filename)
|
||||||
ok = CGAL::read_OFF("data/mesh_with_normals.off", fg, CGAL::parameters::vertex_normal_map(vnm));
|
ok = CGAL::read_OFF("data/mesh_with_normals.off", fg, CGAL::parameters::vertex_normal_map(vnm));
|
||||||
assert(ok);
|
assert(ok);
|
||||||
|
|
||||||
for(const auto v : vertices(fg))
|
for(auto v : vertices(fg))
|
||||||
assert(get(vnm, v) != CGAL::NULL_VECTOR);
|
assert(get(vnm, v) != CGAL::NULL_VECTOR);
|
||||||
|
|
||||||
// write with OFF
|
// write with OFF
|
||||||
|
|
@ -240,7 +240,7 @@ void test_bgl_OFF(const char* filename)
|
||||||
assert(ok);
|
assert(ok);
|
||||||
assert(are_equal_meshes(fg, fg2));
|
assert(are_equal_meshes(fg, fg2));
|
||||||
|
|
||||||
for(const auto v : vertices(fg2))
|
for(auto v : vertices(fg2))
|
||||||
assert(get(vnm2, v) != CGAL::NULL_VECTOR);
|
assert(get(vnm2, v) != CGAL::NULL_VECTOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -256,7 +256,7 @@ void test_bgl_OFF(const char* filename)
|
||||||
assert(ok);
|
assert(ok);
|
||||||
assert(are_equal_meshes(fg, fg2));
|
assert(are_equal_meshes(fg, fg2));
|
||||||
|
|
||||||
for(const auto v : vertices(fg2))
|
for(auto v : vertices(fg2))
|
||||||
assert(get(vnm2, v) != CGAL::NULL_VECTOR);
|
assert(get(vnm2, v) != CGAL::NULL_VECTOR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -278,13 +278,13 @@ void test_bgl_OFF(const char* filename)
|
||||||
assert(ok);
|
assert(ok);
|
||||||
assert(num_vertices(fg) != 0 && num_faces(fg) != 0);
|
assert(num_vertices(fg) != 0 && num_faces(fg) != 0);
|
||||||
|
|
||||||
for(const auto v : vertices(fg))
|
for(auto v : vertices(fg))
|
||||||
{
|
{
|
||||||
assert(get(vnm2, v) != CGAL::NULL_VECTOR);
|
assert(get(vnm2, v) != CGAL::NULL_VECTOR);
|
||||||
assert(get(vcm2, v) != CGAL::Color());
|
assert(get(vcm2, v) != CGAL::Color());
|
||||||
}
|
}
|
||||||
|
|
||||||
for(const auto f : faces(fg))
|
for(auto f : faces(fg))
|
||||||
assert(get(fcm2, f) != CGAL::Color());
|
assert(get(fcm2, f) != CGAL::Color());
|
||||||
fg.clear();
|
fg.clear();
|
||||||
is.close();
|
is.close();
|
||||||
|
|
@ -301,7 +301,7 @@ void test_bgl_OFF(const char* filename)
|
||||||
assert(ok);
|
assert(ok);
|
||||||
assert(num_vertices(fg) != 0 && num_faces(fg) != 0);
|
assert(num_vertices(fg) != 0 && num_faces(fg) != 0);
|
||||||
|
|
||||||
for(const auto v : vertices(fg))
|
for(auto v : vertices(fg))
|
||||||
{
|
{
|
||||||
assert(get(vnm, v) != CGAL::NULL_VECTOR);
|
assert(get(vnm, v) != CGAL::NULL_VECTOR);
|
||||||
assert(get(vcm, v) != CGAL::Color());
|
assert(get(vcm, v) != CGAL::Color());
|
||||||
|
|
@ -328,13 +328,13 @@ void test_bgl_OFF(const char* filename)
|
||||||
assert(ok);
|
assert(ok);
|
||||||
assert(are_equal_meshes(fg, fg2));
|
assert(are_equal_meshes(fg, fg2));
|
||||||
|
|
||||||
for(const auto v : vertices(fg2))
|
for(auto v : vertices(fg2))
|
||||||
{
|
{
|
||||||
assert(get(vnm2, v) != CGAL::NULL_VECTOR);
|
assert(get(vnm2, v) != CGAL::NULL_VECTOR);
|
||||||
assert(get(vcm2, v) != CGAL::Color());
|
assert(get(vcm2, v) != CGAL::Color());
|
||||||
}
|
}
|
||||||
|
|
||||||
for(const auto f : faces(fg2))
|
for(auto f : faces(fg2))
|
||||||
assert(get(fcm2, f) != CGAL::Color());
|
assert(get(fcm2, f) != CGAL::Color());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -359,13 +359,13 @@ void test_bgl_OFF(const char* filename)
|
||||||
assert(ok);
|
assert(ok);
|
||||||
assert(are_equal_meshes(fg, fg2));
|
assert(are_equal_meshes(fg, fg2));
|
||||||
|
|
||||||
for(const auto v : vertices(fg2))
|
for(auto v : vertices(fg2))
|
||||||
{
|
{
|
||||||
assert(get(vnm2, v) != CGAL::NULL_VECTOR);
|
assert(get(vnm2, v) != CGAL::NULL_VECTOR);
|
||||||
assert(get(vcm2, v) != CGAL::Color());
|
assert(get(vcm2, v) != CGAL::Color());
|
||||||
}
|
}
|
||||||
|
|
||||||
for(const auto f : faces(fg2))
|
for(auto f : faces(fg2))
|
||||||
assert(get(fcm2, f) != CGAL::Color());
|
assert(get(fcm2, f) != CGAL::Color());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -526,12 +526,12 @@ void test_bgl_PLY(const std::string filename,
|
||||||
assert(ok);
|
assert(ok);
|
||||||
assert(num_vertices(fg) == 4 && num_faces(fg) == 4);
|
assert(num_vertices(fg) == 4 && num_faces(fg) == 4);
|
||||||
|
|
||||||
for(const auto v : vertices(fg))
|
for(auto v : vertices(fg))
|
||||||
{
|
{
|
||||||
assert(get(vcm, v) != CGAL::Color());
|
assert(get(vcm, v) != CGAL::Color());
|
||||||
}
|
}
|
||||||
|
|
||||||
for(const auto f : faces(fg))
|
for(auto f : faces(fg))
|
||||||
assert(get(fcm, f) != CGAL::Color());
|
assert(get(fcm, f) != CGAL::Color());
|
||||||
|
|
||||||
// write with PLY
|
// write with PLY
|
||||||
|
|
@ -561,10 +561,10 @@ void test_bgl_PLY(const std::string filename,
|
||||||
assert(are_equal_meshes(fg, fg2));
|
assert(are_equal_meshes(fg, fg2));
|
||||||
|
|
||||||
// @tmp
|
// @tmp
|
||||||
// for(const auto v : vertices(fg2))
|
// for(auto v : vertices(fg2))
|
||||||
// assert(get(vcm2, v) != CGAL::Color());
|
// assert(get(vcm2, v) != CGAL::Color());
|
||||||
|
|
||||||
// for(const auto f : faces(fg2))
|
// for(auto f : faces(fg2))
|
||||||
// assert(get(fcm2, f) != CGAL::Color());
|
// assert(get(fcm2, f) != CGAL::Color());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -586,10 +586,10 @@ void test_bgl_PLY(const std::string filename,
|
||||||
assert(are_equal_meshes(fg, fg2));
|
assert(are_equal_meshes(fg, fg2));
|
||||||
|
|
||||||
// @tmp
|
// @tmp
|
||||||
// for(const auto v : vertices(fg2))
|
// for(auto v : vertices(fg2))
|
||||||
// assert(get(vcm2, v) != CGAL::Color());
|
// assert(get(vcm2, v) != CGAL::Color());
|
||||||
|
|
||||||
// for(const auto f : faces(fg2))
|
// for(auto f : faces(fg2))
|
||||||
// assert(get(fcm2, f) != CGAL::Color());
|
// assert(get(fcm2, f) != CGAL::Color());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,7 @@ void test(const NamedParameters& np)
|
||||||
assert(get_parameter(np, CGAL::internal_np::vertex_incident_patches).v == 11);
|
assert(get_parameter(np, CGAL::internal_np::vertex_incident_patches).v == 11);
|
||||||
assert(get_parameter(np, CGAL::internal_np::density_control_factor).v == 12);
|
assert(get_parameter(np, CGAL::internal_np::density_control_factor).v == 12);
|
||||||
assert(get_parameter(np, CGAL::internal_np::use_delaunay_triangulation).v == 13);
|
assert(get_parameter(np, CGAL::internal_np::use_delaunay_triangulation).v == 13);
|
||||||
|
assert(get_parameter(np, CGAL::internal_np::use_2d_constrained_delaunay_triangulation).v == 4573);
|
||||||
assert(get_parameter(np, CGAL::internal_np::fairing_continuity).v == 14);
|
assert(get_parameter(np, CGAL::internal_np::fairing_continuity).v == 14);
|
||||||
assert(get_parameter(np, CGAL::internal_np::sparse_linear_solver).v == 15);
|
assert(get_parameter(np, CGAL::internal_np::sparse_linear_solver).v == 15);
|
||||||
assert(get_parameter(np, CGAL::internal_np::number_of_relaxation_steps).v == 16);
|
assert(get_parameter(np, CGAL::internal_np::number_of_relaxation_steps).v == 16);
|
||||||
|
|
@ -106,6 +107,8 @@ void test(const NamedParameters& np)
|
||||||
assert(get_parameter(np, CGAL::internal_np::allow_self_intersections).v == 66);
|
assert(get_parameter(np, CGAL::internal_np::allow_self_intersections).v == 66);
|
||||||
assert(get_parameter(np, CGAL::internal_np::polyhedral_envelope_epsilon).v == 67);
|
assert(get_parameter(np, CGAL::internal_np::polyhedral_envelope_epsilon).v == 67);
|
||||||
assert(get_parameter(np, CGAL::internal_np::maximum_number_of_faces).v == 78910);
|
assert(get_parameter(np, CGAL::internal_np::maximum_number_of_faces).v == 78910);
|
||||||
|
assert(get_parameter(np, CGAL::internal_np::non_manifold_feature_map).v == 60);
|
||||||
|
assert(get_parameter(np, CGAL::internal_np::filter).v == 61);
|
||||||
|
|
||||||
// Named parameters that we use in the package 'Surface Mesh Simplification'
|
// Named parameters that we use in the package 'Surface Mesh Simplification'
|
||||||
assert(get_parameter(np, CGAL::internal_np::get_cost_policy).v == 34);
|
assert(get_parameter(np, CGAL::internal_np::get_cost_policy).v == 34);
|
||||||
|
|
@ -163,6 +166,7 @@ void test(const NamedParameters& np)
|
||||||
check_same_type<11>(get_parameter(np, CGAL::internal_np::vertex_incident_patches));
|
check_same_type<11>(get_parameter(np, CGAL::internal_np::vertex_incident_patches));
|
||||||
check_same_type<12>(get_parameter(np, CGAL::internal_np::density_control_factor));
|
check_same_type<12>(get_parameter(np, CGAL::internal_np::density_control_factor));
|
||||||
check_same_type<13>(get_parameter(np, CGAL::internal_np::use_delaunay_triangulation));
|
check_same_type<13>(get_parameter(np, CGAL::internal_np::use_delaunay_triangulation));
|
||||||
|
check_same_type<4573>(get_parameter(np, CGAL::internal_np::use_2d_constrained_delaunay_triangulation));
|
||||||
check_same_type<14>(get_parameter(np, CGAL::internal_np::fairing_continuity));
|
check_same_type<14>(get_parameter(np, CGAL::internal_np::fairing_continuity));
|
||||||
check_same_type<15>(get_parameter(np, CGAL::internal_np::sparse_linear_solver));
|
check_same_type<15>(get_parameter(np, CGAL::internal_np::sparse_linear_solver));
|
||||||
check_same_type<16>(get_parameter(np, CGAL::internal_np::number_of_relaxation_steps));
|
check_same_type<16>(get_parameter(np, CGAL::internal_np::number_of_relaxation_steps));
|
||||||
|
|
@ -219,6 +223,8 @@ void test(const NamedParameters& np)
|
||||||
check_same_type<62>(get_parameter(np, CGAL::internal_np::halfedges_keeper));
|
check_same_type<62>(get_parameter(np, CGAL::internal_np::halfedges_keeper));
|
||||||
check_same_type<64>(get_parameter(np, CGAL::internal_np::do_simplify_border));
|
check_same_type<64>(get_parameter(np, CGAL::internal_np::do_simplify_border));
|
||||||
check_same_type<78910>(get_parameter(np, CGAL::internal_np::maximum_number_of_faces));
|
check_same_type<78910>(get_parameter(np, CGAL::internal_np::maximum_number_of_faces));
|
||||||
|
check_same_type<60>(get_parameter(np, CGAL::internal_np::non_manifold_feature_map));
|
||||||
|
check_same_type<61>(get_parameter(np, CGAL::internal_np::filter));
|
||||||
|
|
||||||
// Named parameters that we use in the package 'Surface Mesh Simplification'
|
// Named parameters that we use in the package 'Surface Mesh Simplification'
|
||||||
check_same_type<34>(get_parameter(np, CGAL::internal_np::get_cost_policy));
|
check_same_type<34>(get_parameter(np, CGAL::internal_np::get_cost_policy));
|
||||||
|
|
@ -310,6 +316,7 @@ int main()
|
||||||
.vertex_incident_patches_map(A<11>(11))
|
.vertex_incident_patches_map(A<11>(11))
|
||||||
.density_control_factor(A<12>(12))
|
.density_control_factor(A<12>(12))
|
||||||
.use_delaunay_triangulation(A<13>(13))
|
.use_delaunay_triangulation(A<13>(13))
|
||||||
|
.use_2d_constrained_delaunay_triangulation(A<4573>(4573))
|
||||||
.fairing_continuity(A<14>(14))
|
.fairing_continuity(A<14>(14))
|
||||||
.sparse_linear_solver(A<15>(15))
|
.sparse_linear_solver(A<15>(15))
|
||||||
.number_of_relaxation_steps(A<16>(16))
|
.number_of_relaxation_steps(A<16>(16))
|
||||||
|
|
@ -344,6 +351,8 @@ int main()
|
||||||
.throw_on_self_intersection(A<43>(43))
|
.throw_on_self_intersection(A<43>(43))
|
||||||
.clip_volume(A<44>(44))
|
.clip_volume(A<44>(44))
|
||||||
.use_compact_clipper(A<45>(45))
|
.use_compact_clipper(A<45>(45))
|
||||||
|
.non_manifold_feature_map(A<60>(60))
|
||||||
|
.filter(A<61>(61))
|
||||||
.apply_per_connected_component(A<46>(46))
|
.apply_per_connected_component(A<46>(46))
|
||||||
.output_iterator(A<47>(47))
|
.output_iterator(A<47>(47))
|
||||||
.erase_all_duplicates(A<48>(48))
|
.erase_all_duplicates(A<48>(48))
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
#include <CGAL/internal/disable_deprecation_warnings_and_errors.h>
|
||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
#include <CGAL/Surface_mesh.h>
|
||||||
|
#include <CGAL/Simple_cartesian.h>
|
||||||
|
#include <CGAL/boost/graph/generators.h>
|
||||||
|
|
||||||
|
#include <CGAL/boost/graph/IO/OFF.h>
|
||||||
|
#include <CGAL/boost/graph/IO/VTK.h>
|
||||||
|
#include <CGAL/boost/graph/IO/WRL.h>
|
||||||
|
|
||||||
|
|
||||||
|
typedef CGAL::Simple_cartesian<double> Kernel;
|
||||||
|
typedef Kernel::Point_3 Point_3;
|
||||||
|
typedef CGAL::Surface_mesh<Point_3> SM;
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
// OFF
|
||||||
|
SM sm_in, sm_out;
|
||||||
|
Point_3 p0(0,0,0), p1(1,0,0), p2(0,1,0);
|
||||||
|
CGAL::make_triangle(p0, p1, p2, sm_out);
|
||||||
|
bool ok = CGAL::write_off("tmp.off", sm_out);
|
||||||
|
assert(ok);
|
||||||
|
ok = CGAL::read_off("tmp.off", sm_in);
|
||||||
|
assert(ok);
|
||||||
|
assert(num_vertices(sm_in) == 3 && num_faces(sm_in) == 1);
|
||||||
|
sm_in.clear();
|
||||||
|
|
||||||
|
std::ofstream os("tmp.off");
|
||||||
|
ok = CGAL::write_off(os, sm_out);
|
||||||
|
assert(ok);
|
||||||
|
os.close();
|
||||||
|
std::ifstream is("tmp.off");
|
||||||
|
ok = CGAL::read_off(is, sm_in);
|
||||||
|
assert(ok);
|
||||||
|
assert(num_vertices(sm_in) == 3 && num_faces(sm_in) == 1);
|
||||||
|
is.close();
|
||||||
|
sm_in.clear();
|
||||||
|
#ifdef CGAL_USE_VTK
|
||||||
|
//vtk
|
||||||
|
os.open("tmp.vtp");
|
||||||
|
ok = CGAL::write_vtp(os, sm_out);
|
||||||
|
assert(ok);
|
||||||
|
os.close();
|
||||||
|
|
||||||
|
ok = CGAL::read_VTP("tmp.vtp", sm_in);
|
||||||
|
assert(ok);
|
||||||
|
assert(num_vertices(sm_in) == 3 && num_faces(sm_in) == 1);
|
||||||
|
sm_in.clear();
|
||||||
|
#endif
|
||||||
|
//wrl
|
||||||
|
os.open("tmp.wrl");
|
||||||
|
ok = CGAL::write_wrl(os, sm_out);
|
||||||
|
assert(ok);
|
||||||
|
os.close();
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue