Merge branch 'master' into pr/lrineau/8273

This commit is contained in:
Laurent Rineau 2025-02-07 16:10:52 +01:00
commit 8eefb7f173
485 changed files with 3783 additions and 7047 deletions

View File

@ -0,0 +1,55 @@
# Use an official Fedora as a parent image for the build stage
FROM fedora:latest AS sources_deps
# Set environment variables to non-interactive
ENV DEBIAN_FRONTEND=noninteractive
# Install dependencies
RUN dnf update -y && dnf install -y \
wget \
make \
gcc \
gcc-c++ \
patch \
cmake \
bison \
flex \
unzip \
python3 \
&& dnf clean all
# Copy the patch file to the build context
COPY cgal-NO_ADDITIONAL_DETAILS.patch .
FROM sources_deps AS build
# Build and install Doxygen from sources
ARG DOXYGEN_VERSION=1.9.6
ARG MAKEFLAGS=-j$(nproc)
RUN if [ -n "$DEBUG"];then set -x && make --version && ls -lZ /tmp && id; fi \
&& DOXYGEN_VERSION_UNDERSCORE=$(echo ${DOXYGEN_VERSION} | sed 's/\./_/g') \
&& wget https://github.com/doxygen/doxygen/archive/refs/tags/Release_${DOXYGEN_VERSION_UNDERSCORE}.zip \
&& unzip Release_${DOXYGEN_VERSION_UNDERSCORE}.zip \
&& cd doxygen-Release_${DOXYGEN_VERSION_UNDERSCORE} \
&& patch -p1 < ../cgal-NO_ADDITIONAL_DETAILS.patch \
&& mkdir build \
&& cd build \
&& cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release .. \
&& cmake --build . \
&& cmake --install . \
&& mkdir -p /usr/local/share/doc/doxygen && cp ../LICENSE /usr/local/share/doc/doxygen/LICENSE.TXT \
&& cd ../.. \
&& rm -rf doxygen-Release_${DOXYGEN_VERSION_UNDERSCORE} Release_${DOXYGEN_VERSION_UNDERSCORE}.zip
# Use a smaller base image for the final stage
FROM fedora:latest
# Install necessary runtime dependencies
RUN set -x \
&& dnf update -y && dnf install -y graphviz 'perl(Getopt::Std)' tex-bibtex cmake python3-lxml python3-pyquery \
&& dnf clean all
# Copy Doxygen from the build stage
COPY --from=build /usr/local/bin/doxygen /usr/local/bin
COPY --from=build /usr/local/share/doc/doxygen/LICENSE.TXT /usr/local/share/doc/doxygen/LICENSE.TXT
RUN doxygen --version

View File

@ -0,0 +1,23 @@
SHELL := /bin/bash
DOXYGEN_VERSIONS := 1.12.0 1.11.0 1.10.0 1.9.8 1.9.7 1.9.6
.PHONY: all build-% push-% build push
all: build
@echo "Use `$(MAKE) push` to push the images to the registry."
build-%:
@echo "MAKEFLAGS: $(MAKEFLAGS)"
@echo "Building Doxygen version $*..."
if [ "$$(getenforce || true)" == "Enforcing" ]; then Z=:z; else Z=; fi; \
F="$(MAKEFLAGS)"; F=$${F##*fifo:}; F=$${F%% *}; \
if [ -p "$$F" ]; then echo "The GNU make FIFO file exists:"; ls -l $$F; VOLUME_ARGS="-v $$F:$$F$$Z"; echo -- $$VOLUME_ARGS; fi; \
podman build --build-arg DOXYGEN_VERSION=$* --build-arg "MAKEFLAGS=$(MAKEFLAGS)" $$VOLUME_ARGS -t cgal/doxygen:$* .
push-%: build-%
@echo "Pushing cgal/doxygen:$*..."
podman push cgal/doxygen:$*
build: $(foreach version,$(DOXYGEN_VERSIONS),build-$(version))
push: $(foreach version,$(DOXYGEN_VERSIONS),push-$(version))

View File

@ -0,0 +1,44 @@
diff --git a/src/config.xml b/src/config.xml
index 13910958a6..31f1354e44 100644
--- a/src/config.xml
+++ b/src/config.xml
@@ -893,6 +893,18 @@ Go to the <a href="commands.html">next</a> section or return to the
\note This will also disable the warnings about undocumented members
that are normally produced when \ref cfg_warnings "WARNINGS" is
set to \c YES.
+]]>
+ </docs>
+ </option>
+ </group>
+ <group name='Build' docs='Build related configuration options'>
+ <option type='bool' id='NO_ADDITIONAL_DETAILS' defval='0'>
+ <docs>
+<![CDATA[
+ When the \c EXTRACT_ALL tag is set to \c YES and a member or class
+ as no documentation, no detailed section will be produced if
+ the \c NO_ADDITIONAL_DETAILS tag is set to \c YES.
+ This tag has no effect if the \c EXTRACT_ALL tag is set to \c NO.
]]>
</docs>
</option>
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index 08d9bf24c5..ab04e994c5 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -2501,6 +2501,7 @@ bool MemberDefImpl::hasDetailedDescription() const
if (!m_hasDetailedDescriptionCached)
{
bool extractAll = Config_getBool(EXTRACT_ALL);
+ bool xAllNoDetailedSec = Config_getBool(NO_ADDITIONAL_DETAILS);
bool alwaysDetailedSec = Config_getBool(ALWAYS_DETAILED_SEC);
bool repeatBrief = Config_getBool(REPEAT_BRIEF);
bool briefMemberDesc = Config_getBool(BRIEF_MEMBER_DESC);
@@ -2512,7 +2513,7 @@ bool MemberDefImpl::hasDetailedDescription() const
// the member has detailed documentation because the user added some comments
bool docFilter =
// extract all is enabled
- extractAll ||
+ (extractAll && !xAllNoDetailedSec) ||
// has detailed docs
!documentation().isEmpty() ||
// has inbody docs

View File

@ -0,0 +1,16 @@
{
"name": "CGAL Doxygen Dev Container, version 1.12.0, with CGAL patch",
"image": "docker.io/cgal/doxygen:1.12.0",
"features": {
"ghcr.io/devcontainers/features/git:1.3.2": {}
},
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cmake-tools",
"bbenoist.Doxygen",
"ms-vscode.cpptools"
]
}
},
}

View File

@ -0,0 +1,29 @@
[distrobox-doxygen-1.12.0]
image=cgal/doxygen:1.12.0
exported_bins="/usr/local/bin/doxygen /usr/bin/perl /usr/bin/cmake /usr/bin/python3"
exported_bins_path=$HOME/.local/bin-doxygen-1.12.0
[distrobox-doxygen-1.11.0]
image=cgal/doxygen:1.11.0
exported_bins="/usr/local/bin/doxygen /usr/bin/perl /usr/bin/cmake /usr/bin/python3"
exported_bins_path=$HOME/.local/bin-doxygen-1.11.0
[distrobox-doxygen-1.10.0]
image=cgal/doxygen:1.10.0
exported_bins="/usr/local/bin/doxygen /usr/bin/perl /usr/bin/cmake /usr/bin/python3"
exported_bins_path=$HOME/.local/bin-doxygen-1.10.0
[distrobox-doxygen-1.9.8]
image=cgal/doxygen:1.9.8
exported_bins="/usr/local/bin/doxygen /usr/bin/perl /usr/bin/cmake /usr/bin/python3"
exported_bins_path=$HOME/.local/bin-doxygen-1.9.8
[distrobox-doxygen-1.9.7]
image=cgal/doxygen:1.9.7
exported_bins="/usr/local/bin/doxygen /usr/bin/perl /usr/bin/cmake /usr/bin/python3"
exported_bins_path=$HOME/.local/bin-doxygen-1.9.7
[distrobox-doxygen-1.9.6]
image=cgal/doxygen:1.9.6
exported_bins="/usr/local/bin/doxygen /usr/bin/perl /usr/bin/cmake /usr/bin/python3"
exported_bins_path=$HOME/.local/bin-doxygen-1.9.6

3
.gitattributes vendored
View File

@ -44,11 +44,9 @@ Documentation/Doxyfile text eol=lf
Documentation/pkglist_filter text eol=lf
Installation/update_CHANGES text eol=lf
Scripts/developer_scripts/autotest_cgal text eol=lf
Scripts/developer_scripts/autotest_cgal_with_cmake text eol=lf
Scripts/developer_scripts/cgal_build text eol=lf
Scripts/developer_scripts/cgal_depend text eol=lf
Scripts/developer_scripts/cgal_git_update_hooks_for_client text eol=lf
Scripts/developer_scripts/cgal_test_with_cmake text eol=lf
Scripts/developer_scripts/cgal2gml text eol=lf
Scripts/developer_scripts/check_library_uses_no_gpl_files text eol=lf
Scripts/developer_scripts/check_licenses text eol=lf
@ -56,7 +54,6 @@ Scripts/developer_scripts/check_macro_names text eol=lf
Scripts/developer_scripts/check_no_CGAL_USE_without_includes_before text eol=lf
Scripts/developer_scripts/check_svn_keywords text eol=lf
Scripts/developer_scripts/create_cgal_test text eol=lf
Scripts/developer_scripts/create_cgal_test_with_cmake text eol=lf
Scripts/developer_scripts/create_internal_release text eol=lf
Scripts/developer_scripts/create_new_release text eol=lf
Scripts/developer_scripts/detect_files_with_mixed_eol_styles text eol=lf

58
.gitignore vendored
View File

@ -8,7 +8,6 @@ AABB_tree/demo/AABB_tree/Makefile
AABB_tree/examples/AABB_tree/*.kdev*
AABB_tree/examples/AABB_tree/*_example
AABB_tree/examples/AABB_tree/Makefile
AABB_tree/examples/AABB_tree/cgal_test_with_cmake
AABB_tree/test/AABB_tree/*.kdev*
AABB_tree/test/AABB_tree/Makefile
AABB_tree/test/AABB_tree/aabb_correctness_triangle_test
@ -18,17 +17,14 @@ AABB_tree/test/AABB_tree/aabb_distance_triangle_test
AABB_tree/test/AABB_tree/aabb_intersection_triangle_test
AABB_tree/test/AABB_tree/aabb_naive_vs_tree_distance_segment_test
AABB_tree/test/AABB_tree/aabb_projection_triangle_test
AABB_tree/test/AABB_tree/cgal_test_with_cmake
Algebraic_foundations/test/Algebraic_foundations/Algebraic_extension_traits
Algebraic_foundations/test/Algebraic_foundations/Algebraic_structure_traits
Algebraic_foundations/test/Algebraic_foundations/Chinese_remainder_traits
Algebraic_foundations/test/Algebraic_foundations/Coercion_traits
Algebraic_foundations/test/Algebraic_foundations/Real_embeddable_traits
Algebraic_foundations/test/Algebraic_foundations/Scalar_factor_traits
Algebraic_foundations/test/Algebraic_foundations/cgal_test_with_cmake
Algebraic_foundations/test/Algebraic_foundations/extended_euclidean_algorithm
Algebraic_foundations/test/Algebraic_foundations/ipower
Algebraic_kernel_d/test/Algebraic_kernel_d/cgal_test_with_cmake
Algebraic_kernel_d/test/Algebraic_kernel_d/rs_isolator
Alpha_shapes_2/demo/Alpha_shapes_2/Makefile
Alpha_shapes_2/demo/Alpha_shapes_2/alpha_shapes_2
@ -37,7 +33,6 @@ Alpha_shapes_2/examples/Alpha_shapes_2/alpha_shapes_2
Alpha_shapes_3/demo/Alpha_shapes_3/Makefile
Alpha_shapes_3/demo/Alpha_shapes_3/alpha_shapes_3
Alpha_shapes_3/demo/Alpha_shapes_3/weighted_alpha_shapes_3
Alpha_shapes_3/test/Alpha_shapes_3/cgal_test_with_cmake
Alpha_shapes_3/test/Alpha_shapes_3/test_alpha_shape_3
Alpha_shapes_3/test/Alpha_shapes_3/test_fixed_alpha_shape_3
Alpha_shapes_3/test/Alpha_shapes_3/test_weighted_alpha_shape_3
@ -60,7 +55,6 @@ Arrangement_on_surface_2/examples/Arrangement_on_surface_2/batched_point_locatio
Arrangement_on_surface_2/examples/Arrangement_on_surface_2/bgl_dual_adapter
Arrangement_on_surface_2/examples/Arrangement_on_surface_2/bgl_primal_adapter
Arrangement_on_surface_2/examples/Arrangement_on_surface_2/bounded_planar_vertical_decomposition
Arrangement_on_surface_2/examples/Arrangement_on_surface_2/cgal_test_with_cmake
Arrangement_on_surface_2/examples/Arrangement_on_surface_2/circles
Arrangement_on_surface_2/examples/Arrangement_on_surface_2/circular_arcs
Arrangement_on_surface_2/examples/Arrangement_on_surface_2/circular_line_arcs
@ -103,30 +97,24 @@ Arrangement_on_surface_2/examples/Arrangement_on_surface_2/unbounded_rational_fu
Arrangement_on_surface_2/examples/Arrangement_on_surface_2/vertical_ray_shooting
Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_point_location.cpp
BGL/examples/BGL_arrangement_2/Makefile
BGL/examples/BGL_arrangement_2/cgal_test_with_cmake
BGL/examples/BGL_arrangement_2/dual
BGL/examples/BGL_arrangement_2/primal
BGL/test/BGL/cgal_test_with_cmake
Boolean_set_operations_2/demo/Boolean_set_operations_2/Makefile
Boolean_set_operations_2/demo/Boolean_set_operations_2/boolean_operations_2
Box_intersection_d/test/Box_intersection_d/automated_test
Box_intersection_d/test/Box_intersection_d/benchmark.data
Box_intersection_d/test/Box_intersection_d/benchmark_box_intersection
Box_intersection_d/test/Box_intersection_d/box_grid
Box_intersection_d/test/Box_intersection_d/cgal_test_with_cmake
Box_intersection_d/test/Box_intersection_d/random_set_test
CGAL_ImageIO/demo/CGALimageIO/Makefile
CGAL_ImageIO/demo/CGALimageIO/cgal_test_with_cmake
CGAL_ImageIO/demo/CGALimageIO/image_to_vtk_viewer
CGAL_ImageIO/examples/CGALimageIO/Makefile
CGAL_ImageIO/examples/CGALimageIO/cgal_test_with_cmake
CGAL_ImageIO/examples/CGALimageIO/convert_raw_image_to_inr
CGAL_ImageIO/examples/CGALimageIO/makefile
CGAL_ImageIO/examples/CGALimageIO/test_imageio
CGAL_ImageIO/src/CGAL_ImageIO/Makefile
Circular_kernel_3/demo/Circular_kernel_3/Circular_kernel_3_demo
Circular_kernel_3/demo/Circular_kernel_3/Makefile
Circular_kernel_3/test/Circular_kernel_3/cgal_test_with_cmake
Circular_kernel_3/test/Circular_kernel_3/test_Exact_spherical_kernel
Circular_kernel_3/test/Circular_kernel_3/test_Lazy_Spherical_kernel
Circular_kernel_3/test/Circular_kernel_3/test_Lazy_spherical_kernel_basics
@ -137,7 +125,6 @@ Documentation/log/*.*
Documentation/output
Documentation/tags/*.*
Generator/examples/Generator/ball_d
Generator/examples/Generator/cgal_test_with_cmake
Generator/examples/Generator/cube_d
Generator/examples/Generator/grid_d
Generator/examples/Generator/random_convex_set
@ -149,7 +136,6 @@ Generator/examples/Generator/random_segments1
Generator/examples/Generator/random_segments2
Generator/examples/Generator/sphere_d
Generator/test/Generator/bug
Generator/test/Generator/cgal_test_with_cmake
Generator/test/Generator/random_poly_test
Generator/test/Generator/rcs_test
Generator/test/Generator/test_combination_enumerator
@ -178,7 +164,6 @@ GraphicsView/demo/Triangulation_2/Makefile
GraphicsView/demo/Triangulation_2/Regular_triangulation_2
GraphicsView/demo/Triangulation_2/qrc_*.cxx
GraphicsView/demo/Triangulation_2/ui_*.h
HalfedgeDS/test/HalfedgeDS/cgal_test_with_cmake
HalfedgeDS/test/HalfedgeDS/test_hds
HalfedgeDS/test/HalfedgeDS/test_hds_decorator
Inscribed_areas/test/Inscribed_areas/Makefile
@ -188,11 +173,8 @@ Installation/auxiliary/gdb/python/CGAL/printers.pyc
Installation/auxiliary/gdb/test
Installation/cmake/modules/*.tmp
Installation/test/Installation/cgal_test
/Installation/test/Installation/cgal_test_with_cmake
Installation/test/Installation/deprecation_warning
Interpolation/demo/Interpolation/cgal_test_with_cmake
Intersections_3/test/Intersections_3/bbox_other_do_intersect_test
Intersections_3/test/Intersections_3/cgal_test_with_cmake
Intersections_3/test/Intersections_3/circle_other
Intersections_3/test/Intersections_3/line_line
Intersections_3/test/Intersections_3/segment_segment
@ -206,7 +188,6 @@ Jet_fitting_3/examples/Jet_fitting_3/Single_estimation
Jet_fitting_3/examples/Jet_fitting_3/VC
Jet_fitting_3/test/Jet_fitting_3/Makefile
Jet_fitting_3/test/Jet_fitting_3/blind_1pt
/Jet_fitting_3/examples/Jet_fitting_3/cgal_test_with_cmake
/Jet_fitting_3/examples/Jet_fitting_3/data_ellipe0.003.off.4ogl.txt
Kernel_23/test/Kernel_23/Cartesian
Kernel_23/test/Kernel_23/Dimension
@ -220,7 +201,6 @@ Kernel_23/test/Kernel_23/Simple_cartesian
Kernel_23/test/Kernel_23/Simple_homogeneous
Kernel_23/test/Kernel_23/Test_IO.out
/Kernel_23/test/Kernel_23/Test-*IO.out
Kernel_23/test/Kernel_23/cgal_test_with_cmake
Kernel_23/test/Kernel_23/test_kernel__
Kinetic_data_structures/demo/Kinetic_data_structures/Delaunay_triangulation_2
Kinetic_data_structures/demo/Kinetic_data_structures/Delaunay_triangulation_stable_subset_2
@ -229,13 +209,11 @@ Kinetic_data_structures/demo/Kinetic_data_structures/KDS_Delaunay_triangulation_
Kinetic_data_structures/demo/Kinetic_data_structures/KDS_generate_data
Kinetic_data_structures/demo/Kinetic_data_structures/KDS_gui_2
Kinetic_data_structures/demo/Kinetic_data_structures/Makefile
Kinetic_data_structures/demo/Kinetic_data_structures/cgal_test_with_cmake
Kinetic_data_structures/demo/Kinetic_data_structures/generate_data
Kinetic_data_structures/demo/Kinetic_data_structures/gui_2
Kinetic_data_structures/test/Kinetic_data_structures/Delaunay_triangulation_2
Kinetic_data_structures/test/Kinetic_data_structures/Delaunay_triangulation_3
Kinetic_data_structures/test/Kinetic_data_structures/active_objects_tables
Kinetic_data_structures/test/Kinetic_data_structures/cgal_test_with_cmake
Kinetic_data_structures/test/Kinetic_data_structures/exact_kds
Kinetic_data_structures/test/Kinetic_data_structures/instantaneous_kernel
Kinetic_data_structures/test/Kinetic_data_structures/numbers
@ -248,8 +226,6 @@ Kinetic_data_structures/test/Kinetic_data_structures/test_KDS_Delaunay_triangula
Kinetic_data_structures/test/Kinetic_data_structures/timings
Linear_cell_complex/demo/Linear_cell_complex/Linear_cell_complex_3.qrc.depends
Linear_cell_complex/demo/Linear_cell_complex/Linear_cell_complex_3_demo
Linear_cell_complex/demo/Linear_cell_complex/cgal_test_with_cmake
Linear_cell_complex/examples/Linear_cell_complex/cgal_test_with_cmake
Linear_cell_complex/examples/Linear_cell_complex/linear_cell_complex_3
Linear_cell_complex/examples/Linear_cell_complex/linear_cell_complex_3_triangulation
Linear_cell_complex/examples/Linear_cell_complex/linear_cell_complex_3_with_colored_vertices
@ -297,7 +273,6 @@ Mesh_2/demo/Mesh_2/*.core
Mesh_2/demo/Mesh_2/*.moc
Mesh_2/demo/Mesh_2/.*.deps
Mesh_2/demo/Mesh_2/Makefile
Mesh_2/demo/Mesh_2/cgal_test_with_cmake
Mesh_2/demo/Mesh_2/conform
Mesh_2/demo/Mesh_2/depends
Mesh_2/demo/Mesh_2/filename.edg
@ -309,7 +284,6 @@ Mesh_2/demo/Mesh_2/semantic.cache
Mesh_2/doxygen
Mesh_2/examples/Mesh_2/*.core
Mesh_2/examples/Mesh_2/.*.deps
Mesh_2/examples/Mesh_2/cgal_test_with_cmake
Mesh_2/examples/Mesh_2/conform
Mesh_2/examples/Mesh_2/conforming
Mesh_2/examples/Mesh_2/depends
@ -324,7 +298,6 @@ Mesh_2/test/Mesh_2/*.core
Mesh_2/test/Mesh_2/.*.deps
Mesh_2/test/Mesh_2/Makefile
Mesh_2/test/Mesh_2/bench_double_map
Mesh_2/test/Mesh_2/cgal_test_with_cmake
Mesh_2/test/Mesh_2/conform_plus
Mesh_2/test/Mesh_2/depends
Mesh_2/test/Mesh_2/my_makefile
@ -373,7 +346,6 @@ Mesh_3/examples/Mesh_3/.*.deps
Mesh_3/examples/Mesh_3/random-image.inr
Mesh_3/examples/Mesh_3/Makefile
Mesh_3/examples/Mesh_3/applications
Mesh_3/examples/Mesh_3/cgal_test_with_cmake
Mesh_3/examples/Mesh_3/cgal_to_medit
Mesh_3/examples/Mesh_3/chair-after.mesh
Mesh_3/examples/Mesh_3/chair-after.png
@ -411,7 +383,6 @@ Mesh_3/examples/Mesh_3/test_off
/Mesh_3/test/Mesh_3/a.lua
/Mesh_3/test/Mesh_3/applications
/Mesh_3/test/Mesh_3/*.cgal
/Mesh_3/test/Mesh_3/cgal_test_with_cmake
/Mesh_3/test/Mesh_3/cgal_to_medit
/Mesh_3/test/Mesh_3/combined_spheres
/Mesh_3/test/Mesh_3/combined_spheres-with-sphere-oracle
@ -513,11 +484,9 @@ Min_ellipse_2/.tmp
Min_ellipse_2/Makefile
Min_ellipse_2/bin
Min_ellipse_2/doc_ps
Minkowski_sum_3/test/Minkowski_sum_3/cgal_test_with_cmake
Nef_2/test/Nef_2/EPoint-test
Nef_2/test/Nef_2/Nef_polyhedron_2-test
Nef_2/test/Nef_2/Polynomial-test
Nef_2/test/Nef_2/cgal_test_with_cmake
Nef_2/test/Nef_2/nef_2_point_location
Nef_3/demo/Nef_3/Makefile
Nef_3/examples/Nef_3/Makefile
@ -575,7 +544,6 @@ Number_types/test/Number_types/_test_valid_finite_double
Number_types/test/Number_types/_test_valid_finite_float
Number_types/test/Number_types/bench_interval
Number_types/test/Number_types/cgal_test
Number_types/test/Number_types/cgal_test_with_cmake
Number_types/test/Number_types/constant
Number_types/test/Number_types/double
Number_types/test/Number_types/doubletst
@ -626,7 +594,6 @@ Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/moc_*.cpp
Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/ui_*.h
Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/Periodic_Lloyd_3.qch
Periodic_3_triangulation_3/test/Periodic_3_triangulation_3/Test_tds_IO_3
Periodic_3_triangulation_3/test/Periodic_3_triangulation_3/cgal_test_with_cmake
Periodic_3_triangulation_3/test/Periodic_3_triangulation_3/test_periodic_3_alpha_shape_3
Periodic_3_triangulation_3/test/Periodic_3_triangulation_3/test_periodic_3_delaunay_3
Periodic_3_triangulation_3/test/Periodic_3_triangulation_3/test_periodic_3_delaunay_hierarchy_3
@ -637,7 +604,6 @@ Periodic_3_triangulation_3/test/Periodic_3_triangulation_3/test_periodic_3_trian
Periodic_3_triangulation_3/test/Periodic_3_triangulation_3/test_periodic_3_triangulation_traits_H_3
Periodic_3_triangulation_3/test/Periodic_3_triangulation_3/test_periodic_3_triangulation_traits_SC_3
Periodic_3_triangulation_3/test/Periodic_3_triangulation_3/test_periodic_3_triangulation_traits_SH_3
Point_set_2/test/Point_set_2/cgal_test_with_cmake
Point_set_2/test/Point_set_2/nearest_nb1
Point_set_2/test/Point_set_2/nearest_nb_fcn
Point_set_2/test/Point_set_2/range_search_fcn
@ -683,7 +649,6 @@ Point_set_processing_3/test/Point_set_processing_3/smoothing_test
/Polygon_mesh_processing/test/Polygon_mesh_processing/elephant-oriented.off
/Polygon_mesh_processing/test/Polygon_mesh_processing/elephant-shuffled.off
/Polygon_mesh_processing/test/Polygon_mesh_processing/blobby_2cc_no_id.off
/Polygon_mesh_processing/test/Polygon_mesh_processing/cgal_test_with_cmake
/Polygon_mesh_processing/test/Polygon_mesh_processing/data/U.polylines.txt.off
/Polygon_mesh_processing/test/Polygon_mesh_processing/data/hole1.txt.off
/Polygon_mesh_processing/test/Polygon_mesh_processing/data/hole2.txt.off
@ -707,7 +672,6 @@ Polyhedron/demo/Polyhedron/snapshot.*
Polyhedron/demo/Polyhedron/ui_*.h
Polyhedron/test/Polyhedron/*.kdev*
Polyhedron/test/Polyhedron/Makefile
Polyhedron/test/Polyhedron/cgal_test_with_cmake
Polyhedron/test/Polyhedron/test_polyhedron
Polynomial/test/Polynomial/Exponent_vector
Polynomial/test/Polynomial/Interpolator
@ -715,7 +679,6 @@ Polynomial/test/Polynomial/Polynomial_traits_d
Polynomial/test/Polynomial/Polynomial_type_generator
Polynomial/test/Polynomial/Polynomial_using_core
Polynomial/test/Polynomial/Polynomial_using_leda
Polynomial/test/Polynomial/cgal_test_with_cmake
Polynomial/test/Polynomial/modular_gcd_utcf_algorithm_M
Polynomial/test/Polynomial/modular_gcd_utcf_dfai
Polynomial/test/Polynomial/modular_gcd_utcf_pure_wang
@ -745,10 +708,8 @@ Polytope_distance_d/.obj
Polytope_distance_d/.tmp
Polytope_distance_d/Makefile
Polytope_distance_d/bin
Polytope_distance_d/test/Polytope_distance_d/cgal_test_with_cmake
Polytope_distance_d/test/Polytope_distance_d/test_Polytope_distance_d_d
Principal_component_analysis/test/Principal_component_analysis/bounding_box
Principal_component_analysis/test/Principal_component_analysis/cgal_test_with_cmake
Principal_component_analysis/test/Principal_component_analysis/linear_least_squares_fitting_circles_2
Principal_component_analysis/test/Principal_component_analysis/linear_least_squares_fitting_cuboids_3
Principal_component_analysis/test/Principal_component_analysis/linear_least_squares_fitting_points_2
@ -773,7 +734,6 @@ Principal_component_analysis/test/Principal_component_analysis/test_linear_least
Principal_component_analysis/test/Principal_component_analysis/test_linear_least_squares_fitting_tetrahedra_3
Principal_component_analysis/test/Principal_component_analysis/test_linear_least_squares_fitting_triangles_2
Principal_component_analysis/test/Principal_component_analysis/test_linear_least_squares_fitting_triangles_3
/Profiling_tools/test/Profiling_tools/cgal_test_with_cmake
/Profiling_tools/test/Profiling_tools/test_memory_sizer
/Profiling_tools/test/Profiling_tools/test_timer
QP_solver/documentation/Degeneracies.aux
@ -805,7 +765,6 @@ Ridges_3/examples/Ridges_3/Compute_Ridges_Umbilics
Ridges_3/examples/Ridges_3/Makefile
Ridges_3/test/Ridges_3/Makefile
Ridges_3/test/Ridges_3/ridge_test
STL_Extension/test/STL_Extension/cgal_test_with_cmake
STL_Extension/test/STL_Extension/test_Cache
STL_Extension/test/STL_Extension/test_Compact_container
STL_Extension/test/STL_Extension/test_Concatenate_iterator
@ -827,7 +786,6 @@ STL_Extension/test/STL_Extension/test_nth_element
STL_Extension/test/STL_Extension/test_stl_extension
STL_Extension/test/STL_Extension/test_type_traits
STL_Extension/test/STL_Extension/test_vector
SearchStructures/test/RangeSegmentTrees/cgal_test_with_cmake
SearchStructures/test/RangeSegmentTrees/test_segment_tree_set_2
Skin_surface_3/.cdtproject
Skin_surface_3/.project
@ -838,7 +796,6 @@ Skin_surface_3/test/Skin_surface_3/err.txt
Skin_surface_3/test/Skin_surface_3/makefile
Skin_surface_3/test/Skin_surface_3/msgs.txt
Skin_surface_3/test/Skin_surface_3/subdivision_test
Spatial_sorting/test/Spatial_sorting/cgal_test_with_cmake
Stream_lines_2/demo/Stream_lines_2/Makefile
Stream_lines_2/demo/Stream_lines_2/streamlines
Surface_mesh_parameterization/examples/Surface_mesh_parameterization/*.eps
@ -966,20 +923,15 @@ Triangulation/test/Triangulation/output-pcds*
Triangulation/test/Triangulation/pc
Triangulation/test/Triangulation/pcds
Triangulation/test/Triangulation/torture
/Triangulation/examples/Triangulation/cgal_test_with_cmake
/Triangulation/test/Triangulation/cgal_test_with_cmake
/Triangulation/test/Triangulation/output-tds-*
Triangulation_2/cgal_test_with_cmake
Triangulation_2/demo/Triangulation_2/Makefile
Triangulation_2/demo/Triangulation_2/constrained
Triangulation_2/demo/Triangulation_2/constrained_delaunay_triangulation_2
Triangulation_2/demo/Triangulation_2/delaunay_triangulation_2
Triangulation_2/demo/Triangulation_2/regular_triangulation_2
Triangulation_2/examples/Triangulation_2/cgal_test_with_cmake
Triangulation_2/examples/Triangulation_2/regular
Triangulation_2/test/Triangulation_2/Makefile
Triangulation_2/test/Triangulation_2/T??.triangulation
Triangulation_2/test/Triangulation_2/cgal_test_with_cmake
Triangulation_2/test/Triangulation_2/file_tds*
Triangulation_2/test/Triangulation_2/makefile
Triangulation_2/test/Triangulation_2/test_cdt_degenerate_case
@ -997,10 +949,8 @@ Triangulation_2/test/Triangulation_2/test_triangulation_2_bis
Triangulation_2/test/Triangulation_2/test_triangulation_geom_traits
Triangulation_2/test/Triangulation_2/test_triangulation_tds
Triangulation_2/test/Triangulation_2/vrml_tds*
Triangulation_3/benchmark/Triangulation_3/cgal_test_with_cmake
Triangulation_3/benchmark/Triangulation_3/simple
Triangulation_3/examples/Triangulation_3/adding_handles_3
Triangulation_3/examples/Triangulation_3/cgal_test_with_cmake
Triangulation_3/examples/Triangulation_3/color
Triangulation_3/examples/Triangulation_3/fast_location_3
Triangulation_3/examples/Triangulation_3/find_conflicts_3
@ -1026,7 +976,6 @@ Triangulation_3/test/Triangulation_3/Test8_triangulation_IO_3_binary
Triangulation_3/test/Triangulation_3/Test??_triangulation_IO_3
Triangulation_3/test/Triangulation_3/Test?_triangulation_IO_3
Triangulation_3/test/Triangulation_3/Test_tds_IO_3
Triangulation_3/test/Triangulation_3/cgal_test_with_cmake
Triangulation_3/test/Triangulation_3/makefile
Triangulation_3/test/Triangulation_3/test_delaunay_3
Triangulation_3/test/Triangulation_3/test_delaunay_hierarchy_3
@ -1083,7 +1032,6 @@ ProgramOutput*
ErrorOutput*
CompilerOutput*
error.txt
cgal_test_with_cmake.log
# File created by the Semantic Bovinator (an Emacs package)
semantic.cache
@ -1140,9 +1088,7 @@ Doxyfile
gmon.*
# Unsorted file names:
/Point_set_processing_3/test/Point_set_processing_3/cgal_test_with_cmake
/Point_set_processing_3/test/Point_set_processing_3/read_test
/Nef_S2/test/Nef_S2/cgal_test_with_cmake
/Arrangement_on_surface_2/test/Arrangement_on_surface_2/construction_test_suite_generator
/Arrangement_on_surface_2/test/Arrangement_on_surface_2/ex_kernel_point
/Arrangement_on_surface_2/test/Arrangement_on_surface_2/ex_kernel_segment
@ -1190,15 +1136,11 @@ gmon.*
/Principal_component_analysis/examples/Principal_component_analysis/barycenter
/Principal_component_analysis/examples/Principal_component_analysis/bounding_box
/Principal_component_analysis/examples/Principal_component_analysis/centroid
/Principal_component_analysis/examples/Principal_component_analysis/cgal_test_with_cmake
/Principal_component_analysis/examples/Principal_component_analysis/linear_least_squares_fitting_points_2
/Principal_component_analysis/examples/Principal_component_analysis/linear_least_squares_fitting_triangles_3
/Polygon/examples/Polygon/cgal_test_with_cmake
/Polygon/test/Polygon/cgal_test_with_cmake
/Polygon/test/Polygon/polytest.ascii
/Polygon/test/Polygon/polytest.binary
/Polygon/test/Polygon/polytest.pretty
/Stream_support/test/Stream_support/cgal_test_with_cmake
/*.html
/Snap_rounding_2/test/Snap_rounding_2/data/out
Polygonal_surface_reconstruction/examples/build*

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(AABB_traits_benchmark)
find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Core)

View File

@ -1,6 +1,6 @@
# This is the CMake script for compiling the AABB tree demo.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(AABB_tree_Demo)
# Find includes in corresponding build directories

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(AABB_tree_Examples)
find_package(CGAL REQUIRED)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(AABB_tree_Tests)
find_package(CGAL REQUIRED)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Advancing_front_surface_reconstruction_Examples)
find_package(CGAL REQUIRED)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Advancing_front_surface_reconstruction_Tests)
find_package(CGAL REQUIRED)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Algebraic_foundations_Examples)
find_package(CGAL REQUIRED)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Algebraic_foundations_Tests)
find_package(CGAL REQUIRED COMPONENTS Core)

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Algebraic_kernel_d_Examples)
find_package(CGAL REQUIRED COMPONENTS Core)

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Algebraic_kernel_d_Tests)
# CGAL and its components

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Algebraic_kernel_for_circles_Tests)
find_package(CGAL REQUIRED)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Algebraic_kernel_for_spheres_Tests)
find_package(CGAL REQUIRED)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Alpha_shapes_2_Examples)
find_package(CGAL REQUIRED)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Alpha_shapes_2_Tests)
find_package(CGAL REQUIRED)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Alpha_shapes_3_Demo)
# Find includes in corresponding build directories

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Alpha_shapes_3_Examples)
find_package(CGAL REQUIRED)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Alpha_shapes_3_Tests)
find_package(CGAL REQUIRED)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Alpha_wrap_3_Benchmark)
find_package(CGAL REQUIRED)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Alpha_wrap_3_Examples)
find_package(CGAL REQUIRED)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Alpha_wrap_3_Tests)
find_package(CGAL REQUIRED)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Apollonius_graph_2_Examples)
find_package(CGAL REQUIRED COMPONENTS Core)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Apollonius_graph_2_Tests)
find_package(CGAL REQUIRED)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Arithmetic_kernel_Tests)
find_package(CGAL REQUIRED COMPONENTS Core)

View File

@ -1,6 +1,6 @@
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Arrangement_on_surface_2_Demo)
if(NOT POLICY CMP0070 AND POLICY CMP0053)

View File

@ -1,6 +1,6 @@
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Arrangement_on_surface_2_earth_Demo)
if(NOT POLICY CMP0070 AND POLICY CMP0053)

View File

@ -1438,14 +1438,15 @@ vary according to the user choice.} for answering queries:
points or choosing points on a grid, are also available; see the
Reference Manual for more details.
The landmark strategy requires that the type of the attached
arrangement be an instance of the `Arrangement_2<Traits,Dcel>` class
template, where the `Traits` parameter is substituted by a
geometry-traits class that models the `ArrangementLandmarkTraits_2`
concept, which refines the basic `ArrangementBasicTraits_2` concept;
see Section \ref aos_sssec-tr_landmarks_concept for details. Most
traits classes included in the \ref PkgArrangementOnSurface2 package
are models of this refined concept.
The arrangement attached to the landmark strategy must be either (i)
an instance of the `Arrangement_2<Geom,Dcel>` class template, where
the `Traits` parameter is substituted by a geometry-traits class
that models the `ArrangementLandmarkTraits_2` concept, or (ii) an
instance of the `Arrangement_on_surface_2<GeomTraits,TopolTraits>`
class template, where the `GeomTraits` is similarly substituted;
see Section \ref aos_sssec-tr_landmarks_concept for details about
this concept. Most traits classes included in the \ref
PkgArrangementOnSurface2 package are models of this refined concept.
<LI>`Arr_trapezoid_ric_point_location<Arrangement>` implements an
improved variant of Mulmuley's point-location algorithm

View File

@ -440,13 +440,14 @@ public:
Bbox_2 operator()(const X_monotone_curve_2& xcv) const { return bbox(xcv); }
};
/*! \name Auxiliary Functor definitions, used gor, e.g., the landmarks
/*! \name Auxiliary Functor definitions, used gor, e.g., the landmarks \
* point-location strategy and the drawing function.
*/
//@{
typedef double Approximate_number_type;
typedef CGAL::Cartesian<Approximate_number_type> Approximate_kernel;
typedef Approximate_kernel::Point_2 Approximate_point_2;
//@}
/*! \class Approximate_2
* A functor that approximates a point and an \f$x\f$-monotone curve.

View File

@ -121,6 +121,7 @@ public:
X_monotone_curve_2(const X_monotone_curve_2& xcv,
const Point_2& src, const Point_2& tgt) const;
//! @}
} /* end Arr_segment_traits_2::Trim_2 */
}; /* end Arr_segment_traits_2 */

View File

@ -29,6 +29,7 @@ public:
/// \name Functor Types
/// @{
/// @}
/// \name Accessing Functor Objects
/// @{

View File

@ -33,6 +33,7 @@ public:
/// \name Functor Types
/// @{
/// @}
/// \name Accessing Functor Objects
/// @{

View File

@ -33,6 +33,7 @@ public:
/// \name Functor Types
/// @{
/// @}
/// \name Accessing Functor Objects
/// @{

View File

@ -33,6 +33,7 @@ public:
/// \name Functor Types
/// @{
/// @}
/// \name Accessing Functor Objects
/// @{

View File

@ -33,6 +33,7 @@ public:
/// \name Functor Types
/// @{
/// @}
/// \name Accessing Functor Objects
/// @{

View File

@ -29,6 +29,7 @@ public:
/// \name Functor Types
/// @{
/// @}
/// \name Accessing Functor Objects
/// @{

View File

@ -33,6 +33,7 @@ public:
/// \name Functor Types
/// @{
/// @}
/// \name Accessing Functor Objects
/// @{

View File

@ -33,6 +33,7 @@ public:
/// \name Functor Types
/// @{
/// @}
/// \name Accessing Functor Objects
/// @{

View File

@ -33,6 +33,7 @@ public:
/// \name Functor Types
/// @{
/// @}
/// \name Accessing Functor Objects
/// @{

View File

@ -33,6 +33,7 @@ public:
/// \name Functor Types
/// @{
/// @}
/// \name Accessing Functor Objects
/// @{

View File

@ -29,6 +29,7 @@ public:
/// \name Functor Types
/// @{
/// @}
/// \name Accessing Functor Objects
/// @{

View File

@ -29,6 +29,7 @@ public:
/// \name Functor Types
/// @{
/// @}
/// \name Accessing Functor Objects
/// @{

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Arrangement_on_surface_2_Examples)
find_package(CGAL REQUIRED COMPONENTS Core OPTIONAL_COMPONENTS Qt6)

View File

@ -36,13 +36,6 @@ using Trap_pl = CGAL::Arr_trapezoid_ric_point_location<Gm>;
using Geom_traits = Gm::Geometry_traits_2;
using Point_2 = Geom_traits::Point_2;
using Point_location_result = CGAL::Arr_point_location_result<Gm>;
using Query_result = std::pair<Point_2, Point_location_result::Type>;
using Vertex_const_handle = Gm::Vertex_const_handle;
using Halfedge_const_handle = Gm::Halfedge_const_handle;
using Face_const_handle = Gm::Face_const_handle;
int main() {
Gm_polyhedron p;
p.make_tetrahedron(Point_3(1.0, 0.0, 0.0), Point_3(0.0, 1.0, 0.0),
@ -50,7 +43,7 @@ int main() {
Gm gm;
Naive_pl naive_pl(gm);
// Landmarks_pl landmarks_pl(gm);
Landmarks_pl landmarks_pl(gm);
Walk_pl walk_pl(gm);
// Trap_pl trap_pl(gm);
@ -70,30 +63,17 @@ int main() {
locate_point(naive_pl, points[1]);
locate_point(naive_pl, points[2]);
// locate_point(walk_pl, points[0]);
// locate_point(walk_pl, points[1]);
// locate_point(walk_pl, points[2]);
locate_point(landmarks_pl, points[0]);
locate_point(landmarks_pl, points[1]);
locate_point(landmarks_pl, points[2]);
// locate_point(trap_pl, points[0]);
////////
std::list<Query_result> results;
// The following cause an assertion failure.
// CGAL::locate(gm, &points[0], &points[3], std::back_inserter(results));
// Print the results.
for (auto it = results.begin(); it != results.end(); ++it) {
std::cout << "The point (" << it->first << ") is located ";
if (const Face_const_handle* f =
std::get_if<Face_const_handle>(&(it->second))) // inside a face
std::cout << "inside "
<< (((*f)->is_unbounded()) ? "the unbounded" : "a bounded")
<< " face.\n";
else if (const Halfedge_const_handle* e =
std::get_if<Halfedge_const_handle>(&(it->second))) // on an edge
std::cout << "on an edge: " << (*e)->curve() << std::endl;
else if (const Vertex_const_handle* v =
std::get_if<Vertex_const_handle>(&(it->second))) // on a vertex
std::cout << "on "
<< (((*v)->is_isolated()) ? "an isolated" : "a")
<< " vertex: " << (*v)->point() << std::endl;
}
// locate_point(trap_pl, points[1]);
// locate_point(trap_pl, points[2]);
return 0;
}

View File

@ -1515,7 +1515,7 @@ public:
//@}
/*! \name Auxiliary Functor definitions, used gor, e.g., the landmarks
/*! \name Auxiliary Functor definitions, used gor, e.g., the landmarks \
* point-location strategy and the drawing function.
*/
//@{

View File

@ -8,8 +8,8 @@
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
//
//
// Author(s) : Idit Haran <haranidi@post.tau.ac.il>
// Ron Wein <wein@post.tau.ac.il>
// Author(s) : Idit Haran <haranidi@post.tau.ac.il>
// Ron Wein <wein@post.tau.ac.il>
#ifndef CGAL_ARR_LANDMARKS_POINT_LOCATION_H
#define CGAL_ARR_LANDMARKS_POINT_LOCATION_H
@ -27,6 +27,7 @@
#include <CGAL/Arr_point_location_result.h>
#include <CGAL/Arrangement_2/Arr_traits_adaptor_2.h>
#include <CGAL/Arr_point_location/Arr_lm_vertices_generator.h>
#include <CGAL/Arr_tags.h>
#include <set>
@ -42,44 +43,54 @@ namespace CGAL {
* Generator is a class that generates the set of landmarks.
*/
template <class Arrangement_,
class Generator_ = Arr_landmarks_vertices_generator<Arrangement_> >
class Arr_landmarks_point_location
{
template <typename Arrangement_,
typename Generator_ = Arr_landmarks_vertices_generator<Arrangement_>>
class Arr_landmarks_point_location {
public:
typedef Arrangement_ Arrangement_2;
typedef typename Arrangement_2::Geometry_traits_2 Geometry_traits_2;
typedef Generator_ Generator;
using Arrangement_2 = Arrangement_;
using Generator = Generator_;
using Geometry_traits_2 = typename Arrangement_2::Geometry_traits_2;
typedef typename Arrangement_2::Vertex_const_handle Vertex_const_handle;
typedef typename Arrangement_2::Halfedge_const_handle Halfedge_const_handle;
typedef typename Arrangement_2::Face_const_handle Face_const_handle;
using Vertex_const_handle = typename Arrangement_2::Vertex_const_handle;
using Halfedge_const_handle = typename Arrangement_2::Halfedge_const_handle;
using Face_const_handle = typename Arrangement_2::Face_const_handle;
typedef typename Arrangement_2::Vertex_const_iterator Vertex_const_iterator;
typedef typename Arrangement_2::Halfedge_const_iterator
Halfedge_const_iterator;
typedef typename Arrangement_2::Halfedge_around_vertex_const_circulator
Halfedge_around_vertex_const_circulator;
typedef typename Arrangement_2::Ccb_halfedge_const_circulator
Ccb_halfedge_const_circulator;
typedef typename Arrangement_2::Outer_ccb_const_iterator
Outer_ccb_const_iterator;
typedef typename Arrangement_2::Inner_ccb_const_iterator
Inner_ccb_const_iterator;
typedef typename Arrangement_2::Isolated_vertex_const_iterator
Isolated_vertex_const_iterator;
using Vertex_const_iterator = typename Arrangement_2::Vertex_const_iterator;
using Halfedge_const_iterator =
typename Arrangement_2::Halfedge_const_iterator;
typedef typename Arrangement_2::Point_2 Point_2;
typedef typename Arrangement_2::X_monotone_curve_2 X_monotone_curve_2;
using Halfedge_around_vertex_const_circulator =
typename Arrangement_2::Halfedge_around_vertex_const_circulator;
using Ccb_halfedge_const_circulator =
typename Arrangement_2::Ccb_halfedge_const_circulator;
using Outer_ccb_const_iterator =
typename Arrangement_2::Outer_ccb_const_iterator;
using Inner_ccb_const_iterator =
typename Arrangement_2::Inner_ccb_const_iterator;
using Isolated_vertex_const_iterator =
typename Arrangement_2::Isolated_vertex_const_iterator;
typedef Arr_point_location_result<Arrangement_2> Result;
typedef typename Result::Type Result_type;
using Point_2 = typename Arrangement_2::Point_2;
using X_monotone_curve_2 = typename Arrangement_2::X_monotone_curve_2;
using Result = Arr_point_location_result<Arrangement_2>;
using Result_type = typename Result::Type;
// Support cpp11::result_of
typedef Result_type result_type;
using result_type = Result_type;
private:
using Gt2 = Geometry_traits_2;
using Left_side_category =
typename internal::Arr_complete_left_side_category<Gt2>::Category;
using Right_side_category =
typename internal::Arr_complete_right_side_category<Gt2>::Category;
using Left_or_right_sides_category =
typename Arr_two_sides_category<Left_side_category,
Right_side_category>::result;
protected:
typedef Arr_traits_basic_adaptor_2<Geometry_traits_2> Traits_adaptor_2;
using Traits_adaptor_2 = Arr_traits_basic_adaptor_2<Geometry_traits_2>;
/*! \struct Less_halfedge_handle
* Used to sort handles.
@ -92,10 +103,10 @@ protected:
typedef std::set<Halfedge_const_handle, Less_halfedge_handle> Halfedge_set;
// Data members:
const Arrangement_2* p_arr; // The associated arrangement.
const Arrangement_2* p_arr; // The associated arrangement.
const Traits_adaptor_2* m_traits; // Its associated traits object.
Generator* lm_gen; // The associated landmark generator.
bool own_gen; // Indicates whether the generator
Generator* lm_gen; // The associated landmark generator.
bool own_gen; // Indicates whether the generator
// has been locally allocated.
template<typename T>
@ -103,7 +114,7 @@ protected:
inline Result_type default_result() const { return Result::default_result(); }
public:
/*! Default constructor. */
/*! constructs default. */
Arr_landmarks_point_location() :
p_arr(nullptr),
m_traits(nullptr),
@ -111,34 +122,32 @@ public:
own_gen(false)
{}
/*! Constructor given an arrangement only. */
/*! constructs given an arrangement only. */
Arr_landmarks_point_location(const Arrangement_2& arr) :
p_arr(&arr),
m_traits(static_cast<const Traits_adaptor_2*>(p_arr->geometry_traits())),
lm_gen(new Generator(arr)), // allocate the landmarks generator.
own_gen(true)
{ }
{}
/*! Constructor given an arrangement, and landmarks generator. */
/*! constructs given an arrangement, and landmarks generator. */
Arr_landmarks_point_location(const Arrangement_2& arr, Generator* gen) :
p_arr(&arr),
m_traits(static_cast<const Traits_adaptor_2*>(p_arr->geometry_traits())),
lm_gen(gen),
own_gen(false)
{ }
{}
/*! Destructor. */
~Arr_landmarks_point_location()
{
/*! destructs. */
~Arr_landmarks_point_location() {
if (own_gen) {
delete lm_gen;
lm_gen = nullptr;
}
}
/*! Attach an arrangement object (and a generator, if supplied). */
void attach(const Arrangement_2& arr, Generator* gen = nullptr)
{
/*! attaches an arrangement object (and a generator, if supplied). */
void attach(const Arrangement_2& arr, Generator* gen = nullptr) {
// Keep a pointer to the associated arrangement.
p_arr = &arr;
m_traits = static_cast<const Traits_adaptor_2*>(p_arr->geometry_traits());
@ -163,9 +172,8 @@ public:
}
}
/*! Detach the instance from the arrangement object. */
void detach()
{
/*! detaches the instance from the arrangement object. */
void detach() {
p_arr = nullptr;
m_traits = nullptr;
@ -174,8 +182,7 @@ public:
lm_gen->detach();
}
/*!
* Locate the arrangement feature containing the given point.
/*! locates the arrangement feature containing the given point.
* \param p The query point.
* \return An object representing the arrangement feature containing the
* query point. This object is either a Face_const_handle or a
@ -184,7 +191,7 @@ public:
result_type locate(const Point_2& p) const;
protected:
/*! Walk from the given vertex to the query point.
/*! walks from the given vertex to the query point.
* \param vh The given vertex handle.
* \param p The query point.
* \param crossed_edges In/Out: The set of edges crossed so far.
@ -196,7 +203,7 @@ protected:
const Point_2& p,
Halfedge_set& crossed_edges) const;
/*! Locate an edge around a given vertex that is the predecessor of the
/*! locates an edge around a given vertex that is the predecessor of the
* curve connecting the vertex to the query point in a clockwise order.
* \param vh The vertex.
* \param p The query point.
@ -207,7 +214,7 @@ protected:
const Point_2& p,
bool& new_vertex) const;
/*! Walk from a point on a given halfedge to the query point.
/*! walks from a point on a given halfedge to the query point.
* \param eh The given halfedge handle.
* \param np The point that the walk starts from.
* \param p The query point.
@ -220,7 +227,7 @@ protected:
const Point_2& np,
const Point_2& p,
Halfedge_set& crossed_edges) const;
/*! In case the arrangement's curve contained in the segment
/*! handles the arrangement curve contained in the segment
* from the nearest landmark to the query point
* \param he The given halfedge handle.
* \param p_is_left Is the query point the left endpoint of seg.
@ -236,7 +243,7 @@ protected:
const Point_2& p,
Halfedge_set& crossed_edges) const;
/*! Walk from a point in a face to the query point.
/*! walks from a point in a face to the query point.
* \param fh A halfedge handle that points to the face.
* \param np The point that the walk starts from.
* \param p The query point.
@ -250,7 +257,7 @@ protected:
const Point_2& p,
Halfedge_set& crossed_edges) const;
/*! Find a halfedge on the given CCB that intersects the given x-monotone
/*! finds a halfedge on the given CCB that intersects the given x-monotone
* curve, connecting the current landmark to the query point.
* \param circ The CCB circulator.
* \param seg The segment connecting the landmark and the query point.
@ -275,7 +282,7 @@ protected:
bool& cv_is_contained_in_seg,
Vertex_const_handle& new_vertex) const;
/*! Return the halfedge that contains the query point.
/*! returns the halfedge that contains the query point.
* \param he The halfedge handle.
* \param crossed_edges In/Out: The set of edges crossed so far.
* \param p The query point.
@ -287,7 +294,7 @@ protected:
const Point_2& p,
bool& is_target) const;
/*! Check whether the given curve intersects a simple segment, which connects
/*! checks whether the given curve intersects a simple segment, which connects
* the current landmark to the query point, an odd number of times.
* \param cv The curve.
* \param seg The segment connecting the landmark and the query point.
@ -303,9 +310,62 @@ protected:
bool& p_on_curve,
bool& cv_and_seg_overlap,
bool& cv_is_contained_in_seg) const;
//!
template <typename T>
std::pair<X_monotone_curve_2, Comparison_result>
construct_segment(const Point_2& p, const Point_2& q, T const& traits,
...) const {
X_monotone_curve_2 seg = traits.construct_x_monotone_curve_2_object()(p, q);
Comparison_result res = traits.compare_xy_2_object()(p, q);
return std::make_pair(seg, res);
}
//*!
template <typename T, typename = typename T::Compare_endpoints_xy_2>
std::pair<X_monotone_curve_2, Comparison_result>
construct_segment(const Point_2& p, const Point_2& q, T const& traits,
int) const {
X_monotone_curve_2 seg = traits.construct_x_monotone_curve_2_object()(p, q);
Comparison_result res = traits.compare_endpoints_xy_2_object()(seg);
return std::make_pair(seg, res);
}
/*! Determines whether the $x$-coordinates of two points are equal.
*/
bool equal_x_2(const Point_2& p, const Point_2& q,
Arr_all_sides_oblivious_tag) const
{ return (m_traits->compare_x_2_object()(p, q) == EQUAL); }
/*! Determines whether the $x$-coordinates of two points are equal.
*/
bool equal_x_2(const Point_2& p, const Point_2& q,
Arr_has_identified_side_tag) const {
auto is_on_y_identification = m_traits->is_on_y_identification_2_object();
if (is_on_y_identification(p)) {
return is_on_y_identification(q);
}
if (is_on_y_identification(q)) return false;
return (m_traits->compare_x_2_object()(p, q) == EQUAL);
}
/*! Determines whether the $x$-coordinates of two points are equal.
*/
bool equal_x_2(const Point_2& p, const Point_2& q,
Arr_boundary_cond_tag) const {
auto param_space_in_x = m_traits->parameter_space_in_x_2_object();
switch (param_space_in_x(p)) {
case ARR_LEFT_BOUNDARY: return (param_space_in_x(q) == ARR_LEFT_BOUNDARY);
case ARR_RIGHT_BOUNDARY: return (param_space_in_x(q) == ARR_LEFT_BOUNDARY);
case ARR_INTERIOR: return (m_traits->compare_x_2_object()(p, q) == EQUAL);
default: CGAL_error();
}
CGAL_error();
return false;
}
};
} //namespace CGAL
} // namespace CGAL
// The member-function definitions can be found under:
#include <CGAL/Arr_point_location/Arr_landmarks_pl_impl.h>

View File

@ -7,16 +7,15 @@
// $Id$
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
//
// Author(s) : Idit Haran <haranidi@post.tau.ac.il>
// Ron Wein <wein@post.tau.ac.il>
// Efi Fogel <efif@post.tau.ac.il>
// Author(s) : Idit Haran <haranidi@post.tau.ac.il>
// Ron Wein <wein@post.tau.ac.il>
// Efi Fogel <efif@post.tau.ac.il>
#ifndef CGAL_ARR_LANDMARKS_PL_IMPL_H
#define CGAL_ARR_LANDMARKS_PL_IMPL_H
#include <CGAL/license/Arrangement_on_surface_2.h>
/*! \file
* Member-function definitions for the
* Arr_landmarks_point_location<Arrangement, Generator> class.
@ -24,60 +23,53 @@
namespace CGAL {
//-----------------------------------------------------------------------------
// Locate the arrangement feature containing the given point.
//
/*! locates the arrangement feature containing the given point.
*/
template <typename Arr, typename Gen>
typename Arr_landmarks_point_location<Arr, Gen>::result_type
Arr_landmarks_point_location<Arr, Gen>::locate(const Point_2& p) const
{
Arr_landmarks_point_location<Arr, Gen>::locate(const Point_2& p) const {
// If the arrangement is empty, return its initial (empty and
// non-fictitious) face.
if (p_arr->number_of_vertices() == 0) {
CGAL_assertion(p_arr->number_of_faces() == 1);
Face_const_handle fh = p_arr->faces_begin();
Face_const_handle fh = p_arr->faces_begin();
return make_result(fh);
}
// Use the generator and to find the closest landmark to the query point.
result_type lm_location_obj;
result_type lm_location_obj;
const Point_2& landmark_point = lm_gen->closest_landmark(p, lm_location_obj);
// If the query point and the landmark point are equal, return the landmark.
if (m_traits->equal_2_object()(landmark_point, p))
return lm_location_obj;
if (m_traits->equal_2_object()(landmark_point, p)) return lm_location_obj;
// Walk from the nearest_vertex to the point p, using walk algorithm,
// and find the location of the query point p. Note that the set of edges
// we have crossed so far is initially empty.
Halfedge_set crossed_edges;
result_type out_obj;
Halfedge_set crossed_edges;
result_type out_obj;
// Locate the arrangement feature that contains the landmark.
const Vertex_const_handle* vh;
const Halfedge_const_handle* hh;
const Face_const_handle* fh;
if ( ( vh = Result().template assign<Vertex_const_handle>(&lm_location_obj) ) )
out_obj = _walk_from_vertex(*vh, p, crossed_edges);
else if ( ( hh = Result().template assign<Halfedge_const_handle>(&lm_location_obj) ) )
out_obj = _walk_from_edge(*hh, landmark_point, p, crossed_edges);
else if ( ( fh = Result().template assign<Face_const_handle>(&lm_location_obj) ) )
out_obj = _walk_from_face(*fh, landmark_point, p, crossed_edges);
if (const auto* v = std::get_if<Vertex_const_handle>(&lm_location_obj))
out_obj = _walk_from_vertex(*v, p, crossed_edges);
else if (const auto* e = std::get_if<Halfedge_const_handle>(&lm_location_obj))
out_obj = _walk_from_edge(*e, landmark_point, p, crossed_edges);
else if (const auto* f = std::get_if<Face_const_handle>(&lm_location_obj))
out_obj = _walk_from_face(*f, landmark_point, p, crossed_edges);
else CGAL_error_msg("lm_location_obj of an unknown type.");
if ( ( fh = Result().template assign<Face_const_handle>(&out_obj) ) ) {
if (const auto* fp = std::get_if<Face_const_handle>(&out_obj)) {
const auto& f = *fp;
// If we reached here, we did not locate the query point in any of the
// holes inside the current face, so we conclude it is contained in this
// face.
// However, we first have to check whether the query point coincides with
// any of the isolated vertices contained inside this face.
Isolated_vertex_const_iterator iso_verts_it;
typename Traits_adaptor_2::Equal_2 equal = m_traits->equal_2_object();
for (iso_verts_it = (*fh)->isolated_vertices_begin();
iso_verts_it != (*fh)->isolated_vertices_end(); ++iso_verts_it)
{
// face. However, we first have to check whether the query point coincides
// with any of the isolated vertices contained inside this face.
auto equal = m_traits->equal_2_object();
// Do not use 'auto' to define the iterator, as MSVC2017 complains.
for (Isolated_vertex_const_iterator iso_verts_it = f->isolated_vertices_begin();
iso_verts_it != f->isolated_vertices_end(); ++iso_verts_it) {
if (equal(p, iso_verts_it->point())) {
Vertex_const_handle ivh = iso_verts_it;
Vertex_const_handle ivh = iso_verts_it;
return make_result(ivh);
}
}
@ -86,28 +78,24 @@ Arr_landmarks_point_location<Arr, Gen>::locate(const Point_2& p) const
return out_obj;
}
//-----------------------------------------------------------------------------
// Walk from a given vertex to the query point.
//
/*! walks from a given vertex to the query point.
*/
template <typename Arr, typename Gen>
typename Arr_landmarks_point_location<Arr, Gen>::result_type
Arr_landmarks_point_location<Arr, Gen>::
_walk_from_vertex(Vertex_const_handle nearest_vertex,
const Point_2& p,
Halfedge_set& crossed_edges) const
{
_walk_from_vertex(Vertex_const_handle nearest_vertex, const Point_2& p,
Halfedge_set& crossed_edges) const {
Vertex_const_handle vh = nearest_vertex;
CGAL_assertion_msg(! vh->is_at_open_boundary(),
"_walk_from_vertex() from a vertex at infinity.");
// Check if the query point p coincides with the vertex.
if (m_traits->equal_2_object()(vh->point(), p))
return make_result(vh);
if (m_traits->equal_2_object()(vh->point(), p)) return make_result(vh);
// In case of an isolated vertex, walk to from the face that contains
// it toward the query point.
if (vh->is_isolated()) {
Face_const_handle fh = vh->face();
Face_const_handle fh = vh->face();
return (_walk_from_face(fh, vh->point(), p, crossed_edges));
}
@ -116,16 +104,15 @@ _walk_from_vertex(Vertex_const_handle nearest_vertex,
Halfedge_around_vertex_const_circulator first = vh->incident_halfedges();
// Create an x-monotone curve connecting the point associated with the
// vertex vp and the query point p.
const Point_2& vp = vh->point();
X_monotone_curve_2 seg =
m_traits->construct_x_monotone_curve_2_object()(vp, p);
const bool seg_dir_right =
(m_traits->compare_xy_2_object()(vp, p) == SMALLER);
const Point_2& vp = vh->point();
X_monotone_curve_2 seg;
Comparison_result res;
std::tie(seg, res) = construct_segment(vp, p, *m_traits, 0);
bool seg_dir_right = (res == SMALLER);
Halfedge_around_vertex_const_circulator curr_iter = first;
Halfedge_around_vertex_const_circulator next_iter = curr_iter;
++next_iter;
typename Traits_adaptor_2::Is_between_cw_2 is_between_cw =
m_traits->is_between_cw_2_object();
auto is_between_cw = m_traits->is_between_cw_2_object();
// Traverse the halfedges around vp until we find the pair of adjacent
// halfedges such as seg is located clockwise in between them.
do {
@ -134,12 +121,11 @@ _walk_from_vertex(Vertex_const_handle nearest_vertex,
(curr_iter->direction() == ARR_RIGHT_TO_LEFT),
next_iter->curve(),
(next_iter->direction() == ARR_RIGHT_TO_LEFT),
vp, eq_curr_iter, eq_next_iter))
{
vp, eq_curr_iter, eq_next_iter)) {
// the assumption is that each edge is crossed at most twice
CGAL_assertion_msg(crossed_edges.count (curr_iter) < 2,
CGAL_assertion_msg(crossed_edges.count(curr_iter) < 2,
"crossed_edges should contain each halfedge at most twice.");
CGAL_assertion_msg(crossed_edges.count (next_iter) < 2,
CGAL_assertion_msg(crossed_edges.count(next_iter) < 2,
"crossed_edges should contain each halfedge at most twice.");
crossed_edges.insert(curr_iter);
crossed_edges.insert(curr_iter->twin());
@ -158,8 +144,7 @@ _walk_from_vertex(Vertex_const_handle nearest_vertex,
result_type obj = _find_face_around_vertex(vh, p, new_vertex);
if (new_vertex) {
// We found a vertex closer to p; Continue using this vertex.
const Vertex_const_handle* p_vh =
Result().template assign<Vertex_const_handle>(&obj);
const auto* p_vh = std::get_if<Vertex_const_handle>(&obj);
CGAL_assertion(p_vh != nullptr);
vh = *p_vh;
continue;
@ -167,15 +152,13 @@ _walk_from_vertex(Vertex_const_handle nearest_vertex,
// If p is located on an edge or on a vertex, return the object
// that wraps this arrangement feature.
if (Result().template assign<Halfedge_const_handle>(&obj) ||
Result().template assign<Vertex_const_handle>(&obj))
if (std::get_if<Halfedge_const_handle>(&obj) ||
std::get_if<Vertex_const_handle>(&obj))
return obj;
const Face_const_handle* p_fh =
Result().template assign<Face_const_handle>(&obj);
if (p_fh)
// Walk to p from the face we have located:
return _walk_from_face(*p_fh, vh->point(), p, crossed_edges);
const auto* p_fh = std::get_if<Face_const_handle>(&obj);
// Walk to p from the face we have located:
if (p_fh) return _walk_from_face(*p_fh, vh->point(), p, crossed_edges);
CGAL_error_msg("_find_face_around_vertex() returned an unknown object.");
}
@ -185,31 +168,27 @@ _walk_from_vertex(Vertex_const_handle nearest_vertex,
return default_result();
}
//-----------------------------------------------------------------------------
// Locate an edge around a given vertex that is the predecessor of the curve
// connecting the vertex to the query point in a clockwise order.
//
/*! locates an edge around a given vertex that is the predecessor of the curve
* connecting the vertex to the query point in a clockwise order.
*/
template <typename Arr, typename Gen>
typename Arr_landmarks_point_location<Arr, Gen>::result_type
Arr_landmarks_point_location<Arr, Gen>::
_find_face_around_vertex(Vertex_const_handle vh,
const Point_2& p,
bool& new_vertex) const
{
_find_face_around_vertex(Vertex_const_handle vh, const Point_2& p,
bool& new_vertex) const {
new_vertex = false;
// Create an x-monotone curve connecting the point associated with the
// vertex vp and the query point p.
const Point_2& vp = vh->point();
X_monotone_curve_2 seg =
m_traits->construct_x_monotone_curve_2_object()(vp, p);
const bool seg_dir_right =
(m_traits->compare_xy_2_object()(vp, p) == SMALLER);
const Point_2& vp = vh->point();
X_monotone_curve_2 seg;
Comparison_result res;
std::tie(seg, res) = construct_segment(vp, p, *m_traits, 0);
bool seg_dir_right = (res == SMALLER);
// Get the first incident halfedge around v and the next halfedge.
Halfedge_around_vertex_const_circulator first = vh->incident_halfedges();
Halfedge_around_vertex_const_circulator curr, next;
bool equal_curr = false;
Halfedge_around_vertex_const_circulator first = vh->incident_halfedges();
Halfedge_around_vertex_const_circulator curr, next;
bool equal_curr = false;
next = curr = first;
++next;
@ -241,16 +220,14 @@ _find_face_around_vertex(Vertex_const_handle vh,
else {
// Traverse the halfedges around v until we find the pair of adjacent
// halfedges such as seg is located clockwise in between them.
typename Traits_adaptor_2::Is_between_cw_2 is_between_cw =
m_traits->is_between_cw_2_object();
bool eq_curr, eq_next;
auto is_between_cw = m_traits->is_between_cw_2_object();
bool eq_curr, eq_next;
while (! is_between_cw(seg, seg_dir_right, curr->curve(),
(curr->direction() == ARR_RIGHT_TO_LEFT),
next->curve(),
(next->direction() == ARR_RIGHT_TO_LEFT),
vp, eq_curr, eq_next))
{
vp, eq_curr, eq_next)) {
// Break the loop if seg equals one of the halfedges next to v.
if (eq_curr) {
equal_curr = true;
@ -291,10 +268,9 @@ _find_face_around_vertex(Vertex_const_handle vh,
// Check whether p lies on the curve associated with the edge.
if (m_traits->is_in_x_range_2_object()(curr->curve(), p) &&
m_traits->compare_y_at_x_2_object()(p, curr->curve()) == EQUAL)
{
m_traits->compare_y_at_x_2_object()(p, curr->curve()) == EQUAL) {
// p is located on the interior of the edge.
Halfedge_const_handle he = curr;
Halfedge_const_handle he = curr;
return make_result(he);
}
@ -304,22 +280,18 @@ _find_face_around_vertex(Vertex_const_handle vh,
return make_result(curr->source());
}
//-----------------------------------------------------------------------------
// Walk from the edge to the query point.
//
/*! walks from the edge to the query point.
*/
template <typename Arr, typename Gen>
typename Arr_landmarks_point_location<Arr, Gen>::result_type
Arr_landmarks_point_location<Arr, Gen>::
_walk_from_edge(Halfedge_const_handle eh,
const Point_2& np,
const Point_2& p,
Halfedge_set& crossed_edges) const
{
_walk_from_edge(Halfedge_const_handle eh, const Point_2& np, const Point_2& p,
Halfedge_set& crossed_edges) const {
CGAL_assertion_msg(! eh->is_fictitious(),
"_walk_from_edge() from a fictitious edge.");
const X_monotone_curve_2& cv = eh->curve() ;
Comparison_result res;
Comparison_result res;
X_monotone_curve_2 seg =
m_traits->construct_x_monotone_curve_2_object()(np, p);
@ -345,8 +317,7 @@ _walk_from_edge(Halfedge_const_handle eh,
if (m_traits->is_in_x_range_2_object()(seg, temp_p)) {
//we must make sure that eh is not a tip on an "antena"
if (m_traits->compare_y_at_x_2_object()(temp_p, seg) == EQUAL &&
eh->prev() != eh->twin())
{
eh->prev() != eh->twin()) {
// the assumption is that each edge is crossed at most twice
CGAL_assertion_msg(crossed_edges.count(eh->prev()) < 2,
"crossed_edges should contain each halfedge at most twice.");
@ -367,8 +338,7 @@ _walk_from_edge(Halfedge_const_handle eh,
if (m_traits->is_in_x_range_2_object()(seg, temp_p)) {
//we must make sure that eh is not a tip on an "antena"
if (m_traits->compare_y_at_x_2_object()(temp_p, seg) == EQUAL &&
eh->next() != eh->twin())
{
eh->next() != eh->twin()) {
// the assumption is that each edge is crossed at most twice
CGAL_assertion_msg(crossed_edges.count(eh->next()) < 2,
"crossed_edges should contain each halfedge at most twice.");
@ -428,89 +398,71 @@ _walk_from_edge(Halfedge_const_handle eh,
return (_walk_from_vertex(vh, p, crossed_edges));
}
//-----------------------------------------------------------------------------
// In case the arrangement's curve contained in the segment
// from the nearest landmark to the query point
//
/*! deals with an arrangement curve contained in the segment from the nearest
* landmark to the query point
*/
template <typename Arr, typename Gen>
typename Arr_landmarks_point_location<Arr, Gen>::result_type
Arr_landmarks_point_location<Arr, Gen>::
_deal_with_curve_contained_in_segment(Halfedge_const_handle he,
bool p_is_left,
_deal_with_curve_contained_in_segment(Halfedge_const_handle he, bool p_is_left,
const Point_2& p,
Halfedge_set& crossed_edges) const
{
Halfedge_set& crossed_edges) const {
// in this case we want to walk from to the query point from the nearest
// vertex either the halfedge's source or target
Vertex_const_handle vh;
bool target_is_left;
if (m_traits->compare_xy_2_object()
(he->source()->point(),he->target()->point()) == LARGER)
target_is_left = true;
else
target_is_left = false;
auto cmp_xy = m_traits->compare_xy_2_object();
bool target_is_left =
(cmp_xy(he->source()->point(), he->target()->point()) == LARGER);
Vertex_const_handle vh;
if (p_is_left) {
if (target_is_left)
vh = he->target();
else
vh = he->source();
if (target_is_left) vh = he->target();
else vh = he->source();
}
else {
if (target_is_left)
vh = he->source();
else
vh = he->target();
if (target_is_left) vh = he->source();
else vh = he->target();
}
// vh is the closest vertex among the halfedge's end points
return (_walk_from_vertex(vh, p, crossed_edges));
}
//-----------------------------------------------------------------------------
// Walk from the given face to the query point.
//
/*! walks from the given face to the query point.
*/
template <typename Arr, typename Gen>
typename Arr_landmarks_point_location<Arr, Gen>::result_type
Arr_landmarks_point_location<Arr, Gen>::
_walk_from_face(Face_const_handle face,
const Point_2& np,
const Point_2& p,
Halfedge_set& crossed_edges) const
{
_walk_from_face(Face_const_handle face, const Point_2& np, const Point_2& p,
Halfedge_set& crossed_edges) const {
// Construct an x-monotone curve connecting the nearest landmark point np
// to the query point p and check which CCB intersects this segment.
X_monotone_curve_2 seg =
m_traits->construct_x_monotone_curve_2_object()(np, p);
const bool p_is_left =
(m_traits->compare_xy_2_object()(np, p) == LARGER);
X_monotone_curve_2 seg;
Comparison_result res;
std::tie(seg, res) = construct_segment(np, p, *m_traits, 0);
const bool p_is_left = (res == LARGER);
Inner_ccb_const_iterator inner_ccb_iter;
Outer_ccb_const_iterator outer_ccb_iter;
const Halfedge_const_handle invalid_he;
Halfedge_const_handle he;
Face_const_handle new_face;
bool is_on_edge;
bool is_target;
bool cv_is_contained_in_seg;
Vertex_const_handle new_vertex;
const Vertex_const_handle invalid_vertex;
const Halfedge_const_handle invalid_he;
const Vertex_const_handle invalid_vertex;
bool cv_is_contained_in_seg;
do {
// Check whether p lies inside the current face (including its holes):
if (p_arr->topology_traits()->is_in_face(&(*face), p, nullptr))
{
if (p_arr->topology_traits()->is_in_face(&(*face), p, nullptr)) {
// We know that p is located inside the current face, and we check
// whether it lies inside one of its holes (or on the boundary of
// its holes).
cv_is_contained_in_seg = false;
new_face = face;
for (inner_ccb_iter = face->inner_ccbs_begin();
inner_ccb_iter != face->inner_ccbs_end(); ++inner_ccb_iter)
{
he = _intersection_with_ccb(*inner_ccb_iter,seg, p, p_is_left,
crossed_edges,is_on_edge, is_target,
cv_is_contained_in_seg,new_vertex);
if (he == invalid_he && cv_is_contained_in_seg)
{
auto new_face = face;
// Do not use 'auto' to define the iterator, as MSVC2017 complains.
for (Inner_ccb_const_iterator inner_ccb_iter = face->inner_ccbs_begin();
inner_ccb_iter != face->inner_ccbs_end(); ++inner_ccb_iter) {
bool is_on_edge;
bool is_target;
Vertex_const_handle new_vertex;
Halfedge_const_handle he =
_intersection_with_ccb(*inner_ccb_iter,seg, p, p_is_left,
crossed_edges, is_on_edge, is_target,
cv_is_contained_in_seg, new_vertex);
if (he == invalid_he && cv_is_contained_in_seg) {
return _deal_with_curve_contained_in_segment(*inner_ccb_iter,
p_is_left,p,
crossed_edges);
@ -535,8 +487,7 @@ _walk_from_face(Face_const_handle face,
// Check if we found a new face (hole) containing p. If not, the current
// face contains p.
if (new_face == face)
return make_result(face);
if (new_face == face) return make_result(face);
// Continue from the new face (hole).
face = new_face;
@ -544,13 +495,17 @@ _walk_from_face(Face_const_handle face,
else {
// We know that p is not located inside the current face. We therefore
// look for an edge on its outer boundary that intersects seg.
new_face = face;
for (outer_ccb_iter = face->outer_ccbs_begin();
outer_ccb_iter != face->outer_ccbs_end(); ++outer_ccb_iter)
{
he = _intersection_with_ccb(*outer_ccb_iter,seg, p, p_is_left,
crossed_edges,is_on_edge, is_target,
cv_is_contained_in_seg,new_vertex);
auto new_face = face;
// Do not use 'auto' to define the iterator, as MSVC2017 complains.
for (Inner_ccb_const_iterator outer_ccb_iter = face->outer_ccbs_begin();
outer_ccb_iter != face->outer_ccbs_end(); ++outer_ccb_iter) {
bool is_on_edge;
bool is_target;
Vertex_const_handle new_vertex;
Halfedge_const_handle he =
_intersection_with_ccb(*outer_ccb_iter,seg, p, p_is_left,
crossed_edges, is_on_edge, is_target,
cv_is_contained_in_seg, new_vertex);
if (he == invalid_he && cv_is_contained_in_seg) {
return _deal_with_curve_contained_in_segment(*outer_ccb_iter,
p_is_left,p,
@ -585,10 +540,9 @@ _walk_from_face(Face_const_handle face,
return default_result();
}
//-----------------------------------------------------------------------------
// Find a halfedge on the given CCB that intersects the given x-monotone
// curve, connecting the current landmark to the query point.
//
/*! finds a halfedge on the given CCB that intersects the given x-monotone
* curve, connecting the current landmark to the query point.
*/
template <typename Arr, typename Gen>
typename Arr_landmarks_point_location<Arr, Gen>::Halfedge_const_handle
Arr_landmarks_point_location<Arr, Gen>::
@ -598,17 +552,15 @@ _intersection_with_ccb(Ccb_halfedge_const_circulator circ,
Halfedge_set& crossed_edges,
bool& is_on_edge, bool& is_target,
bool& cv_is_contained_in_seg,
Vertex_const_handle & new_vertex) const
{
Vertex_const_handle& new_vertex) const {
is_on_edge = false;
is_target = false;
// Go over the CCB.
typename Traits_adaptor_2::Is_in_x_range_2 is_in_x_range =
m_traits->is_in_x_range_2_object();
Ccb_halfedge_const_circulator curr = circ , temp_circ;
const Halfedge_const_handle invalid_he;
Halfedge_const_handle he;
auto is_in_x_range = m_traits->is_in_x_range_2_object();
Ccb_halfedge_const_circulator curr = circ , temp_circ;
const Halfedge_const_handle invalid_he;
Halfedge_const_handle he;
bool cv_and_seg_overlap;
do {
he = curr;
@ -646,33 +598,28 @@ _intersection_with_ccb(Ccb_halfedge_const_circulator circ,
// Check whether the current curve intersects seg an odd number of times.
if (_have_odd_intersections(he->curve(), seg, p_is_left,
is_on_edge,cv_and_seg_overlap,
cv_is_contained_in_seg)
&& !(cv_and_seg_overlap || cv_is_contained_in_seg))
{
cv_is_contained_in_seg) &&
! (cv_and_seg_overlap || cv_is_contained_in_seg)) {
// Check if the query point lies on the current edge, or whether
// it lies in its interior.
if (is_on_edge)
return _in_case_p_is_on_edge(he,crossed_edges,p,is_target);
if ((!curr->target()->is_at_open_boundary()) &&
is_in_x_range(seg, curr->target()->point()))
{
is_in_x_range(seg, curr->target()->point())) {
// if the target point of curr is located on seg
// we should walk from it to the query point
if (m_traits->compare_y_at_x_2_object()
(curr->target()->point(), seg) == EQUAL)
{
(curr->target()->point(), seg) == EQUAL) {
new_vertex = curr->target();
}
}
else if ((!curr->source()->is_at_open_boundary()) &&
is_in_x_range(seg , curr->source()->point() ))
{
is_in_x_range(seg , curr->source()->point())) {
// if the source point of curr is located on seg
// we should walk from it to the query point
if (m_traits->compare_y_at_x_2_object()
(curr->source()->point() , seg) == EQUAL)
{
(curr->source()->point(), seg) == EQUAL) {
new_vertex = curr->source();
}
}
@ -718,8 +665,7 @@ Arr_landmarks_point_location<Arr, Gen>::
_in_case_p_is_on_edge(Halfedge_const_handle he,
Halfedge_set& crossed_edges,
const Point_2 & p,
bool & is_target) const
{
bool & is_target) const {
// cv and seg overlap, obviously we crossed it
// the assumption is that each edge is crossed at most twice
CGAL_assertion_msg(crossed_edges.count(he) < 2,
@ -728,14 +674,12 @@ _in_case_p_is_on_edge(Halfedge_const_handle he,
crossed_edges.insert(he->twin());
// Check if p equals one of the edge end-vertices.
if (! he->target()->is_at_open_boundary() &&
m_traits->compare_xy_2_object()(he->target()->point(), p) == EQUAL)
{
m_traits->equal_2_object()(he->target()->point(), p)) {
// p is the target of the current halfedge.
is_target = true;
}
else if (! he->source()->is_at_open_boundary() &&
m_traits->compare_xy_2_object()(he->source()->point(), p) == EQUAL)
{
m_traits->equal_2_object()(he->source()->point(), p)) {
// Take the twin halfedge, so p equals its target.
he = he->twin();
is_target = true;
@ -744,21 +688,17 @@ _in_case_p_is_on_edge(Halfedge_const_handle he,
return he;
}
//-----------------------------------------------------------------------------
// Check whether the given curve intersects a simple segment, which connects
// the current landmark to the query point, an odd number of times.
//
/*! checks whether the given curve intersects a simple segment, which connects
* the current landmark to the query point, an odd number of times.
*/
template <typename Arr, typename Gen>
bool Arr_landmarks_point_location<Arr, Gen>::
_have_odd_intersections(const X_monotone_curve_2& cv,
const X_monotone_curve_2& seg,
bool p_is_left,
bool& p_on_curve,
bool p_is_left, bool& p_on_curve,
bool& cv_and_seg_overlap,
bool& cv_is_contained_in_seg) const
{
typename Traits_adaptor_2::Is_in_x_range_2 is_in_x_range =
m_traits->is_in_x_range_2_object();
bool& cv_is_contained_in_seg) const {
auto is_in_x_range = m_traits->is_in_x_range_2_object();
p_on_curve = false;
cv_and_seg_overlap = false;
cv_is_contained_in_seg = false;
@ -776,9 +716,9 @@ _have_odd_intersections(const X_monotone_curve_2& cv,
cv_right = m_traits->construct_max_vertex_2_object()(cv);
if (cv_left_is_closed && cv_right_is_closed) {
if (is_in_x_range(seg,cv_left) && is_in_x_range(seg,cv_right)) {
if ((m_traits->compare_y_at_x_2_object()(cv_left, seg) == EQUAL) &&
(m_traits->compare_y_at_x_2_object()(cv_right, seg) == EQUAL))
{
auto cmp_y_at_x = m_traits->compare_y_at_x_2_object();
if ((cmp_y_at_x(cv_left, seg) == EQUAL) &&
(cmp_y_at_x(cv_right, seg) == EQUAL)) {
// cv is contained in seg non of the answer true or false is correct
// we must set a special flag to distinguish this case
cv_is_contained_in_seg = true;
@ -791,22 +731,17 @@ _have_odd_intersections(const X_monotone_curve_2& cv,
if (cv_left_is_closed) {
// Check if the left endpoint of cv has the same x-coordinate as the
// right endpoint of seg.
if (m_traits->compare_x_2_object()
(m_traits->construct_min_vertex_2_object()(cv), seg_right) == EQUAL)
{
if (! p_is_left &&
m_traits->compare_xy_2_object()
(m_traits->construct_min_vertex_2_object()(cv), seg_right) == EQUAL)
{
auto min_p = m_traits->construct_min_vertex_2_object()(cv);
if (equal_x_2(min_p, seg_right, Left_or_right_sides_category())) {
if (! p_is_left && m_traits->equal_2_object()(min_p, seg_right)) {
p_on_curve = true;
return true;
}
else if (m_traits->is_vertical_2_object()(seg)) {
auto cmp_y_at_x = m_traits->compare_y_at_x_2_object();
// Special treatment for vertical segments.
Comparison_result res_l =
m_traits->compare_y_at_x_2_object()(seg_left, cv);
Comparison_result res_r =
m_traits->compare_y_at_x_2_object()(seg_right, cv);
Comparison_result res_l = cmp_y_at_x(seg_left, cv);
Comparison_result res_r = cmp_y_at_x(seg_right, cv);
if ((p_is_left && res_l == EQUAL) || (! p_is_left && res_r == EQUAL)) {
p_on_curve = true;
return true;
@ -819,23 +754,17 @@ _have_odd_intersections(const X_monotone_curve_2& cv,
if (cv_right_is_closed) {
// Check if the right endpoint of cv has the same x-coordinate as the
// left endpoint of seg.
if (m_traits->compare_x_2_object()
(m_traits->construct_max_vertex_2_object()(cv), seg_left) == EQUAL)
{
if (p_is_left &&
m_traits->compare_xy_2_object()
(m_traits->construct_max_vertex_2_object()(cv), seg_left) == EQUAL)
{
auto max_p = m_traits->construct_max_vertex_2_object()(cv);
if (equal_x_2(max_p, seg_left, Left_or_right_sides_category())) {
if (p_is_left && m_traits->equal_2_object()(max_p, seg_left)) {
p_on_curve = true;
return true;
}
else if (m_traits->is_vertical_2_object()(seg)) {
// Special treatment for vertical segments.
Comparison_result res_l =
m_traits->compare_y_at_x_2_object()(seg_left, cv);
Comparison_result res_r =
m_traits->compare_y_at_x_2_object()(seg_right, cv);
auto cmp_y_at_x = m_traits->compare_y_at_x_2_object();
Comparison_result res_l = cmp_y_at_x(seg_left, cv);
Comparison_result res_r = cmp_y_at_x(seg_right, cv);
if ((p_is_left && res_l == EQUAL) || (! p_is_left && res_r == EQUAL)) {
p_on_curve = true;
return true;
@ -846,8 +775,8 @@ _have_odd_intersections(const X_monotone_curve_2& cv,
}
}
// Compare the two left ends of cv and seg.
Comparison_result left_res;
const Arr_parameter_space bx_l =
Comparison_result left_res;
const Arr_parameter_space bx_l =
m_traits->parameter_space_in_x_2_object()(cv, ARR_MIN_END);
if (bx_l == ARR_LEFT_BOUNDARY) {
// The left end of cv lies to the left of seg_left:
@ -858,11 +787,11 @@ _have_odd_intersections(const X_monotone_curve_2& cv,
// The left end of cv lies to the right of seg_left.
// Compare the left endpoint of cv to seg.
left_res = m_traits->compare_y_at_x_2_object()
(m_traits->construct_min_vertex_2_object()(cv), seg);
(m_traits->construct_min_vertex_2_object()(cv), seg);
left_res = CGAL::opposite(left_res);
}
else {
const Arr_parameter_space by_l =
const Arr_parameter_space by_l =
m_traits->parameter_space_in_y_2_object()(cv, ARR_MIN_END);
if (by_l == ARR_BOTTOM_BOUNDARY)
// The left end of cv is at y = -oo, so cv obviously lies above it.
@ -876,8 +805,7 @@ _have_odd_intersections(const X_monotone_curve_2& cv,
Comparison_result res = m_traits->compare_xy_2_object()(cv_left, seg_left);
if (res != LARGER) {
left_res = m_traits->compare_y_at_x_2_object()(seg_left, cv);
if (p_is_left && left_res == EQUAL)
{
if (p_is_left && left_res == EQUAL) {
// In this case the query point p, which is the left endpoint of seg,
// lies on cv.
p_on_curve = true;
@ -904,8 +832,7 @@ _have_odd_intersections(const X_monotone_curve_2& cv,
// we must set a special flag to distinguish this case
if (is_in_x_range(cv,( p_is_left ? seg_left : seg_right)))
if (m_traits->compare_y_at_x_2_object()
((p_is_left ? seg_left : seg_right), cv) == EQUAL)
{
((p_is_left ? seg_left : seg_right), cv) == EQUAL) {
p_on_curve = true;
}
cv_and_seg_overlap = true;
@ -913,8 +840,8 @@ _have_odd_intersections(const X_monotone_curve_2& cv,
}
}
// Compare the two right ends of cv and seg.
Comparison_result right_res;
const Arr_parameter_space bx_r =
Comparison_result right_res;
const Arr_parameter_space bx_r =
m_traits->parameter_space_in_x_2_object()(cv, ARR_MAX_END);
if (bx_r == ARR_RIGHT_BOUNDARY) {
// The right end of cv lies to the right of seg_right:
@ -925,11 +852,11 @@ _have_odd_intersections(const X_monotone_curve_2& cv,
// The right end of cv lies to the left of seg_right.
// Compare the right endpoint of cv to seg.
right_res = m_traits->compare_y_at_x_2_object()
(m_traits->construct_max_vertex_2_object()(cv), seg);
(m_traits->construct_max_vertex_2_object()(cv), seg);
right_res = CGAL::opposite(right_res);
}
else {
const Arr_parameter_space by_r =
const Arr_parameter_space by_r =
m_traits->parameter_space_in_y_2_object()(cv, ARR_MAX_END);
if (by_r == ARR_BOTTOM_BOUNDARY)
// The right end of cv is at y = -oo, so cv obviously lies above it.
@ -972,8 +899,7 @@ _have_odd_intersections(const X_monotone_curve_2& cv,
// we must set a special flag to distinguish this case
if (is_in_x_range(cv, (p_is_left ? seg_left : seg_right)))
if (m_traits->compare_y_at_x_2_object()
((p_is_left ? seg_left : seg_right), cv) == EQUAL)
{
((p_is_left ? seg_left : seg_right), cv) == EQUAL) {
p_on_curve = true;
}
cv_and_seg_overlap = true;
@ -986,6 +912,6 @@ _have_odd_intersections(const X_monotone_curve_2& cv,
return (left_res != right_res);
}
} //namespace CGAL
} // namespace CGAL
#endif

View File

@ -76,9 +76,9 @@ public:
NUMBER_OF_OPERATIONS
};
private:
using Base = BaseTraits;
private:
//! A set of bits that indicate whether operations should be traced.
unsigned long long m_flags;
@ -212,6 +212,7 @@ public:
using X_monotone_curve_2 = typename Base::X_monotone_curve_2;
using Curve_2 = typename Base::Curve_2;
using Multiplicity = typename Base::Multiplicity;
//@}
/*! A functor that compares the \f$x\f$-coordinates of two points. */
class Compare_x_2 {
@ -832,9 +833,16 @@ public:
std::cout << "approximate_2" << std::endl
<< " xcv: " << xcv << ", error: " << error
<< ", l2r: " << l2r << std::endl;
auto res = m_object(xcv, error, oi, l2r);
std::cout << " result: " << res << std::endl;
return res;
std::list<Approximate_point_2> container;
m_object(xcv, error, std::back_inserter(container), l2r);
if (container.empty()) return oi;
std::size_t i = 0;
for (const auto& point : container) {
std::cout << " result[" << i++ << "]: " << point << std::endl;
*oi++ = point;
}
return oi;
}
};

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Arrangement_on_surface_2_Tests)
enable_testing()

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_CMakeLists
# This is the CMake script for compiling a set of CGAL applications.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(BGL_LCC_Examples)
# CGAL and its components

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_CMakeLists
# This is the CMake script for compiling a set of CGAL applications.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(BGL_OpenMesh_Examples)
# CGAL and its components

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(BGL_arrangement_2_Examples)
find_package(CGAL REQUIRED)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_CMakeLists
# This is the CMake script for compiling a set of CGAL applications.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(BGL_graphcut_Examples)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_CMakeLists
# This is the CMake script for compiling a set of CGAL applications.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(BGL_polyhedron_3_Examples)
# CGAL and its components

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(BGL_surface_mesh_Examples)
find_package(CGAL REQUIRED)

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(BGL_triangulation_2_Examples)
find_package(CGAL REQUIRED)

View File

@ -178,6 +178,7 @@ void copy_face_graph_impl(const SourceMesh& sm, TargetMesh& tm,
}
// detect if there are some non-manifold umbrellas and fix missing halfedge target pointers
std::map<sm_vertex_descriptor, std::vector<tm_halfedge_descriptor>> nm_umbrella_map;
typedef typename std::vector<tm_edge_descriptor>::iterator edge_iterator;
for (edge_iterator it=new_edges.begin(); it!=new_edges.end(); ++it)
{
@ -199,10 +200,19 @@ void copy_face_graph_impl(const SourceMesh& sm, TargetMesh& tm,
// we recover tm_v using the halfedge associated to the target vertex of
// the halfedge in sm corresponding to nh_t. This is working because we
// set the vertex halfedge pointer to the "same" halfedges.
tm_vertex_descriptor tm_v =
target( get(hs_to_ht, halfedge(target(get(ht_to_hs, nh_t), sm), sm)), tm);
for(tm_halfedge_descriptor ht : halfedges_around_target(nh_t, tm))
set_target(ht, tm_v, tm);
sm_vertex_descriptor vs = target(get(ht_to_hs, nh_t), sm);
sm_halfedge_descriptor hs = halfedge(vs, sm);
if (hs == boost::graph_traits<SourceMesh>::null_halfedge())
{ // special case for Face_filtered_graph with a non-manifold input with not all umbrellas selected
nm_umbrella_map[vs].push_back(nh_t);
}
else
{
tm_vertex_descriptor tm_v = target( get(hs_to_ht, hs), tm);
for(tm_halfedge_descriptor ht : halfedges_around_target(nh_t, tm))
set_target(ht, tm_v, tm);
}
}
nh_t = opposite(nh_t, tm);
}
@ -210,6 +220,18 @@ void copy_face_graph_impl(const SourceMesh& sm, TargetMesh& tm,
break;
}
}
for (const auto& vs_and_hts : nm_umbrella_map)
{
sm_vertex_descriptor v_sm = vs_and_hts.first;
tm_vertex_descriptor v_tm = add_vertex(tm);
*v2v++=std::make_pair(v_sm, v_tm);
set_halfedge(v_tm, vs_and_hts.second.front(), tm);
put(tm_vpm, v_tm, conv(get(sm_vpm, v_sm)));
for (tm_halfedge_descriptor h_tm : vs_and_hts.second)
set_target(h_tm, v_tm, tm);
}
}
} // end of namespace internal

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script_with_options
# This is the CMake script for compiling a set of CGAL applications.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(BGL_Tests)
# CGAL and its components

View File

@ -579,6 +579,102 @@ void test_Polyhedron_tetrahedron()
test_mesh<Polyhedron, FCMap, Poly_Adapter>(poly_adapter);
}
void non_manifoldness_test1()
{
// works out-of-the-box because Face_filtered_graph handles already non-manifold cycles
SM mesh;
SM::Vertex_index v0=add_vertex(mesh);
SM::Vertex_index v1=add_vertex(mesh);
SM::Vertex_index v2=add_vertex(mesh);
SM::Vertex_index v3=add_vertex(mesh);
SM::Vertex_index v4=add_vertex(mesh);
SM::Vertex_index v5=add_vertex(mesh);
SM::Vertex_index v6=add_vertex(mesh);
SM::Face_index f0=mesh.add_face(v0,v1,v2);
SM::Face_index f1=mesh.add_face(v0,v3,v4);
SM::Face_index f2=mesh.add_face(v0,v5,v6);
SM::Halfedge_index h = halfedge(f0,mesh);
while(target(h, mesh)!=v0)
h=next(h,mesh);
set_halfedge(v0, h, mesh);
std::vector<SM::Face_index> selection = {f1, f2};
CGAL::Face_filtered_graph<SM> ffg(mesh, selection);
SM out;
CGAL::copy_face_graph(ffg, out);
assert(vertices(out).size()==5);
assert(faces(out).size()==2);
}
void non_manifoldness_test2()
{
SM mesh;
SM::Vertex_index v0=add_vertex(mesh);
SM::Vertex_index v0b=add_vertex(mesh);
SM::Vertex_index v0t=add_vertex(mesh);
SM::Vertex_index v1=add_vertex(mesh);
SM::Vertex_index v2=add_vertex(mesh);
SM::Vertex_index v3=add_vertex(mesh);
SM::Vertex_index v4=add_vertex(mesh);
SM::Vertex_index v5=add_vertex(mesh);
SM::Vertex_index v6=add_vertex(mesh);
SM::Vertex_index v7=add_vertex(mesh);
SM::Vertex_index v8=add_vertex(mesh);
SM::Vertex_index v9=add_vertex(mesh);
SM::Face_index f00=mesh.add_face(v1,v2,v0);
SM::Face_index f01=mesh.add_face(v2,v3,v0);
SM::Face_index f02=mesh.add_face(v3,v1,v0);
SM::Face_index f10=mesh.add_face(v4,v5,v0b);
SM::Face_index f11=mesh.add_face(v5,v6,v0b);
SM::Face_index f12=mesh.add_face(v6,v4,v0b);
SM::Face_index f20=mesh.add_face(v7,v8,v0t);
SM::Face_index f21=mesh.add_face(v8,v9,v0t);
SM::Face_index f22=mesh.add_face(v9,v7,v0t);
assert(f00!=SM::Face_index());
assert(f01!=SM::Face_index());
assert(f02!=SM::Face_index());
assert(f10!=SM::Face_index());
assert(f11!=SM::Face_index());
assert(f12!=SM::Face_index());
assert(f20!=SM::Face_index());
assert(f21!=SM::Face_index());
assert(f22!=SM::Face_index());
#define UPDATE_V(fX, vX) \
{ SM::Halfedge_index h = halfedge(fX,mesh);\
while(target(h, mesh)!=vX) h=next(h,mesh);\
set_target(h, v0, mesh); }
UPDATE_V(f10, v0b)
UPDATE_V(f11, v0b)
UPDATE_V(f12, v0b)
UPDATE_V(f20, v0t)
UPDATE_V(f21, v0t)
UPDATE_V(f22, v0t)
remove_vertex(v0b, mesh);
remove_vertex(v0t, mesh);
std::vector<SM::Face_index> selection = {f10, f11, f12, f20, f21, f22};
CGAL::Face_filtered_graph<SM> ffg(mesh, selection);
SM out;
CGAL::copy_face_graph(ffg, out);
assert(vertices(out).size()==7);
assert(faces(out).size()==6);
}
int main(int, char**)
{
test_graph_range(poly_data());
@ -590,6 +686,8 @@ int main(int, char**)
#endif
test_invalid_selections();
non_manifoldness_test1();
non_manifoldness_test2();
test_SM_tetrahedron();
test_Polyhedron_tetrahedron();

View File

@ -10,13 +10,29 @@ typedef Traits::edge_descriptor edge_descriptor;
typedef Traits::halfedge_descriptor halfedge_descriptor;
typedef Traits::vertex_descriptor vertex_descriptor;
typedef Traits::face_descriptor face_descriptor;
//typedef Kernel::Point_3 Point_3;
int main()
{
Om om;
for (Om::EdgeHandle ed : edges(om)) {
std::cout << "edge" << std::endl;
for (Om::EdgeHandle ed : edges(om))
{
CGAL_USE(ed);
}
for (edge_descriptor ed : edges(om))
{
CGAL_USE(ed);
}
for (halfedge_descriptor hd : halfedges(om))
{
CGAL_USE(hd);
}
for (face_descriptor fd : faces(om))
{
CGAL_USE(fd);
}
for (vertex_descriptor vd : vertices(om))
{
CGAL_USE(vd);
}
return 0;
}

View File

@ -3,7 +3,7 @@
project(Barycentric_coordinates_2_Benchmarks)
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
find_package(CGAL REQUIRED COMPONENTS Core)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script.
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Barycentric_coordinates_2_Examples)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script.
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Barycentric_coordinates_2_Tests)

View File

@ -6,7 +6,7 @@
# Used in /CGAL/Documentation/doc/Documentation/Developer_manual/create_and_use_a_cmakelist.txt.
# Careful when modifying
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Basic_viewer_Examples)
#CGAL_Qt6 is needed for the drawing.

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Boolean_set_operations_2_Examples)
find_package(CGAL REQUIRED COMPONENTS Core OPTIONAL_COMPONENTS Qt6)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Boolean_set_operations_2_Tests)
find_package(CGAL REQUIRED)

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Approximate_min_ellipsoid_d_Examples)
find_package(CGAL REQUIRED)

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Min_annulus_d_Examples)
find_package(CGAL REQUIRED)

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Min_circle_2_Examples)
find_package(CGAL REQUIRED)

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Min_ellipse_2_Examples)
find_package(CGAL REQUIRED)

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Min_quadrilateral_2_Examples)
find_package(CGAL REQUIRED)

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Min_sphere_d_Examples)
find_package(CGAL REQUIRED)

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Min_sphere_of_spheres_d_Examples)
find_package(CGAL REQUIRED)

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Rectangular_p_center_2_Examples)
find_package(CGAL REQUIRED)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Bounding_volumes_Tests)
find_package(CGAL REQUIRED COMPONENTS Core)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Box_intersection_d_Examples)
find_package(CGAL REQUIRED)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Box_intersection_d_Tests)
find_package(CGAL REQUIRED)

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Core_Examples)
# CGAL and its components

View File

@ -600,6 +600,7 @@ inline long longValue(const BigFloat& bf)
{
return bf.longValue();
}
//@}
} //namespace CORE

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(CGALimageIO_Examples)
find_package(CGAL REQUIRED COMPONENTS ImageIO)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(CGAL_ImageIO_Tests)
find_package(CGAL REQUIRED COMPONENTS ImageIO)

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(CGAL_ipelets_Demo)
if(NOT POLICY CMP0070 AND POLICY CMP0053)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(CGAL_ipelets_Tests)
find_package(CGAL REQUIRED)

View File

@ -1,7 +1,7 @@
# Top level CMakeLists.txt for CGAL-branchbuild
# Minimal version of CMake:
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
message("== CMake setup ==")
project(CGAL CXX C)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Circular_kernel_2_Examples)
find_package(CGAL REQUIRED)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Circular_kernel_2_Tests)
find_package(CGAL REQUIRED)

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Circular_kernel_3_Demo)
find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Circular_kernel_3_Examples)
find_package(CGAL REQUIRED)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Circular_kernel_3_Tests)
find_package(CGAL REQUIRED COMPONENTS Core)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Circulator_Examples)
find_package(CGAL REQUIRED)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Circulator_Tests)
find_package(CGAL REQUIRED)

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_CMakeLists
# This is the CMake script for compiling a set of CGAL applications.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Classification_Examples)
# CGAL and its components

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_CMakeLists
# This is the CMake script for compiling a set of CGAL applications.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Classification_Tests)
# CGAL and its components

View File

@ -1,7 +1,7 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.29)
cmake_minimum_required(VERSION 3.12...3.31)
project(Combinatorial_map_Examples)
find_package(CGAL REQUIRED)

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