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)
|
||||
|
||||
cmake_minimum_required(VERSION 2.8.10)
|
||||
cmake_minimum_required(VERSION 3.1...3.15)
|
||||
set(CMAKE_CXX_STANDARD 14)
|
||||
|
||||
find_package(CGAL QUIET COMPONENTS Core)
|
||||
|
|
@ -12,33 +12,25 @@ if(CGAL_FOUND)
|
|||
include(${CGAL_USE_FILE})
|
||||
include(CGAL_CreateSingleSourceCGALProgram)
|
||||
|
||||
create_single_source_cgal_program(
|
||||
"benchmark_segment_coordinates.cpp")
|
||||
create_single_source_cgal_program(
|
||||
"benchmark_triangle_coordinates.cpp")
|
||||
create_single_source_cgal_program(
|
||||
"benchmark_polygon_4_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")
|
||||
create_single_source_cgal_program("benchmark_segment_coordinates.cpp")
|
||||
create_single_source_cgal_program("benchmark_triangle_coordinates.cpp")
|
||||
create_single_source_cgal_program("benchmark_polygon_4_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)
|
||||
if(EIGEN3_FOUND)
|
||||
include(${EIGEN3_USE_FILE})
|
||||
include(CGAL_Eigen3_support)
|
||||
if(TARGET CGAL::Eigen3_support)
|
||||
|
||||
create_single_source_cgal_program(
|
||||
"benchmark_hm_4_vertices.cpp")
|
||||
create_single_source_cgal_program(
|
||||
"benchmark_hm_n_vertices.cpp")
|
||||
create_single_source_cgal_program("benchmark_hm_4_vertices.cpp")
|
||||
target_link_libraries(benchmark_hm_4_vertices PUBLIC CGAL::Eigen3_support)
|
||||
create_single_source_cgal_program("benchmark_hm_n_vertices.cpp")
|
||||
target_link_libraries(benchmark_hm_n_vertices PUBLIC CGAL::Eigen3_support)
|
||||
|
||||
else()
|
||||
message(WARNING
|
||||
"Harmonic coordinates require the Eigen library, and will not be compiled.")
|
||||
message(WARNING "Several coordinates require the Eigen library, and will not be compiled.")
|
||||
endif()
|
||||
else()
|
||||
message(WARNING
|
||||
"This program requires the CGAL library, and will not be compiled.")
|
||||
message(WARNING "This program requires the CGAL library, and will not be compiled.")
|
||||
endif()
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
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)
|
||||
|
||||
find_package(CGAL QUIET COMPONENTS Core)
|
||||
|
|
@ -12,43 +12,34 @@ if(CGAL_FOUND)
|
|||
include(${CGAL_USE_FILE})
|
||||
include(CGAL_CreateSingleSourceCGALProgram)
|
||||
|
||||
create_single_source_cgal_program(
|
||||
"segment_coordinates.cpp")
|
||||
create_single_source_cgal_program(
|
||||
"triangle_coordinates.cpp")
|
||||
create_single_source_cgal_program(
|
||||
"wachspress_coordinates.cpp")
|
||||
create_single_source_cgal_program(
|
||||
"mean_value_coordinates.cpp")
|
||||
create_single_source_cgal_program(
|
||||
"discrete_harmonic_coordinates.cpp")
|
||||
create_single_source_cgal_program("segment_coordinates.cpp")
|
||||
create_single_source_cgal_program("triangle_coordinates.cpp")
|
||||
create_single_source_cgal_program("wachspress_coordinates.cpp")
|
||||
create_single_source_cgal_program("mean_value_coordinates.cpp")
|
||||
create_single_source_cgal_program("discrete_harmonic_coordinates.cpp")
|
||||
|
||||
# missing:
|
||||
# construct_centroid_2
|
||||
# in projection traits
|
||||
# create_single_source_cgal_program(
|
||||
# "terrain_height_modeling.cpp")
|
||||
# create_single_source_cgal_program("terrain_height_modeling.cpp")
|
||||
|
||||
# this code is deprecated:
|
||||
# create_single_source_cgal_program(
|
||||
# "deprecated_coordinates.cpp")
|
||||
# create_single_source_cgal_program("deprecated_coordinates.cpp")
|
||||
|
||||
find_package(Eigen3 REQUIRED)
|
||||
if(EIGEN3_FOUND)
|
||||
include(${EIGEN3_USE_FILE})
|
||||
include(CGAL_Eigen3_support)
|
||||
if(TARGET CGAL::Eigen3_support)
|
||||
|
||||
create_single_source_cgal_program(
|
||||
"affine_coordinates.cpp")
|
||||
create_single_source_cgal_program(
|
||||
"harmonic_coordinates.cpp")
|
||||
create_single_source_cgal_program(
|
||||
"shape_deformation.cpp")
|
||||
create_single_source_cgal_program("affine_coordinates.cpp")
|
||||
target_link_libraries(affine_coordinates PUBLIC CGAL::Eigen3_support)
|
||||
create_single_source_cgal_program("harmonic_coordinates.cpp")
|
||||
target_link_libraries(harmonic_coordinates PUBLIC CGAL::Eigen3_support)
|
||||
create_single_source_cgal_program("shape_deformation.cpp")
|
||||
target_link_libraries(shape_deformation PUBLIC CGAL::Eigen3_support)
|
||||
|
||||
else()
|
||||
message(WARNING
|
||||
"Harmonic/Affine coordinates require the Eigen library, and will not be compiled.")
|
||||
message(WARNING "Several coordinates require the Eigen library, and will not be compiled.")
|
||||
endif()
|
||||
else()
|
||||
message(WARNING
|
||||
"This program requires the CGAL library, and will not be compiled.")
|
||||
message(WARNING "This program requires the CGAL library, and will not be compiled.")
|
||||
endif()
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
#include <CGAL/Projection_traits_xy_3.h>
|
||||
#include <CGAL/interpolation_functions.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.
|
||||
using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
#include <CGAL/convex_hull_2.h>
|
||||
#include <CGAL/Simple_cartesian.h>
|
||||
#include <CGAL/point_generators_2.h>
|
||||
#include <CGAL/Barycentric_coordinates_2.h>
|
||||
#include <CGAL/Barycentric_coordinates_2/Wachspress_coordinates_2.h>
|
||||
|
||||
// Typedefs.
|
||||
using Kernel = CGAL::Simple_cartesian<double>;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
#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.
|
||||
using Kernel = CGAL::Exact_predicates_exact_constructions_kernel;
|
||||
|
|
@ -48,7 +49,7 @@ int main() {
|
|||
discrete_harmonic_2.weights(center, std::back_inserter(weights));
|
||||
|
||||
std::cout << std::endl << "discrete harmonic weights (center): ";
|
||||
for (const FT weight : weights)
|
||||
for (const FT& weight : weights)
|
||||
std::cout << weight << " ";
|
||||
std::cout << std::endl;
|
||||
|
||||
|
|
@ -57,7 +58,7 @@ int main() {
|
|||
discrete_harmonic_2(center, std::back_inserter(coordinates));
|
||||
|
||||
std::cout << std::endl << "discrete harmonic coordinates (center): ";
|
||||
for (const FT coordinate : coordinates)
|
||||
for (const FT& coordinate : coordinates)
|
||||
std::cout << coordinate << " ";
|
||||
std::cout << std::endl;
|
||||
|
||||
|
|
@ -105,7 +106,7 @@ int main() {
|
|||
square, e4, std::back_inserter(coordinates), kernel, point_map);
|
||||
|
||||
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 << std::endl;
|
||||
|
||||
|
|
@ -144,7 +145,7 @@ int main() {
|
|||
discrete_harmonic_2(r, std::back_inserter(coordinates));
|
||||
|
||||
std::cout << std::endl << "discrete harmonic coordinates (exterior): ";
|
||||
for (const FT coordinate : coordinates)
|
||||
for (const FT& coordinate : coordinates)
|
||||
std::cout << coordinate << " ";
|
||||
std::cout << std::endl << std::endl;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
#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.
|
||||
using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
|
||||
#include <CGAL/Barycentric_coordinates_2.h>
|
||||
#include <CGAL/Barycentric_coordinates_2/segment_coordinates_2.h>
|
||||
|
||||
// Typedefs.
|
||||
using Kernel = CGAL::Exact_predicates_exact_constructions_kernel;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
#include <CGAL/Simple_cartesian.h>
|
||||
#include <CGAL/Barycentric_coordinates_2.h>
|
||||
#include <CGAL/Barycentric_coordinates_2/triangle_coordinates_2.h>
|
||||
|
||||
// Typedefs.
|
||||
using Kernel = CGAL::Simple_cartesian<double>;
|
||||
|
|
|
|||
|
|
@ -29,6 +29,10 @@
|
|||
// #include <CGAL/Barycentric_coordinates_2/Deprecated_headers_2.h>
|
||||
|
||||
// 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/Wachspress_coordinates_2.h>
|
||||
#include <CGAL/Barycentric_coordinates_2/Discrete_harmonic_coordinates_2.h>
|
||||
|
|
@ -38,957 +42,6 @@
|
|||
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
|
||||
|
||||
/*!
|
||||
\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
|
||||
|
||||
|
|
@ -1048,7 +101,7 @@ namespace Barycentric_coordinates {
|
|||
const PointRange& polygon,
|
||||
const PointRange& seeds,
|
||||
OutIterator c_begin,
|
||||
const GeomTraits& traits,
|
||||
const GeomTraits& /* traits */, // TODO: we should involve it in the code!
|
||||
const typename GeomTraits::FT max_edge_length =
|
||||
typename GeomTraits::FT(1) / typename GeomTraits::FT(100)) {
|
||||
|
||||
|
|
|
|||
|
|
@ -214,7 +214,7 @@ namespace Barycentric_coordinates {
|
|||
|
||||
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(
|
||||
m_vhs.size() == m_cdt.number_of_vertices());
|
||||
|
|
@ -251,7 +251,7 @@ namespace Barycentric_coordinates {
|
|||
|
||||
\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 {
|
||||
|
||||
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;
|
||||
for (auto fh = m_cdt.finite_faces_begin();
|
||||
|
|
|
|||
|
|
@ -26,11 +26,12 @@
|
|||
#include <CGAL/license/Barycentric_coordinates_2.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/Mean_value_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>
|
||||
|
||||
#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 CGAL
|
||||
|
||||
|
|
|
|||
|
|
@ -350,7 +350,6 @@ namespace Barycentric_coordinates {
|
|||
|
||||
if (m_setup_is_called) return;
|
||||
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.
|
||||
const auto pair = create_indices(m_indices);
|
||||
|
|
@ -488,7 +487,7 @@ namespace Barycentric_coordinates {
|
|||
}
|
||||
|
||||
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,
|
||||
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 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 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) {
|
||||
|
||||
FT sum = FT(0);
|
||||
for (const FT value : values)
|
||||
for (const FT& value : values)
|
||||
sum += value;
|
||||
|
||||
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)
|
||||
|
||||
cmake_minimum_required(VERSION 2.8.10)
|
||||
cmake_minimum_required(VERSION 3.1...3.15)
|
||||
set(CMAKE_CXX_STANDARD 14)
|
||||
|
||||
find_package(CGAL QUIET COMPONENTS Core)
|
||||
|
|
@ -12,84 +12,60 @@ if(CGAL_FOUND)
|
|||
include(${CGAL_USE_FILE})
|
||||
include(CGAL_CreateSingleSourceCGALProgram)
|
||||
|
||||
create_single_source_cgal_program(
|
||||
"test_almost_degenerate_segment.cpp")
|
||||
create_single_source_cgal_program(
|
||||
"test_segment_coordinates.cpp")
|
||||
create_single_source_cgal_program(
|
||||
"test_segment_coordinates_with_offset.cpp")
|
||||
create_single_source_cgal_program("test_almost_degenerate_segment.cpp")
|
||||
create_single_source_cgal_program("test_segment_coordinates.cpp")
|
||||
create_single_source_cgal_program("test_segment_coordinates_with_offset.cpp")
|
||||
|
||||
create_single_source_cgal_program(
|
||||
"test_almost_degenerate_triangle.cpp")
|
||||
create_single_source_cgal_program(
|
||||
"test_triangle_coordinates.cpp")
|
||||
create_single_source_cgal_program("test_almost_degenerate_triangle.cpp")
|
||||
create_single_source_cgal_program("test_triangle_coordinates.cpp")
|
||||
|
||||
create_single_source_cgal_program(
|
||||
"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_at_vertices.cpp")
|
||||
create_single_source_cgal_program("test_boundary_coordinates_on_edges.cpp")
|
||||
|
||||
create_single_source_cgal_program(
|
||||
"test_wp_dh_unit_square.cpp")
|
||||
create_single_source_cgal_program(
|
||||
"test_wp_almost_degenerate_polygon.cpp")
|
||||
create_single_source_cgal_program(
|
||||
"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("test_wp_dh_unit_square.cpp")
|
||||
create_single_source_cgal_program("test_wp_almost_degenerate_polygon.cpp")
|
||||
create_single_source_cgal_program("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(
|
||||
"test_mv_special_points.cpp")
|
||||
create_single_source_cgal_program(
|
||||
"test_mv_weakly_convex_polygon.cpp")
|
||||
create_single_source_cgal_program(
|
||||
"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("test_mv_special_points.cpp")
|
||||
create_single_source_cgal_program("test_mv_weakly_convex_polygon.cpp")
|
||||
create_single_source_cgal_program("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(
|
||||
"test_dh_almost_degenerate_polygon.cpp")
|
||||
create_single_source_cgal_program(
|
||||
"test_dh_const_linear_precision.cpp")
|
||||
create_single_source_cgal_program(
|
||||
"test_dh_triangle.cpp")
|
||||
create_single_source_cgal_program(
|
||||
"test_dh_weights.cpp")
|
||||
create_single_source_cgal_program("test_dh_almost_degenerate_polygon.cpp")
|
||||
create_single_source_cgal_program("test_dh_const_linear_precision.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
|
||||
# create_single_source_cgal_program(
|
||||
# "test_cgal_polygons.cpp")
|
||||
# create_single_source_cgal_program("test_cgal_polygons.cpp")
|
||||
|
||||
find_package(Eigen3 REQUIRED)
|
||||
if(EIGEN3_FOUND)
|
||||
include(${EIGEN3_USE_FILE})
|
||||
include(CGAL_Eigen3_support)
|
||||
if(TARGET CGAL::Eigen3_support)
|
||||
|
||||
create_single_source_cgal_program(
|
||||
"test_hm_unit_square.cpp")
|
||||
create_single_source_cgal_program(
|
||||
"test_hm_const_linear_precision.cpp")
|
||||
create_single_source_cgal_program(
|
||||
"test_hm_triangle.cpp")
|
||||
create_single_source_cgal_program("test_hm_unit_square.cpp")
|
||||
target_link_libraries(test_hm_unit_square PUBLIC CGAL::Eigen3_support)
|
||||
create_single_source_cgal_program("test_hm_const_linear_precision.cpp")
|
||||
target_link_libraries(test_hm_const_linear_precision PUBLIC CGAL::Eigen3_support)
|
||||
create_single_source_cgal_program("test_hm_triangle.cpp")
|
||||
target_link_libraries(test_hm_triangle PUBLIC CGAL::Eigen3_support)
|
||||
|
||||
# missing:
|
||||
# construct_centroid_2,
|
||||
# compute_determinant_2
|
||||
# in projection traits
|
||||
# create_single_source_cgal_program(
|
||||
# "test_projection_traits.cpp")
|
||||
# create_single_source_cgal_program("test_projection_traits.cpp")
|
||||
# target_link_libraries(test_projection_traits PUBLIC CGAL::Eigen3_support)
|
||||
|
||||
create_single_source_cgal_program(
|
||||
"test_all_coordinates.cpp")
|
||||
create_single_source_cgal_program("test_all_coordinates.cpp")
|
||||
target_link_libraries(test_all_coordinates PUBLIC CGAL::Eigen3_support)
|
||||
|
||||
else()
|
||||
message(WARNING
|
||||
"Harmonic coordinates require the Eigen library, and will not be compiled.")
|
||||
message(WARNING "Several coordinates require the Eigen library, and will not be compiled.")
|
||||
endif()
|
||||
else()
|
||||
message(WARNING
|
||||
"This program requires the CGAL library, and will not be compiled.")
|
||||
message(WARNING "This program requires the CGAL library, and will not be compiled.")
|
||||
endif()
|
||||
|
|
|
|||
Loading…
Reference in New Issue