mirror of https://github.com/CGAL/cgal
updated cmakelists, refactored free functions for non eigen coordinates, fixed several warnings
This commit is contained in:
parent
eb90c3adda
commit
c11ce6c33a
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
project(Barycentric_coordinates_2_Benchmarks)
|
project(Barycentric_coordinates_2_Benchmarks)
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 2.8.10)
|
cmake_minimum_required(VERSION 3.1...3.15)
|
||||||
set(CMAKE_CXX_STANDARD 14)
|
set(CMAKE_CXX_STANDARD 14)
|
||||||
|
|
||||||
find_package(CGAL QUIET COMPONENTS Core)
|
find_package(CGAL QUIET COMPONENTS Core)
|
||||||
|
|
@ -12,33 +12,25 @@ if(CGAL_FOUND)
|
||||||
include(${CGAL_USE_FILE})
|
include(${CGAL_USE_FILE})
|
||||||
include(CGAL_CreateSingleSourceCGALProgram)
|
include(CGAL_CreateSingleSourceCGALProgram)
|
||||||
|
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("benchmark_segment_coordinates.cpp")
|
||||||
"benchmark_segment_coordinates.cpp")
|
create_single_source_cgal_program("benchmark_triangle_coordinates.cpp")
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("benchmark_polygon_4_vertices.cpp")
|
||||||
"benchmark_triangle_coordinates.cpp")
|
create_single_source_cgal_program("benchmark_polygon_16_vertices.cpp")
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("benchmark_polygon_100_vertices.cpp")
|
||||||
"benchmark_polygon_4_vertices.cpp")
|
create_single_source_cgal_program("benchmark_mv_34_vertices.cpp")
|
||||||
create_single_source_cgal_program(
|
|
||||||
"benchmark_polygon_16_vertices.cpp")
|
|
||||||
create_single_source_cgal_program(
|
|
||||||
"benchmark_polygon_100_vertices.cpp")
|
|
||||||
create_single_source_cgal_program(
|
|
||||||
"benchmark_mv_34_vertices.cpp")
|
|
||||||
|
|
||||||
find_package(Eigen3 REQUIRED)
|
find_package(Eigen3 REQUIRED)
|
||||||
if(EIGEN3_FOUND)
|
include(CGAL_Eigen3_support)
|
||||||
include(${EIGEN3_USE_FILE})
|
if(TARGET CGAL::Eigen3_support)
|
||||||
|
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("benchmark_hm_4_vertices.cpp")
|
||||||
"benchmark_hm_4_vertices.cpp")
|
target_link_libraries(benchmark_hm_4_vertices PUBLIC CGAL::Eigen3_support)
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("benchmark_hm_n_vertices.cpp")
|
||||||
"benchmark_hm_n_vertices.cpp")
|
target_link_libraries(benchmark_hm_n_vertices PUBLIC CGAL::Eigen3_support)
|
||||||
|
|
||||||
else()
|
else()
|
||||||
message(WARNING
|
message(WARNING "Several coordinates require the Eigen library, and will not be compiled.")
|
||||||
"Harmonic coordinates require the Eigen library, and will not be compiled.")
|
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
message(WARNING
|
message(WARNING "This program requires the CGAL library, and will not be compiled.")
|
||||||
"This program requires the CGAL library, and will not be compiled.")
|
|
||||||
endif()
|
endif()
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
project(Barycentric_coordinates_2_Examples)
|
project(Barycentric_coordinates_2_Examples)
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 2.8.10)
|
cmake_minimum_required(VERSION 3.1...3.15)
|
||||||
set(CMAKE_CXX_STANDARD 14)
|
set(CMAKE_CXX_STANDARD 14)
|
||||||
|
|
||||||
find_package(CGAL QUIET COMPONENTS Core)
|
find_package(CGAL QUIET COMPONENTS Core)
|
||||||
|
|
@ -12,43 +12,34 @@ if(CGAL_FOUND)
|
||||||
include(${CGAL_USE_FILE})
|
include(${CGAL_USE_FILE})
|
||||||
include(CGAL_CreateSingleSourceCGALProgram)
|
include(CGAL_CreateSingleSourceCGALProgram)
|
||||||
|
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("segment_coordinates.cpp")
|
||||||
"segment_coordinates.cpp")
|
create_single_source_cgal_program("triangle_coordinates.cpp")
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("wachspress_coordinates.cpp")
|
||||||
"triangle_coordinates.cpp")
|
create_single_source_cgal_program("mean_value_coordinates.cpp")
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("discrete_harmonic_coordinates.cpp")
|
||||||
"wachspress_coordinates.cpp")
|
|
||||||
create_single_source_cgal_program(
|
|
||||||
"mean_value_coordinates.cpp")
|
|
||||||
create_single_source_cgal_program(
|
|
||||||
"discrete_harmonic_coordinates.cpp")
|
|
||||||
|
|
||||||
# missing:
|
# missing:
|
||||||
# construct_centroid_2
|
# construct_centroid_2
|
||||||
# in projection traits
|
# in projection traits
|
||||||
# create_single_source_cgal_program(
|
# create_single_source_cgal_program("terrain_height_modeling.cpp")
|
||||||
# "terrain_height_modeling.cpp")
|
|
||||||
|
|
||||||
# this code is deprecated:
|
# this code is deprecated:
|
||||||
# create_single_source_cgal_program(
|
# create_single_source_cgal_program("deprecated_coordinates.cpp")
|
||||||
# "deprecated_coordinates.cpp")
|
|
||||||
|
|
||||||
find_package(Eigen3 REQUIRED)
|
find_package(Eigen3 REQUIRED)
|
||||||
if(EIGEN3_FOUND)
|
include(CGAL_Eigen3_support)
|
||||||
include(${EIGEN3_USE_FILE})
|
if(TARGET CGAL::Eigen3_support)
|
||||||
|
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("affine_coordinates.cpp")
|
||||||
"affine_coordinates.cpp")
|
target_link_libraries(affine_coordinates PUBLIC CGAL::Eigen3_support)
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("harmonic_coordinates.cpp")
|
||||||
"harmonic_coordinates.cpp")
|
target_link_libraries(harmonic_coordinates PUBLIC CGAL::Eigen3_support)
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("shape_deformation.cpp")
|
||||||
"shape_deformation.cpp")
|
target_link_libraries(shape_deformation PUBLIC CGAL::Eigen3_support)
|
||||||
|
|
||||||
else()
|
else()
|
||||||
message(WARNING
|
message(WARNING "Several coordinates require the Eigen library, and will not be compiled.")
|
||||||
"Harmonic/Affine coordinates require the Eigen library, and will not be compiled.")
|
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
message(WARNING
|
message(WARNING "This program requires the CGAL library, and will not be compiled.")
|
||||||
"This program requires the CGAL library, and will not be compiled.")
|
|
||||||
endif()
|
endif()
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
#include <CGAL/Projection_traits_xy_3.h>
|
#include <CGAL/Projection_traits_xy_3.h>
|
||||||
#include <CGAL/interpolation_functions.h>
|
#include <CGAL/interpolation_functions.h>
|
||||||
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
||||||
#include <CGAL/Barycentric_coordinates_2.h>
|
#include <CGAL/Barycentric_coordinates_2/Delaunay_domain_2.h>
|
||||||
|
#include <CGAL/Barycentric_coordinates_2/Mean_value_coordinates_2.h>
|
||||||
|
|
||||||
// Typedefs.
|
// Typedefs.
|
||||||
using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
|
using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#include <CGAL/convex_hull_2.h>
|
#include <CGAL/convex_hull_2.h>
|
||||||
#include <CGAL/Simple_cartesian.h>
|
#include <CGAL/Simple_cartesian.h>
|
||||||
#include <CGAL/point_generators_2.h>
|
#include <CGAL/point_generators_2.h>
|
||||||
#include <CGAL/Barycentric_coordinates_2.h>
|
#include <CGAL/Barycentric_coordinates_2/Wachspress_coordinates_2.h>
|
||||||
|
|
||||||
// Typedefs.
|
// Typedefs.
|
||||||
using Kernel = CGAL::Simple_cartesian<double>;
|
using Kernel = CGAL::Simple_cartesian<double>;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
|
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
|
||||||
#include <CGAL/Barycentric_coordinates_2.h>
|
#include <CGAL/Barycentric_coordinates_2/boundary_coordinates_2.h>
|
||||||
|
#include <CGAL/Barycentric_coordinates_2/Discrete_harmonic_coordinates_2.h>
|
||||||
|
|
||||||
// Typedefs.
|
// Typedefs.
|
||||||
using Kernel = CGAL::Exact_predicates_exact_constructions_kernel;
|
using Kernel = CGAL::Exact_predicates_exact_constructions_kernel;
|
||||||
|
|
@ -48,7 +49,7 @@ int main() {
|
||||||
discrete_harmonic_2.weights(center, std::back_inserter(weights));
|
discrete_harmonic_2.weights(center, std::back_inserter(weights));
|
||||||
|
|
||||||
std::cout << std::endl << "discrete harmonic weights (center): ";
|
std::cout << std::endl << "discrete harmonic weights (center): ";
|
||||||
for (const FT weight : weights)
|
for (const FT& weight : weights)
|
||||||
std::cout << weight << " ";
|
std::cout << weight << " ";
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
|
|
||||||
|
|
@ -57,7 +58,7 @@ int main() {
|
||||||
discrete_harmonic_2(center, std::back_inserter(coordinates));
|
discrete_harmonic_2(center, std::back_inserter(coordinates));
|
||||||
|
|
||||||
std::cout << std::endl << "discrete harmonic coordinates (center): ";
|
std::cout << std::endl << "discrete harmonic coordinates (center): ";
|
||||||
for (const FT coordinate : coordinates)
|
for (const FT& coordinate : coordinates)
|
||||||
std::cout << coordinate << " ";
|
std::cout << coordinate << " ";
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
|
|
||||||
|
|
@ -105,7 +106,7 @@ int main() {
|
||||||
square, e4, std::back_inserter(coordinates), kernel, point_map);
|
square, e4, std::back_inserter(coordinates), kernel, point_map);
|
||||||
|
|
||||||
std::cout << std::endl << "boundary coordinates (edge 2 and edge 4): ";
|
std::cout << std::endl << "boundary coordinates (edge 2 and edge 4): ";
|
||||||
for (const FT coordinate : coordinates)
|
for (const FT& coordinate : coordinates)
|
||||||
std::cout << coordinate << " ";
|
std::cout << coordinate << " ";
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
|
|
||||||
|
|
@ -144,7 +145,7 @@ int main() {
|
||||||
discrete_harmonic_2(r, std::back_inserter(coordinates));
|
discrete_harmonic_2(r, std::back_inserter(coordinates));
|
||||||
|
|
||||||
std::cout << std::endl << "discrete harmonic coordinates (exterior): ";
|
std::cout << std::endl << "discrete harmonic coordinates (exterior): ";
|
||||||
for (const FT coordinate : coordinates)
|
for (const FT& coordinate : coordinates)
|
||||||
std::cout << coordinate << " ";
|
std::cout << coordinate << " ";
|
||||||
std::cout << std::endl << std::endl;
|
std::cout << std::endl << std::endl;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
||||||
#include <CGAL/Barycentric_coordinates_2.h>
|
#include <CGAL/Barycentric_coordinates_2/Mean_value_coordinates_2.h>
|
||||||
|
|
||||||
// Typedefs.
|
// Typedefs.
|
||||||
using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
|
using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
|
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
|
||||||
#include <CGAL/Barycentric_coordinates_2.h>
|
#include <CGAL/Barycentric_coordinates_2/segment_coordinates_2.h>
|
||||||
|
|
||||||
// Typedefs.
|
// Typedefs.
|
||||||
using Kernel = CGAL::Exact_predicates_exact_constructions_kernel;
|
using Kernel = CGAL::Exact_predicates_exact_constructions_kernel;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
#include <CGAL/Simple_cartesian.h>
|
#include <CGAL/Simple_cartesian.h>
|
||||||
#include <CGAL/Barycentric_coordinates_2.h>
|
#include <CGAL/Barycentric_coordinates_2/triangle_coordinates_2.h>
|
||||||
|
|
||||||
// Typedefs.
|
// Typedefs.
|
||||||
using Kernel = CGAL::Simple_cartesian<double>;
|
using Kernel = CGAL::Simple_cartesian<double>;
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,10 @@
|
||||||
// #include <CGAL/Barycentric_coordinates_2/Deprecated_headers_2.h>
|
// #include <CGAL/Barycentric_coordinates_2/Deprecated_headers_2.h>
|
||||||
|
|
||||||
// Internal includes.
|
// Internal includes.
|
||||||
|
#include <CGAL/Barycentric_coordinates_2/segment_coordinates_2.h>
|
||||||
|
#include <CGAL/Barycentric_coordinates_2/triangle_coordinates_2.h>
|
||||||
|
#include <CGAL/Barycentric_coordinates_2/boundary_coordinates_2.h>
|
||||||
|
|
||||||
#include <CGAL/Barycentric_coordinates_2/Delaunay_domain_2.h>
|
#include <CGAL/Barycentric_coordinates_2/Delaunay_domain_2.h>
|
||||||
#include <CGAL/Barycentric_coordinates_2/Wachspress_coordinates_2.h>
|
#include <CGAL/Barycentric_coordinates_2/Wachspress_coordinates_2.h>
|
||||||
#include <CGAL/Barycentric_coordinates_2/Discrete_harmonic_coordinates_2.h>
|
#include <CGAL/Barycentric_coordinates_2/Discrete_harmonic_coordinates_2.h>
|
||||||
|
|
@ -38,957 +42,6 @@
|
||||||
namespace CGAL {
|
namespace CGAL {
|
||||||
namespace Barycentric_coordinates {
|
namespace Barycentric_coordinates {
|
||||||
|
|
||||||
/*!
|
|
||||||
\ingroup PkgBarycentricCoordinates2RefFunctions
|
|
||||||
|
|
||||||
\brief computes segment coordinates.
|
|
||||||
|
|
||||||
This function computes barycentric coordinates at a given `query` point
|
|
||||||
with respect to the end points `p0` and `p1` of a segment that is one
|
|
||||||
coordinate per end point. The coordinates are stored in a destination range
|
|
||||||
beginning at `c_begin`.
|
|
||||||
|
|
||||||
After the coordinates \f$b_0\f$ and \f$b_1\f$ are computed, the query point \f$q\f$ can be
|
|
||||||
obtained as \f$q = b_0p_0 + b_1p_1\f$. If \f$q\f$ does not belong to the line through \f$p_0\f$
|
|
||||||
and \f$p_1\f$, it is projected onto this line, and only then the coordinates are
|
|
||||||
computed. See more details in the user manual \ref compute_seg_coord "here".
|
|
||||||
|
|
||||||
\tparam OutIterator
|
|
||||||
a model of `OutputIterator` that accepts values of type `GeomTraits::FT`
|
|
||||||
|
|
||||||
\tparam GeomTraits
|
|
||||||
a model of `BarycentricTraits_2`
|
|
||||||
|
|
||||||
\param p0
|
|
||||||
the first vertex of a segment
|
|
||||||
|
|
||||||
\param p1
|
|
||||||
the second vertex of a segment
|
|
||||||
|
|
||||||
\param query
|
|
||||||
a query point
|
|
||||||
|
|
||||||
\param c_begin
|
|
||||||
the beginning of the destination range with the computed coordinates
|
|
||||||
|
|
||||||
\param traits
|
|
||||||
a traits class with geometric objects, predicates, and constructions;
|
|
||||||
this parameter can be omitted if the traits class can be deduced from the point type
|
|
||||||
|
|
||||||
\return an output iterator to the element in the destination range,
|
|
||||||
one past the last coordinate stored
|
|
||||||
|
|
||||||
\pre p0 != p1
|
|
||||||
*/
|
|
||||||
template<
|
|
||||||
typename OutIterator,
|
|
||||||
typename GeomTraits>
|
|
||||||
OutIterator segment_coordinates_2(
|
|
||||||
const typename GeomTraits::Point_2& p0,
|
|
||||||
const typename GeomTraits::Point_2& p1,
|
|
||||||
const typename GeomTraits::Point_2& query,
|
|
||||||
OutIterator c_begin,
|
|
||||||
const GeomTraits& traits) {
|
|
||||||
|
|
||||||
return internal::linear_coordinates_2(
|
|
||||||
p0, p1, query, c_begin, traits);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \cond SKIP_IN_MANUAL
|
|
||||||
template<
|
|
||||||
typename Point_2,
|
|
||||||
typename OutIterator>
|
|
||||||
OutIterator segment_coordinates_2(
|
|
||||||
const Point_2& p0,
|
|
||||||
const Point_2& p1,
|
|
||||||
const Point_2& query,
|
|
||||||
OutIterator c_begin) {
|
|
||||||
|
|
||||||
using GeomTraits = typename Kernel_traits<Point_2>::Kernel;
|
|
||||||
const GeomTraits traits;
|
|
||||||
return segment_coordinates_2(
|
|
||||||
p0, p1, query, c_begin, traits);
|
|
||||||
}
|
|
||||||
/// \endcond
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\ingroup PkgBarycentricCoordinates2RefFunctions
|
|
||||||
|
|
||||||
\brief computes segment coordinates.
|
|
||||||
|
|
||||||
This function computes barycentric coordinates at a given `query` point
|
|
||||||
with respect to the end points `p0` and `p1` of a segment that is one
|
|
||||||
coordinate per end point. The coordinates are returned in a pair.
|
|
||||||
|
|
||||||
After the coordinates \f$b_0\f$ and \f$b_1\f$ are computed, the query point \f$q\f$ can be
|
|
||||||
obtained as \f$q = b_0p_0 + b_1p_1\f$. If \f$q\f$ does not belong to the line through \f$p_0\f$
|
|
||||||
and \f$p_1\f$, it is projected onto this line, and only then the coordinates are
|
|
||||||
computed. See more details in the user manual \ref compute_seg_coord "here".
|
|
||||||
|
|
||||||
\tparam GeomTraits
|
|
||||||
a model of `BarycentricTraits_2`
|
|
||||||
|
|
||||||
\param p0
|
|
||||||
the first vertex of a segment
|
|
||||||
|
|
||||||
\param p1
|
|
||||||
the second vertex of a segment
|
|
||||||
|
|
||||||
\param query
|
|
||||||
a query point
|
|
||||||
|
|
||||||
\param traits
|
|
||||||
a traits class with geometric objects, predicates, and constructions;
|
|
||||||
this parameter can be omitted if the traits class can be deduced from the point type
|
|
||||||
|
|
||||||
\return a pair `std::pair<GeomTraits::FT, GeomTraits::FT>`
|
|
||||||
with the computed coordinates
|
|
||||||
|
|
||||||
\pre p0 != p1
|
|
||||||
*/
|
|
||||||
template<typename GeomTraits>
|
|
||||||
std::pair<
|
|
||||||
typename GeomTraits::FT,
|
|
||||||
typename GeomTraits::FT>
|
|
||||||
segment_coordinates_in_pair_2(
|
|
||||||
const typename GeomTraits::Point_2& p0,
|
|
||||||
const typename GeomTraits::Point_2& p1,
|
|
||||||
const typename GeomTraits::Point_2& query,
|
|
||||||
const GeomTraits& traits) {
|
|
||||||
|
|
||||||
using FT = typename GeomTraits::FT;
|
|
||||||
std::vector<FT> coordinates;
|
|
||||||
coordinates.reserve(2);
|
|
||||||
internal::linear_coordinates_2(
|
|
||||||
p0, p1, query, std::back_inserter(coordinates), traits);
|
|
||||||
CGAL_assertion(coordinates.size() == 2);
|
|
||||||
return std::make_pair(coordinates[0], coordinates[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \cond SKIP_IN_MANUAL
|
|
||||||
template<typename Point_2>
|
|
||||||
std::pair<
|
|
||||||
typename Kernel_traits<Point_2>::Kernel::FT,
|
|
||||||
typename Kernel_traits<Point_2>::Kernel::FT>
|
|
||||||
segment_coordinates_in_pair_2(
|
|
||||||
const Point_2& p0,
|
|
||||||
const Point_2& p1,
|
|
||||||
const Point_2& query) {
|
|
||||||
|
|
||||||
using GeomTraits = typename Kernel_traits<Point_2>::Kernel;
|
|
||||||
const GeomTraits traits;
|
|
||||||
return segment_coordinates_in_pair_2(
|
|
||||||
p0, p1, query, traits);
|
|
||||||
}
|
|
||||||
/// \endcond
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\ingroup PkgBarycentricCoordinates2RefFunctions
|
|
||||||
|
|
||||||
\brief computes triangle coordinates.
|
|
||||||
|
|
||||||
This function computes barycentric coordinates at a given `query` point
|
|
||||||
with respect to the points `p0`, `p1`, and `p2`, which form a triangle, that is one
|
|
||||||
coordinate per point. The coordinates are stored in a destination range
|
|
||||||
beginning at `c_begin`.
|
|
||||||
|
|
||||||
After the coordinates \f$b_0\f$, \f$b_1\f$, and \f$b_2\f$ are computed, the query
|
|
||||||
point \f$q\f$ can be obtained as \f$q = b_0p_0 + b_1p_1 + b_2p_2\f$. See more details
|
|
||||||
in the user manual \ref compute_tri_coord "here".
|
|
||||||
|
|
||||||
\tparam OutIterator
|
|
||||||
a model of `OutputIterator` that accepts values of type `GeomTraits::FT`
|
|
||||||
|
|
||||||
\tparam GeomTraits
|
|
||||||
a model of `BarycentricTraits_2`
|
|
||||||
|
|
||||||
\param p0
|
|
||||||
the first vertex of a triangle
|
|
||||||
|
|
||||||
\param p1
|
|
||||||
the second vertex of a triangle
|
|
||||||
|
|
||||||
\param p2
|
|
||||||
the third vertex of a triangle
|
|
||||||
|
|
||||||
\param query
|
|
||||||
a query point
|
|
||||||
|
|
||||||
\param c_begin
|
|
||||||
the beginning of the destination range with the computed coordinates
|
|
||||||
|
|
||||||
\param traits
|
|
||||||
a traits class with geometric objects, predicates, and constructions;
|
|
||||||
this parameter can be omitted if the traits class can be deduced from the point type
|
|
||||||
|
|
||||||
\return an output iterator to the element in the destination range,
|
|
||||||
one past the last coordinate stored
|
|
||||||
|
|
||||||
\pre area_2(p0, p1, p2) != 0
|
|
||||||
*/
|
|
||||||
template<
|
|
||||||
typename OutIterator,
|
|
||||||
typename GeomTraits>
|
|
||||||
OutIterator triangle_coordinates_2(
|
|
||||||
const typename GeomTraits::Point_2& p0,
|
|
||||||
const typename GeomTraits::Point_2& p1,
|
|
||||||
const typename GeomTraits::Point_2& p2,
|
|
||||||
const typename GeomTraits::Point_2& query,
|
|
||||||
OutIterator c_begin,
|
|
||||||
const GeomTraits& traits) {
|
|
||||||
|
|
||||||
return internal::planar_coordinates_2(
|
|
||||||
p0, p1, p2, query, c_begin, traits);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \cond SKIP_IN_MANUAL
|
|
||||||
template<
|
|
||||||
typename Point_2,
|
|
||||||
typename OutIterator>
|
|
||||||
OutIterator triangle_coordinates_2(
|
|
||||||
const Point_2& p0,
|
|
||||||
const Point_2& p1,
|
|
||||||
const Point_2& p2,
|
|
||||||
const Point_2& query,
|
|
||||||
OutIterator c_begin) {
|
|
||||||
|
|
||||||
using GeomTraits = typename Kernel_traits<Point_2>::Kernel;
|
|
||||||
const GeomTraits traits;
|
|
||||||
return triangle_coordinates_2(
|
|
||||||
p0, p1, p2, query, c_begin, traits);
|
|
||||||
}
|
|
||||||
/// \endcond
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\ingroup PkgBarycentricCoordinates2RefFunctions
|
|
||||||
|
|
||||||
\brief computes triangle coordinates.
|
|
||||||
|
|
||||||
This function computes barycentric coordinates at a given `query` point
|
|
||||||
with respect to the points `p0`, `p1`, and `p2`, which form a triangle, that is one
|
|
||||||
coordinate per point. The coordinates are returned in a tuple.
|
|
||||||
|
|
||||||
After the coordinates \f$b_0\f$, \f$b_1\f$, and \f$b_2\f$ are computed, the query
|
|
||||||
point \f$q\f$ can be obtained as \f$q = b_0p_0 + b_1p_1 + b_2p_2\f$. See more details
|
|
||||||
in the user manual \ref compute_tri_coord "here".
|
|
||||||
|
|
||||||
\tparam GeomTraits
|
|
||||||
a model of `BarycentricTraits_2`
|
|
||||||
|
|
||||||
\param p0
|
|
||||||
the first vertex of a triangle
|
|
||||||
|
|
||||||
\param p1
|
|
||||||
the second vertex of a triangle
|
|
||||||
|
|
||||||
\param p2
|
|
||||||
the third vertex of a triangle
|
|
||||||
|
|
||||||
\param query
|
|
||||||
a query point
|
|
||||||
|
|
||||||
\param traits
|
|
||||||
a traits class with geometric objects, predicates, and constructions;
|
|
||||||
this parameter can be omitted if the traits class can be deduced from the point type
|
|
||||||
|
|
||||||
\return a tuple `std::tuple<GeomTraits::FT, GeomTraits::FT, GeomTraits::FT>`
|
|
||||||
with the computed coordinates
|
|
||||||
|
|
||||||
\pre area_2(p0, p1, p2) != 0
|
|
||||||
*/
|
|
||||||
template<typename GeomTraits>
|
|
||||||
std::tuple<
|
|
||||||
typename GeomTraits::FT,
|
|
||||||
typename GeomTraits::FT,
|
|
||||||
typename GeomTraits::FT>
|
|
||||||
triangle_coordinates_in_tuple_2(
|
|
||||||
const typename GeomTraits::Point_2& p0,
|
|
||||||
const typename GeomTraits::Point_2& p1,
|
|
||||||
const typename GeomTraits::Point_2& p2,
|
|
||||||
const typename GeomTraits::Point_2& query,
|
|
||||||
const GeomTraits& traits) {
|
|
||||||
|
|
||||||
using FT = typename GeomTraits::FT;
|
|
||||||
std::vector<FT> coordinates;
|
|
||||||
coordinates.reserve(3);
|
|
||||||
internal::planar_coordinates_2(
|
|
||||||
p0, p1, p2, query, std::back_inserter(coordinates), traits);
|
|
||||||
CGAL_assertion(coordinates.size() == 3);
|
|
||||||
return std::make_tuple(coordinates[0], coordinates[1], coordinates[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \cond SKIP_IN_MANUAL
|
|
||||||
template<typename Point_2>
|
|
||||||
std::tuple<
|
|
||||||
typename Kernel_traits<Point_2>::Kernel::FT,
|
|
||||||
typename Kernel_traits<Point_2>::Kernel::FT,
|
|
||||||
typename Kernel_traits<Point_2>::Kernel::FT>
|
|
||||||
triangle_coordinates_in_tuple_2(
|
|
||||||
const Point_2& p0,
|
|
||||||
const Point_2& p1,
|
|
||||||
const Point_2& p2,
|
|
||||||
const Point_2& query) {
|
|
||||||
|
|
||||||
using GeomTraits = typename Kernel_traits<Point_2>::Kernel;
|
|
||||||
const GeomTraits traits;
|
|
||||||
return triangle_coordinates_in_tuple_2(
|
|
||||||
p0, p1, p2, query, traits);
|
|
||||||
}
|
|
||||||
/// \endcond
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\ingroup PkgBarycentricCoordinates2RefFunctions
|
|
||||||
|
|
||||||
\brief computes 2D boundary coordinates.
|
|
||||||
|
|
||||||
This function computes boundary barycentric coordinates at a given `query` point
|
|
||||||
with respect to the vertices of a simple `polygon`, that is one
|
|
||||||
coordinate per vertex. The coordinates are stored in a destination range
|
|
||||||
beginning at `c_begin`.
|
|
||||||
|
|
||||||
If `query` is at the vertex, the corresponding coordinate is set to one, while
|
|
||||||
all other coordinates are zero. If `query` is on the edge, the two corresponding
|
|
||||||
coordinates are segment coordinates, while all other coordinates are set to zero.
|
|
||||||
If `query` is not on the boundary, all the coordinates are set to zero.
|
|
||||||
|
|
||||||
Internally, `segment_coordinates_2()` are used.
|
|
||||||
|
|
||||||
\tparam VertexRange
|
|
||||||
a model of `ConstRange` whose iterator type is `RandomAccessIterator`
|
|
||||||
|
|
||||||
\tparam OutIterator
|
|
||||||
a model of `OutputIterator` that accepts values of type `GeomTraits::FT`
|
|
||||||
|
|
||||||
\tparam GeomTraits
|
|
||||||
a model of `BarycentricTraits_2`
|
|
||||||
|
|
||||||
\tparam PointMap
|
|
||||||
a model of `ReadablePropertyMap` whose key type is `VertexRange::value_type` and
|
|
||||||
value type is `GeomTraits::Point_2`
|
|
||||||
|
|
||||||
\param polygon
|
|
||||||
an instance of `VertexRange` with 2D points, which form a simple polygon
|
|
||||||
|
|
||||||
\param query
|
|
||||||
a query point
|
|
||||||
|
|
||||||
\param c_begin
|
|
||||||
the beginning of the destination range with the computed coordinates
|
|
||||||
|
|
||||||
\param traits
|
|
||||||
a traits class with geometric objects, predicates, and constructions;
|
|
||||||
this parameter can be omitted if the traits class can be deduced from the point type
|
|
||||||
|
|
||||||
\param point_map
|
|
||||||
an instance of `PointMap` that maps a vertex from `polygon` to `Point_2`
|
|
||||||
|
|
||||||
\return an output iterator to the element in the destination range,
|
|
||||||
one past the last coordinate stored + the flag indicating whether the
|
|
||||||
query point belongs to the polygon boundary
|
|
||||||
|
|
||||||
\pre polygon.size() >= 3
|
|
||||||
*/
|
|
||||||
template<
|
|
||||||
typename VertexRange,
|
|
||||||
typename OutIterator,
|
|
||||||
typename GeomTraits,
|
|
||||||
typename PointMap>
|
|
||||||
std::pair<OutIterator, bool> boundary_coordinates_2(
|
|
||||||
const VertexRange& polygon,
|
|
||||||
const typename GeomTraits::Point_2& query,
|
|
||||||
OutIterator c_begin,
|
|
||||||
const GeomTraits& traits,
|
|
||||||
const PointMap point_map) {
|
|
||||||
|
|
||||||
const auto result =
|
|
||||||
internal::locate_wrt_polygon_2(polygon, query, traits, point_map);
|
|
||||||
auto location = (*result).first;
|
|
||||||
auto index = (*result).second;
|
|
||||||
|
|
||||||
if (!result) {
|
|
||||||
index = std::size_t(-1);
|
|
||||||
location = internal::Query_point_location::UNSPECIFIED;
|
|
||||||
}
|
|
||||||
return internal::boundary_coordinates_2(
|
|
||||||
polygon, query, location, index, c_begin, traits, point_map);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\ingroup PkgBarycentricCoordinates2RefFunctions
|
|
||||||
|
|
||||||
\brief computes 2D boundary coordinates.
|
|
||||||
|
|
||||||
This is an overload of the function `boundary_coordinates_2`.
|
|
||||||
|
|
||||||
\tparam VertexRange
|
|
||||||
a model of `ConstRange` whose iterator type is `RandomAccessIterator`
|
|
||||||
|
|
||||||
\tparam Query_2
|
|
||||||
a model of `Kernel::Point_2`
|
|
||||||
|
|
||||||
\tparam OutIterator
|
|
||||||
a model of `OutputIterator` that accepts values of type `GeomTraits::FT`
|
|
||||||
|
|
||||||
\tparam PointMap
|
|
||||||
a model of `ReadablePropertyMap` whose key type is `VertexRange::value_type` and
|
|
||||||
value type is `Query_2`. The default is `CGAL::Identity_property_map`.
|
|
||||||
|
|
||||||
\param polygon
|
|
||||||
an instance of `VertexRange` with 2D points, which form a simple polygon
|
|
||||||
|
|
||||||
\param query
|
|
||||||
a query point
|
|
||||||
|
|
||||||
\param c_begin
|
|
||||||
the beginning of the destination range with the computed coordinates
|
|
||||||
|
|
||||||
\param point_map
|
|
||||||
an instance of `PointMap` that maps a vertex from `polygon` to `Query_2`;
|
|
||||||
the default initialization is provided
|
|
||||||
|
|
||||||
\return an output iterator to the element in the destination range,
|
|
||||||
one past the last coordinate stored + the flag indicating whether the
|
|
||||||
query point belongs to the polygon boundary
|
|
||||||
|
|
||||||
\pre polygon.size() >= 3
|
|
||||||
*/
|
|
||||||
template<
|
|
||||||
typename VertexRange,
|
|
||||||
typename Query_2,
|
|
||||||
typename OutIterator,
|
|
||||||
typename PointMap = CGAL::Identity_property_map<Query_2> >
|
|
||||||
std::pair<OutIterator, bool> boundary_coordinates_2(
|
|
||||||
const VertexRange& polygon,
|
|
||||||
const Query_2& query,
|
|
||||||
OutIterator c_begin,
|
|
||||||
const PointMap point_map = PointMap()) {
|
|
||||||
|
|
||||||
using GeomTraits = typename Kernel_traits<Query_2>::Kernel;
|
|
||||||
const GeomTraits traits;
|
|
||||||
return boundary_coordinates_2(
|
|
||||||
polygon, query, c_begin, traits, point_map);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\ingroup PkgBarycentricCoordinates2RefFunctions
|
|
||||||
|
|
||||||
\brief computes 2D Wachspress weights.
|
|
||||||
|
|
||||||
This function computes 2D Wachspress weights at a given `query` point
|
|
||||||
with respect to the vertices of a strictly convex `polygon`, that is one
|
|
||||||
weight per vertex. The weights are stored in a destination range
|
|
||||||
beginning at `w_begin`.
|
|
||||||
|
|
||||||
Internally, the class `Wachspress_coordinates_2` is used. If one wants to process
|
|
||||||
multiple query points, it is better to use that class. When using the free function,
|
|
||||||
internal memory is allocated for each query point, while when using the class,
|
|
||||||
it is allocated only once, which is much more efficient. However, for a few query
|
|
||||||
points, it is easier to use this function. It can also be used when the processing
|
|
||||||
time is not a concern.
|
|
||||||
|
|
||||||
\tparam PointRange
|
|
||||||
a model of `ConstRange` whose iterator type is `RandomAccessIterator`
|
|
||||||
and value type is `GeomTraits::Point_2`
|
|
||||||
|
|
||||||
\tparam OutIterator
|
|
||||||
a model of `OutputIterator` that accepts values of type `GeomTraits::FT`
|
|
||||||
|
|
||||||
\tparam GeomTraits
|
|
||||||
a model of `BarycentricTraits_2`
|
|
||||||
|
|
||||||
\param polygon
|
|
||||||
an instance of `PointRange` with 2D points, which form a strictly convex polygon
|
|
||||||
|
|
||||||
\param query
|
|
||||||
a query point
|
|
||||||
|
|
||||||
\param w_begin
|
|
||||||
the beginning of the destination range with the computed weights
|
|
||||||
|
|
||||||
\param traits
|
|
||||||
a traits class with geometric objects, predicates, and constructions;
|
|
||||||
this parameter can be omitted if the traits class can be deduced from the point type
|
|
||||||
|
|
||||||
\param policy
|
|
||||||
one of the `Computation_policy_2`;
|
|
||||||
the default is `Computation_policy_2::FAST_WITH_EDGE_CASES`
|
|
||||||
|
|
||||||
\return an output iterator to the element in the destination range,
|
|
||||||
one past the last weight stored
|
|
||||||
|
|
||||||
\pre polygon.size() >= 3
|
|
||||||
\pre polygon is simple
|
|
||||||
\pre polygon is strictly convex
|
|
||||||
*/
|
|
||||||
template<
|
|
||||||
typename PointRange,
|
|
||||||
typename OutIterator,
|
|
||||||
typename GeomTraits>
|
|
||||||
OutIterator wachspress_weights_2(
|
|
||||||
const PointRange& polygon,
|
|
||||||
const typename GeomTraits::Point_2& query,
|
|
||||||
OutIterator w_begin,
|
|
||||||
const GeomTraits& traits,
|
|
||||||
const Computation_policy_2 policy =
|
|
||||||
Computation_policy_2::FAST_WITH_EDGE_CASES) {
|
|
||||||
|
|
||||||
Wachspress_coordinates_2<PointRange, GeomTraits> wachspress(
|
|
||||||
polygon, policy, traits);
|
|
||||||
return wachspress.weights(query, w_begin);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \cond SKIP_IN_MANUAL
|
|
||||||
template<
|
|
||||||
typename PointRange,
|
|
||||||
typename Point_2,
|
|
||||||
typename OutIterator>
|
|
||||||
OutIterator wachspress_weights_2(
|
|
||||||
const PointRange& polygon,
|
|
||||||
const Point_2& query,
|
|
||||||
OutIterator w_begin,
|
|
||||||
const Computation_policy_2 policy =
|
|
||||||
Computation_policy_2::FAST_WITH_EDGE_CASES) {
|
|
||||||
|
|
||||||
using GeomTraits = typename Kernel_traits<Point_2>::Kernel;
|
|
||||||
const GeomTraits traits;
|
|
||||||
return wachspress_weights_2(
|
|
||||||
polygon, query, w_begin, traits, policy);
|
|
||||||
}
|
|
||||||
/// \endcond
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\ingroup PkgBarycentricCoordinates2RefFunctions
|
|
||||||
|
|
||||||
\brief computes 2D Wachspress coordinates.
|
|
||||||
|
|
||||||
This function computes 2D Wachspress coordinates at a given `query` point
|
|
||||||
with respect to the vertices of a strictly convex `polygon`, that is one
|
|
||||||
coordinate per vertex. The coordinates are stored in a destination range
|
|
||||||
beginning at `c_begin`.
|
|
||||||
|
|
||||||
Internally, the class `Wachspress_coordinates_2` is used. If one wants to process
|
|
||||||
multiple query points, it is better to use that class. When using the free function,
|
|
||||||
internal memory is allocated for each query point, while when using the class,
|
|
||||||
it is allocated only once, which is much more efficient. However, for a few query
|
|
||||||
points, it is easier to use this function. It can also be used when the processing
|
|
||||||
time is not a concern.
|
|
||||||
|
|
||||||
\tparam PointRange
|
|
||||||
a model of `ConstRange` whose iterator type is `RandomAccessIterator`
|
|
||||||
and value type is `GeomTraits::Point_2`
|
|
||||||
|
|
||||||
\tparam OutIterator
|
|
||||||
a model of `OutputIterator` that accepts values of type `GeomTraits::FT`
|
|
||||||
|
|
||||||
\tparam GeomTraits
|
|
||||||
a model of `BarycentricTraits_2`
|
|
||||||
|
|
||||||
\param polygon
|
|
||||||
an instance of `PointRange` with 2D points, which form a strictly convex polygon
|
|
||||||
|
|
||||||
\param query
|
|
||||||
a query point
|
|
||||||
|
|
||||||
\param c_begin
|
|
||||||
the beginning of the destination range with the computed coordinates
|
|
||||||
|
|
||||||
\param traits
|
|
||||||
a traits class with geometric objects, predicates, and constructions;
|
|
||||||
this parameter can be omitted if the traits class can be deduced from the point type
|
|
||||||
|
|
||||||
\param policy
|
|
||||||
one of the `Computation_policy_2`;
|
|
||||||
the default is `Computation_policy_2::PRECISE_WITH_EDGE_CASES`
|
|
||||||
|
|
||||||
\return an output iterator to the element in the destination range,
|
|
||||||
one past the last coordinate stored
|
|
||||||
|
|
||||||
\pre polygon.size() >= 3
|
|
||||||
\pre polygon is simple
|
|
||||||
\pre polygon is strictly convex
|
|
||||||
*/
|
|
||||||
template<
|
|
||||||
typename PointRange,
|
|
||||||
typename OutIterator,
|
|
||||||
typename GeomTraits>
|
|
||||||
OutIterator wachspress_coordinates_2(
|
|
||||||
const PointRange& polygon,
|
|
||||||
const typename GeomTraits::Point_2& query,
|
|
||||||
OutIterator c_begin,
|
|
||||||
const GeomTraits& traits,
|
|
||||||
const Computation_policy_2 policy =
|
|
||||||
Computation_policy_2::PRECISE_WITH_EDGE_CASES) {
|
|
||||||
|
|
||||||
Wachspress_coordinates_2<PointRange, GeomTraits> wachspress(
|
|
||||||
polygon, policy, traits);
|
|
||||||
return wachspress(query, c_begin);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \cond SKIP_IN_MANUAL
|
|
||||||
template<
|
|
||||||
typename PointRange,
|
|
||||||
typename Point_2,
|
|
||||||
typename OutIterator>
|
|
||||||
OutIterator wachspress_coordinates_2(
|
|
||||||
const PointRange& polygon,
|
|
||||||
const Point_2& query,
|
|
||||||
OutIterator c_begin,
|
|
||||||
const Computation_policy_2 policy =
|
|
||||||
Computation_policy_2::PRECISE_WITH_EDGE_CASES) {
|
|
||||||
|
|
||||||
using GeomTraits = typename Kernel_traits<Point_2>::Kernel;
|
|
||||||
const GeomTraits traits;
|
|
||||||
return wachspress_coordinates_2(
|
|
||||||
polygon, query, c_begin, traits, policy);
|
|
||||||
}
|
|
||||||
/// \endcond
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\ingroup PkgBarycentricCoordinates2RefFunctions
|
|
||||||
|
|
||||||
\brief computes 2D discrete harmonic weights.
|
|
||||||
|
|
||||||
This function computes 2D discrete harmonic weights at a given `query` point
|
|
||||||
with respect to the vertices of a strictly convex `polygon`, that is one
|
|
||||||
weight per vertex. The weights are stored in a destination range
|
|
||||||
beginning at `w_begin`.
|
|
||||||
|
|
||||||
Internally, the class `Discrete_harmonic_coordinates_2` is used. If one wants to process
|
|
||||||
multiple query points, it is better to use that class. When using the free function,
|
|
||||||
internal memory is allocated for each query point, while when using the class,
|
|
||||||
it is allocated only once, which is much more efficient. However, for a few query
|
|
||||||
points, it is easier to use this function. It can also be used when the processing
|
|
||||||
time is not a concern.
|
|
||||||
|
|
||||||
\tparam PointRange
|
|
||||||
a model of `ConstRange` whose iterator type is `RandomAccessIterator`
|
|
||||||
and value type is `GeomTraits::Point_2`
|
|
||||||
|
|
||||||
\tparam OutIterator
|
|
||||||
a model of `OutputIterator` that accepts values of type `GeomTraits::FT`
|
|
||||||
|
|
||||||
\tparam GeomTraits
|
|
||||||
a model of `BarycentricTraits_2`
|
|
||||||
|
|
||||||
\param polygon
|
|
||||||
an instance of `PointRange` with 2D points, which form a strictly convex polygon
|
|
||||||
|
|
||||||
\param query
|
|
||||||
a query point
|
|
||||||
|
|
||||||
\param w_begin
|
|
||||||
the beginning of the destination range with the computed weights
|
|
||||||
|
|
||||||
\param traits
|
|
||||||
a traits class with geometric objects, predicates, and constructions;
|
|
||||||
this parameter can be omitted if the traits class can be deduced from the point type
|
|
||||||
|
|
||||||
\param policy
|
|
||||||
one of the `Computation_policy_2`;
|
|
||||||
the default is `Computation_policy_2::FAST_WITH_EDGE_CASES`
|
|
||||||
|
|
||||||
\return an output iterator to the element in the destination range,
|
|
||||||
one past the last weight stored
|
|
||||||
|
|
||||||
\pre polygon.size() >= 3
|
|
||||||
\pre polygon is simple
|
|
||||||
\pre polygon is strictly convex
|
|
||||||
*/
|
|
||||||
template<
|
|
||||||
typename PointRange,
|
|
||||||
typename OutIterator,
|
|
||||||
typename GeomTraits>
|
|
||||||
OutIterator discrete_harmonic_weights_2(
|
|
||||||
const PointRange& polygon,
|
|
||||||
const typename GeomTraits::Point_2& query,
|
|
||||||
OutIterator w_begin,
|
|
||||||
const GeomTraits& traits,
|
|
||||||
const Computation_policy_2 policy =
|
|
||||||
Computation_policy_2::FAST_WITH_EDGE_CASES) {
|
|
||||||
|
|
||||||
Discrete_harmonic_coordinates_2<PointRange, GeomTraits> discrete_harmonic(
|
|
||||||
polygon, policy, traits);
|
|
||||||
return discrete_harmonic.weights(query, w_begin);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \cond SKIP_IN_MANUAL
|
|
||||||
template<
|
|
||||||
typename PointRange,
|
|
||||||
typename Point_2,
|
|
||||||
typename OutIterator>
|
|
||||||
OutIterator discrete_harmonic_weights_2(
|
|
||||||
const PointRange& polygon,
|
|
||||||
const Point_2& query,
|
|
||||||
OutIterator w_begin,
|
|
||||||
const Computation_policy_2 policy =
|
|
||||||
Computation_policy_2::FAST_WITH_EDGE_CASES) {
|
|
||||||
|
|
||||||
using GeomTraits = typename Kernel_traits<Point_2>::Kernel;
|
|
||||||
const GeomTraits traits;
|
|
||||||
return discrete_harmonic_weights_2(
|
|
||||||
polygon, query, w_begin, traits, policy);
|
|
||||||
}
|
|
||||||
/// \endcond
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\ingroup PkgBarycentricCoordinates2RefFunctions
|
|
||||||
|
|
||||||
\brief computes 2D discrete harmonic coordinates.
|
|
||||||
|
|
||||||
This function computes 2D discrete harmonic coordinates at a given `query` point
|
|
||||||
with respect to the vertices of a strictly convex `polygon`, that is one
|
|
||||||
coordinate per vertex. The coordinates are stored in a destination range
|
|
||||||
beginning at `c_begin`.
|
|
||||||
|
|
||||||
Internally, the class `Discrete_harmonic_coordinates_2` is used. If one wants to process
|
|
||||||
multiple query points, it is better to use that class. When using the free function,
|
|
||||||
internal memory is allocated for each query point, while when using the class,
|
|
||||||
it is allocated only once, which is much more efficient. However, for a few query
|
|
||||||
points, it is easier to use this function. It can also be used when the processing
|
|
||||||
time is not a concern.
|
|
||||||
|
|
||||||
\tparam PointRange
|
|
||||||
a model of `ConstRange` whose iterator type is `RandomAccessIterator`
|
|
||||||
and value type is `GeomTraits::Point_2`
|
|
||||||
|
|
||||||
\tparam OutIterator
|
|
||||||
a model of `OutputIterator` that accepts values of type `GeomTraits::FT`
|
|
||||||
|
|
||||||
\tparam GeomTraits
|
|
||||||
a model of `BarycentricTraits_2`
|
|
||||||
|
|
||||||
\param polygon
|
|
||||||
an instance of `PointRange` with 2D points, which form a strictly convex polygon
|
|
||||||
|
|
||||||
\param query
|
|
||||||
a query point
|
|
||||||
|
|
||||||
\param c_begin
|
|
||||||
the beginning of the destination range with the computed coordinates
|
|
||||||
|
|
||||||
\param traits
|
|
||||||
a traits class with geometric objects, predicates, and constructions;
|
|
||||||
this parameter can be omitted if the traits class can be deduced from the point type
|
|
||||||
|
|
||||||
\param policy
|
|
||||||
one of the `Computation_policy_2`;
|
|
||||||
the default is `Computation_policy_2::PRECISE_WITH_EDGE_CASES`
|
|
||||||
|
|
||||||
\return an output iterator to the element in the destination range,
|
|
||||||
one past the last coordinate stored
|
|
||||||
|
|
||||||
\pre polygon.size() >= 3
|
|
||||||
\pre polygon is simple
|
|
||||||
\pre polygon is strictly convex
|
|
||||||
*/
|
|
||||||
template<
|
|
||||||
typename PointRange,
|
|
||||||
typename OutIterator,
|
|
||||||
typename GeomTraits>
|
|
||||||
OutIterator discrete_harmonic_coordinates_2(
|
|
||||||
const PointRange& polygon,
|
|
||||||
const typename GeomTraits::Point_2& query,
|
|
||||||
OutIterator c_begin,
|
|
||||||
const GeomTraits& traits,
|
|
||||||
const Computation_policy_2 policy =
|
|
||||||
Computation_policy_2::PRECISE_WITH_EDGE_CASES) {
|
|
||||||
|
|
||||||
Discrete_harmonic_coordinates_2<PointRange, GeomTraits> discrete_harmonic(
|
|
||||||
polygon, policy, traits);
|
|
||||||
return discrete_harmonic(query, c_begin);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \cond SKIP_IN_MANUAL
|
|
||||||
template<
|
|
||||||
typename PointRange,
|
|
||||||
typename Point_2,
|
|
||||||
typename OutIterator>
|
|
||||||
OutIterator discrete_harmonic_coordinates_2(
|
|
||||||
const PointRange& polygon,
|
|
||||||
const Point_2& query,
|
|
||||||
OutIterator c_begin,
|
|
||||||
const Computation_policy_2 policy =
|
|
||||||
Computation_policy_2::PRECISE_WITH_EDGE_CASES) {
|
|
||||||
|
|
||||||
using GeomTraits = typename Kernel_traits<Point_2>::Kernel;
|
|
||||||
const GeomTraits traits;
|
|
||||||
return discrete_harmonic_coordinates_2(
|
|
||||||
polygon, query, c_begin, traits, policy);
|
|
||||||
}
|
|
||||||
/// \endcond
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\ingroup PkgBarycentricCoordinates2RefFunctions
|
|
||||||
|
|
||||||
\brief computes 2D mean value weights.
|
|
||||||
|
|
||||||
This function computes 2D mean value weights at a given `query` point
|
|
||||||
with respect to the vertices of a simple `polygon`, that is one
|
|
||||||
weight per vertex. The weights are stored in a destination range
|
|
||||||
beginning at `w_begin`.
|
|
||||||
|
|
||||||
Internally, the class `Mean_value_coordinates_2` is used. If one wants to process
|
|
||||||
multiple query points, it is better to use that class. When using the free function,
|
|
||||||
internal memory is allocated for each query point, while when using the class,
|
|
||||||
it is allocated only once, which is much more efficient. However, for a few query
|
|
||||||
points, it is easier to use this function. It can also be used when the processing
|
|
||||||
time is not a concern.
|
|
||||||
|
|
||||||
\tparam PointRange
|
|
||||||
a model of `ConstRange` whose iterator type is `RandomAccessIterator`
|
|
||||||
and value type is `GeomTraits::Point_2`
|
|
||||||
|
|
||||||
\tparam OutIterator
|
|
||||||
a model of `OutputIterator` that accepts values of type `GeomTraits::FT`
|
|
||||||
|
|
||||||
\tparam GeomTraits
|
|
||||||
a model of `BarycentricTraits_2`
|
|
||||||
|
|
||||||
\param polygon
|
|
||||||
an instance of `PointRange` with 2D points, which form a simple polygon
|
|
||||||
|
|
||||||
\param query
|
|
||||||
a query point
|
|
||||||
|
|
||||||
\param w_begin
|
|
||||||
the beginning of the destination range with the computed weights
|
|
||||||
|
|
||||||
\param traits
|
|
||||||
a traits class with geometric objects, predicates, and constructions;
|
|
||||||
this parameter can be omitted if the traits class can be deduced from the point type
|
|
||||||
|
|
||||||
\param policy
|
|
||||||
one of the `Computation_policy_2`;
|
|
||||||
the default is `Computation_policy_2::FAST_WITH_EDGE_CASES`
|
|
||||||
|
|
||||||
\return an output iterator to the element in the destination range,
|
|
||||||
one past the last weight stored
|
|
||||||
|
|
||||||
\pre polygon.size() >= 3
|
|
||||||
\pre polygon is simple
|
|
||||||
*/
|
|
||||||
template<
|
|
||||||
typename PointRange,
|
|
||||||
typename OutIterator,
|
|
||||||
typename GeomTraits>
|
|
||||||
OutIterator mean_value_weights_2(
|
|
||||||
const PointRange& polygon,
|
|
||||||
const typename GeomTraits::Point_2& query,
|
|
||||||
OutIterator w_begin,
|
|
||||||
const GeomTraits& traits,
|
|
||||||
const Computation_policy_2 policy =
|
|
||||||
Computation_policy_2::FAST_WITH_EDGE_CASES) {
|
|
||||||
|
|
||||||
Mean_value_coordinates_2<PointRange, GeomTraits> mean_value(
|
|
||||||
polygon, policy, traits);
|
|
||||||
return mean_value.weights(query, w_begin);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \cond SKIP_IN_MANUAL
|
|
||||||
template<
|
|
||||||
typename PointRange,
|
|
||||||
typename Point_2,
|
|
||||||
typename OutIterator>
|
|
||||||
OutIterator mean_value_weights_2(
|
|
||||||
const PointRange& polygon,
|
|
||||||
const Point_2& query,
|
|
||||||
OutIterator w_begin,
|
|
||||||
const Computation_policy_2 policy =
|
|
||||||
Computation_policy_2::FAST_WITH_EDGE_CASES) {
|
|
||||||
|
|
||||||
using GeomTraits = typename Kernel_traits<Point_2>::Kernel;
|
|
||||||
const GeomTraits traits;
|
|
||||||
return mean_value_weights_2(
|
|
||||||
polygon, query, w_begin, traits, policy);
|
|
||||||
}
|
|
||||||
/// \endcond
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\ingroup PkgBarycentricCoordinates2RefFunctions
|
|
||||||
|
|
||||||
\brief computes 2D mean value coordinates.
|
|
||||||
|
|
||||||
This function computes 2D mean value coordinates at a given `query` point
|
|
||||||
with respect to the vertices of a simple `polygon`, that is one
|
|
||||||
coordinate per vertex. The coordinates are stored in a destination range
|
|
||||||
beginning at `c_begin`.
|
|
||||||
|
|
||||||
Internally, the class `Mean_value_coordinates_2` is used. If one wants to process
|
|
||||||
multiple query points, it is better to use that class. When using the free function,
|
|
||||||
internal memory is allocated for each query point, while when using the class,
|
|
||||||
it is allocated only once, which is much more efficient. However, for a few query
|
|
||||||
points, it is easier to use this function. It can also be used when the processing
|
|
||||||
time is not a concern.
|
|
||||||
|
|
||||||
\tparam PointRange
|
|
||||||
a model of `ConstRange` whose iterator type is `RandomAccessIterator`
|
|
||||||
and value type is `GeomTraits::Point_2`
|
|
||||||
|
|
||||||
\tparam OutIterator
|
|
||||||
a model of `OutputIterator` that accepts values of type `GeomTraits::FT`
|
|
||||||
|
|
||||||
\tparam GeomTraits
|
|
||||||
a model of `BarycentricTraits_2`
|
|
||||||
|
|
||||||
\param polygon
|
|
||||||
an instance of `PointRange` with 2D points, which form a simple polygon
|
|
||||||
|
|
||||||
\param query
|
|
||||||
a query point
|
|
||||||
|
|
||||||
\param c_begin
|
|
||||||
the beginning of the destination range with the computed coordinates
|
|
||||||
|
|
||||||
\param traits
|
|
||||||
a traits class with geometric objects, predicates, and constructions;
|
|
||||||
this parameter can be omitted if the traits class can be deduced from the point type
|
|
||||||
|
|
||||||
\param policy
|
|
||||||
one of the `Computation_policy_2`;
|
|
||||||
the default is `Computation_policy_2::PRECISE_WITH_EDGE_CASES`
|
|
||||||
|
|
||||||
\return an output iterator to the element in the destination range,
|
|
||||||
one past the last coordinate stored
|
|
||||||
|
|
||||||
\pre polygon.size() >= 3
|
|
||||||
\pre polygon is simple
|
|
||||||
*/
|
|
||||||
template<
|
|
||||||
typename PointRange,
|
|
||||||
typename OutIterator,
|
|
||||||
typename GeomTraits>
|
|
||||||
OutIterator mean_value_coordinates_2(
|
|
||||||
const PointRange& polygon,
|
|
||||||
const typename GeomTraits::Point_2& query,
|
|
||||||
OutIterator c_begin,
|
|
||||||
const GeomTraits& traits,
|
|
||||||
const Computation_policy_2 policy =
|
|
||||||
Computation_policy_2::PRECISE_WITH_EDGE_CASES) {
|
|
||||||
|
|
||||||
Mean_value_coordinates_2<PointRange, GeomTraits> mean_value(
|
|
||||||
polygon, policy, traits);
|
|
||||||
return mean_value(query, c_begin);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \cond SKIP_IN_MANUAL
|
|
||||||
template<
|
|
||||||
typename PointRange,
|
|
||||||
typename Point_2,
|
|
||||||
typename OutIterator>
|
|
||||||
OutIterator mean_value_coordinates_2(
|
|
||||||
const PointRange& polygon,
|
|
||||||
const Point_2& query,
|
|
||||||
OutIterator c_begin,
|
|
||||||
const Computation_policy_2 policy =
|
|
||||||
Computation_policy_2::PRECISE_WITH_EDGE_CASES) {
|
|
||||||
|
|
||||||
using GeomTraits = typename Kernel_traits<Point_2>::Kernel;
|
|
||||||
const GeomTraits traits;
|
|
||||||
return mean_value_coordinates_2(
|
|
||||||
polygon, query, c_begin, traits, policy);
|
|
||||||
}
|
|
||||||
/// \endcond
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\ingroup PkgBarycentricCoordinates2RefFunctions
|
\ingroup PkgBarycentricCoordinates2RefFunctions
|
||||||
|
|
||||||
|
|
@ -1048,7 +101,7 @@ namespace Barycentric_coordinates {
|
||||||
const PointRange& polygon,
|
const PointRange& polygon,
|
||||||
const PointRange& seeds,
|
const PointRange& seeds,
|
||||||
OutIterator c_begin,
|
OutIterator c_begin,
|
||||||
const GeomTraits& traits,
|
const GeomTraits& /* traits */, // TODO: we should involve it in the code!
|
||||||
const typename GeomTraits::FT max_edge_length =
|
const typename GeomTraits::FT max_edge_length =
|
||||||
typename GeomTraits::FT(1) / typename GeomTraits::FT(100)) {
|
typename GeomTraits::FT(1) / typename GeomTraits::FT(100)) {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -214,7 +214,7 @@ namespace Barycentric_coordinates {
|
||||||
|
|
||||||
This function implements `DiscretizedDomain_2::number_of_vertices()`.
|
This function implements `DiscretizedDomain_2::number_of_vertices()`.
|
||||||
*/
|
*/
|
||||||
const std::size_t number_of_vertices() const {
|
std::size_t number_of_vertices() const {
|
||||||
|
|
||||||
CGAL_assertion(
|
CGAL_assertion(
|
||||||
m_vhs.size() == m_cdt.number_of_vertices());
|
m_vhs.size() == m_cdt.number_of_vertices());
|
||||||
|
|
@ -251,7 +251,7 @@ namespace Barycentric_coordinates {
|
||||||
|
|
||||||
\pre query_index >= 0 && query_index < number_of_vertices()
|
\pre query_index >= 0 && query_index < number_of_vertices()
|
||||||
*/
|
*/
|
||||||
const bool is_on_boundary(
|
bool is_on_boundary(
|
||||||
const std::size_t query_index) const {
|
const std::size_t query_index) const {
|
||||||
|
|
||||||
CGAL_precondition(
|
CGAL_precondition(
|
||||||
|
|
@ -515,7 +515,7 @@ namespace Barycentric_coordinates {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::size_t get_number_of_faces() const {
|
std::size_t get_number_of_faces() const {
|
||||||
|
|
||||||
std::size_t num_faces = 0;
|
std::size_t num_faces = 0;
|
||||||
for (auto fh = m_cdt.finite_faces_begin();
|
for (auto fh = m_cdt.finite_faces_begin();
|
||||||
|
|
|
||||||
|
|
@ -26,11 +26,12 @@
|
||||||
#include <CGAL/license/Barycentric_coordinates_2.h>
|
#include <CGAL/license/Barycentric_coordinates_2.h>
|
||||||
|
|
||||||
#include <CGAL/Barycentric_coordinates_2/deprecated/barycentric_enum_2_depr.h>
|
#include <CGAL/Barycentric_coordinates_2/deprecated/barycentric_enum_2_depr.h>
|
||||||
|
#include <CGAL/Barycentric_coordinates_2/deprecated/Segment_coordinates_2_depr.h>
|
||||||
|
#include <CGAL/Barycentric_coordinates_2/deprecated/Triangle_coordinates_2_depr.h>
|
||||||
|
|
||||||
#include <CGAL/Barycentric_coordinates_2/deprecated/Wachspress_2_depr.h>
|
#include <CGAL/Barycentric_coordinates_2/deprecated/Wachspress_2_depr.h>
|
||||||
#include <CGAL/Barycentric_coordinates_2/deprecated/Mean_value_2_depr.h>
|
#include <CGAL/Barycentric_coordinates_2/deprecated/Mean_value_2_depr.h>
|
||||||
#include <CGAL/Barycentric_coordinates_2/deprecated/Discrete_harmonic_2_depr.h>
|
#include <CGAL/Barycentric_coordinates_2/deprecated/Discrete_harmonic_2_depr.h>
|
||||||
#include <CGAL/Barycentric_coordinates_2/deprecated/Segment_coordinates_2_depr.h>
|
|
||||||
#include <CGAL/Barycentric_coordinates_2/deprecated/Triangle_coordinates_2_depr.h>
|
|
||||||
#include <CGAL/Barycentric_coordinates_2/deprecated/Generalized_barycentric_coordinates_2_depr.h>
|
#include <CGAL/Barycentric_coordinates_2/deprecated/Generalized_barycentric_coordinates_2_depr.h>
|
||||||
|
|
||||||
#endif // CGAL_BARYCENTRIC_DEPRECATED_HEADERS_2_H
|
#endif // CGAL_BARYCENTRIC_DEPRECATED_HEADERS_2_H
|
||||||
|
|
|
||||||
|
|
@ -382,6 +382,180 @@ namespace Barycentric_coordinates {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\ingroup PkgBarycentricCoordinates2RefFunctions
|
||||||
|
|
||||||
|
\brief computes 2D discrete harmonic weights.
|
||||||
|
|
||||||
|
This function computes 2D discrete harmonic weights at a given `query` point
|
||||||
|
with respect to the vertices of a strictly convex `polygon`, that is one
|
||||||
|
weight per vertex. The weights are stored in a destination range
|
||||||
|
beginning at `w_begin`.
|
||||||
|
|
||||||
|
Internally, the class `Discrete_harmonic_coordinates_2` is used. If one wants to process
|
||||||
|
multiple query points, it is better to use that class. When using the free function,
|
||||||
|
internal memory is allocated for each query point, while when using the class,
|
||||||
|
it is allocated only once, which is much more efficient. However, for a few query
|
||||||
|
points, it is easier to use this function. It can also be used when the processing
|
||||||
|
time is not a concern.
|
||||||
|
|
||||||
|
\tparam PointRange
|
||||||
|
a model of `ConstRange` whose iterator type is `RandomAccessIterator`
|
||||||
|
and value type is `GeomTraits::Point_2`
|
||||||
|
|
||||||
|
\tparam OutIterator
|
||||||
|
a model of `OutputIterator` that accepts values of type `GeomTraits::FT`
|
||||||
|
|
||||||
|
\tparam GeomTraits
|
||||||
|
a model of `BarycentricTraits_2`
|
||||||
|
|
||||||
|
\param polygon
|
||||||
|
an instance of `PointRange` with 2D points, which form a strictly convex polygon
|
||||||
|
|
||||||
|
\param query
|
||||||
|
a query point
|
||||||
|
|
||||||
|
\param w_begin
|
||||||
|
the beginning of the destination range with the computed weights
|
||||||
|
|
||||||
|
\param traits
|
||||||
|
a traits class with geometric objects, predicates, and constructions;
|
||||||
|
this parameter can be omitted if the traits class can be deduced from the point type
|
||||||
|
|
||||||
|
\param policy
|
||||||
|
one of the `Computation_policy_2`;
|
||||||
|
the default is `Computation_policy_2::FAST_WITH_EDGE_CASES`
|
||||||
|
|
||||||
|
\return an output iterator to the element in the destination range,
|
||||||
|
one past the last weight stored
|
||||||
|
|
||||||
|
\pre polygon.size() >= 3
|
||||||
|
\pre polygon is simple
|
||||||
|
\pre polygon is strictly convex
|
||||||
|
*/
|
||||||
|
template<
|
||||||
|
typename PointRange,
|
||||||
|
typename OutIterator,
|
||||||
|
typename GeomTraits>
|
||||||
|
OutIterator discrete_harmonic_weights_2(
|
||||||
|
const PointRange& polygon,
|
||||||
|
const typename GeomTraits::Point_2& query,
|
||||||
|
OutIterator w_begin,
|
||||||
|
const GeomTraits& traits,
|
||||||
|
const Computation_policy_2 policy =
|
||||||
|
Computation_policy_2::FAST_WITH_EDGE_CASES) {
|
||||||
|
|
||||||
|
Discrete_harmonic_coordinates_2<PointRange, GeomTraits> discrete_harmonic(
|
||||||
|
polygon, policy, traits);
|
||||||
|
return discrete_harmonic.weights(query, w_begin);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \cond SKIP_IN_MANUAL
|
||||||
|
template<
|
||||||
|
typename PointRange,
|
||||||
|
typename Point_2,
|
||||||
|
typename OutIterator>
|
||||||
|
OutIterator discrete_harmonic_weights_2(
|
||||||
|
const PointRange& polygon,
|
||||||
|
const Point_2& query,
|
||||||
|
OutIterator w_begin,
|
||||||
|
const Computation_policy_2 policy =
|
||||||
|
Computation_policy_2::FAST_WITH_EDGE_CASES) {
|
||||||
|
|
||||||
|
using GeomTraits = typename Kernel_traits<Point_2>::Kernel;
|
||||||
|
const GeomTraits traits;
|
||||||
|
return discrete_harmonic_weights_2(
|
||||||
|
polygon, query, w_begin, traits, policy);
|
||||||
|
}
|
||||||
|
/// \endcond
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\ingroup PkgBarycentricCoordinates2RefFunctions
|
||||||
|
|
||||||
|
\brief computes 2D discrete harmonic coordinates.
|
||||||
|
|
||||||
|
This function computes 2D discrete harmonic coordinates at a given `query` point
|
||||||
|
with respect to the vertices of a strictly convex `polygon`, that is one
|
||||||
|
coordinate per vertex. The coordinates are stored in a destination range
|
||||||
|
beginning at `c_begin`.
|
||||||
|
|
||||||
|
Internally, the class `Discrete_harmonic_coordinates_2` is used. If one wants to process
|
||||||
|
multiple query points, it is better to use that class. When using the free function,
|
||||||
|
internal memory is allocated for each query point, while when using the class,
|
||||||
|
it is allocated only once, which is much more efficient. However, for a few query
|
||||||
|
points, it is easier to use this function. It can also be used when the processing
|
||||||
|
time is not a concern.
|
||||||
|
|
||||||
|
\tparam PointRange
|
||||||
|
a model of `ConstRange` whose iterator type is `RandomAccessIterator`
|
||||||
|
and value type is `GeomTraits::Point_2`
|
||||||
|
|
||||||
|
\tparam OutIterator
|
||||||
|
a model of `OutputIterator` that accepts values of type `GeomTraits::FT`
|
||||||
|
|
||||||
|
\tparam GeomTraits
|
||||||
|
a model of `BarycentricTraits_2`
|
||||||
|
|
||||||
|
\param polygon
|
||||||
|
an instance of `PointRange` with 2D points, which form a strictly convex polygon
|
||||||
|
|
||||||
|
\param query
|
||||||
|
a query point
|
||||||
|
|
||||||
|
\param c_begin
|
||||||
|
the beginning of the destination range with the computed coordinates
|
||||||
|
|
||||||
|
\param traits
|
||||||
|
a traits class with geometric objects, predicates, and constructions;
|
||||||
|
this parameter can be omitted if the traits class can be deduced from the point type
|
||||||
|
|
||||||
|
\param policy
|
||||||
|
one of the `Computation_policy_2`;
|
||||||
|
the default is `Computation_policy_2::PRECISE_WITH_EDGE_CASES`
|
||||||
|
|
||||||
|
\return an output iterator to the element in the destination range,
|
||||||
|
one past the last coordinate stored
|
||||||
|
|
||||||
|
\pre polygon.size() >= 3
|
||||||
|
\pre polygon is simple
|
||||||
|
\pre polygon is strictly convex
|
||||||
|
*/
|
||||||
|
template<
|
||||||
|
typename PointRange,
|
||||||
|
typename OutIterator,
|
||||||
|
typename GeomTraits>
|
||||||
|
OutIterator discrete_harmonic_coordinates_2(
|
||||||
|
const PointRange& polygon,
|
||||||
|
const typename GeomTraits::Point_2& query,
|
||||||
|
OutIterator c_begin,
|
||||||
|
const GeomTraits& traits,
|
||||||
|
const Computation_policy_2 policy =
|
||||||
|
Computation_policy_2::PRECISE_WITH_EDGE_CASES) {
|
||||||
|
|
||||||
|
Discrete_harmonic_coordinates_2<PointRange, GeomTraits> discrete_harmonic(
|
||||||
|
polygon, policy, traits);
|
||||||
|
return discrete_harmonic(query, c_begin);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \cond SKIP_IN_MANUAL
|
||||||
|
template<
|
||||||
|
typename PointRange,
|
||||||
|
typename Point_2,
|
||||||
|
typename OutIterator>
|
||||||
|
OutIterator discrete_harmonic_coordinates_2(
|
||||||
|
const PointRange& polygon,
|
||||||
|
const Point_2& query,
|
||||||
|
OutIterator c_begin,
|
||||||
|
const Computation_policy_2 policy =
|
||||||
|
Computation_policy_2::PRECISE_WITH_EDGE_CASES) {
|
||||||
|
|
||||||
|
using GeomTraits = typename Kernel_traits<Point_2>::Kernel;
|
||||||
|
const GeomTraits traits;
|
||||||
|
return discrete_harmonic_coordinates_2(
|
||||||
|
polygon, query, c_begin, traits, policy);
|
||||||
|
}
|
||||||
|
/// \endcond
|
||||||
|
|
||||||
} // namespace Barycentric_coordinates
|
} // namespace Barycentric_coordinates
|
||||||
} // namespace CGAL
|
} // namespace CGAL
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -350,7 +350,6 @@ namespace Barycentric_coordinates {
|
||||||
|
|
||||||
if (m_setup_is_called) return;
|
if (m_setup_is_called) return;
|
||||||
const std::size_t n = m_polygon.size();
|
const std::size_t n = m_polygon.size();
|
||||||
const std::size_t N = m_domain.number_of_vertices();
|
|
||||||
|
|
||||||
// Create an index map. It splits interior and boundary vertices.
|
// Create an index map. It splits interior and boundary vertices.
|
||||||
const auto pair = create_indices(m_indices);
|
const auto pair = create_indices(m_indices);
|
||||||
|
|
@ -488,7 +487,7 @@ namespace Barycentric_coordinates {
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_boundary_vector(
|
void set_boundary_vector(
|
||||||
const std::size_t numB,
|
const std::size_t /* numB */, // this is not used here but the number of elements is numB!
|
||||||
const std::vector<std::size_t>& indices,
|
const std::vector<std::size_t>& indices,
|
||||||
VectorFT& boundary) const {
|
VectorFT& boundary) const {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -425,6 +425,178 @@ namespace Barycentric_coordinates {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\ingroup PkgBarycentricCoordinates2RefFunctions
|
||||||
|
|
||||||
|
\brief computes 2D mean value weights.
|
||||||
|
|
||||||
|
This function computes 2D mean value weights at a given `query` point
|
||||||
|
with respect to the vertices of a simple `polygon`, that is one
|
||||||
|
weight per vertex. The weights are stored in a destination range
|
||||||
|
beginning at `w_begin`.
|
||||||
|
|
||||||
|
Internally, the class `Mean_value_coordinates_2` is used. If one wants to process
|
||||||
|
multiple query points, it is better to use that class. When using the free function,
|
||||||
|
internal memory is allocated for each query point, while when using the class,
|
||||||
|
it is allocated only once, which is much more efficient. However, for a few query
|
||||||
|
points, it is easier to use this function. It can also be used when the processing
|
||||||
|
time is not a concern.
|
||||||
|
|
||||||
|
\tparam PointRange
|
||||||
|
a model of `ConstRange` whose iterator type is `RandomAccessIterator`
|
||||||
|
and value type is `GeomTraits::Point_2`
|
||||||
|
|
||||||
|
\tparam OutIterator
|
||||||
|
a model of `OutputIterator` that accepts values of type `GeomTraits::FT`
|
||||||
|
|
||||||
|
\tparam GeomTraits
|
||||||
|
a model of `BarycentricTraits_2`
|
||||||
|
|
||||||
|
\param polygon
|
||||||
|
an instance of `PointRange` with 2D points, which form a simple polygon
|
||||||
|
|
||||||
|
\param query
|
||||||
|
a query point
|
||||||
|
|
||||||
|
\param w_begin
|
||||||
|
the beginning of the destination range with the computed weights
|
||||||
|
|
||||||
|
\param traits
|
||||||
|
a traits class with geometric objects, predicates, and constructions;
|
||||||
|
this parameter can be omitted if the traits class can be deduced from the point type
|
||||||
|
|
||||||
|
\param policy
|
||||||
|
one of the `Computation_policy_2`;
|
||||||
|
the default is `Computation_policy_2::FAST_WITH_EDGE_CASES`
|
||||||
|
|
||||||
|
\return an output iterator to the element in the destination range,
|
||||||
|
one past the last weight stored
|
||||||
|
|
||||||
|
\pre polygon.size() >= 3
|
||||||
|
\pre polygon is simple
|
||||||
|
*/
|
||||||
|
template<
|
||||||
|
typename PointRange,
|
||||||
|
typename OutIterator,
|
||||||
|
typename GeomTraits>
|
||||||
|
OutIterator mean_value_weights_2(
|
||||||
|
const PointRange& polygon,
|
||||||
|
const typename GeomTraits::Point_2& query,
|
||||||
|
OutIterator w_begin,
|
||||||
|
const GeomTraits& traits,
|
||||||
|
const Computation_policy_2 policy =
|
||||||
|
Computation_policy_2::FAST_WITH_EDGE_CASES) {
|
||||||
|
|
||||||
|
Mean_value_coordinates_2<PointRange, GeomTraits> mean_value(
|
||||||
|
polygon, policy, traits);
|
||||||
|
return mean_value.weights(query, w_begin);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \cond SKIP_IN_MANUAL
|
||||||
|
template<
|
||||||
|
typename PointRange,
|
||||||
|
typename Point_2,
|
||||||
|
typename OutIterator>
|
||||||
|
OutIterator mean_value_weights_2(
|
||||||
|
const PointRange& polygon,
|
||||||
|
const Point_2& query,
|
||||||
|
OutIterator w_begin,
|
||||||
|
const Computation_policy_2 policy =
|
||||||
|
Computation_policy_2::FAST_WITH_EDGE_CASES) {
|
||||||
|
|
||||||
|
using GeomTraits = typename Kernel_traits<Point_2>::Kernel;
|
||||||
|
const GeomTraits traits;
|
||||||
|
return mean_value_weights_2(
|
||||||
|
polygon, query, w_begin, traits, policy);
|
||||||
|
}
|
||||||
|
/// \endcond
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\ingroup PkgBarycentricCoordinates2RefFunctions
|
||||||
|
|
||||||
|
\brief computes 2D mean value coordinates.
|
||||||
|
|
||||||
|
This function computes 2D mean value coordinates at a given `query` point
|
||||||
|
with respect to the vertices of a simple `polygon`, that is one
|
||||||
|
coordinate per vertex. The coordinates are stored in a destination range
|
||||||
|
beginning at `c_begin`.
|
||||||
|
|
||||||
|
Internally, the class `Mean_value_coordinates_2` is used. If one wants to process
|
||||||
|
multiple query points, it is better to use that class. When using the free function,
|
||||||
|
internal memory is allocated for each query point, while when using the class,
|
||||||
|
it is allocated only once, which is much more efficient. However, for a few query
|
||||||
|
points, it is easier to use this function. It can also be used when the processing
|
||||||
|
time is not a concern.
|
||||||
|
|
||||||
|
\tparam PointRange
|
||||||
|
a model of `ConstRange` whose iterator type is `RandomAccessIterator`
|
||||||
|
and value type is `GeomTraits::Point_2`
|
||||||
|
|
||||||
|
\tparam OutIterator
|
||||||
|
a model of `OutputIterator` that accepts values of type `GeomTraits::FT`
|
||||||
|
|
||||||
|
\tparam GeomTraits
|
||||||
|
a model of `BarycentricTraits_2`
|
||||||
|
|
||||||
|
\param polygon
|
||||||
|
an instance of `PointRange` with 2D points, which form a simple polygon
|
||||||
|
|
||||||
|
\param query
|
||||||
|
a query point
|
||||||
|
|
||||||
|
\param c_begin
|
||||||
|
the beginning of the destination range with the computed coordinates
|
||||||
|
|
||||||
|
\param traits
|
||||||
|
a traits class with geometric objects, predicates, and constructions;
|
||||||
|
this parameter can be omitted if the traits class can be deduced from the point type
|
||||||
|
|
||||||
|
\param policy
|
||||||
|
one of the `Computation_policy_2`;
|
||||||
|
the default is `Computation_policy_2::PRECISE_WITH_EDGE_CASES`
|
||||||
|
|
||||||
|
\return an output iterator to the element in the destination range,
|
||||||
|
one past the last coordinate stored
|
||||||
|
|
||||||
|
\pre polygon.size() >= 3
|
||||||
|
\pre polygon is simple
|
||||||
|
*/
|
||||||
|
template<
|
||||||
|
typename PointRange,
|
||||||
|
typename OutIterator,
|
||||||
|
typename GeomTraits>
|
||||||
|
OutIterator mean_value_coordinates_2(
|
||||||
|
const PointRange& polygon,
|
||||||
|
const typename GeomTraits::Point_2& query,
|
||||||
|
OutIterator c_begin,
|
||||||
|
const GeomTraits& traits,
|
||||||
|
const Computation_policy_2 policy =
|
||||||
|
Computation_policy_2::PRECISE_WITH_EDGE_CASES) {
|
||||||
|
|
||||||
|
Mean_value_coordinates_2<PointRange, GeomTraits> mean_value(
|
||||||
|
polygon, policy, traits);
|
||||||
|
return mean_value(query, c_begin);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \cond SKIP_IN_MANUAL
|
||||||
|
template<
|
||||||
|
typename PointRange,
|
||||||
|
typename Point_2,
|
||||||
|
typename OutIterator>
|
||||||
|
OutIterator mean_value_coordinates_2(
|
||||||
|
const PointRange& polygon,
|
||||||
|
const Point_2& query,
|
||||||
|
OutIterator c_begin,
|
||||||
|
const Computation_policy_2 policy =
|
||||||
|
Computation_policy_2::PRECISE_WITH_EDGE_CASES) {
|
||||||
|
|
||||||
|
using GeomTraits = typename Kernel_traits<Point_2>::Kernel;
|
||||||
|
const GeomTraits traits;
|
||||||
|
return mean_value_coordinates_2(
|
||||||
|
polygon, query, c_begin, traits, policy);
|
||||||
|
}
|
||||||
|
/// \endcond
|
||||||
|
|
||||||
} // namespace Barycentric_coordinates
|
} // namespace Barycentric_coordinates
|
||||||
} // namespace CGAL
|
} // namespace CGAL
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -370,6 +370,180 @@ namespace Barycentric_coordinates {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\ingroup PkgBarycentricCoordinates2RefFunctions
|
||||||
|
|
||||||
|
\brief computes 2D Wachspress weights.
|
||||||
|
|
||||||
|
This function computes 2D Wachspress weights at a given `query` point
|
||||||
|
with respect to the vertices of a strictly convex `polygon`, that is one
|
||||||
|
weight per vertex. The weights are stored in a destination range
|
||||||
|
beginning at `w_begin`.
|
||||||
|
|
||||||
|
Internally, the class `Wachspress_coordinates_2` is used. If one wants to process
|
||||||
|
multiple query points, it is better to use that class. When using the free function,
|
||||||
|
internal memory is allocated for each query point, while when using the class,
|
||||||
|
it is allocated only once, which is much more efficient. However, for a few query
|
||||||
|
points, it is easier to use this function. It can also be used when the processing
|
||||||
|
time is not a concern.
|
||||||
|
|
||||||
|
\tparam PointRange
|
||||||
|
a model of `ConstRange` whose iterator type is `RandomAccessIterator`
|
||||||
|
and value type is `GeomTraits::Point_2`
|
||||||
|
|
||||||
|
\tparam OutIterator
|
||||||
|
a model of `OutputIterator` that accepts values of type `GeomTraits::FT`
|
||||||
|
|
||||||
|
\tparam GeomTraits
|
||||||
|
a model of `BarycentricTraits_2`
|
||||||
|
|
||||||
|
\param polygon
|
||||||
|
an instance of `PointRange` with 2D points, which form a strictly convex polygon
|
||||||
|
|
||||||
|
\param query
|
||||||
|
a query point
|
||||||
|
|
||||||
|
\param w_begin
|
||||||
|
the beginning of the destination range with the computed weights
|
||||||
|
|
||||||
|
\param traits
|
||||||
|
a traits class with geometric objects, predicates, and constructions;
|
||||||
|
this parameter can be omitted if the traits class can be deduced from the point type
|
||||||
|
|
||||||
|
\param policy
|
||||||
|
one of the `Computation_policy_2`;
|
||||||
|
the default is `Computation_policy_2::FAST_WITH_EDGE_CASES`
|
||||||
|
|
||||||
|
\return an output iterator to the element in the destination range,
|
||||||
|
one past the last weight stored
|
||||||
|
|
||||||
|
\pre polygon.size() >= 3
|
||||||
|
\pre polygon is simple
|
||||||
|
\pre polygon is strictly convex
|
||||||
|
*/
|
||||||
|
template<
|
||||||
|
typename PointRange,
|
||||||
|
typename OutIterator,
|
||||||
|
typename GeomTraits>
|
||||||
|
OutIterator wachspress_weights_2(
|
||||||
|
const PointRange& polygon,
|
||||||
|
const typename GeomTraits::Point_2& query,
|
||||||
|
OutIterator w_begin,
|
||||||
|
const GeomTraits& traits,
|
||||||
|
const Computation_policy_2 policy =
|
||||||
|
Computation_policy_2::FAST_WITH_EDGE_CASES) {
|
||||||
|
|
||||||
|
Wachspress_coordinates_2<PointRange, GeomTraits> wachspress(
|
||||||
|
polygon, policy, traits);
|
||||||
|
return wachspress.weights(query, w_begin);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \cond SKIP_IN_MANUAL
|
||||||
|
template<
|
||||||
|
typename PointRange,
|
||||||
|
typename Point_2,
|
||||||
|
typename OutIterator>
|
||||||
|
OutIterator wachspress_weights_2(
|
||||||
|
const PointRange& polygon,
|
||||||
|
const Point_2& query,
|
||||||
|
OutIterator w_begin,
|
||||||
|
const Computation_policy_2 policy =
|
||||||
|
Computation_policy_2::FAST_WITH_EDGE_CASES) {
|
||||||
|
|
||||||
|
using GeomTraits = typename Kernel_traits<Point_2>::Kernel;
|
||||||
|
const GeomTraits traits;
|
||||||
|
return wachspress_weights_2(
|
||||||
|
polygon, query, w_begin, traits, policy);
|
||||||
|
}
|
||||||
|
/// \endcond
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\ingroup PkgBarycentricCoordinates2RefFunctions
|
||||||
|
|
||||||
|
\brief computes 2D Wachspress coordinates.
|
||||||
|
|
||||||
|
This function computes 2D Wachspress coordinates at a given `query` point
|
||||||
|
with respect to the vertices of a strictly convex `polygon`, that is one
|
||||||
|
coordinate per vertex. The coordinates are stored in a destination range
|
||||||
|
beginning at `c_begin`.
|
||||||
|
|
||||||
|
Internally, the class `Wachspress_coordinates_2` is used. If one wants to process
|
||||||
|
multiple query points, it is better to use that class. When using the free function,
|
||||||
|
internal memory is allocated for each query point, while when using the class,
|
||||||
|
it is allocated only once, which is much more efficient. However, for a few query
|
||||||
|
points, it is easier to use this function. It can also be used when the processing
|
||||||
|
time is not a concern.
|
||||||
|
|
||||||
|
\tparam PointRange
|
||||||
|
a model of `ConstRange` whose iterator type is `RandomAccessIterator`
|
||||||
|
and value type is `GeomTraits::Point_2`
|
||||||
|
|
||||||
|
\tparam OutIterator
|
||||||
|
a model of `OutputIterator` that accepts values of type `GeomTraits::FT`
|
||||||
|
|
||||||
|
\tparam GeomTraits
|
||||||
|
a model of `BarycentricTraits_2`
|
||||||
|
|
||||||
|
\param polygon
|
||||||
|
an instance of `PointRange` with 2D points, which form a strictly convex polygon
|
||||||
|
|
||||||
|
\param query
|
||||||
|
a query point
|
||||||
|
|
||||||
|
\param c_begin
|
||||||
|
the beginning of the destination range with the computed coordinates
|
||||||
|
|
||||||
|
\param traits
|
||||||
|
a traits class with geometric objects, predicates, and constructions;
|
||||||
|
this parameter can be omitted if the traits class can be deduced from the point type
|
||||||
|
|
||||||
|
\param policy
|
||||||
|
one of the `Computation_policy_2`;
|
||||||
|
the default is `Computation_policy_2::PRECISE_WITH_EDGE_CASES`
|
||||||
|
|
||||||
|
\return an output iterator to the element in the destination range,
|
||||||
|
one past the last coordinate stored
|
||||||
|
|
||||||
|
\pre polygon.size() >= 3
|
||||||
|
\pre polygon is simple
|
||||||
|
\pre polygon is strictly convex
|
||||||
|
*/
|
||||||
|
template<
|
||||||
|
typename PointRange,
|
||||||
|
typename OutIterator,
|
||||||
|
typename GeomTraits>
|
||||||
|
OutIterator wachspress_coordinates_2(
|
||||||
|
const PointRange& polygon,
|
||||||
|
const typename GeomTraits::Point_2& query,
|
||||||
|
OutIterator c_begin,
|
||||||
|
const GeomTraits& traits,
|
||||||
|
const Computation_policy_2 policy =
|
||||||
|
Computation_policy_2::PRECISE_WITH_EDGE_CASES) {
|
||||||
|
|
||||||
|
Wachspress_coordinates_2<PointRange, GeomTraits> wachspress(
|
||||||
|
polygon, policy, traits);
|
||||||
|
return wachspress(query, c_begin);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \cond SKIP_IN_MANUAL
|
||||||
|
template<
|
||||||
|
typename PointRange,
|
||||||
|
typename Point_2,
|
||||||
|
typename OutIterator>
|
||||||
|
OutIterator wachspress_coordinates_2(
|
||||||
|
const PointRange& polygon,
|
||||||
|
const Point_2& query,
|
||||||
|
OutIterator c_begin,
|
||||||
|
const Computation_policy_2 policy =
|
||||||
|
Computation_policy_2::PRECISE_WITH_EDGE_CASES) {
|
||||||
|
|
||||||
|
using GeomTraits = typename Kernel_traits<Point_2>::Kernel;
|
||||||
|
const GeomTraits traits;
|
||||||
|
return wachspress_coordinates_2(
|
||||||
|
polygon, query, c_begin, traits, policy);
|
||||||
|
}
|
||||||
|
/// \endcond
|
||||||
|
|
||||||
} // namespace Barycentric_coordinates
|
} // namespace Barycentric_coordinates
|
||||||
} // namespace CGAL
|
} // namespace CGAL
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,170 @@
|
||||||
|
// Copyright (c) 2014 INRIA Sophia-Antipolis (France).
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// This file is part of CGAL (www.cgal.org).
|
||||||
|
// You can redistribute it and/or modify it under the terms of the GNU
|
||||||
|
// General Public License as published by the Free Software Foundation,
|
||||||
|
// either version 3 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// Licensees holding a valid commercial license may use this file in
|
||||||
|
// accordance with the commercial license agreement provided with the software.
|
||||||
|
//
|
||||||
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
//
|
||||||
|
// $URL$
|
||||||
|
// $Id$
|
||||||
|
// SPDX-License-Identifier: GPL-3.0+
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Author(s) : Dmitry Anisimov, David Bommes, Kai Hormann, Pierre Alliez
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef CGAL_BARYCENTRIC_BOUNDARY_COORDINATES_2_H
|
||||||
|
#define CGAL_BARYCENTRIC_BOUNDARY_COORDINATES_2_H
|
||||||
|
|
||||||
|
#include <CGAL/license/Barycentric_coordinates_2.h>
|
||||||
|
|
||||||
|
// Internal includes.
|
||||||
|
#include <CGAL/Barycentric_coordinates_2/internal/utils_2.h>
|
||||||
|
|
||||||
|
namespace CGAL {
|
||||||
|
namespace Barycentric_coordinates {
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\ingroup PkgBarycentricCoordinates2RefFunctions
|
||||||
|
|
||||||
|
\brief computes 2D boundary coordinates.
|
||||||
|
|
||||||
|
This function computes boundary barycentric coordinates at a given `query` point
|
||||||
|
with respect to the vertices of a simple `polygon`, that is one
|
||||||
|
coordinate per vertex. The coordinates are stored in a destination range
|
||||||
|
beginning at `c_begin`.
|
||||||
|
|
||||||
|
If `query` is at the vertex, the corresponding coordinate is set to one, while
|
||||||
|
all other coordinates are zero. If `query` is on the edge, the two corresponding
|
||||||
|
coordinates are segment coordinates, while all other coordinates are set to zero.
|
||||||
|
If `query` is not on the boundary, all the coordinates are set to zero.
|
||||||
|
|
||||||
|
Internally, `segment_coordinates_2()` are used.
|
||||||
|
|
||||||
|
\tparam VertexRange
|
||||||
|
a model of `ConstRange` whose iterator type is `RandomAccessIterator`
|
||||||
|
|
||||||
|
\tparam OutIterator
|
||||||
|
a model of `OutputIterator` that accepts values of type `GeomTraits::FT`
|
||||||
|
|
||||||
|
\tparam GeomTraits
|
||||||
|
a model of `BarycentricTraits_2`
|
||||||
|
|
||||||
|
\tparam PointMap
|
||||||
|
a model of `ReadablePropertyMap` whose key type is `VertexRange::value_type` and
|
||||||
|
value type is `GeomTraits::Point_2`
|
||||||
|
|
||||||
|
\param polygon
|
||||||
|
an instance of `VertexRange` with 2D points, which form a simple polygon
|
||||||
|
|
||||||
|
\param query
|
||||||
|
a query point
|
||||||
|
|
||||||
|
\param c_begin
|
||||||
|
the beginning of the destination range with the computed coordinates
|
||||||
|
|
||||||
|
\param traits
|
||||||
|
a traits class with geometric objects, predicates, and constructions;
|
||||||
|
this parameter can be omitted if the traits class can be deduced from the point type
|
||||||
|
|
||||||
|
\param point_map
|
||||||
|
an instance of `PointMap` that maps a vertex from `polygon` to `Point_2`
|
||||||
|
|
||||||
|
\return an output iterator to the element in the destination range,
|
||||||
|
one past the last coordinate stored + the flag indicating whether the
|
||||||
|
query point belongs to the polygon boundary
|
||||||
|
|
||||||
|
\pre polygon.size() >= 3
|
||||||
|
*/
|
||||||
|
template<
|
||||||
|
typename VertexRange,
|
||||||
|
typename OutIterator,
|
||||||
|
typename GeomTraits,
|
||||||
|
typename PointMap>
|
||||||
|
std::pair<OutIterator, bool> boundary_coordinates_2(
|
||||||
|
const VertexRange& polygon,
|
||||||
|
const typename GeomTraits::Point_2& query,
|
||||||
|
OutIterator c_begin,
|
||||||
|
const GeomTraits& traits,
|
||||||
|
const PointMap point_map) {
|
||||||
|
|
||||||
|
const auto result =
|
||||||
|
internal::locate_wrt_polygon_2(polygon, query, traits, point_map);
|
||||||
|
auto location = (*result).first;
|
||||||
|
auto index = (*result).second;
|
||||||
|
|
||||||
|
if (!result) {
|
||||||
|
index = std::size_t(-1);
|
||||||
|
location = internal::Query_point_location::UNSPECIFIED;
|
||||||
|
}
|
||||||
|
return internal::boundary_coordinates_2(
|
||||||
|
polygon, query, location, index, c_begin, traits, point_map);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\ingroup PkgBarycentricCoordinates2RefFunctions
|
||||||
|
|
||||||
|
\brief computes 2D boundary coordinates.
|
||||||
|
|
||||||
|
This is an overload of the function `boundary_coordinates_2`.
|
||||||
|
|
||||||
|
\tparam VertexRange
|
||||||
|
a model of `ConstRange` whose iterator type is `RandomAccessIterator`
|
||||||
|
|
||||||
|
\tparam Query_2
|
||||||
|
a model of `Kernel::Point_2`
|
||||||
|
|
||||||
|
\tparam OutIterator
|
||||||
|
a model of `OutputIterator` that accepts values of type `GeomTraits::FT`
|
||||||
|
|
||||||
|
\tparam PointMap
|
||||||
|
a model of `ReadablePropertyMap` whose key type is `VertexRange::value_type` and
|
||||||
|
value type is `Query_2`. The default is `CGAL::Identity_property_map`.
|
||||||
|
|
||||||
|
\param polygon
|
||||||
|
an instance of `VertexRange` with 2D points, which form a simple polygon
|
||||||
|
|
||||||
|
\param query
|
||||||
|
a query point
|
||||||
|
|
||||||
|
\param c_begin
|
||||||
|
the beginning of the destination range with the computed coordinates
|
||||||
|
|
||||||
|
\param point_map
|
||||||
|
an instance of `PointMap` that maps a vertex from `polygon` to `Query_2`;
|
||||||
|
the default initialization is provided
|
||||||
|
|
||||||
|
\return an output iterator to the element in the destination range,
|
||||||
|
one past the last coordinate stored + the flag indicating whether the
|
||||||
|
query point belongs to the polygon boundary
|
||||||
|
|
||||||
|
\pre polygon.size() >= 3
|
||||||
|
*/
|
||||||
|
template<
|
||||||
|
typename VertexRange,
|
||||||
|
typename Query_2,
|
||||||
|
typename OutIterator,
|
||||||
|
typename PointMap = CGAL::Identity_property_map<Query_2> >
|
||||||
|
std::pair<OutIterator, bool> boundary_coordinates_2(
|
||||||
|
const VertexRange& polygon,
|
||||||
|
const Query_2& query,
|
||||||
|
OutIterator c_begin,
|
||||||
|
const PointMap point_map = PointMap()) {
|
||||||
|
|
||||||
|
using GeomTraits = typename Kernel_traits<Query_2>::Kernel;
|
||||||
|
const GeomTraits traits;
|
||||||
|
return boundary_coordinates_2(
|
||||||
|
polygon, query, c_begin, traits, point_map);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Barycentric_coordinates
|
||||||
|
} // namespace CGAL
|
||||||
|
|
||||||
|
#endif // CGAL_BARYCENTRIC_BOUNDARY_COORDINATES_2_H
|
||||||
|
|
@ -122,7 +122,7 @@ namespace internal {
|
||||||
void normalize(std::vector<FT>& values) {
|
void normalize(std::vector<FT>& values) {
|
||||||
|
|
||||||
FT sum = FT(0);
|
FT sum = FT(0);
|
||||||
for (const FT value : values)
|
for (const FT& value : values)
|
||||||
sum += value;
|
sum += value;
|
||||||
|
|
||||||
CGAL_assertion(sum != FT(0));
|
CGAL_assertion(sum != FT(0));
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,181 @@
|
||||||
|
// Copyright (c) 2014 INRIA Sophia-Antipolis (France).
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// This file is part of CGAL (www.cgal.org).
|
||||||
|
// You can redistribute it and/or modify it under the terms of the GNU
|
||||||
|
// General Public License as published by the Free Software Foundation,
|
||||||
|
// either version 3 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// Licensees holding a valid commercial license may use this file in
|
||||||
|
// accordance with the commercial license agreement provided with the software.
|
||||||
|
//
|
||||||
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
//
|
||||||
|
// $URL$
|
||||||
|
// $Id$
|
||||||
|
// SPDX-License-Identifier: GPL-3.0+
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Author(s) : Dmitry Anisimov, David Bommes, Kai Hormann, Pierre Alliez
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef CGAL_BARYCENTRIC_SEGMENT_COORDINATES_2_H
|
||||||
|
#define CGAL_BARYCENTRIC_SEGMENT_COORDINATES_2_H
|
||||||
|
|
||||||
|
#include <CGAL/license/Barycentric_coordinates_2.h>
|
||||||
|
|
||||||
|
// Internal includes.
|
||||||
|
#include <CGAL/Barycentric_coordinates_2/internal/utils_2.h>
|
||||||
|
|
||||||
|
namespace CGAL {
|
||||||
|
namespace Barycentric_coordinates {
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\ingroup PkgBarycentricCoordinates2RefFunctions
|
||||||
|
|
||||||
|
\brief computes segment coordinates.
|
||||||
|
|
||||||
|
This function computes barycentric coordinates at a given `query` point
|
||||||
|
with respect to the end points `p0` and `p1` of a segment that is one
|
||||||
|
coordinate per end point. The coordinates are stored in a destination range
|
||||||
|
beginning at `c_begin`.
|
||||||
|
|
||||||
|
After the coordinates \f$b_0\f$ and \f$b_1\f$ are computed, the query point \f$q\f$ can be
|
||||||
|
obtained as \f$q = b_0p_0 + b_1p_1\f$. If \f$q\f$ does not belong to the line through \f$p_0\f$
|
||||||
|
and \f$p_1\f$, it is projected onto this line, and only then the coordinates are
|
||||||
|
computed. See more details in the user manual \ref compute_seg_coord "here".
|
||||||
|
|
||||||
|
\tparam OutIterator
|
||||||
|
a model of `OutputIterator` that accepts values of type `GeomTraits::FT`
|
||||||
|
|
||||||
|
\tparam GeomTraits
|
||||||
|
a model of `BarycentricTraits_2`
|
||||||
|
|
||||||
|
\param p0
|
||||||
|
the first vertex of a segment
|
||||||
|
|
||||||
|
\param p1
|
||||||
|
the second vertex of a segment
|
||||||
|
|
||||||
|
\param query
|
||||||
|
a query point
|
||||||
|
|
||||||
|
\param c_begin
|
||||||
|
the beginning of the destination range with the computed coordinates
|
||||||
|
|
||||||
|
\param traits
|
||||||
|
a traits class with geometric objects, predicates, and constructions;
|
||||||
|
this parameter can be omitted if the traits class can be deduced from the point type
|
||||||
|
|
||||||
|
\return an output iterator to the element in the destination range,
|
||||||
|
one past the last coordinate stored
|
||||||
|
|
||||||
|
\pre p0 != p1
|
||||||
|
*/
|
||||||
|
template<
|
||||||
|
typename OutIterator,
|
||||||
|
typename GeomTraits>
|
||||||
|
OutIterator segment_coordinates_2(
|
||||||
|
const typename GeomTraits::Point_2& p0,
|
||||||
|
const typename GeomTraits::Point_2& p1,
|
||||||
|
const typename GeomTraits::Point_2& query,
|
||||||
|
OutIterator c_begin,
|
||||||
|
const GeomTraits& traits) {
|
||||||
|
|
||||||
|
return internal::linear_coordinates_2(
|
||||||
|
p0, p1, query, c_begin, traits);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \cond SKIP_IN_MANUAL
|
||||||
|
template<
|
||||||
|
typename Point_2,
|
||||||
|
typename OutIterator>
|
||||||
|
OutIterator segment_coordinates_2(
|
||||||
|
const Point_2& p0,
|
||||||
|
const Point_2& p1,
|
||||||
|
const Point_2& query,
|
||||||
|
OutIterator c_begin) {
|
||||||
|
|
||||||
|
using GeomTraits = typename Kernel_traits<Point_2>::Kernel;
|
||||||
|
const GeomTraits traits;
|
||||||
|
return segment_coordinates_2(
|
||||||
|
p0, p1, query, c_begin, traits);
|
||||||
|
}
|
||||||
|
/// \endcond
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\ingroup PkgBarycentricCoordinates2RefFunctions
|
||||||
|
|
||||||
|
\brief computes segment coordinates.
|
||||||
|
|
||||||
|
This function computes barycentric coordinates at a given `query` point
|
||||||
|
with respect to the end points `p0` and `p1` of a segment that is one
|
||||||
|
coordinate per end point. The coordinates are returned in a pair.
|
||||||
|
|
||||||
|
After the coordinates \f$b_0\f$ and \f$b_1\f$ are computed, the query point \f$q\f$ can be
|
||||||
|
obtained as \f$q = b_0p_0 + b_1p_1\f$. If \f$q\f$ does not belong to the line through \f$p_0\f$
|
||||||
|
and \f$p_1\f$, it is projected onto this line, and only then the coordinates are
|
||||||
|
computed. See more details in the user manual \ref compute_seg_coord "here".
|
||||||
|
|
||||||
|
\tparam GeomTraits
|
||||||
|
a model of `BarycentricTraits_2`
|
||||||
|
|
||||||
|
\param p0
|
||||||
|
the first vertex of a segment
|
||||||
|
|
||||||
|
\param p1
|
||||||
|
the second vertex of a segment
|
||||||
|
|
||||||
|
\param query
|
||||||
|
a query point
|
||||||
|
|
||||||
|
\param traits
|
||||||
|
a traits class with geometric objects, predicates, and constructions;
|
||||||
|
this parameter can be omitted if the traits class can be deduced from the point type
|
||||||
|
|
||||||
|
\return a pair `std::pair<GeomTraits::FT, GeomTraits::FT>`
|
||||||
|
with the computed coordinates
|
||||||
|
|
||||||
|
\pre p0 != p1
|
||||||
|
*/
|
||||||
|
template<typename GeomTraits>
|
||||||
|
std::pair<
|
||||||
|
typename GeomTraits::FT,
|
||||||
|
typename GeomTraits::FT>
|
||||||
|
segment_coordinates_in_pair_2(
|
||||||
|
const typename GeomTraits::Point_2& p0,
|
||||||
|
const typename GeomTraits::Point_2& p1,
|
||||||
|
const typename GeomTraits::Point_2& query,
|
||||||
|
const GeomTraits& traits) {
|
||||||
|
|
||||||
|
using FT = typename GeomTraits::FT;
|
||||||
|
std::vector<FT> coordinates;
|
||||||
|
coordinates.reserve(2);
|
||||||
|
internal::linear_coordinates_2(
|
||||||
|
p0, p1, query, std::back_inserter(coordinates), traits);
|
||||||
|
CGAL_assertion(coordinates.size() == 2);
|
||||||
|
return std::make_pair(coordinates[0], coordinates[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \cond SKIP_IN_MANUAL
|
||||||
|
template<typename Point_2>
|
||||||
|
std::pair<
|
||||||
|
typename Kernel_traits<Point_2>::Kernel::FT,
|
||||||
|
typename Kernel_traits<Point_2>::Kernel::FT>
|
||||||
|
segment_coordinates_in_pair_2(
|
||||||
|
const Point_2& p0,
|
||||||
|
const Point_2& p1,
|
||||||
|
const Point_2& query) {
|
||||||
|
|
||||||
|
using GeomTraits = typename Kernel_traits<Point_2>::Kernel;
|
||||||
|
const GeomTraits traits;
|
||||||
|
return segment_coordinates_in_pair_2(
|
||||||
|
p0, p1, query, traits);
|
||||||
|
}
|
||||||
|
/// \endcond
|
||||||
|
|
||||||
|
} // namespace Barycentric_coordinates
|
||||||
|
} // namespace CGAL
|
||||||
|
|
||||||
|
#endif // CGAL_BARYCENTRIC_SEGMENT_COORDINATES_2_H
|
||||||
|
|
@ -0,0 +1,191 @@
|
||||||
|
// Copyright (c) 2014 INRIA Sophia-Antipolis (France).
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// This file is part of CGAL (www.cgal.org).
|
||||||
|
// You can redistribute it and/or modify it under the terms of the GNU
|
||||||
|
// General Public License as published by the Free Software Foundation,
|
||||||
|
// either version 3 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// Licensees holding a valid commercial license may use this file in
|
||||||
|
// accordance with the commercial license agreement provided with the software.
|
||||||
|
//
|
||||||
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
//
|
||||||
|
// $URL$
|
||||||
|
// $Id$
|
||||||
|
// SPDX-License-Identifier: GPL-3.0+
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Author(s) : Dmitry Anisimov, David Bommes, Kai Hormann, Pierre Alliez
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef CGAL_BARYCENTRIC_TRIANGLE_COORDINATES_2_H
|
||||||
|
#define CGAL_BARYCENTRIC_TRIANGLE_COORDINATES_2_H
|
||||||
|
|
||||||
|
#include <CGAL/license/Barycentric_coordinates_2.h>
|
||||||
|
|
||||||
|
// Internal includes.
|
||||||
|
#include <CGAL/Barycentric_coordinates_2/internal/utils_2.h>
|
||||||
|
|
||||||
|
namespace CGAL {
|
||||||
|
namespace Barycentric_coordinates {
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\ingroup PkgBarycentricCoordinates2RefFunctions
|
||||||
|
|
||||||
|
\brief computes triangle coordinates.
|
||||||
|
|
||||||
|
This function computes barycentric coordinates at a given `query` point
|
||||||
|
with respect to the points `p0`, `p1`, and `p2`, which form a triangle, that is one
|
||||||
|
coordinate per point. The coordinates are stored in a destination range
|
||||||
|
beginning at `c_begin`.
|
||||||
|
|
||||||
|
After the coordinates \f$b_0\f$, \f$b_1\f$, and \f$b_2\f$ are computed, the query
|
||||||
|
point \f$q\f$ can be obtained as \f$q = b_0p_0 + b_1p_1 + b_2p_2\f$. See more details
|
||||||
|
in the user manual \ref compute_tri_coord "here".
|
||||||
|
|
||||||
|
\tparam OutIterator
|
||||||
|
a model of `OutputIterator` that accepts values of type `GeomTraits::FT`
|
||||||
|
|
||||||
|
\tparam GeomTraits
|
||||||
|
a model of `BarycentricTraits_2`
|
||||||
|
|
||||||
|
\param p0
|
||||||
|
the first vertex of a triangle
|
||||||
|
|
||||||
|
\param p1
|
||||||
|
the second vertex of a triangle
|
||||||
|
|
||||||
|
\param p2
|
||||||
|
the third vertex of a triangle
|
||||||
|
|
||||||
|
\param query
|
||||||
|
a query point
|
||||||
|
|
||||||
|
\param c_begin
|
||||||
|
the beginning of the destination range with the computed coordinates
|
||||||
|
|
||||||
|
\param traits
|
||||||
|
a traits class with geometric objects, predicates, and constructions;
|
||||||
|
this parameter can be omitted if the traits class can be deduced from the point type
|
||||||
|
|
||||||
|
\return an output iterator to the element in the destination range,
|
||||||
|
one past the last coordinate stored
|
||||||
|
|
||||||
|
\pre area_2(p0, p1, p2) != 0
|
||||||
|
*/
|
||||||
|
template<
|
||||||
|
typename OutIterator,
|
||||||
|
typename GeomTraits>
|
||||||
|
OutIterator triangle_coordinates_2(
|
||||||
|
const typename GeomTraits::Point_2& p0,
|
||||||
|
const typename GeomTraits::Point_2& p1,
|
||||||
|
const typename GeomTraits::Point_2& p2,
|
||||||
|
const typename GeomTraits::Point_2& query,
|
||||||
|
OutIterator c_begin,
|
||||||
|
const GeomTraits& traits) {
|
||||||
|
|
||||||
|
return internal::planar_coordinates_2(
|
||||||
|
p0, p1, p2, query, c_begin, traits);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \cond SKIP_IN_MANUAL
|
||||||
|
template<
|
||||||
|
typename Point_2,
|
||||||
|
typename OutIterator>
|
||||||
|
OutIterator triangle_coordinates_2(
|
||||||
|
const Point_2& p0,
|
||||||
|
const Point_2& p1,
|
||||||
|
const Point_2& p2,
|
||||||
|
const Point_2& query,
|
||||||
|
OutIterator c_begin) {
|
||||||
|
|
||||||
|
using GeomTraits = typename Kernel_traits<Point_2>::Kernel;
|
||||||
|
const GeomTraits traits;
|
||||||
|
return triangle_coordinates_2(
|
||||||
|
p0, p1, p2, query, c_begin, traits);
|
||||||
|
}
|
||||||
|
/// \endcond
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\ingroup PkgBarycentricCoordinates2RefFunctions
|
||||||
|
|
||||||
|
\brief computes triangle coordinates.
|
||||||
|
|
||||||
|
This function computes barycentric coordinates at a given `query` point
|
||||||
|
with respect to the points `p0`, `p1`, and `p2`, which form a triangle, that is one
|
||||||
|
coordinate per point. The coordinates are returned in a tuple.
|
||||||
|
|
||||||
|
After the coordinates \f$b_0\f$, \f$b_1\f$, and \f$b_2\f$ are computed, the query
|
||||||
|
point \f$q\f$ can be obtained as \f$q = b_0p_0 + b_1p_1 + b_2p_2\f$. See more details
|
||||||
|
in the user manual \ref compute_tri_coord "here".
|
||||||
|
|
||||||
|
\tparam GeomTraits
|
||||||
|
a model of `BarycentricTraits_2`
|
||||||
|
|
||||||
|
\param p0
|
||||||
|
the first vertex of a triangle
|
||||||
|
|
||||||
|
\param p1
|
||||||
|
the second vertex of a triangle
|
||||||
|
|
||||||
|
\param p2
|
||||||
|
the third vertex of a triangle
|
||||||
|
|
||||||
|
\param query
|
||||||
|
a query point
|
||||||
|
|
||||||
|
\param traits
|
||||||
|
a traits class with geometric objects, predicates, and constructions;
|
||||||
|
this parameter can be omitted if the traits class can be deduced from the point type
|
||||||
|
|
||||||
|
\return a tuple `std::tuple<GeomTraits::FT, GeomTraits::FT, GeomTraits::FT>`
|
||||||
|
with the computed coordinates
|
||||||
|
|
||||||
|
\pre area_2(p0, p1, p2) != 0
|
||||||
|
*/
|
||||||
|
template<typename GeomTraits>
|
||||||
|
std::tuple<
|
||||||
|
typename GeomTraits::FT,
|
||||||
|
typename GeomTraits::FT,
|
||||||
|
typename GeomTraits::FT>
|
||||||
|
triangle_coordinates_in_tuple_2(
|
||||||
|
const typename GeomTraits::Point_2& p0,
|
||||||
|
const typename GeomTraits::Point_2& p1,
|
||||||
|
const typename GeomTraits::Point_2& p2,
|
||||||
|
const typename GeomTraits::Point_2& query,
|
||||||
|
const GeomTraits& traits) {
|
||||||
|
|
||||||
|
using FT = typename GeomTraits::FT;
|
||||||
|
std::vector<FT> coordinates;
|
||||||
|
coordinates.reserve(3);
|
||||||
|
internal::planar_coordinates_2(
|
||||||
|
p0, p1, p2, query, std::back_inserter(coordinates), traits);
|
||||||
|
CGAL_assertion(coordinates.size() == 3);
|
||||||
|
return std::make_tuple(coordinates[0], coordinates[1], coordinates[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \cond SKIP_IN_MANUAL
|
||||||
|
template<typename Point_2>
|
||||||
|
std::tuple<
|
||||||
|
typename Kernel_traits<Point_2>::Kernel::FT,
|
||||||
|
typename Kernel_traits<Point_2>::Kernel::FT,
|
||||||
|
typename Kernel_traits<Point_2>::Kernel::FT>
|
||||||
|
triangle_coordinates_in_tuple_2(
|
||||||
|
const Point_2& p0,
|
||||||
|
const Point_2& p1,
|
||||||
|
const Point_2& p2,
|
||||||
|
const Point_2& query) {
|
||||||
|
|
||||||
|
using GeomTraits = typename Kernel_traits<Point_2>::Kernel;
|
||||||
|
const GeomTraits traits;
|
||||||
|
return triangle_coordinates_in_tuple_2(
|
||||||
|
p0, p1, p2, query, traits);
|
||||||
|
}
|
||||||
|
/// \endcond
|
||||||
|
|
||||||
|
} // namespace Barycentric_coordinates
|
||||||
|
} // namespace CGAL
|
||||||
|
|
||||||
|
#endif // CGAL_BARYCENTRIC_TRIANGLE_COORDINATES_2_H
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
project(Barycentric_coordinates_2_Tests)
|
project(Barycentric_coordinates_2_Tests)
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 2.8.10)
|
cmake_minimum_required(VERSION 3.1...3.15)
|
||||||
set(CMAKE_CXX_STANDARD 14)
|
set(CMAKE_CXX_STANDARD 14)
|
||||||
|
|
||||||
find_package(CGAL QUIET COMPONENTS Core)
|
find_package(CGAL QUIET COMPONENTS Core)
|
||||||
|
|
@ -12,84 +12,60 @@ if(CGAL_FOUND)
|
||||||
include(${CGAL_USE_FILE})
|
include(${CGAL_USE_FILE})
|
||||||
include(CGAL_CreateSingleSourceCGALProgram)
|
include(CGAL_CreateSingleSourceCGALProgram)
|
||||||
|
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("test_almost_degenerate_segment.cpp")
|
||||||
"test_almost_degenerate_segment.cpp")
|
create_single_source_cgal_program("test_segment_coordinates.cpp")
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("test_segment_coordinates_with_offset.cpp")
|
||||||
"test_segment_coordinates.cpp")
|
|
||||||
create_single_source_cgal_program(
|
|
||||||
"test_segment_coordinates_with_offset.cpp")
|
|
||||||
|
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("test_almost_degenerate_triangle.cpp")
|
||||||
"test_almost_degenerate_triangle.cpp")
|
create_single_source_cgal_program("test_triangle_coordinates.cpp")
|
||||||
create_single_source_cgal_program(
|
|
||||||
"test_triangle_coordinates.cpp")
|
|
||||||
|
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("test_boundary_coordinates_at_vertices.cpp")
|
||||||
"test_boundary_coordinates_at_vertices.cpp")
|
create_single_source_cgal_program("test_boundary_coordinates_on_edges.cpp")
|
||||||
create_single_source_cgal_program(
|
|
||||||
"test_boundary_coordinates_on_edges.cpp")
|
|
||||||
|
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("test_wp_dh_unit_square.cpp")
|
||||||
"test_wp_dh_unit_square.cpp")
|
create_single_source_cgal_program("test_wp_almost_degenerate_polygon.cpp")
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("test_wp_const_linear_precision.cpp")
|
||||||
"test_wp_almost_degenerate_polygon.cpp")
|
create_single_source_cgal_program("test_wp_triangle.cpp")
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("test_wp_weights.cpp")
|
||||||
"test_wp_const_linear_precision.cpp")
|
|
||||||
create_single_source_cgal_program(
|
|
||||||
"test_wp_triangle.cpp")
|
|
||||||
create_single_source_cgal_program(
|
|
||||||
"test_wp_weights.cpp")
|
|
||||||
|
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("test_mv_special_points.cpp")
|
||||||
"test_mv_special_points.cpp")
|
create_single_source_cgal_program("test_mv_weakly_convex_polygon.cpp")
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("test_mv_const_linear_precision.cpp")
|
||||||
"test_mv_weakly_convex_polygon.cpp")
|
create_single_source_cgal_program("test_mv_triangle.cpp")
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("test_mv_weights.cpp")
|
||||||
"test_mv_const_linear_precision.cpp")
|
|
||||||
create_single_source_cgal_program(
|
|
||||||
"test_mv_triangle.cpp")
|
|
||||||
create_single_source_cgal_program(
|
|
||||||
"test_mv_weights.cpp")
|
|
||||||
|
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("test_dh_almost_degenerate_polygon.cpp")
|
||||||
"test_dh_almost_degenerate_polygon.cpp")
|
create_single_source_cgal_program("test_dh_const_linear_precision.cpp")
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("test_dh_triangle.cpp")
|
||||||
"test_dh_const_linear_precision.cpp")
|
create_single_source_cgal_program("test_dh_weights.cpp")
|
||||||
create_single_source_cgal_program(
|
|
||||||
"test_dh_triangle.cpp")
|
|
||||||
create_single_source_cgal_program(
|
|
||||||
"test_dh_weights.cpp")
|
|
||||||
|
|
||||||
# missing begin() and end() in CGAL 4.14
|
# missing begin() and end() in CGAL 4.14
|
||||||
# create_single_source_cgal_program(
|
# create_single_source_cgal_program("test_cgal_polygons.cpp")
|
||||||
# "test_cgal_polygons.cpp")
|
|
||||||
|
|
||||||
find_package(Eigen3 REQUIRED)
|
find_package(Eigen3 REQUIRED)
|
||||||
if(EIGEN3_FOUND)
|
include(CGAL_Eigen3_support)
|
||||||
include(${EIGEN3_USE_FILE})
|
if(TARGET CGAL::Eigen3_support)
|
||||||
|
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("test_hm_unit_square.cpp")
|
||||||
"test_hm_unit_square.cpp")
|
target_link_libraries(test_hm_unit_square PUBLIC CGAL::Eigen3_support)
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("test_hm_const_linear_precision.cpp")
|
||||||
"test_hm_const_linear_precision.cpp")
|
target_link_libraries(test_hm_const_linear_precision PUBLIC CGAL::Eigen3_support)
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("test_hm_triangle.cpp")
|
||||||
"test_hm_triangle.cpp")
|
target_link_libraries(test_hm_triangle PUBLIC CGAL::Eigen3_support)
|
||||||
|
|
||||||
# missing:
|
# missing:
|
||||||
# construct_centroid_2,
|
# construct_centroid_2,
|
||||||
# compute_determinant_2
|
# compute_determinant_2
|
||||||
# in projection traits
|
# in projection traits
|
||||||
# create_single_source_cgal_program(
|
# create_single_source_cgal_program("test_projection_traits.cpp")
|
||||||
# "test_projection_traits.cpp")
|
# target_link_libraries(test_projection_traits PUBLIC CGAL::Eigen3_support)
|
||||||
|
|
||||||
create_single_source_cgal_program(
|
create_single_source_cgal_program("test_all_coordinates.cpp")
|
||||||
"test_all_coordinates.cpp")
|
target_link_libraries(test_all_coordinates PUBLIC CGAL::Eigen3_support)
|
||||||
|
|
||||||
else()
|
else()
|
||||||
message(WARNING
|
message(WARNING "Several coordinates require the Eigen library, and will not be compiled.")
|
||||||
"Harmonic coordinates require the Eigen library, and will not be compiled.")
|
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
message(WARNING
|
message(WARNING "This program requires the CGAL library, and will not be compiled.")
|
||||||
"This program requires the CGAL library, and will not be compiled.")
|
|
||||||
endif()
|
endif()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue