Merge remote-tracking branch 'cgal/master' into Heat_method_3-mollify-oboes

# Conflicts:
#	Heat_method_3/test/Heat_method_3/CMakeLists.txt
This commit is contained in:
Jane Tournois 2021-03-22 13:17:55 +01:00
commit 1448c6525a
1668 changed files with 163848 additions and 38115 deletions

2
.github/install.sh vendored
View File

@ -3,7 +3,7 @@ sudo add-apt-repository ppa:mikhailnov/pulseeffects -y
sudo apt-get update
sudo apt-get install -y libmpfr-dev \
libeigen3-dev qtbase5-dev libqt5sql5-sqlite libqt5opengl5-dev qtscript5-dev \
libqt5svg5-dev qttools5-dev qttools5-dev-tools libboost1.72-dev
libqt5svg5-dev qttools5-dev qttools5-dev-tools libboost1.72-dev zsh
#update cmake to 3.18.4
sudo apt purge --auto-remove cmake
cd /tmp

View File

@ -49,8 +49,9 @@ jobs:
if: steps.get_round.outputs.result != 'stop'
run: |
set -x
sudo apt-get install -y graphviz ssh bibtex2html
sudo pip install lxml pyquery
sudo apt-get update && sudo apt-get install -y graphviz ssh bibtex2html
sudo pip install lxml
sudo pip install 'pyquery==1.4.1' # it seems to be the last py2 compatible version
wget --no-verbose -O doxygen_exe https://cgal.geometryfactory.com/~mgimeno/doxygen/build_1_8_13/bin/doxygen
sudo mv doxygen_exe /usr/bin/doxygen
sudo chmod +x /usr/bin/doxygen
@ -91,7 +92,7 @@ jobs:
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
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
exit 1
fi

30
.github/workflows/checks.yml vendored Normal file
View File

@ -0,0 +1,30 @@
name: CMake Test Merge Branch
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2.0.0
- name: install dependencies
run: |
.github/install.sh
set -x
sudo apt-get update && sudo apt-get install -y graphviz ssh bibtex2html
sudo pip install lxml
sudo pip install 'pyquery==1.4.1' # it seems to be the last py2 compatible version
wget --no-verbose -O doxygen_exe https://cgal.geometryfactory.com/~mgimeno/doxygen/build_1_8_13/bin/doxygen
sudo mv doxygen_exe /usr/bin/doxygen
sudo chmod +x /usr/bin/doxygen
git config --global user.email "maxime.gimeno@geometryfactory.com"
git config --global user.name "Maxime Gimeno"
- name: Run checks
run: |
zsh Scripts/developer_scripts/test_merge_of_branch HEAD
#test dependencies
bash Scripts/developer_scripts/cgal_check_dependencies.sh --check_headers /usr/bin/doxygen

View File

@ -26,7 +26,7 @@ jobs:
git rm -r ${PR_NUMBER}
fi
#git diff exits with 1 if there is a diff
if !git diff --quiet; then
if ! git diff --quiet; then
git commit -a --amend -m"base commit" && git push -f -u origin master
fi

View File

@ -1,6 +1,6 @@
name: Test Polyhedron Demo
on: [pull_request]
on: [push, pull_request]
jobs:
batch_1:

View File

@ -1,80 +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='Inventor Jet_fitting_3 Kernel_23 '
- PACKAGE='Kernel_d LEDA Linear_cell_complex '
- PACKAGE='MacOSX Maintenance Matrix_search '
- PACKAGE='Mesh_2 Mesh_3 Mesher_level '
- PACKAGE='Minkowski_sum_2 Minkowski_sum_3 Modifier '
- PACKAGE='Modular_arithmetic Nef_2 Nef_3 '
- PACKAGE='Nef_S2 NewKernel_d Number_types '
- PACKAGE='OpenNL Optimal_bounding_box Optimal_transportation_reconstruction_2 '
- PACKAGE='Optimisation_basic Partition_2 Periodic_2_triangulation_2 '
- PACKAGE='Periodic_3_mesh_3 Periodic_3_triangulation_3 Periodic_4_hyperbolic_triangulation_2 '
- PACKAGE='Point_set_2 Point_set_3 Point_set_processing_3 '
- PACKAGE='Poisson_surface_reconstruction_3 Polygon Polygon_mesh_processing '
- PACKAGE='Polygonal_surface_reconstruction Polyhedron Polyhedron_IO '
- PACKAGE='Polyline_simplification_2 Polynomial Polytope_distance_d '
- PACKAGE='Principal_component_analysis Principal_component_analysis_LGPL Profiling_tools '
- PACKAGE='Property_map QP_solver Random_numbers '
- PACKAGE='Ridges_3 STL_Extension Scale_space_reconstruction_3 '
- PACKAGE='Scripts SearchStructures Segment_Delaunay_graph_2 '
- PACKAGE='Segment_Delaunay_graph_Linf_2 Set_movable_separability_2 Shape_detection '
- PACKAGE='Skin_surface_3 Snap_rounding_2 Solver_interface '
- PACKAGE='Spatial_searching Spatial_sorting Straight_skeleton_2 '
- PACKAGE='Stream_lines_2 Stream_support Subdivision_method_3 '
- PACKAGE='Surface_mesh Surface_mesh_approximation Surface_mesh_deformation '
- PACKAGE='Surface_mesh_parameterization Surface_mesh_segmentation Surface_mesh_shortest_path '
- PACKAGE='Surface_mesh_simplification Surface_mesh_skeletonization Surface_mesh_topology '
- PACKAGE='Surface_mesher Surface_sweep_2 TDS_2 '
- PACKAGE='TDS_3 Testsuite Tetrahedral_remeshing '
- PACKAGE='Three Triangulation Triangulation_2 '
- PACKAGE='Triangulation_3 Union_find Visibility_2 '
- PACKAGE='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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,140 +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
Inventor
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
Polyhedron_IO
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

View File

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

View File

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

View File

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

View File

@ -19,18 +19,16 @@
#include <QApplication>
#include <CGAL/Qt/resources.h>
#include <QMimeData>
#include <CGAL/Qt/init_ogl_context.h>
int main(int argc, char **argv)
{
CGAL::Qt::init_ogl_context(4,3);
QApplication app(argc, argv);
app.setOrganizationDomain("inria.fr");
app.setOrganizationName("INRIA");
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).
CGAL_QT_INIT_RESOURCES;

View File

@ -23,7 +23,7 @@ include_directories(BEFORE ./ ./include)
find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5)
# 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)
@ -54,7 +54,7 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND)
#${CGAL_Qt5_MOC_FILES}
)
# 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)
add_to_cached_list(CGAL_EXECUTABLE_TARGETS AABB_demo)

View File

@ -22,8 +22,6 @@ MainWindow::MainWindow(QWidget* parent)
// saves some pointers from ui, for latter use.
m_pViewer = ui->viewer;
// does not save the state of the viewer
m_pViewer->setStateFileName(QString());
// accepts drop events
setAcceptDrops(true);
@ -45,6 +43,7 @@ MainWindow::MainWindow(QWidget* parent)
MainWindow::~MainWindow()
{
m_pViewer->makeCurrent();
delete ui;
}

View File

@ -91,8 +91,8 @@ void Scene::compile_shaders()
//Vertex source code
const char vertex_source[] =
{
"#version 120 \n"
"attribute highp vec4 vertex;\n"
"#version 150 \n"
"in highp vec4 vertex;\n"
"uniform highp mat4 mvp_matrix;\n"
"uniform highp mat4 f_matrix;\n"
"void main(void)\n"
@ -103,10 +103,11 @@ void Scene::compile_shaders()
//Vertex source code
const char fragment_source[] =
{
"#version 120 \n"
"#version 150 \n"
"uniform highp vec4 color; \n"
"out highp vec4 out_color; \n"
"void main(void) { \n"
"gl_FragColor = color; \n"
"out_color = color; \n"
"} \n"
"\n"
};
@ -139,12 +140,12 @@ void Scene::compile_shaders()
//Vertex source code
const char tex_vertex_source[] =
{
"#version 120 \n"
"attribute highp vec4 vertex;\n"
"attribute highp vec2 tex_coord; \n"
"#version 150 \n"
"in highp vec4 vertex;\n"
"in highp vec2 tex_coord; \n"
"uniform highp mat4 mvp_matrix;\n"
"uniform highp mat4 f_matrix;\n"
"varying highp vec2 texc;\n"
"out highp vec2 texc;\n"
"void main(void)\n"
"{\n"
" gl_Position = mvp_matrix * f_matrix * vertex;\n"
@ -154,11 +155,12 @@ void Scene::compile_shaders()
//Vertex source code
const char tex_fragment_source[] =
{
"#version 120 \n"
"uniform sampler2D texture;\n"
"varying highp vec2 texc;\n"
"#version 150 \n"
"uniform sampler2D s_texture;\n"
"in highp vec2 texc;\n"
"out highp vec4 out_color; \n"
"void main(void) { \n"
"gl_FragColor = texture2D(texture, texc.st);\n"
"out_color = vec4(texture(s_texture, texc));\n"
"} \n"
"\n"
};
@ -1319,12 +1321,8 @@ void Scene::deactivate_cutting_plane()
}
void Scene::initGL()
{
gl = new QOpenGLFunctions_2_1();
if(!gl->initializeOpenGLFunctions())
{
qFatal("ERROR : OpenGL Functions not initialized. Check your OpenGL Verison (should be >=3.3)");
exit(1);
}
gl = new QOpenGLFunctions();
gl->initializeOpenGLFunctions();
gl->glGenTextures(1, &textureId);
compile_shaders();

View File

@ -86,7 +86,7 @@ public:
private:
// member data
QOpenGLFunctions_2_1 *gl;
QOpenGLFunctions *gl;
Bbox m_bbox;
Polyhedron *m_pPolyhedron;
std::list<Point> m_points;

View File

@ -35,7 +35,7 @@
\cgalCRPSection{Primitives}
- `CGAL::AABB_triangle_primitive<GeomTraits, Iterator, CacheDatum>`
- `CGAL::AABB_segment_primitive<GeomTraits, Iterator, CacheDatum>`
- `CGAL::AABB_primitive<Id,ObjectPropertyMap,PointPropertyMapPolyhedron,ExternalPropertyMaps,CacheDatum>`
- `CGAL::AABB_primitive<Id,ObjectPropertyMap,PointPropertyMap,ExternalPropertyMaps,CacheDatum>`
- `CGAL::AABB_halfedge_graph_segment_primitive<HalfedgeGraph,Vpm,OneHalfedgeGraphPerTree,CacheDatum>`
- `CGAL::AABB_face_graph_triangle_primitive<FaceGraph,Vpm,OneFaceGraphPerTree,CacheDatum>`
*/

View File

@ -1,7 +1,5 @@
#include <iostream>
#include <fstream>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/AABB_tree.h>
#include <CGAL/AABB_traits.h>
#include <CGAL/Polyhedron_3.h>
@ -9,6 +7,9 @@
#include <CGAL/AABB_face_graph_triangle_primitive.h>
#include <CGAL/Timer.h>
#include <iostream>
#include <fstream>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::FT FT;
typedef K::Point_3 Point_3;
@ -26,8 +27,12 @@ void triangle_mesh(const char* fname)
typedef CGAL::AABB_tree<Traits> Tree;
TriangleMesh tmesh;
std::ifstream in(fname);
in >> tmesh;
if(!CGAL::read_polygon_mesh(fname, tmesh) || CGAL::is_triangle_mesh(tmesh))
{
std::cerr << "Invalid input." << std::endl;
return;
}
Timer t;
t.start();
Tree tree(faces(tmesh).first, faces(tmesh).second, tmesh);
@ -36,7 +41,6 @@ void triangle_mesh(const char* fname)
std::cout << "Closest point to ORIGIN:" << tree.closest_point(CGAL::ORIGIN) << std::endl;
}
Bbox_3 bbox(boost::graph_traits<Surface_mesh>::face_descriptor fd,
const Surface_mesh& p)
{
@ -47,7 +51,6 @@ Bbox_3 bbox(boost::graph_traits<Surface_mesh>::face_descriptor fd,
return res;
}
void surface_mesh_cache_bbox(const char* fname)
{
typedef boost::graph_traits<Surface_mesh>::face_descriptor face_descriptor;
@ -64,9 +67,9 @@ void surface_mesh_cache_bbox(const char* fname)
t.start();
Bbox_pmap bb = tmesh.add_property_map<face_descriptor,Bbox_3>("f:bbox",Bbox_3()).first;
for(face_descriptor fd : faces(tmesh)){
for(face_descriptor fd : faces(tmesh))
put(bb, fd, bbox(fd,tmesh));
}
Traits traits(bb);
Tree tree(traits);
tree.insert(faces(tmesh).first, faces(tmesh).second, tmesh);
@ -77,7 +80,6 @@ void surface_mesh_cache_bbox(const char* fname)
std::cout << "Closest point to ORIGIN:" << tree.closest_point(CGAL::ORIGIN) << std::endl;
}
int main(int argc, char* argv[])
{
std::cout << "Polyhedron_3" << std::endl;

View File

@ -1,14 +1,15 @@
#include <iostream>
#include <fstream>
#include <CGAL/Simple_cartesian.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/AABB_tree.h>
#include <CGAL/AABB_traits.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/AABB_face_graph_triangle_primitive.h>
#include <CGAL/Polygon_mesh_processing/compute_normal.h>
#include <CGAL/Polygon_mesh_processing/orientation.h>
#include <iostream>
#include <fstream>
typedef CGAL::Simple_cartesian<double> K;
typedef K::FT FT;
typedef K::Point_3 Point;
@ -24,8 +25,8 @@ typedef CGAL::AABB_traits<K, Primitive> Traits;
typedef CGAL::AABB_tree<Traits> Tree;
typedef boost::optional<Tree::Intersection_and_primitive_id<Ray>::Type> Ray_intersection;
struct Skip {
struct Skip
{
face_descriptor fd;
Skip(const face_descriptor fd)
@ -44,14 +45,20 @@ struct Skip {
int main(int argc, char* argv[])
{
const char* filename = (argc > 1) ? argv[1] : "data/tetrahedron.off";
std::ifstream input(filename);
Mesh mesh;
input >> mesh;
if(!CGAL::read_polygon_mesh(filename, mesh))
{
std::cerr << "Invalid input." << std::endl;
return 1;
}
Tree tree(faces(mesh).first, faces(mesh).second, mesh);
double d = CGAL::Polygon_mesh_processing::is_outward_oriented(mesh)?-1:1;
for(face_descriptor fd : faces(mesh)){
for(face_descriptor fd : faces(mesh))
{
halfedge_descriptor hd = halfedge(fd,mesh);
Point p = CGAL::centroid(mesh.point(source(hd,mesh)),
mesh.point(target(hd,mesh)),
@ -61,13 +68,16 @@ int main(int argc, char* argv[])
Ray ray(p,d * v);
Skip skip(fd);
Ray_intersection intersection = tree.first_intersection(ray, skip);
if(intersection){
if(intersection)
{
if(boost::get<Point>(&(intersection->first))){
const Point* p = boost::get<Point>(&(intersection->first) );
std::cout << *p << std::endl;
}
}
}
std::cerr << "done" << std::endl;
return 0;
}

View File

@ -98,7 +98,7 @@ class AABB_face_graph_triangle_primitive
}
public:
#ifdef DOXYGEN_RUNNING
#ifdef DOXYGEN_RUNNING
/// \name Types
/// @{
/*!
@ -122,18 +122,32 @@ public:
If `OneFaceGraphPerTree` is CGAL::Tag_true, constructs a `Shared_data` object from a reference to the polyhedon `graph`.
*/
static unspecified_type construct_shared_data( FaceGraph& graph );
#else
#else
typedef typename Base::Id Id;
#endif
#endif
typedef typename boost::graph_traits<FaceGraph>::face_descriptor face_descriptor;
// constructors
#ifdef DOXYGEN_RUNNING
/*!
constructs a primitive.
\tparam Iterator an input iterator with `Id` as value type.
If `VertexPointPMap` is the default of the class, an additional constructor
is available with `vppm` set to `get(vertex_point, graph)`.
*/
template <class Iterator>
AABB_face_graph_triangle_primitive(Iterator it, const FaceGraph& graph, VertexPointPMap vppm);
/*!
constructs a primitive.
If `VertexPointPMap` is the default of the class, an additional constructor
is available with `vppm` set to `get(vertex_point, graph)`.
*/
AABB_face_graph_triangle_primitive(face_descriptor fd, const FaceGraph& graph, VertexPointPMap vppm);
#else
template <class Iterator>
AABB_face_graph_triangle_primitive(Iterator it, const FaceGraph& graph, VertexPointPMap_ vppm)
: Base( Id_(make_id(*it, graph, OneFaceGraphPerTree())),
@ -141,18 +155,12 @@ public:
Point_property_map(const_cast<FaceGraph*>(&graph),vppm) )
{}
/*!
constructs a primitive.
If `VertexPointPMap` is the default of the class, an additional constructor
is available with `vppm` set to `get(vertex_point, graph)`.
*/
AABB_face_graph_triangle_primitive(face_descriptor fd, const FaceGraph& graph, VertexPointPMap_ vppm)
: Base( Id_(make_id(fd, graph, OneFaceGraphPerTree())),
Triangle_property_map(const_cast<FaceGraph*>(&graph),vppm),
Point_property_map(const_cast<FaceGraph*>(&graph),vppm) )
{}
#ifndef DOXYGEN_RUNNING
template <class Iterator>
AABB_face_graph_triangle_primitive(Iterator it, const FaceGraph& graph)
: Base( Id_(make_id(*it, graph, OneFaceGraphPerTree())),

View File

@ -140,14 +140,27 @@ public:
#endif
typedef typename boost::graph_traits<HalfedgeGraph>::edge_descriptor edge_descriptor;
#ifdef DOXYGEN_RUNNING
/*!
constructs a primitive.
\tparam Iterator is an input iterator with `Id` as value type.
This \ref AABB_tree/AABB_halfedge_graph_edge_example.cpp "example" gives a way to call this constructor
using the insert-by-range method of the class `AABB_tree<Traits>`.
If `VertexPointPMap` is the default of the class, an additional constructor
is available with `vppm` set to `boost::get(vertex_point, graph)`.
*/
template <class Iterator>
AABB_halfedge_graph_segment_primitive(Iterator it, const HalfedgeGraph& graph, VertexPointPMap vppm);
/*!
constructs a primitive.
If `VertexPointPMap` is the default of the class, an additional constructor
is available with `vppm` set to `boost::get(vertex_point, graph)`.
*/
AABB_halfedge_graph_segment_primitive(edge_descriptor ed, const HalfedgeGraph& graph, VertexPointPMap vppm);
#else
template <class Iterator>
AABB_halfedge_graph_segment_primitive(Iterator it, const HalfedgeGraph& graph, VertexPointPMap_ vppm)
: Base( Id_(make_id(*it, graph, OneHalfedgeGraphPerTree())),
@ -155,18 +168,12 @@ public:
Point_property_map(const_cast<HalfedgeGraph*>(&graph), vppm) )
{}
/*!
constructs a primitive.
If `VertexPointPMap` is the default of the class, an additional constructor
is available with `vppm` set to `boost::get(vertex_point, graph)`.
*/
AABB_halfedge_graph_segment_primitive(edge_descriptor ed, const HalfedgeGraph& graph, VertexPointPMap_ vppm)
: Base( Id_(make_id(ed, graph, OneHalfedgeGraphPerTree())),
Segment_property_map(const_cast<HalfedgeGraph*>(&graph), vppm),
Point_property_map(const_cast<HalfedgeGraph*>(&graph), vppm) )
{}
#ifndef DOXYGEN_RUNNING
template <class Iterator>
AABB_halfedge_graph_segment_primitive(Iterator it, const HalfedgeGraph& graph)
: Base( Id_(make_id(*it, graph, OneHalfedgeGraphPerTree())),
@ -177,7 +184,7 @@ public:
: Base( Id_(make_id(ed, graph, OneHalfedgeGraphPerTree())),
Segment_property_map(const_cast<HalfedgeGraph*>(&graph)),
Point_property_map(const_cast<HalfedgeGraph*>(&graph)) ){}
#endif
#endif
/// \internal
typedef internal::Cstr_shared_data<HalfedgeGraph, Base, Segment_property_map, Point_property_map, OneHalfedgeGraphPerTree> Cstr_shared_data;

View File

@ -26,7 +26,6 @@
#include <CGAL/internal/AABB_tree/Primitive_helper.h>
#include <boost/optional.hpp>
#include <boost/bind.hpp>
/// \file AABB_traits.h
@ -274,13 +273,13 @@ public:
switch(Traits::longest_axis(bbox))
{
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;
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;
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;
default:
CGAL_error();
@ -429,6 +428,11 @@ public:
Closest_point closest_point_object() const {return Closest_point(*this);}
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:
/**
@ -447,13 +451,6 @@ private:
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
static bool less_x(const Primitive& pr1, const Primitive& pr2,const AABB_traits<GeomTraits,AABBPrimitive, BboxMap>& traits)
{

View File

@ -126,7 +126,7 @@ namespace CGAL {
Self& operator=(const Self&) = delete;
/**
* @brief Builds the datastructure from a sequence of primitives.
* @brief Builds the data structure from a sequence of primitives.
* @param first iterator over first primitive to insert
* @param beyond past-the-end iterator
*

View File

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

View File

@ -1,5 +1,8 @@
/// \defgroup PkgAdvancingFrontSurfaceReconstructionRef Advancing Front Surface Reconstruction Reference
/// \defgroup PkgAdvancingFrontSurfaceReconstructionRefConcepts Concepts
/// \ingroup PkgAdvancingFrontSurfaceReconstructionRef
/*!
\addtogroup PkgAdvancingFrontSurfaceReconstructionRef
@ -25,6 +28,10 @@ of topological singularities. }
\cgalClassifedRefPages
\cgalCRPSection{Concepts}
- `AdvancingFrontSurfaceReconstructionTraits_3`
\cgalCRPSection{Classes}
- `CGAL::Advancing_front_surface_reconstruction`

View File

@ -5,6 +5,7 @@ Algebraic_foundations
Circulator
Stream_support
TDS_2
TDS_3
Triangulation_2
Triangulation_3
Number_types

View File

@ -9,7 +9,7 @@
#include <CGAL/Delaunay_triangulation_3.h>
#include <CGAL/Triangulation_vertex_base_with_info_3.h>
#include <CGAL/Advancing_front_surface_reconstruction.h>
#include <CGAL/IO/read_xyz_points.h>
#include <CGAL/IO/read_points.h>
#include <CGAL/disable_warnings.h>
#include <boost/lexical_cast.hpp>
@ -113,11 +113,8 @@ int main (int argc, char* argv[])
const char* fname = (argc>1) ? argv[1] : "data/cube.pwn";
// Loading point set from a file.
std::ifstream stream(fname);
if (!stream ||
!CGAL::read_xyz_points(stream,
std::back_inserter(points),
if (!CGAL::read_points(fname, std::back_inserter(points),
CGAL::parameters::point_map(Point_map()).
normal_map(Normal_map())))
{

View File

@ -175,23 +175,42 @@ namespace CGAL {
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.
\tparam Dt must be a `Delaunay_triangulation_3` with
`Advancing_front_surface_reconstruction_vertex_base_3` and `Advancing_front_surface_reconstruction_cell_base_3` blended into the vertex and cell type.
The default uses the `Exact_predicates_inexact_constructions_kernel` as geometric traits class.
\tparam Dt must be a `Delaunay_triangulation_3` whose `Traits` template parameter must be a model of
`AdvancingFrontSurfaceReconstructionTraits_3` and whose `Tds` template parameter must be
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
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,
\tparam P must be a functor offering
\code
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
`smallest_radius_delaunay_sphere()`.
*/
template <
class Dt = Default,
template <class Dt = Default,
class P = Default>
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;
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<P,AFSR::Default_priority>::type Priority;
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 `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
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.
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;
/*!
The type of the 3D triangulation.
The type of the 3D Delaunay triangulation (the first template parameter).
*/
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;
/*!
The number type.
*/
typedef typename Triangulation_3::Geom_traits::FT FT;
/*!
The point type.
*/
@ -245,21 +269,21 @@ namespace CGAL {
/*!
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
of the iterator is `#Point`.
of the iterator is `Point`.
*/
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.
The value type of the iterator is `Vertex_on_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
@ -268,6 +292,7 @@ namespace CGAL {
typedef Advancing_front_surface_reconstruction<Dt,P> Extract;
typedef typename Triangulation_3::Geom_traits Geom_traits;
typedef typename Kernel::FT FT;
typedef typename Kernel::FT coord_type;
typedef typename Kernel::Point_3 Point;
@ -377,7 +402,23 @@ namespace CGAL {
std::list<Next_border_elt> nbe_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()
{
nbe_pool.resize(nbe_pool.size()+1);
@ -679,12 +720,14 @@ namespace CGAL {
++it;
}while(collinear(p,q,it->point()));
const Point& r = it->point();
Vector u = q-r;
Vector v = q-p;
Vector w = r-p;
Vector vw = cross_product(v,w);
double len = (std::max)(u*u,(std::max)(v*v,w*w));
Point s = p + 10* len * (vw/(vw*vw));
Vector u = construct_vector(r, q);
Vector v = construct_vector(p, q);
Vector w = construct_vector(p, r);
Vector vw = construct_cross_product(v,w);
double len = (std::max)(compute_scalar_product(u,u),
(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);
}
}
@ -736,9 +779,9 @@ namespace CGAL {
\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`.
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.
Described in Section \ref AFSR_Selection
Described in Section \ref AFSR_Selection.
*/
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`
*/
coord_type
FT
smallest_radius_delaunay_sphere(const Cell_handle& c,
const int& index) const
{
@ -1249,16 +1292,16 @@ namespace CGAL {
const Point& pp2 = cc->vertex(i2)->point();
const Point& pp3 = cc->vertex(i3)->point();
Sphere facet_sphere(pp1, pp2, pp3);
if (squared_distance(facet_sphere.center(), pp0) <
facet_sphere.squared_radius())
Sphere facet_sphere = T.geom_traits().construct_sphere_3_object()(pp1, pp2, pp3);
if (squared_distance(T.geom_traits().construct_center_3_object()(facet_sphere), pp0) <
T.geom_traits().compute_squared_radius_3_object()(facet_sphere))
{
#ifdef AFSR_LAZY
value = lazy_squared_radius(cc);
#else
// qualified with CGAL, to avoid a compilation error with clang
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 {
typedef Exact_predicates_exact_constructions_kernel EK;
Cartesian_converter<Kernel, EK> to_exact;
@ -1280,26 +1323,30 @@ namespace CGAL {
cc = lazy_circumcenter(c);
cn = lazy_circumcenter(n);
#else
cc = CGAL::circumcenter(cp0, cp1, cp2, cp3);
cn = CGAL::circumcenter(np0, np1, np2, np3);
cc = T.geom_traits().construct_circumcenter_3_object()(cp0, cp1, cp2, cp3);
cn = T.geom_traits().construct_circumcenter_3_object()(np0, np1, np2, np3);
#endif
// computation of the distance of cp1 to the dual segment cc, cn...
Vector V(cc - cn), Vc(cc - cp1), Vn(cp1 - cn);
coord_type ac(V * Vc), an(V * Vn), norm_V(V * V);
Vector V = construct_vector(cn, cc),
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))
{
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)){
// 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
{
if (ac <= 0)
value = squared_distance(cc, cp1);
value = T.geom_traits().compute_squared_distance_3_object()(cc, cp1);
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.
*/
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& 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 norm12 = P2P1*P2P1;
@ -1375,12 +1422,12 @@ namespace CGAL {
{
const Point& pn = neigh->vertex(n_i3)->point();
P2Pn = pn-p2;
v2 = cross_product(P2P1,P2Pn);
P2Pn = construct_vector(p2, pn);
v2 = construct_cross_product(P2P1,P2Pn);
//pas necessaire de normer pour un bon echantillon:
// on peut alors tester v1*v2 >= 0
norm = sqrt(norm1 * (v2*v2));
norm = sqrt(norm1 * compute_scalar_product(v2,v2));
pscal = v1*v2;
// check if the triangle will produce a sliver on the surface
bool sliver_facet = (pscal <= COS_ALPHA_SLIVER*norm);
@ -1394,10 +1441,9 @@ namespace CGAL {
// We skip triangles having an internal angle along e
// whose cosinus is smaller than -DELTA
// that is the angle is larger than arcos(-DELTA)
border_facet = !((P2P1*P2Pn >=
-DELTA*sqrt(norm12*(P2Pn*P2Pn)))&&
(P2P1*PnP1 >=
-DELTA*sqrt(norm12*(PnP1*PnP1))));
border_facet =
!((P2P1*P2Pn >= -DELTA*sqrt(norm12*compute_scalar_product(P2Pn,P2Pn))) &&
(P2P1*PnP1 >= -DELTA*sqrt(norm12*compute_scalar_product(PnP1,PnP1))));
// \todo investigate why we simply do not skip this triangle
// but continue looking for a better candidate
// if (!border_facet){
@ -1569,9 +1615,11 @@ namespace CGAL {
int n_i3 = (6 - n_ind - n_i1 - n_i2);
const Point& pn = neigh->vertex(n_i3)->point();
Vector v1 = cross_product(pc-p2,p1-p2),
v2 = cross_product(p1-p2,pn-p2);
coord_type norm = sqrt((v1*v1)*(v2*v2));
Vector v1 = construct_cross_product(construct_vector(p2, pc),
construct_vector(p2, p1)),
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)
return 1; // label bonne pliure sinon:
@ -2487,9 +2535,9 @@ namespace CGAL {
\param out output iterator
\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`.
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.
Described in Section \ref AFSR_Selection
Described in Section \ref AFSR_Selection.
*/
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`.
\tparam IndicesOutputIterator must be an output iterator to which
`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)`.
\param b iterator on the first point of the sequence

View File

@ -21,9 +21,9 @@ Modular_arithmetic
Number_types
Polygon
Polyhedron
Polyhedron_IO
Profiling_tools
Property_map
Random_numbers
STL_Extension
Spatial_sorting
Stream_support

View File

@ -22,7 +22,7 @@ namespace CGAL {
\ingroup PkgAlgebraicFoundationsRef
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,
`compare` is performed with the semantic of the type determined via

View File

@ -14,7 +14,7 @@
/*! \file CGAL/Algebraic_extension_traits.h
* \brief Defines traits class CGAL::Algebraic_extension_traits.
* \brief defines traits class CGAL::Algebraic_extension_traits.
*/
#ifndef CGAL_ALGEBRAIC_NUMBER_TRAITS_H

View File

@ -13,7 +13,7 @@
// =============================================================================
/*! \file NiX/Coercion_traits.h
* \brief Defines class NiX::Coercion_traits.
* \brief defines class NiX::Coercion_traits.
*
* Provides the general definition of the \c Coercion_traits<A,B> class, with
* specializations for the builtin number types.

View File

@ -17,7 +17,7 @@
// they may be wrong now.
/*! \file NiX/Fraction_traits.h
\brief Defines class NiX::Fraction_traits.
\brief defines class NiX::Fraction_traits.
Provides dependent types and function objects for all the functions
beyond operators with specializations of the \c Fraction_traits<NT>

View File

@ -27,7 +27,7 @@ namespace CGAL {
class Parens_as_product_tag {};
/*! \ingroup NiX_io_parens
* \brief Decides whether this number requires parentheses
* \brief decides whether this number requires parentheses
* in case it appears within a produkt.
*/
template <class NT>
@ -36,7 +36,7 @@ struct Needs_parens_as_product{
};
/*! \ingroup NiX_io_parens
* \brief Decides whether this number requires parentheses
* \brief decides whether this number requires parentheses
* in case it appears within a produkt.
*/
template <class NT>

View File

@ -302,13 +302,13 @@ to_interval( const Real_embeddable& x) {
}
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)));
}
template <typename NT>
NT approximate_sqrt(const NT& nt, CGAL::Field_with_sqrt_tag)
template <typename NT, typename Sqrt>
NT approximate_sqrt(const NT& nt, Sqrt sqrt)
{
return sqrt(nt);
}
@ -316,9 +316,12 @@ NT approximate_sqrt(const NT& nt, CGAL::Field_with_sqrt_tag)
template <typename 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 typename AST::Algebraic_category Algebraic_category;
return approximate_sqrt(nt, Algebraic_category());
typedef typename AST::Sqrt Sqrt;
return approximate_sqrt(nt, Sqrt());
}
CGAL_NTS_END_NAMESPACE

View File

@ -5,23 +5,15 @@ find_package(CGAL REQUIRED COMPONENTS Core)
find_package(MPFI QUIET)
if(MPFI_FOUND)
if(MPFI_FOUND AND NOT CGAL_DISABLE_GMP)
include(${CGAL_USE_FILE})
include(${MPFI_USE_FILE})
include(CGAL_VersionUtils)
create_single_source_cgal_program("Compare_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("Sign_at_1.cpp")
create_single_source_cgal_program("Solve_1.cpp")
else()
message(
STATUS
"This program requires the CGAL library and MPFI, and will not be compiled."
)
message(STATUS "This program requires the CGAL, CGAL_Core and MPFI libraries, and will not be compiled.")
endif()

View File

@ -180,13 +180,13 @@ public:
}
}
/*! \brief Refines the isolating interval. */
/*! \brief refines the isolating interval. */
void refine() const{ this->ptr()->refine(); }
/*! \brief Bisects the isolating interval. */
void bisect() const{ this->ptr()->bisect(); }
/*! \brief Refines the isolating interval until \a m is outside
/*! \brief refines the isolating interval until \a m is outside
* the \c closed interval
*/
template < class NTX >

View File

@ -375,7 +375,7 @@ public:
}
/*!
* \brief Gives an opportunity to process the nodes after
* \brief gives an opportunity to process the nodes after
* the subdivision steps are finished
*
* This method must be specialised by derived classes, but can
@ -386,7 +386,7 @@ public:
return;
}
/*! \brief Returns whether the \c i th root is definitely a simple root
/*! \brief returns whether the \c i th root is definitely a simple root
* of the isolated polynomial
*
* Must be specialised by derived class
@ -396,7 +396,7 @@ public:
return false;
}
/*! \brief Returns whether the \c i th root is definitely a multiple root
/*! \brief returns whether the \c i th root is definitely a multiple root
* of the isolated polynomial
*
* Must be specialised by derived class
@ -1040,7 +1040,7 @@ public:
}
/*! \brief Returns whether the \c i th root is definitely a simple root
/*! \brief returns whether the \c i th root is definitely a simple root
* of the isolated polynomial
*
*/
@ -1048,7 +1048,7 @@ public:
return false;
}
/*! \brief Returns whether the \c i th root is definitely
/*! \brief returns whether the \c i th root is definitely
* a multiple root
* of the isolated polynomial
*
@ -1372,7 +1372,7 @@ public:
bool is_exact_root(int) const { return false; }
/*!
* \brief Returns true if the <tt>i</tt>th root is known to be a simple
* \brief returns true if the <tt>i</tt>th root is known to be a simple
* root of the curve.
*/
bool is_certainly_simple_root(int i) const {
@ -1381,7 +1381,7 @@ public:
}
/*!
* \brief Returns true if the <tt>i</tt>th root is known to be a multiple
* \brief returns true if the <tt>i</tt>th root is known to be a multiple
* root of the curve.
*/
bool is_certainly_multiple_root(int i) const {
@ -1391,7 +1391,7 @@ public:
/*!
* \brief Returns the multiplicity of the root if know, otherwise -1
* \brief returns the multiplicity of the root if know, otherwise -1
*/
int multiplicity_of_root(int i) const {
CGAL_assertion(is_isolated());
@ -1407,7 +1407,7 @@ public:
}
/*!
* \brief Returns the isolator of the polynomial f(1/x + q), if known
* \brief returns the isolator of the polynomial f(1/x + q), if known
*/
Self inverse_transform_isolator() const {
return this->ptr()->inverse_transform_isolator();

View File

@ -707,13 +707,13 @@ public:
this->ptr()->node_list_.erase(n);
}
/*! \brief Replace traits class
/*! \brief replaces traits class
*/
void set_traits(TRAITS& traits) {
this->ptr()->b_from_p_.set_traits(traits);
}
/*! \brief Returns a copy of this with its own representation
/*! \brief returns a copy of this with its own representation
*/
Self make_unique() const {
Self tmp = *this;

View File

@ -1079,7 +1079,7 @@ public:
this->ptr()->node_list_.erase(n);
}
/*! \brief Replace traits class
/*! \brief replaces traits class
*/
void set_traits(TRAITS& traits) {
@ -1090,7 +1090,7 @@ public:
}
/*! \brief Returns a copy of this with its own representation
/*! \brief returns a copy of this with its own representation
*/
Self make_unique() const {
Self tmp = *this;

View File

@ -512,7 +512,7 @@ public:
private:
/*
* \brief Sets all status lines at events and of intervals
* \brief sets all status lines at events and of intervals
*
* Writes the status lines of events and interval into the object.
* The value type of both \c InputIterator1 and \c InputIterator2
@ -571,7 +571,7 @@ private:
public:
/*! \brief Returns whether the curve has a valid defining polynomial
/*! \brief returns whether the curve has a valid defining polynomial
*/
bool has_defining_polynomial() const {
return bool(this->ptr()->f);
@ -579,7 +579,7 @@ public:
public:
/*! \brief Sets the defining polynomial.
/*! \brief sets the defining polynomial.
*
* \pre The object has no defining polynomial yet.
*/
@ -595,7 +595,7 @@ public:
public:
/*!
* \brief Returns whether the curve is y-regular
* \brief returns whether the curve is y-regular
*
* A curve is called y-regular if the leading coefficient of its defining
* polynomial wrt y is a constant, i.e., contains no x
@ -646,7 +646,7 @@ public:
public:
/*!
* \brief Returns the number of event lines of the curve
* \brief returns the number of event lines of the curve
*
* Algebraically, the number of real roots of the discriminant of
* the curve's defining equation is returned.
@ -664,7 +664,7 @@ public:
public:
/*!
* \brief Returns whether the given x-coordinate is critical for the curve
* \brief returns whether the given x-coordinate is critical for the curve
* and which event or interval index the x-coordinate belongs to.
*
* \param is_event is set to \c true if the curve has an event
@ -734,7 +734,7 @@ public:
private:
/*
* \brief Returns a status line for an exact value \c alpha that
* \brief returns a status line for an exact value \c alpha that
* is not an event of the curve
*
* This function controls the internal cache that stores already created
@ -1167,7 +1167,7 @@ private:
public:
/*!
* \brief Returns the status line for the interval
* \brief returns the status line for the interval
* preceeding the <tt>i</tt>th event
*
* Returns a status line for a reference x-coordinate of the <tt>i</tt>th
@ -1235,7 +1235,7 @@ public:
private:
/*
* \brief Creates an intermediate line at position \c ar.
* \brief creates an intermediate line at position \c ar.
*
* It is required that none of the following situations occurs at position
* <tt>ar</tt>: singularity, vertical tangent line, vertical asymptote.\n
@ -1279,7 +1279,7 @@ private:
private:
/*
* \brief Returns an Event_line_builder instance
* \brief returns an Event_line_builder instance
*
* Note: So far, a new instance is created each time the function is called
*/
@ -1444,7 +1444,7 @@ private:
public:
/*!
* \brief Returns the <tt>i</tt>th Sturm-Habicht polynomial
* \brief returns the <tt>i</tt>th Sturm-Habicht polynomial
* of the primitive part of the defining polynomial
*/
Polynomial_2 sturm_habicht_of_primitive(size_type i) const
@ -1458,7 +1458,7 @@ public:
public:
/*!
* \brief Returns the <tt>i</tt>th principal Sturm-Habicht coefficient
* \brief returns the <tt>i</tt>th principal Sturm-Habicht coefficient
* of the primitive part of the defining polynomial
*/
Polynomial_1 principal_sturm_habicht_of_primitive(size_type i) const
@ -1477,7 +1477,7 @@ public:
public:
/*!
* \brief Returns the <tt>i</tt>th coprincipal Sturm-Habicht coefficient
* \brief returns the <tt>i</tt>th coprincipal Sturm-Habicht coefficient
* of the primitive part of the defining polynomial
*
* The coprincipal Sturm-Habicht coefficient is the coefficient
@ -1498,7 +1498,7 @@ public:
public:
/*!
* \brief Returns an iterator to the principal Sturm-Habicht coefficients,
* \brief returns an iterator to the principal Sturm-Habicht coefficients,
* starting with the <tt>0</tt>th one (the resultant)
*/
Principal_sturm_habicht_iterator principal_sturm_habicht_begin() const {
@ -1930,7 +1930,7 @@ private:
public:
/*!
* \brief Returns a \c Curve_analysis_2 object for a sheared curve.
* \brief returns a \c Curve_analysis_2 object for a sheared curve.
*
* The shear factor is given by the integer \c s.
* This functions only shears the primitive part of the defining equation.
@ -2007,7 +2007,7 @@ public:
*
* For each status line at an event and each status line that represents
* 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) {
@ -2082,7 +2082,7 @@ public:
public:
/*!
* \brief Returns the limit an infinite arc converges to
* \brief returns the limit an infinite arc converges to
*
* \pre <tt>loc==CGAL::LEFT_BOUNDARY ||
* loc==CGAL::RIGHT_BOUNDARY</tt>
@ -2399,7 +2399,7 @@ private:
}; // class Algebraic_curve_2_2
//! \brief Prints the objects.
//! \brief prints the objects.
template<typename AlgebraicKernelWithAnalysis_2,
typename Rep_>
std::ostream& operator<< (
@ -2507,7 +2507,7 @@ std::ostream& operator<< (
return out;
}
//! \brief Reads the objects from stream
//! \brief reads the objects from stream
template<typename AlgebraicKernelWithAnalysis_2,
typename Rep_>
std::istream& operator>> (

View File

@ -611,7 +611,7 @@ public:
public:
/*
* \brief Returns the indices of the <tt>i</tt>th event value
* \brief returns the indices of the <tt>i</tt>th event value
*
* Returns a Event_indices <tt>(fg,ffy,ggy)</tt> such that
* the <tt>i</tt>th event root is the <tt>fg</tt>th root of the
@ -963,7 +963,7 @@ public:
}
/*!
* \brief Returns the number of event slices
* \brief returns the number of event slices
*
* Precisely, this is the number of points which are either root of
* the resultant of the two curves, or root of discriminant of one
@ -1171,7 +1171,7 @@ private:
Integer s) const;
/*
* \brief Reduces the number of possible intersections
* \brief reduces the number of possible intersections
*
* At the position given by the event lins \c e1 and \c e2 and the slice
* info object \c slice, the points on the event lines are further refined
@ -1197,7 +1197,7 @@ private:
}; // end of Curve_pair_analysis_2
//! \brief Prints the objects.
//! \brief prints the objects.
template<typename AlgebraicKernelWithAnalysis_2>
std::ostream& operator<<
(std::ostream& out,

View File

@ -16,7 +16,7 @@
// they may be wrong now.
/*! \file NiX/Descartes.h
\brief Defines class NiX::Descartes.
\brief defines class NiX::Descartes.
Isolate real roots of polynomials.

View File

@ -114,7 +114,7 @@ public:
/*!
* \brief Creates an event line at position \c alpha for the specified
* \brief creates an event line at position \c alpha for the specified
* curve.
*
* Additionally, the \c id of the event line to be created has to be

View File

@ -95,7 +95,7 @@ set_union_with_source(InputIterator1 first_begin,
}
/*
* \brief Removes the leading term of the polynomial \c f as long as it
* \brief removes the leading term of the polynomial \c f as long as it
* vanishes at \c alpha
*
*/
@ -169,7 +169,7 @@ template<typename AlgebraicKernel_1> typename AlgebraicKernel_1::Bound
/*!
* \brief Produces intermediate rational values for a list of
* \brief produces intermediate rational values for a list of
* algebraic reals.
*
* For a list of Algebraic real values with \c n elements, a list with

View File

@ -36,7 +36,7 @@ namespace CGAL {
namespace internal {
/*! \brief Tries to find a SIMPLE rational q with a<q<b.
/*! \brief tries to find a SIMPLE rational q with a<q<b.
*
* In this context, simple means that the denominator of <tt>q</tt>
* is a power of two, and is not too big. There is no guarantee to find

View File

@ -31,7 +31,7 @@ namespace internal {
} // namespace internal
/*!
* \brief Represents different strategies how to handle
* \brief represents different strategies how to handle
* degenerate cases during the analysis
*
* Currently, there are two possible strategies implemented. See the

View File

@ -34,32 +34,36 @@ include(${CGAL_USE_FILE})
# ##########################################################
create_single_source_cgal_program("cyclic.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_kernel_d_1_LEDA.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_tools.cpp")
create_single_source_cgal_program("Algebraic_kernel_d_1_LEDA.cpp")
create_single_source_cgal_program(
create_single_source_cgal_program(
"Algebraic_kernel_d_1_CORE_Integer_rational.cpp")
create_single_source_cgal_program(
create_single_source_cgal_program(
"Algebraic_kernel_d_1_CORE_SqrtII_rational.cpp")
create_single_source_cgal_program(
create_single_source_cgal_program(
"Algebraic_kernel_d_1_CORE_SqrtRI_rational.cpp")
create_single_source_cgal_program(
create_single_source_cgal_program(
"Algebraic_kernel_d_1_CORE_SqrtRR_rational.cpp")
create_single_source_cgal_program("Algebraic_kernel_d_1_GMP.cpp")
create_single_source_cgal_program("Algebraic_kernel_d_2.cpp")
create_single_source_cgal_program("Algebraic_real_d_1.cpp")
create_single_source_cgal_program("Bitstream_descartes.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("Descartes.cpp")
create_single_source_cgal_program("Real_embeddable_traits_extension.cpp")
if(RS_FOUND)
create_single_source_cgal_program("Algebraic_kernel_d_1_GMP.cpp")
create_single_source_cgal_program("Algebraic_kernel_d_2.cpp")
create_single_source_cgal_program("Algebraic_real_d_1.cpp")
create_single_source_cgal_program("Bitstream_descartes.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("Real_embeddable_traits_extension.cpp")
if(RS_FOUND)
create_single_source_cgal_program("Algebraic_kernel_rs_gmpq_d_1.cpp")
create_single_source_cgal_program("Algebraic_kernel_rs_gmpz_d_1.cpp")
else()
else()
message(
STATUS
"NOTICE: Some tests require the RS library, and will not be compiled.")
endif()
else()
message(STATUS "NOTICE: Some tests require the CGAL_Core library, and will not be compiled.")
endif()

View File

@ -30,19 +30,19 @@ namespace CGAL {
template <typename RT>
Comparison_result
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>
Comparison_result
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>
Comparison_result
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>

View File

@ -134,9 +134,8 @@ All \cgal kernels are models of both concepts.
The triangulation data structure of the triangulation
has to be a model of the concept `TriangulationDataStructure_2`,
and it must be parameterized with
vertex and face classes which are models of the concepts
`AlphaShapeVertex_2` and `AlphaShapeFace_2`.
whose vertex and face classes are models of the concepts
`AlphaShapeVertex_2` and `AlphaShapeFace_2`, respectively.
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,
provided that the template parameters `Vb` and `Fb` are appropriately chosen,

View File

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

View File

@ -45,7 +45,7 @@ typedef unspecified_type FT;
/*!
A default constructor.
*/
AlphaShapeTraits_2();
WeightedAlphaShapeTraits_2();
/// @}

View File

@ -70,12 +70,12 @@ finite number of different \f$ \alpha\f$-shapes and corresponding
\cgalCRPSection{Concepts}
- `AlphaShapeTraits_2`
- `WeightedAlphaShapeTraits_2`
- `AlphaShapeFace_2`
- `AlphaShapeVertex_2`
\cgalCRPSection{Classes}
- `CGAL::Alpha_shape_2<Dt>`
- `CGAL::Weighted_alpha_shape_euclidean_traits_2<K>`
- `CGAL::Alpha_shape_vertex_base_2<AlphaShapeTraits_2>`
- `CGAL::Alpha_shape_face_base_2<AlphaShapeTraits_2, TriangulationFaceBase_2>`

View File

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

View File

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

View File

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

View File

@ -5,18 +5,16 @@
#include <CGAL/Qt/resources.h>
#include <CGAL/Qt/init_ogl_context.h>
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.setOrganizationName("GeometryFactory");
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).
// See https://doc.qt.io/qt-5/qdir.html#Q_INIT_RESOURCE

View File

@ -18,7 +18,7 @@ endif()
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)

View File

@ -29,14 +29,14 @@ void Viewer::compile_shaders()
//Vertex source code
const char vertex_source[] =
{
"#version 120 \n"
"attribute highp vec4 vertex;\n"
"attribute highp vec3 normal;\n"
"#version 150 \n"
"in highp vec4 vertex;\n"
"in highp vec3 normal;\n"
"uniform highp mat4 mvp_matrix;\n"
"uniform highp mat4 mv_matrix; \n"
"varying highp vec4 fP; \n"
"varying highp vec3 fN; \n"
"out highp vec4 fP; \n"
"out highp vec3 fN; \n"
"void main(void)\n"
"{\n"
" fP = mv_matrix * vertex; \n"
@ -47,15 +47,16 @@ void Viewer::compile_shaders()
//Fragment source code
const char fragment_source[] =
{
"#version 120 \n"
"varying highp vec4 fP; \n"
"varying highp vec3 fN; \n"
"#version 150 \n"
"in highp vec4 fP; \n"
"in highp vec3 fN; \n"
"uniform highp vec4 color; \n"
"uniform highp vec4 light_pos; \n"
"uniform highp vec4 light_diff; \n"
"uniform highp vec4 light_spec; \n"
"uniform highp vec4 light_amb; \n"
"uniform float spec_power ; \n"
"out highp vec4 out_color; \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 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"
};
@ -105,8 +106,8 @@ rendering_program.bind();
//Vertex source code
const char vertex_source_points[] =
{
"#version 120 \n"
"attribute highp vec4 vertex;\n"
"#version 150 \n"
"in highp vec4 vertex;\n"
"uniform highp mat4 mvp_matrix;\n"
"uniform highp float point_size;\n"
@ -119,11 +120,12 @@ const char vertex_source_points[] =
//Vertex source code
const char fragment_source_points[] =
{
"#version 120 \n"
"#version 150 \n"
"uniform highp vec4 color; \n"
"out highp vec4 out_color; \n"
"void main(void) { \n"
"gl_FragColor = color; \n"
"out_color = color; \n"
"} \n"
"\n"
};

View File

@ -21,6 +21,7 @@ public:
Viewer(QWidget* parent);
~Viewer()
{
makeCurrent();
buffers[0].destroy();
buffers[1].destroy();
buffers[2].destroy();

View File

@ -192,6 +192,10 @@ the vertices, edges, facets and cells of the different types
(`EXTERIOR`, `SINGULAR`, `REGULAR` or
`INTERIOR`).
\subsection AlphaShape3DIO Input/Output
It is possible to export a 3D alpha shape to a `std::ostream` or to a `Geomview_stream`
using the `operator<<`, see the documentation of the class `Alpha_shape_3` for more information.
\section AlphaShape3D_ConceptAndModels Concepts and Models
We currently do not specify concepts for the underlying triangulation
@ -215,8 +219,8 @@ in the non-weighted case and `WeightedAlphaShapeTraits_3` in the weighted case.
All \cgal kernels are models of both concepts.
The triangulation data structure of the triangulation
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
has to be a model of the concept `TriangulationDataStructure_3`
whose vertex and cell classes are model of the concepts
`AlphaShapeVertex_3` and `AlphaShapeCell_3`.
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,
@ -230,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.
All \cgal kernels are models of both concepts.
The triangulation data structure of the triangulation
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
has to be a model of the concept `TriangulationDataStructure_3`
whose vertex and cell classes are model of the concepts
`FixedAlphaShapeVertex_3` and `FixedAlphaShapeCell_3`.
The package provides models `Fixed_alpha_shape_vertex_base_3<Gt>`
and `Fixed_alpha_shape_cell_base_3<Gt>`, respectively.

View File

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

View File

@ -5,21 +5,23 @@
// Max-Planck-Institute Saarbruecken (Germany),
// and Tel-Aviv University (Israel). All rights reserved.
//
// This file is part of CGAL (www.cgal.org)
// This file is part of CGAL (www.cgal.org).
//
// $URL$
// $Id$
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
//
// Author(s) : Andreas Fabri
#ifndef CGAL_ALPHA_SHAPE_3_VRML_2_OSTREAM_H
#define CGAL_ALPHA_SHAPE_3_VRML_2_OSTREAM_H
#include <CGAL/basic.h>
#include <CGAL/IO/VRML_2_ostream.h>
#include <CGAL/license/Alpha_shapes_3.h>
#include <CGAL/Alpha_shape_3.h>
#include <CGAL/IO/VRML/VRML_2_ostream.h>
#include <CGAL/number_utils.h>
#ifdef CGAL_ALPHA_SHAPE_3_H
namespace CGAL {
template <class Dt >
@ -90,6 +92,5 @@ operator<<(VRML_2_ostream& os,
}
} //namespace CGAL
#endif // CGAL_ALPHA_SHAPE_3_H
#endif CGAL_ALPHA_SHAPE_3_VRML_2_OSTREAM_H
#endif // CGAL_ALPHA_SHAPE_3_VRML_2_OSTREAM_H

View File

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

View File

@ -4,7 +4,6 @@ Arithmetic_kernel
Cartesian_kernel
Circulator
Filtered_kernel
Geomview
Hash_map
Homogeneous_kernel
Installation

View File

@ -181,7 +181,7 @@ two visible circles.
The 2D Apollonius graph class
`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:
<UL>
<LI>the <B>geometric traits</B> class. It provides the basic

View File

@ -4,14 +4,20 @@ namespace CGAL {
/*!
\ingroup PkgApolloniusGraph2Ref
The class `Apollonius_graph_2` represents the
Apollonius graph. 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`,
which must be a model of `ApolloniusGraphDataStructure_2`.
The second template argument defaults to
`CGAL::Triangulation_data_structure_2< CGAL::Apollonius_graph_vertex_base_2<Gt,true>, CGAL::Triangulation_face_base_2<Gt> >`.
\cgalModels `DelaunayGraph_2`
The class `Apollonius_graph_2` represents the Apollonius graph.
It supports insertions and deletions of sites.
\tparam Gt is the geometric traits class and must be a model of `ApolloniusGraphTraits_2`.
\tparam Agds is the Apollonius graph data structure and must be a model of `ApolloniusGraphDataStructure_2`
whose vertex and face must be models of `ApolloniusGraphVertexBase_2` and `TriangulationFaceBase_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}
@ -40,17 +46,11 @@ ag.incident_edges(ag.infinite_vertex());
ag.incident_edges(ag.infinite_vertex(), f);
\endcode
\sa `DelaunayGraph_2`
\sa `ApolloniusGraphTraits_2`
\sa `ApolloniusGraphDataStructure_2`
\sa `ApolloniusGraphVertexBase_2`
\sa `TriangulationFaceBase_2`
\cgalModels `DelaunayGraph_2`
\sa `CGAL::Apollonius_graph_traits_2<K,Method_tag>`
\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_vertex_base_2<Gt,StoreHidden>`
\sa `CGAL::Triangulation_face_base_2<Gt>`
\sa `CGAL::Apollonius_graph_hierarchy_2<Gt,Agds>`
*/
template< typename Gt, typename Agds >
class Apollonius_graph_2 {
@ -92,7 +92,7 @@ typedef Gt::Site_2 Site_2;
/// \name Handles And Iterators
/// 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
/// circulators and iterators are assignable 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.
*/
Geom_traits geom_traits();
const Geom_traits& geom_traits() const;
/*!
Returns a reference to the
underlying data structure.
*/
Data_structure data_structure();
const Data_structure& data_structure() const;
/*!
Same as `data_structure()`. This
method has been added in compliance with the `DelaunayGraph_2`
concept.
*/
Data_structure tds();
const Data_structure& tds() const;
/*!
Returns the dimension of the Apollonius graph.
*/
int dimension();
int dimension() const;
/*!
Returns the number of finite vertices.
*/
size_type number_of_vertices();
size_type number_of_vertices() const;
/*!
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.
*/
size_type number_of_hidden_sites();
size_type number_of_hidden_sites() const;
/*!
Returns the number of faces (both finite and infinite) of the
Apollonius graph.
*/
size_type number_of_faces();
size_type number_of_faces() const;
/*!
Returns a face incident to the `infinite_vertex`.
*/
Face_handle infinite_face();
Face_handle infinite_face() const;
/*!
Returns the `infinite_vertex`.
*/
Vertex_handle
infinite_vertex();
Vertex_handle infinite_vertex() const;
/*!
Returns a vertex distinct from the `infinite_vertex`.
\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.
*/
Finite_vertices_iterator finite_vertices_begin();
Finite_vertices_iterator finite_vertices_begin() const;
/*!
Past-the-end iterator.
*/
Finite_vertices_iterator finite_vertices_end();
Finite_vertices_iterator finite_vertices_end() const;
/*!
Starts at an arbitrary finite edge.
*/
Finite_edges_iterator finite_edges_begin();
Finite_edges_iterator finite_edges_begin() const;
/*!
Past-the-end iterator.
*/
Finite_edges_iterator finite_edges_end();
Finite_edges_iterator finite_edges_end() const;
/*!
Starts at an arbitrary finite face.
*/
Finite_faces_iterator finite_faces_begin();
Finite_faces_iterator finite_faces_begin() const;
/*!
Past-the-end iterator.
*/
Finite_faces_iterator finite_faces_end()
const;
Finite_faces_iterator finite_faces_end() const;
/*!
Starts at an arbitrary vertex.
*/
All_vertices_iterator all_vertices_begin();
All_vertices_iterator all_vertices_begin() const;
/*!
Past-the-end iterator.
*/
All_vertices_iterator all_vertices_end();
All_vertices_iterator all_vertices_end() const;
/*!
Starts at an arbitrary edge.
*/
All_edges_iterator all_edges_begin();
All_edges_iterator all_edges_begin() const;
/*!
Past-the-end iterator.
*/
All_edges_iterator all_edges_end();
All_edges_iterator all_edges_end() const;
/*!
Starts at an arbitrary face.
*/
All_faces_iterator all_faces_begin();
All_faces_iterator all_faces_begin() const;
/*!
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.
*/
Sites_iterator sites_begin();
Sites_iterator sites_begin() const;
/*!
Past-the-end iterator.
*/
Sites_iterator sites_end();
Sites_iterator sites_end() const;
/*!
Starts at an arbitrary visible site.
*/
Visible_sites_iterator visible_sites_begin();
Visible_sites_iterator visible_sites_begin() const;
/*!
Past-the-end iterator.
*/
Visible_sites_iterator visible_sites_end();
Visible_sites_iterator visible_sites_end() const;
/*!
Starts at an arbitrary hidden site.
*/
Hidden_sites_iterator hidden_sites_begin();
Hidden_sites_iterator hidden_sites_begin() const;
/*!
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
to `v`.
*/
Face_circulator incident_faces(Vertex_handle v);
Face_circulator incident_faces(Vertex_handle v) const;
/*!
Starts at face `f`.
\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
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
`v`, in counterclockwise order around `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
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`
in counterclockwise order around `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.
*/
bool
is_infinite(Edge e) const;
is_infinite(const Edge& e) const;
/*!
`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(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
@ -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
returned.
*/
Vertex_handle insert(Site_2 s, Vertex_handle
vnear);
Vertex_handle insert(const Site_2& s, Vertex_handle 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
`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
@ -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
`Vertex_handle(nullptr)` is returned.
*/
Vertex_handle nearest_neighbor(Point_2 p,
Vertex_handle vnear);
Vertex_handle nearest_neighbor(const Point_2& p, Vertex_handle vnear) const;
/// @}
@ -645,7 +641,7 @@ the stream `str`.
*/
template< class Stream >
Stream& draw_primal(Stream& str);
Stream& draw_primal(Stream& str) const;
/*!
Draws the dual of the
@ -658,7 +654,7 @@ Apollonius graph, i.e., the Apollonius diagram, to the stream
*/
template < class Stream >
Stream& draw_dual(Stream& str);
Stream& draw_dual(Stream& str) const;
/*!
Draws the edge
@ -669,7 +665,7 @@ Draws the edge
*/
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
@ -682,7 +678,7 @@ of the Apollonius diagram.
*/
template< class Stream >
Stream& draw_dual_edge(Edge e, Stream& str);
Stream& draw_dual_edge(const Edge& e, Stream& str) const;
/*!
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
underlying combinatorial data structure.
*/
void file_output(std::ostream& os);
void file_output(std::ostream& os) const;
/*!
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.
*/
std::ostream& operator<<(std::ostream& os,
Apollonius_graph_2<Gt,Agds> ag);
std::ostream& operator<<(std::ostream& os, const Apollonius_graph_2<Gt,Agds>& ag) const;
/*!
Reads the state of the Apollonius graph from an input stream.
*/
std::istream& operator>>(std::istream& is,
Apollonius_graph_2<Gt,Agds> ag);
std::istream& operator>>(std::istream& is, const 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
both the data structure and the Apollonius graph are
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
`other` and `ag` are swapped. `ag`.`swap(other)` should
be preferred to `ag`` = other` or to `ag``(other)` if
`other` and `ag` are swapped. `ag.swap(other)` should
be preferred to `ag = other` or to `ag(other)` if
`other` is deleted afterwards.
*/
void swap(Apollonius_graph_2<Gt,Agds>
other);
void swap(Apollonius_graph_2<Gt,Agds>& other);
/// @}

View File

@ -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
neighbor at level \f$ i\f$. This is a variant of the corresponding
hierarchy for points found in \cgalCite{d-iirdt-98}.
The class has two template parameters which have essentially the same
meaning as in the `Apollonius_graph_2<Gt,Agds>` class. The first
template parameter must be a model of the
`ApolloniusGraphTraits_2` concept.
The second template parameter must be a model of the
`ApolloniusGraphDataStructure_2` concept. However, the vertex base
class that is to be used in the Apollonius graph data structure must
be a model of the `ApolloniusGraphHierarchyVertexBase_2` concept.
The second template parameter defaults to
`Triangulation_data_structure_2< Apollonius_graph_hierarchy_vertex_base_2< Apollonius_graph_vertex_base_2<Gt,true> >, Triangulation_face_base_2<Gt> >`.
meaning as in the `Apollonius_graph_2<Gt,Agds>` class.
\tparam Gt is the geometric traits class and must be a model of `ApolloniusGraphTraits_2`.
\tparam Agds is the Apollonius graph data structure and must be a model of `ApolloniusGraphDataStructure_2`
whose vertex and face must be models of `ApolloniusGraphHierarchyVertexBase_2` and `TriangulationFaceBase_2`, respectively.
It defaults to:
\code
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
`Apollonius_graph_2<Gt,Agds>` class. The interface is
the same with its base class. In the sequel only the methods
overridden are documented.
\cgalHeading{Types}
`Apollonius_graph_hierarchy_2` does not introduce other types than those introduced by
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::Triangulation_data_structure_2<Vb,Fb>`
\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_hierarchy_vertex_base_2<Agvb>`
*/
template< typename Gt, typename 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
geometric traits.
*/
Apollonius_graph_hierarchy_2(Gt
gt=Gt());
Apollonius_graph_hierarchy_2(Gt gt=Gt());
/*!
Creates an Apollonius graph hierarchy using
@ -70,17 +67,15 @@ Creates an Apollonius graph hierarchy using
range [`first`, `beyond`).
*/
template< class Input_iterator >
Apollonius_graph_hierarchy_2<Gt,Agds>(Input_iterator
first, Input_iterator beyond, Gt gt=Gt());
Apollonius_graph_hierarchy_2(Input_iterator 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
to two different Apollonius graph hierarchies: if
`other` is modified, `agh` is not.
*/
Apollonius_graph_hierarchy_2<Gt,Agds>
(Apollonius_graph_hierarchy_2<Gt,Agds> other);
Apollonius_graph_hierarchy_2(const Apollonius_graph_hierarchy_2<Gt,Agds>& other);
/*!
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
`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
@ -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
`Apollonius_graph_2<Gt,Agds>` class.
*/
Vertex_handle insert(Site_2 s, Vertex_handle
vnear);
Vertex_handle insert(const Site_2& s, Vertex_handle 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
`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
@ -163,8 +157,7 @@ A call to this method is equivalent to
conformity with the interface of the
`Apollonius_graph_2<Gt,Agds>` class.
*/
Vertex_handle nearest_neighbor(Point p,
Vertex_handle vnear);
Vertex_handle nearest_neighbor(const Point_2& p, Vertex_handle vnear) const;
/// @}
@ -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
underlying combinatorial hierarchical data structure.
*/
void file_output(std::ostream& os);
void file_output(std::ostream& os) const;
/*!
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
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.
@ -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
pointers are validated and all levels of the Apollonius graph
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.
*/
bool is_valid(bool verbose = false, int level = 1) const;
@ -227,11 +220,10 @@ void clear();
/*!
The Apollonius graph hierarchies `other` and `agh` are
swapped. `agh`.`swap(other)` should be preferred to `agh`` =
other` or to `agh``(other)` if `other` is deleted afterwards.
swapped. `agh.swap(other)` should be preferred to `agh = other`
or to `agh(other)` if `other` is deleted afterwards.
*/
void swap(Apollonius_graph_hierarchy_2<Gt,Agds>
other);
void swap(Apollonius_graph_hierarchy_2<Gt,Agds>& other);
/// @}

View File

@ -13,10 +13,9 @@ of the `ApolloniusGraphVertexBase_2` concept.
\cgalModels `ApolloniusGraphHierarchyVertexBase_2`
\sa `ApolloniusGraphVertexBase_2`
\sa `ApolloniusGraphHierarchyVertexBase_2`
\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 >
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
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
@ -42,7 +41,7 @@ the site `s`, embedded at the center of `s`,
and pointing to the face associated with the face
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);
/// @}

View File

@ -22,13 +22,8 @@ The way the predicates are evaluated is discussed in
\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_filtered_traits_2<CK,CM,EK,EM,FK,FM>`
*/
template< typename K, typename Method_tag >
class Apollonius_graph_traits_2 {
@ -45,14 +40,13 @@ Apollonius_graph_traits_2<K,Method_tag>();
/*!
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.
*/
Apollonius_graph_traits_2<K,Method_tag>
operator=(Apollonius_graph_traits_2<K,Method_tag>
other);
operator=(const Apollonius_graph_traits_2<K,Method_tag>& other);
/// @}

View File

@ -19,13 +19,8 @@ discarded. By default `StoreHidden` is set to `true`.
\cgalModels `ApolloniusGraphVertexBase_2`
\sa `ApolloniusGraphVertexBase_2`
\sa `ApolloniusGraphDataStructure_2`
\sa `ApolloniusGraphTraits_2`
\sa `CGAL::Triangulation_data_structure_2<Vb,Fb>`
\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_hierarchy_vertex_base_2<Gt>`
*/
template< typename Gt, typename StoreHidden >
class Apollonius_graph_vertex_base_2 {
@ -37,13 +32,13 @@ public:
/*!
%Default constructor.
*/
Apollonius_graph_bertex_base_2();
Apollonius_graph_vertex_base_2();
/*!
Constructs a vertex associated with the site `s` and
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
@ -51,7 +46,7 @@ the site `s`, embedded at the center of `s`,
and pointing to the face associated with the face
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);
/// @}

View File

@ -22,12 +22,9 @@ The I/O operators are defined for `iostream`.
The information output in the `iostream` is: the point of the
Apollonius site and its weight.
\sa `Kernel`
\sa `ApolloniusSite_2`
\sa `CGAL::Qt_widget`
\sa `CGAL::Apollonius_graph_traits_2<K,Method_tag>`
\sa `CGAL::Apollonius_graph_filtered_traits_2<CK,CM,EK,EM,FK,FM>`
*/
template< typename K >
class Apollonius_site_2 {
@ -44,7 +41,7 @@ Apollonius_site_2(Point_2 p=Point_2(), Weight w= Weight(0));
/*!
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`.
\relates Apollonius_site_2
*/
std::ostream& operator<<(std::ostream& os,
const Apollonius_site_2<K>& s);
std::ostream& operator<<(std::ostream& os, const Apollonius_site_2<K>& s) const;
/*!
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`.
\relates Apollonius_site_2
*/
std::istream& operator>>(std::istream& is,
const Apollonius_site_2<K>& s);
std::istream& operator>>(std::istream& is, const Apollonius_site_2<K>& s);
/*!
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`.
\relates Apollonius_site_2
*/
Qt_widget& operator<<(Qt_widget& w,
const Apollonius_site_2<K>& s);
Qt_widget& operator<<(Qt_widget& w, const Apollonius_site_2<K>& s) const;
} /* end namespace CGAL */

View File

@ -42,10 +42,10 @@ public:
/// @{
/*!
Inserts
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
`i` is duplicated. It returns a handle to the vertex created.
inserts 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 `i` is duplicated. It returns a handle
to the vertex created.
*/
Vertex_handle insert_degree_2(Face_handle f, int i);

View File

@ -19,17 +19,12 @@ next and previous level graphs.
`ApolloniusGraphHierarchyVertexBase_2` does not introduce any
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 `ApolloniusGraphVertexBase_2`
\sa `CGAL::Apollonius_graph_hierarchy_2<Gt,Agds>`
\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 {
public:
@ -37,8 +32,7 @@ public:
/// @{
/*!
Default
constructor.
%Default constructor.
*/
ApolloniusGraphHierarchyVertexBase_2();

View File

@ -3,8 +3,6 @@
\ingroup PkgApolloniusGraph2Concepts
\cgalConcept
\cgalRefines `TriangulationVertexBase_2`
The concept `ApolloniusGraphVertexBase_2` describes the
requirements for the vertex base class of the
`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
sites. The container stores the hidden sites related to the vertex.
\cgalRefines `TriangulationVertexBase_2`
\cgalHasModel `CGAL::Apollonius_graph_vertex_base_2<Gt,StoreHidden>`
\sa `ApolloniusGraphDataStructure_2`
\sa `ApolloniusGraphTraits_2`
\sa `CGAL::Apollonius_graph_vertex_base_2<Gt,StoreHidden>`
\sa `CGAL::Apollonius_graph_2<Gt,Agds>`
\sa `CGAL::Triangulation_data_structure_2<Vb,Fb>`
*/
class ApolloniusGraphVertexBase_2 {
public:
@ -77,7 +75,7 @@ typedef unspecified_type Hidden_sites_iterator;
/// @{
/*!
Default constructor.
%Default constructor.
*/
ApolloniusGraphVertexBase_2();

View File

@ -43,18 +43,18 @@ aforementioned concepts.
\cgalCRPSection{Concepts}
- `ApolloniusSite_2`
- `ApolloniusGraphTraits_2`
- `ApolloniusGraphDataStructure_2`
- `ApolloniusGraphVertexBase_2`
- `ApolloniusGraphTraits_2`
- `ApolloniusGraphHierarchyVertexBase_2`
\cgalCRPSection{Classes}
- `CGAL::Apollonius_graph_2<Gt,Agds>`
- `CGAL::Apollonius_site_2<K>`
- `CGAL::Apollonius_graph_vertex_base_2<Gt,StoreHidden>`
- `CGAL::Apollonius_graph_traits_2<K,Method_tag>`
- `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_vertex_base_2<Agvb>`

View File

@ -10,7 +10,7 @@
// Author(s) : Oren Salzman <orenzalz@post.tau.ac.il >
// Michael Hemmer <Michael.Hemmer@sophia.inria.fr>
//TODO: somehow use the fact the the x-value is the same in all comparisons
//TODO: somehow use the fact the x-value is the same in all comparisons
#ifndef CGAL_ARR_VERTICAL_SEGMENT_TRAITS
#define CGAL_ARR_VERTICAL_SEGMENT_TRAITS

View File

@ -3,9 +3,6 @@
cmake_minimum_required(VERSION 3.1...3.15)
project(Arrangement_on_surface_2_Demo)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
if(NOT POLICY CMP0070 AND POLICY CMP0053)
# Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning.
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)
include_directories( BEFORE ./ )
# Arrangement package includes
add_definitions(-DQT_NO_KEYWORDS)
option(COMPILE_UTILS_INCREMENTALLY
"Compile files in Utils directory incrementally, or compile them all as a unit. \
Incremental compilation will be better for development and consume less \

View File

@ -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
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
<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
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
the \f$ xy\f$-lexicographically smaller (left) endpoint of the curve toward
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
interior (or no holes at all). In addition, every face may contain
isolated vertices in its interior. See \cgalFigureRef{arr_figseg_dcel}
for an illustration of the various \sc{Dcel} features. For more details
on the \sc{Dcel} data structure see \cgalCite{bkos-cgaa-00} Chapter 2.
for an illustration of the various \dcel features. For more details
on the \dcel data structure see \cgalCite{bkos-cgaa-00} Chapter 2.
\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
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
that allows external classes to keep track of the changes that an
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.
In Section \ref arr_secoverlay we introduce the fundamental
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,
traverse them, and maintain them. An arrangement is defined by
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.
It supplies a minimal set of geometric operations (predicates and
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
that is a model of the `ArrangementDcel` concept. The value of this
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
examples.
</UL>
@ -212,7 +212,7 @@ The simplest and most fundamental arrangement operations are the
various traversal methods, which allow users to systematically go
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,
the `Arrangement_2` class supplies iterators for these
containers. For example, the methods `vertices_begin()` and
@ -486,7 +486,7 @@ for more details and examples.
\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
@ -1349,7 +1349,7 @@ construct it from scratch. (ii) We have to insert \f$ m\f$ input curves
to a non-empty arrangement `arr`.
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
\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
@ -1567,7 +1567,7 @@ exists. This implied that collinearity indeed exists as explained above.
\cgalAdvancedBegin
\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
@ -1580,7 +1580,7 @@ finite curve endpoints and intersection points between curves in
straightforward to compute the arrangement induced by this set.
However, we would like to operate directly on the unbounded curves
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
that subdivide the plane into eight unbounded faces and two bounded
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
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,
vertical lines, and curves with vertical asymptotes are represented
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
by the decorators and distributed to the constructed geometric entities.
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.
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}
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
data on-line. See Section \ref arr_secex_dcel for more details
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
decorator, as explained in Section \ref arr_ssecmeta_tr, which may
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.
Extending the \sc{Dcel} face records comes handy is such cases. As a matter
of fact, it is possible to conveniently extend all \sc{Dcel} records
Extending the \dcel face records comes handy is such cases. As a matter
of fact, it is possible to conveniently extend all \dcel records
(namely vertices, halfedges and faces), which can also be advantageous
for some applications.
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
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.
In this section we show how to use alternative \sc{Dcel} types to extend the
desired \sc{Dcel} records.
In this section we show how to use alternative \dcel types to extend the
desired \dcel records.
\subsection arr_ssecex_dcel_face Extending the DCEL Faces
The `Arr_face_extended_dcel<Traits, FaceData>` class-template
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
\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
functions it is straightforward to access and maintain the auxiliary
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>`
class-template is used to associate auxiliary data fields of
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
\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()`
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
with a color, which may be blue, red, or white, depending on whether the
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}
\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.
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
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
Reference Manual.
\cgalAdvancedEnd
@ -3197,16 +3197,16 @@ types nested in geometry traits `Traits_R`. The same holds for all
types nested in geometry traits `Traits_B`.
The `ovl_traits` parameter is
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.
In principle, we distinguish between three levels of overlay:
<DL>
<DT><B>Simple overlay:</B><DD>
An overlay of two arrangements that store no additional data
with their \sc{Dcel} records. That is, they are defined using the default
\sc{Dcel} class `Arr_default_dcel`. Typically, the overlaid
arrangement in this case stores no extra data with its \sc{Dcel} records as
with their \dcel records. That is, they are defined using the default
\dcel class `Arr_default_dcel`. Typically, the overlaid
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
the overlay operation), so by overlaying the two arrangement we just
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
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
traits-class is parameterized by a functor that is capable of combining two
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.
<DT><B>Full overlay:</B><DD>
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
Section \ref arr_ssecex_dcel_all), where the resulting arrangement
also extends it \sc{Dcel} records with data fields computed on the basis
of the overlapping \sc{Dcel} features of the two input arrangements.
also extends it \dcel records with data fields computed on the basis
of the overlapping \dcel features of the two input arrangements.
</DL>
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
The following example shows how to compute the intersection of two polygons
using the `overlay()` function. It uses a face-extended \sc{Dcel} class
to define our arrangement class. The \sc{Dcel} extends each face with a Boolean
using the `overlay()` function. It uses a face-extended \dcel class
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 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.
@ -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
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
\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
some applications. However, in many practical cases it is important to
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).
That is, it should define the `Curve_2` type (and not just the
`X_monotone_curve_2` type). The `Dcel` parameter should model the
`ArrangementDcel` concept. Users can use the default \sc{Dcel} class or
an extended \sc{Dcel} class according to their needs.
`ArrangementDcel` concept. Users can use the default \dcel class or
an extended \dcel class according to their needs.
\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
automatically preserve the cross-mapping between the arrangement edges
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).
\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.
However, as explained in Section \ref arr_secex_dcel, one can easily
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
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
arrangement extractor, as defined above.
<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
Section \ref arr_ssecex_dcel_face). It supports reading and writing
the auxiliary data objects stored with the arrangement faces provided
that the `FaceData` class supports an inserter and an extractor.
<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
(see Section \ref arr_ssecex_dcel_all). It supports reading and writing
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
provision of a set of free functions that operate on the arrangement features
and conform with the relevant BGL concepts. Besides the straightforward
adaptation, which associates a vertex with each \sc{Dcel} vertex and an edge
with each \sc{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
connected, iff there is a \sc{Dcel} halfedge that connects the two corresponding
adaptation, which associates a vertex with each \dcel vertex and an edge
with each \dcel halfedge, the package also offer a <I>dual</I> adaptor, which
associates a graph vertex with each \dcel face, such that two vertices are
connected, iff there is a \dcel halfedge that connects the two corresponding
faces.
\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
example `bgl_primal_adapter.cpp` (see \cgalFigureRef{arr_figex_bgl}),
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
using `boost` visitors and a property-map class that directly accesses
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
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`).
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
hardly involve any geometric operations, if at all. They accept
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.
A polygon, represented by a list of segments along its boundary, can

View File

@ -408,7 +408,7 @@ namespace CGAL {
size_type number_of_subcurves() const;
/*! 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.
*/
typename SubcurveTraits_2::X_monotone_curve_2

View File

@ -79,7 +79,7 @@ typedef unspecified_type Split_2;
/// \name
/// \attention The two following function-object types are
/// optional. If they are supported, the `Has_merge_category` tag
/// should be defined as `Tag_true` (and `Tag_false` otherwise.
/// should be defined as `Tag_true` and otherwise as `Tag_false`.
/// @{
/*!
@ -114,8 +114,8 @@ Split_2 split_2_object() const;
/// \name
/// The two following methods are optional. If they are supported, the
/// `Has_merge_category` tag should be defined as `Tag_true` (and
/// `Tag_false` otherwise.
/// `Has_merge_category` tag should be defined as `Tag_true` and otherwise
/// as `Tag_false`.
/// @{
/*!

View File

@ -61,7 +61,7 @@ int main()
// but not for this instance
for(size_t i = 0; i < pre_segs.size(); ++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);
}
// Construct an ellipse with equation 2*x^2+5*y^2-7=0

View File

@ -159,11 +159,11 @@ namespace CGAL {
{ return CK_Equal_2()(a0, a1); }
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; }
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; }
result_type

View File

@ -479,7 +479,18 @@ public:
const Inner_ccb* inner_ccb() const
{
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).
@ -488,11 +499,28 @@ public:
Inner_ccb* 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. */
void set_inner_ccb(Inner_ccb *ic)
void set_inner_ccb(const Inner_ccb *ic)
{
// Set the component pointer and set its LSB.
this->p_comp = _set_lsb(ic);
@ -769,57 +797,111 @@ public:
typedef typename Face::Inner_ccb_iterator Inner_ccb_iterator;
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.
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:
/*! 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. */
Arr_inner_ccb(const Arr_inner_ccb& other) :
p_f(other.p_f), iter_is_not_singular(other.iter_is_not_singular)
{ if (other.iter_is_not_singular) iter = other.iter; }
f_or_icc(other.f_or_icc), status(other.status)
{ if (other.status == ITER_IS_NOT_SINGULAR) iter = other.iter; }
/*! 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). */
Halfedge* halfedge() { return (*iter); }
Halfedge* halfedge()
{
CGAL_assertion (is_valid());
return (*iter);
}
/*! 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). */
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). */
Face* face() { return (p_f); }
Face* face()
{
CGAL_assertion (status != INVALID);
return f_or_icc.f;
}
/*! 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). */
Inner_ccb_iterator iterator() const
{
CGAL_assertion(iter_is_not_singular);
CGAL_assertion(status == ITER_IS_NOT_SINGULAR);
return (iter);
}
/*! Get the iterator (non-const version). */
Inner_ccb_iterator iterator()
{
CGAL_assertion(iter_is_not_singular);
CGAL_assertion(status == ITER_IS_NOT_SINGULAR);
return (iter);
}
/*! Set the inner CCB iterator. */
void set_iterator(Inner_ccb_iterator it)
{
CGAL_assertion (is_valid());
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
@ -943,6 +1025,7 @@ public:
typedef typename Face_list::iterator Face_iterator;
typedef CGAL::N_step_adaptor_derived<Halfedge_iterator, 2>
Edge_iterator;
typedef typename Inner_ccb_list::iterator Inner_ccb_iterator;
// Definitions of const iterators.
typedef typename Vertex_list::const_iterator Vertex_const_iterator;
@ -1019,6 +1102,9 @@ public:
{
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.

View File

@ -1068,7 +1068,7 @@ public:
* LARGER - x(xcv1, ce) > x(xcv2, ce).
* \pre the ce end of the arc xcv1 lies on a pole.
* \pre the ce end of the arc xcv2 lies on a pole.
* \pre the the $x$-coordinates of xcv1 and xcv2 at their ce end are
* \pre the $x$-coordinates of xcv1 and xcv2 at their ce end are
* equal (implying that the curves overlap).
* \pre xcv1 does not coincide with the vertical identification curve.
* \pre xcv2 does not coincide with the vertical identification curve.

View File

@ -751,7 +751,7 @@ public:
}
/*!
* Compare the the two points xy-lexicographically.
* Compare the two points xy-lexicographically.
* \param pt The other point.
* \param cache A cache for the vertical tangency points and the
* intersection points.

View File

@ -1139,7 +1139,7 @@ public:
* that xcv1 is vertical.
* \pre the ce end of the line xcv2 lies on a boundary, implying
* that xcv2 is vertical.
* \pre the the $x$-coordinates of xcv1 and xcv2 at their ce ends are
* \pre the $x$-coordinates of xcv1 and xcv2 at their ce ends are
* equal, implying that the curves overlap!
*/
Comparison_result

View File

@ -168,7 +168,7 @@ overlay(const Arrangement_on_surface_2<GeometryTraitsA_2, TopologyTraitsA>& arr1
typedef Arrangement_on_surface_2<Rgt2, Rtt> Arr_res;
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)
typedef typename Agt2::Point_2 A_point;
typedef typename Bgt2::Point_2 B_point;

View File

@ -1488,7 +1488,7 @@ Trapezoidal_decomposition_2<Td_traits>::insert(Halfedge_const_handle he)
// if the edge starts at a vertex, we should not insert it into the DAG.
// Instead, we should update all the edges incident to the vertex.
// Otherwise, this is a new vertex, insert a node to the DAG that represents
// the new vertex. In this case, the the edge itself is the only incident
// the new vertex. In this case, the edge itself is the only incident
// edge, and so it is a trivial operation.
Td_map_item p1_item = (lt1 == POINT) ?
update_vtx_with_new_edge(he, ce1, item1, lt1) :

View File

@ -781,7 +781,7 @@ public:
}
}
// Check if the the left endpoint lies on the other polycurve.
// Check if the left endpoint lies on the other polycurve.
bool left_coincides = (left_res == EQUAL);
bool left_overlap = false;

View File

@ -423,7 +423,7 @@ compare_y_at_x(const Point_2& p, const Halfedge* he) const
return m_geom_traits->compare_y_at_x_2_object()(p, he->curve());
}
/*! \brief determine whether a vertex is associated with a curve end */
/*! \brief determines whether a vertex is associated with a curve end */
template <typename GeomTraits, typename Dcel>
bool Arr_spherical_topology_traits_2<GeomTraits, Dcel>::
are_equal(const Vertex* v,
@ -812,7 +812,7 @@ _locate_around_pole(Vertex* v,
return nullptr;
}
/*! \brief Return the face that lies below the given vertex, which lies
/*! \brief returns the face that lies below the given vertex, which lies
* on the line of discontinuity.
*/
template <typename GeomTraits, typename Dcel>

View File

@ -669,7 +669,7 @@ public:
/*! Operate
* \param xcv1 the first curve
* \param xcv2 the second curve
* \return true if the the two curve are mergeable and false otherwise.
* \return true if the two curve are mergeable and false otherwise.
* Two curves are mergeable if they have the same underlying theoretical
* curve
*/

View File

@ -2741,14 +2741,24 @@ _insert_at_vertices(DHalfedge* he_to,
he1->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.
DHalfedge* curr;
for (curr = he2->next(); curr != he1; curr = curr->next())
curr->set_inner_ccb(ic1);
// Delete the redundant inner CCB.
_dcel().delete_inner_ccb(ic2);
}
// Notify the observers that we have merged the two inner CCBs.
_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
// - 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 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
// Note that we compare the vertices lexicographically: first by the
// indices, then by x, then by y.

View File

@ -1513,7 +1513,7 @@ bool Arrangement_zone_2<Arrangement, ZoneVisitor>::_zone_in_overlap()
// In this case m_overlap_cv has a finite right endpoint. In this case,
// if the right vertex of m_intersect_he is associated with a finite point,
// we check whether it is equal to cv_right_pt. Otherwise, we know that
// m_intersect_he extends to the the right of m_overlap_cv, and there is no
// m_intersect_he extends to the right of m_overlap_cv, and there is no
// vertex currently associated with m_overlap_cv's right endpoint.
if (! he_right_v->is_at_open_boundary() &&
equal(cv_right_pt, he_right_v->point()))

View File

@ -911,6 +911,14 @@ protected:
bool m_own_traits; // inidicates whether the geometry
// 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:
/// \name Constructors.
//@{
@ -941,6 +949,9 @@ public:
/*! Destructor. */
virtual ~Arrangement_on_surface_2();
/*! Change mode. */
void set_sweep_mode (bool mode) { m_sweep_mode = mode; }
/*! Clear the arrangement. */
virtual void clear();
//@}
@ -1485,7 +1496,7 @@ public:
* \pre cv1's source and cv2's target equal the endpoints of the curve
* currently assoicated with e (respectively), and cv1's target equals
* cv2's target, and this is the split point (ot vice versa).
* \return A handle for the halfedge whose source is the source of the the
* \return A handle for the halfedge whose source is the source of the
* original halfedge e, and whose target is the split point.
*/
Halfedge_handle split_edge(Halfedge_handle e,
@ -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:
/// \name Determining the boundary-side conditions.
//@{

View File

@ -557,7 +557,7 @@ public:
* \param e The edge to split (one of the pair of twin halfedges).
* \param p The split point.
* \pre p lies in the interior of the curve associated with e.
* \return A handle for the halfedge whose source is the source of the the
* \return A handle for the halfedge whose source is the source of the
* original halfedge e, and whose target is the split point.
*/
Halfedge_handle split_edge (Halfedge_handle e, const Point_2& p);

View File

@ -14,7 +14,7 @@
#define CGAL_CURVED_KERNEL_VIA_ANALYSIS_2_ARC_2_H
/*!\file include/CGAL/Curved_kernel_via_analysis_2/Arc_2.h
*\brief Defines class \c Arc_2 that represents an arc on a curve that
*\brief defines class \c Arc_2 that represents an arc on a curve that
* can be analyzed.
*/
@ -2695,9 +2695,9 @@ protected:
* if arcs' x-ranges overlap; otherwise returns \c false
*
* \param cv2 The second arc
* \param pt_low Output: Point indicating the lower bound of the the joint
* \param pt_low Output: Point indicating the lower bound of the joint
* x-range
* \param pt_high Output: Point indicating the upper bound of the the joint
* \param pt_high Output: Point indicating the upper bound of the joint
* x-range
* \return \c true, if arcs overlap, \c false otherwise
*
@ -3364,7 +3364,7 @@ std::ostream& operator<<(
}
//! \brief Reads the objects from stream.
//! \brief reads the objects from stream.
template < class CurvedKernelViaAnalysis_2, class Rep_ >
std::istream& operator>> (
std::istream& is,

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