mirror of https://github.com/CGAL/cgal
handle convex hull functionality for up to 3 points to a mutable graph and to an output iterator
This commit is contained in:
parent
ec000ea312
commit
be4dfe77ac
|
|
@ -7,9 +7,7 @@ namespace CGAL {
|
|||
[`first`, `last`). The polyhedron `pm` is cleared, then
|
||||
the convex hull is stored in `pm`. Note that the convex hull will be triangulated,
|
||||
that is `pm` will contain only triangular facets.
|
||||
|
||||
\pre There are at least four points in the range
|
||||
[`first`, `last`) not all of which are collinear.
|
||||
if the convex hull is a point or a segment, endpoints will be added in pm as isolated vertices.
|
||||
|
||||
\tparam InputIterator must be an input iterator with a value type equivalent to `Traits::Point_3`.
|
||||
\tparam PolygonMesh must be a model of `MutableFaceGraph`.
|
||||
|
|
@ -69,24 +67,20 @@ const Traits& ch_traits = Default_traits);
|
|||
/*!
|
||||
\ingroup PkgConvexHull3Functions
|
||||
|
||||
\brief computes the convex hull of the set of points in the range.
|
||||
The result is put in an output iterator as a list of points.
|
||||
\brief copies in `out` the points on the convex hull of the points in `range`.
|
||||
|
||||
\tparam InputRange a range of `Traits::Point_3`, model of `Range`.
|
||||
\tparam InputRange a range of `Traits::Point_3`, model of `ConstRange`.
|
||||
Its iterator type is `ForwardIterator`.
|
||||
\tparam OutputIterator must be an output iterator with a value type equivalent to `Traits::Point_3`.
|
||||
\tparam Traits must be model of the concept `ConvexHullTraits_3`.
|
||||
For the purposes of checking the postcondition that the convex hull
|
||||
is valid, `Traits` must also be a model of the concept
|
||||
`IsStronglyConvexTraits_3`. Furthermore, `Traits` must define a type `Polygon_mesh` that is a model of
|
||||
`MutableFaceGraph`.
|
||||
|
||||
If the kernel `R` of the points determined by the value type of `InputIterator`
|
||||
If the kernel `R` of the points from `InputRange`
|
||||
is a kernel with exact predicates but inexact constructions
|
||||
(in practice we check `R::Has_filtered_predicates_tag` is `Tag_true` and `R::FT` is a floating point type),
|
||||
then the default traits class of `convex_hull_3()` is `Convex_hull_traits_3<R>`, and `R` otherwise.
|
||||
|
||||
@param range the range of input points.
|
||||
@param out an output iterator where the list of points will be put.
|
||||
@param out an output iterator where the extreme points will be put.
|
||||
@param traits an instance of `Traits`.
|
||||
*/
|
||||
template <class InputRange, class OutputIterator, class Traits>
|
||||
|
|
|
|||
|
|
@ -93,6 +93,15 @@ void make_tetrahedron(const Point& p0, const Point& p1, const Point& p2, const P
|
|||
*(w.out)++ = p3;
|
||||
}
|
||||
|
||||
template <class Point_3, class OutputIterator>
|
||||
void make_triangle(const Point_3& p1, const Point_3& p2, const Point_3& p3,
|
||||
internal::Convex_hull_3::Output_iterator_wrapper<OutputIterator>& w)
|
||||
{
|
||||
++w.out++ = p1;
|
||||
++w.out++ = p2;
|
||||
++w.out++ = p3;
|
||||
}
|
||||
|
||||
template <class TDS, class OutputIterator>
|
||||
void copy_face_graph(const TDS& tds, internal::Convex_hull_3::Output_iterator_wrapper<OutputIterator>& wrapper)
|
||||
{
|
||||
|
|
@ -104,6 +113,43 @@ void copy_face_graph(const TDS& tds, internal::Convex_hull_3::Output_iterator_wr
|
|||
}
|
||||
}
|
||||
|
||||
template <class Point_3, class OutputIterator>
|
||||
void add_isolated_points(const Point_3& point,
|
||||
internal::Convex_hull_3::Output_iterator_wrapper<OutputIterator>& w)
|
||||
{
|
||||
++w.out++ = point;
|
||||
}
|
||||
|
||||
template <class Point_3, class Polyhedron_3>
|
||||
void add_isolated_points(const Point_3& point, Polyhedron_3& P)
|
||||
{
|
||||
typedef typename boost::graph_traits<Polyhedron_3>::vertex_descriptor vertex_descriptor;
|
||||
typedef typename boost::property_map<Polyhedron_3, CGAL::vertex_point_t>::type Vpmap;
|
||||
Vpmap vpm = get(CGAL::vertex_point, P);
|
||||
vertex_descriptor v = add_vertex(P);
|
||||
put(vpm, v, point);
|
||||
}
|
||||
|
||||
template <class Point_3, class OutputIterator>
|
||||
void add_isolated_points(const Point_3& p1, const Point_3& p2,
|
||||
internal::Convex_hull_3::Output_iterator_wrapper<OutputIterator>& w)
|
||||
{
|
||||
++w.out++ = p1;
|
||||
++w.out++ = p2;
|
||||
}
|
||||
|
||||
template <class Point_3, class Polyhedron_3>
|
||||
void add_isolated_points(const Point_3& p1, const Point_3& p2, Polyhedron_3& P)
|
||||
{
|
||||
typedef typename boost::graph_traits<Polyhedron_3>::vertex_descriptor vertex_descriptor;
|
||||
typedef typename boost::property_map<Polyhedron_3, CGAL::vertex_point_t>::type Vpmap;
|
||||
Vpmap vpm = get(CGAL::vertex_point, P);
|
||||
vertex_descriptor v1 = add_vertex(P);
|
||||
vertex_descriptor v2 = add_vertex(P);
|
||||
put(vpm, v1, p1);
|
||||
put(vpm, v2, p2);
|
||||
}
|
||||
|
||||
template <class Point_3, class OutputIterator>
|
||||
void copy_ch2_to_face_graph(const std::list<Point_3>& CH_2,
|
||||
internal::Convex_hull_3::Output_iterator_wrapper<OutputIterator>& w)
|
||||
|
|
@ -689,9 +735,6 @@ void non_coplanar_quickhull_3(std::list<typename Traits::Point_3>& points,
|
|||
// CGAL_ch_postcondition(is_strongly_convex_3(P, traits));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
template <class InputIterator, class Polyhedron_3, class Traits>
|
||||
void
|
||||
ch_quickhull_polyhedron_3(std::list<typename Traits::Point_3>& points,
|
||||
|
|
@ -907,8 +950,7 @@ convex_hull_3(InputIterator first, InputIterator beyond,
|
|||
|
||||
|
||||
template <class InputIterator>
|
||||
void convex_hull_3(InputIterator first, InputIterator beyond,
|
||||
Object& ch_object)
|
||||
void convex_hull_3(InputIterator first, InputIterator beyond, Object& ch_object)
|
||||
{
|
||||
typedef typename std::iterator_traits<InputIterator>::value_type Point_3;
|
||||
typedef typename internal::Convex_hull_3::Default_traits_for_Chull_3<Point_3>::type Traits;
|
||||
|
|
@ -924,42 +966,69 @@ void convex_hull_3(InputIterator first, InputIterator beyond,
|
|||
typedef typename Traits::Point_3 Point_3;
|
||||
typedef std::list<Point_3> Point_3_list;
|
||||
typedef typename Point_3_list::iterator P3_iterator;
|
||||
typedef std::pair<P3_iterator,P3_iterator> P3_iterator_pair;
|
||||
|
||||
if(first == beyond)
|
||||
return;
|
||||
|
||||
Point_3_list points(first, beyond);
|
||||
CGAL_ch_precondition(points.size() > 3);
|
||||
clear(polyhedron);
|
||||
|
||||
// at least 4 points
|
||||
typename Traits::Collinear_3 collinear = traits.collinear_3_object();
|
||||
typename Traits::Equal_3 equal = traits.equal_3_object();
|
||||
|
||||
P3_iterator point1_it = points.begin();
|
||||
P3_iterator point2_it = points.begin();
|
||||
point2_it++;
|
||||
|
||||
// find three that are not collinear
|
||||
while (point2_it != points.end() && equal(*point1_it,*point2_it))
|
||||
++point2_it;
|
||||
|
||||
CGAL_ch_precondition_msg(point2_it != points.end(),
|
||||
"All points are equal; cannot construct polyhedron.");
|
||||
// if there is only one point or all points are equal
|
||||
if(point2_it == points.end())
|
||||
{
|
||||
add_isolated_points(*point1_it, polyhedron);
|
||||
return;
|
||||
}
|
||||
|
||||
P3_iterator point3_it = point2_it;
|
||||
++point3_it;
|
||||
|
||||
CGAL_ch_precondition_msg(point3_it != points.end(),
|
||||
"Only two points with different coordinates; cannot construct polyhedron.");
|
||||
// if there are only two or only two points have different coordinates then return those.
|
||||
if(point3_it == points.end())
|
||||
{
|
||||
add_isolated_points(*point1_it, *point2_it, polyhedron);
|
||||
return;
|
||||
}
|
||||
|
||||
// if there are 3 points not equal, then the third is not at points.end()
|
||||
if(points.size() == 3)
|
||||
{
|
||||
if(collinear(*point1_it,*point2_it,*point3_it))
|
||||
{
|
||||
typedef typename Traits::Less_distance_to_point_3 Less_dist;
|
||||
Less_dist less_dist = traits.less_distance_to_point_3_object();
|
||||
P3_iterator_pair endpoints =
|
||||
min_max_element(points.begin(), points.end(),
|
||||
boost::bind(less_dist, *points.begin(), _1, _2),
|
||||
boost::bind(less_dist, *points.begin(), _1, _2));
|
||||
|
||||
add_isolated_points(*endpoints.first, *endpoints.second, polyhedron);
|
||||
}
|
||||
else
|
||||
{
|
||||
make_triangle(*point1_it, *point2_it, *point3_it, polyhedron);
|
||||
}
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
while (point3_it != points.end() && collinear(*point1_it,*point2_it,*point3_it))
|
||||
++point3_it;
|
||||
|
||||
CGAL_ch_precondition_msg(point3_it != points.end(),
|
||||
"All points are collinear; cannot construct polyhedron.");
|
||||
|
||||
clear(polyhedron);
|
||||
// result will be a polyhedron
|
||||
internal::Convex_hull_3::ch_quickhull_polyhedron_3(points, point1_it, point2_it, point3_it,
|
||||
polyhedron, traits);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -975,7 +1044,7 @@ void convex_hull_3(InputIterator first, InputIterator beyond,
|
|||
|
||||
template <class InputRange, class OutputIterator, class Traits>
|
||||
OutputIterator
|
||||
extreme_points_3(InputRange range,
|
||||
extreme_points_3(const InputRange& range,
|
||||
OutputIterator out,
|
||||
const Traits& traits)
|
||||
{
|
||||
|
|
@ -986,7 +1055,7 @@ extreme_points_3(InputRange range,
|
|||
|
||||
template <class InputRange, class OutputIterator>
|
||||
OutputIterator
|
||||
extreme_points_3(InputRange range, OutputIterator out)
|
||||
extreme_points_3(const InputRange& range, OutputIterator out)
|
||||
{
|
||||
typedef typename InputRange::const_iterator Iterator_type;
|
||||
typedef typename std::iterator_traits<Iterator_type>::value_type Point_3;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,289 @@
|
|||
0.041666666666666671 0.75 1 0 0 1
|
||||
0 0.75 1 0 0 1
|
||||
0 0.6875 1 0 0 1
|
||||
0.041666666666666671 0.5 1 0 0 1
|
||||
0 0.5 1 0 0 1
|
||||
0 0.4375 1 0 0 1
|
||||
0 0.5625 1 0 0 1
|
||||
0 0.625 1 0 0 1
|
||||
0.0625 0.6875 1 0 0 1
|
||||
0 0.8125 1 0 0 1
|
||||
0.071428571428571425 0.8214285714285714 1 0 0 1
|
||||
0 0.875 1 0 0 1
|
||||
0.0625 0.89583333333333337 1 0 0 1
|
||||
0 0.9375 1 0 0 1
|
||||
0.083333333333333329 0.625 1 0 0 1
|
||||
0.0625 0.5625 1 0 0 1
|
||||
0.0625 0.4375 1 0 0 1
|
||||
0 0.375 1 0 0 1
|
||||
0.0625 0.375 1 0 0 1
|
||||
0 0.3125 1 0 0 1
|
||||
0.083333333333333329 0.3125 1 0 0 1
|
||||
0.125 0.875 1 0 0 1
|
||||
0 0.25 1 0 0 1
|
||||
0.041666666666666671 0.25 1 0 0 1
|
||||
0 0.1875 1 0 0 1
|
||||
0.75 0.041666666666666671 1 0 0 1
|
||||
0.75 0.10416666666666667 1 0 0 1
|
||||
0.6875 0.083333333333333329 1 0 0 1
|
||||
0.7589285714285714 0.17857142857142858 1 0 0 1
|
||||
0.6875 0.14583333333333334 1 0 0 1
|
||||
0.63749999999999996 0.1125 1 0 0 1
|
||||
0.625 0.0625 1 0 0 1
|
||||
0.5625 0.0625 1 0 0 1
|
||||
0.58333333333333337 0.125 1 0 0 1
|
||||
0.5089285714285714 0.11607142857142858 1 0 0 1
|
||||
0.5 0.041666666666666671 1 0 0 1
|
||||
0.4375 0.0625 1 0 0 1
|
||||
0.4375 0.125 1 0 0 1
|
||||
0.38750000000000001 0.13750000000000001 1 0 0 1
|
||||
0.375 0.083333333333333329 1 0 0 1
|
||||
0.29166666666666669 0.1875 1 0 0 1
|
||||
0.25892857142857145 0.11607142857142858 1 0 0 1
|
||||
0.33333333333333331 0.125 1 0 0 1
|
||||
0.3125 0.0625 1 0 0 1
|
||||
0.25 0.041666666666666671 1 0 0 1
|
||||
0.17857142857142858 0.071428571428571425 1 0 0 1
|
||||
0.14583333333333334 0.1875 1 0 0 1
|
||||
0.1875 0.14583333333333334 1 0 0 1
|
||||
0.1875 0.1875 1 0 0 1
|
||||
0.22916666666666666 0.1875 1 0 0 1
|
||||
0.125 0.125 1 0 0 1
|
||||
0.10416666666666667 0.0625 1 0 0 1
|
||||
0.071428571428571425 0.17857142857142858 1 0 0 1
|
||||
0.0625 0.10416666666666667 1 0 0 1
|
||||
0.050000000000000003 0.050000000000000003 1 0 0 1
|
||||
0.10416666666666667 0.25 1 0 0 1
|
||||
0 0.125 1 0 0 1
|
||||
0 0.0625 1 0 0 1
|
||||
0 0 1 0 0 1
|
||||
0.0625 0 1 0 0 1
|
||||
0.125 0 1 0 0 1
|
||||
0.1875 0 1 0 0 1
|
||||
0.25 0 1 0 0 1
|
||||
0.3125 0 1 0 0 1
|
||||
0.375 0 1 0 0 1
|
||||
0.4375 0 1 0 0 1
|
||||
0.5 0 1 0 0 1
|
||||
0.5625 0 1 0 0 1
|
||||
0.625 0 1 0 0 1
|
||||
0.6875 0 1 0 0 1
|
||||
0.75 0 1 0 0 1
|
||||
0.9375 0.10416666666666667 1 0 0 1
|
||||
0.89583333333333337 0.0625 1 0 0 1
|
||||
0.94999999999999996 0.050000000000000003 1 0 0 1
|
||||
0.8125 0.1875 1 0 0 1
|
||||
0.8125 0.14583333333333334 1 0 0 1
|
||||
0.85416666666666663 0.1875 1 0 0 1
|
||||
0.8125 0.22916666666666666 1 0 0 1
|
||||
0.875 0.125 1 0 0 1
|
||||
0.8214285714285714 0.071428571428571425 1 0 0 1
|
||||
0.8839285714285714 0.25892857142857145 1 0 0 1
|
||||
0.9285714285714286 0.17857142857142858 1 0 0 1
|
||||
0.8125 0 1 0 0 1
|
||||
0.875 0 1 0 0 1
|
||||
0.9375 0 1 0 0 1
|
||||
1 0 1 0 0 1
|
||||
1 0.0625 1 0 0 1
|
||||
1 0.1875 1 0 0 1
|
||||
1 0.25 1 0 0 1
|
||||
0.95833333333333337 0.25 1 0 0 1
|
||||
1 0.125 1 0 0 1
|
||||
1 0.3125 1 0 0 1
|
||||
1 0.375 1 0 0 1
|
||||
0.9375 0.3125 1 0 0 1
|
||||
0.91666666666666663 0.375 1 0 0 1
|
||||
1 0.5625 1 0 0 1
|
||||
1 0.625 1 0 0 1
|
||||
0.9375 0.5625 1 0 0 1
|
||||
0.9375 0.625 1 0 0 1
|
||||
1 0.6875 1 0 0 1
|
||||
0.94999999999999996 0.94999999999999996 1 0 0 1
|
||||
1 1 1 0 0 1
|
||||
0.9375 1 1 0 0 1
|
||||
1 0.9375 1 0 0 1
|
||||
1 0.875 1 0 0 1
|
||||
0.9375 0.89583333333333337 1 0 0 1
|
||||
0.8125 1 1 0 0 1
|
||||
0.75 1 1 0 0 1
|
||||
0.75 0.95833333333333337 1 0 0 1
|
||||
0.8214285714285714 0.9285714285714286 1 0 0 1
|
||||
0.875 1 1 0 0 1
|
||||
0.89583333333333337 0.9375 1 0 0 1
|
||||
0.6875 1 1 0 0 1
|
||||
0.95833333333333337 0.75 1 0 0 1
|
||||
1 0.8125 1 0 0 1
|
||||
0.9285714285714286 0.8214285714285714 1 0 0 1
|
||||
1 0.75 1 0 0 1
|
||||
0.875 0.875 1 0 0 1
|
||||
0.95833333333333337 0.5 1 0 0 1
|
||||
0.8125 0.8125 1 0 0 1
|
||||
0.85416666666666663 0.8125 1 0 0 1
|
||||
0.8125 0.85416666666666663 1 0 0 1
|
||||
0.89583333333333337 0.75 1 0 0 1
|
||||
0.91666666666666663 0.6875 1 0 0 1
|
||||
0.9375 0.4375 1 0 0 1
|
||||
1 0.4375 1 0 0 1
|
||||
1 0.5 1 0 0 1
|
||||
0.875 0.33333333333333331 1 0 0 1
|
||||
0.86250000000000004 0.38750000000000001 1 0 0 1
|
||||
0.8125 0.29166666666666669 1 0 0 1
|
||||
0.75 0.25 1 0 0 1
|
||||
0.35416666666666669 0.1875 1 0 0 1
|
||||
0.6875 0.20833333333333334 1 0 0 1
|
||||
0.5625 0.1875 1 0 0 1
|
||||
0.625 0.16666666666666666 1 0 0 1
|
||||
0.49107142857142855 0.19642857142857142 1 0 0 1
|
||||
0.41666666666666669 0.1875 1 0 0 1
|
||||
0.54166666666666663 0.25 1 0 0 1
|
||||
0.6160714285714286 0.24107142857142858 1 0 0 1
|
||||
0.6875 0.27083333333333331 1 0 0 1
|
||||
0.7410714285714286 0.32142857142857145 1 0 0 1
|
||||
0.8125 0.35416666666666669 1 0 0 1
|
||||
0.6875 0.3125 1 0 0 1
|
||||
0.88749999999999996 0.63749999999999996 1 0 0 1
|
||||
0.875 0.58333333333333337 1 0 0 1
|
||||
0.8214285714285714 0.7589285714285714 1 0 0 1
|
||||
0.85416666666666663 0.6875 1 0 0 1
|
||||
0.8839285714285714 0.5089285714285714 1 0 0 1
|
||||
0.875 0.4375 1 0 0 1
|
||||
0.58333333333333337 0.3125 1 0 0 1
|
||||
0.64583333333333337 0.3125 1 0 0 1
|
||||
0.8125 0.41666666666666669 1 0 0 1
|
||||
0.6875 0.35416666666666669 1 0 0 1
|
||||
0.75 0.39583333333333331 1 0 0 1
|
||||
0.625 0.375 1 0 0 1
|
||||
0.8125 0.5625 1 0 0 1
|
||||
0.83333333333333337 0.625 1 0 0 1
|
||||
0.8035714285714286 0.49107142857142855 1 0 0 1
|
||||
0.75 0.45833333333333331 1 0 0 1
|
||||
0.75 0.5 1 0 0 1
|
||||
0.6785714285714286 0.42857142857142855 1 0 0 1
|
||||
0.70833333333333337 0.8125 1 0 0 1
|
||||
0.7410714285714286 0.8839285714285714 1 0 0 1
|
||||
0.66666666666666663 0.875 1 0 0 1
|
||||
0.75 0.54166666666666663 1 0 0 1
|
||||
0.70833333333333337 0.5 1 0 0 1
|
||||
0.72916666666666663 0.6875 1 0 0 1
|
||||
0.7589285714285714 0.6160714285714286 1 0 0 1
|
||||
0.79166666666666663 0.6875 1 0 0 1
|
||||
0.6875 0.9375 1 0 0 1
|
||||
0.75 0.75 1 0 0 1
|
||||
0.11607142857142858 0.7410714285714286 1 0 0 1
|
||||
0.3125 0.91666666666666663 1 0 0 1
|
||||
0.36249999999999999 0.88749999999999996 1 0 0 1
|
||||
0.375 0.9375 1 0 0 1
|
||||
0.6875 0.64583333333333337 1 0 0 1
|
||||
0.6875 0.6875 1 0 0 1
|
||||
0.64583333333333337 0.8125 1 0 0 1
|
||||
0.61250000000000004 0.86250000000000004 1 0 0 1
|
||||
0.6785714285714286 0.7410714285714286 1 0 0 1
|
||||
0.6785714285714286 0.5714285714285714 1 0 0 1
|
||||
0.125 0.66666666666666663 1 0 0 1
|
||||
0.13750000000000001 0.61250000000000004 1 0 0 1
|
||||
0.1875 0.70833333333333337 1 0 0 1
|
||||
0.1875 0.77083333333333337 1 0 0 1
|
||||
0.3125 0.85416666666666663 1 0 0 1
|
||||
0.375 0.83333333333333337 1 0 0 1
|
||||
0.58333333333333337 0.8125 1 0 0 1
|
||||
0.5625 0.875 1 0 0 1
|
||||
0.49107142857142855 0.8839285714285714 1 0 0 1
|
||||
0.5089285714285714 0.8035714285714286 1 0 0 1
|
||||
0.64583333333333337 0.6875 1 0 0 1
|
||||
0.64583333333333337 0.5 1 0 0 1
|
||||
0.60416666666666663 0.4375 1 0 0 1
|
||||
0.14583333333333334 0.3125 1 0 0 1
|
||||
0.17857142857142858 0.24107142857142858 1 0 0 1
|
||||
0.20833333333333334 0.3125 1 0 0 1
|
||||
0.19642857142857142 0.5089285714285714 1 0 0 1
|
||||
0.11607142857142858 0.49107142857142855 1 0 0 1
|
||||
0.1875 0.4375 1 0 0 1
|
||||
0.16666666666666666 0.375 1 0 0 1
|
||||
0.32142857142857145 0.5714285714285714 1 0 0 1
|
||||
0.35416666666666669 0.5 1 0 0 1
|
||||
0.39583333333333331 0.5625 1 0 0 1
|
||||
0.1875 0.64583333333333337 1 0 0 1
|
||||
0.1125 0.36249999999999999 1 0 0 1
|
||||
0.125 0.41666666666666669 1 0 0 1
|
||||
0.25 0.45833333333333331 1 0 0 1
|
||||
0.29166666666666669 0.5 1 0 0 1
|
||||
0.25 0.5 1 0 0 1
|
||||
0.125 0.5625 1 0 0 1
|
||||
0.41666666666666669 0.6875 1 0 0 1
|
||||
0.375 0.625 1 0 0 1
|
||||
0.4375 0.625 1 0 0 1
|
||||
0.5089285714285714 0.30357142857142855 1 0 0 1
|
||||
0.5 0.375 1 0 0 1
|
||||
0.42857142857142855 0.32142857142857145 1 0 0 1
|
||||
0.54166666666666663 0.4375 1 0 0 1
|
||||
0.5625 0.375 1 0 0 1
|
||||
0.39583333333333331 0.4375 1 0 0 1
|
||||
0.4375 0.39583333333333331 1 0 0 1
|
||||
0.4375 0.4375 1 0 0 1
|
||||
0.5714285714285714 0.5089285714285714 1 0 0 1
|
||||
0.5 0.25 1 0 0 1
|
||||
0.32142857142857145 0.25892857142857145 1 0 0 1
|
||||
0.25 0.54166666666666663 1 0 0 1
|
||||
0.35416666666666669 0.6875 1 0 0 1
|
||||
0.3125 0.72916666666666663 1 0 0 1
|
||||
0.3125 0.6875 1 0 0 1
|
||||
0.45833333333333331 0.25 1 0 0 1
|
||||
0.1875 0.58333333333333337 1 0 0 1
|
||||
0.25 0.25 1 0 0 1
|
||||
0.27083333333333331 0.3125 1 0 0 1
|
||||
0.3125 0.3125 1 0 0 1
|
||||
0.35416666666666669 0.3125 1 0 0 1
|
||||
0.25 0.60416666666666663 1 0 0 1
|
||||
0.39583333333333331 0.25 1 0 0 1
|
||||
0.77083333333333337 0.8125 1 0 0 1
|
||||
0.625 1 1 0 0 1
|
||||
0.5 0.95833333333333337 1 0 0 1
|
||||
0.5 1 1 0 0 1
|
||||
0.4375 1 1 0 0 1
|
||||
0.5625 0.9375 1 0 0 1
|
||||
0.5625 1 1 0 0 1
|
||||
0.25 0.95833333333333337 1 0 0 1
|
||||
0.25 1 1 0 0 1
|
||||
0.1875 1 1 0 0 1
|
||||
0.3125 1 1 0 0 1
|
||||
0.375 1 1 0 0 1
|
||||
0.4375 0.9375 1 0 0 1
|
||||
0.625 0.91666666666666663 1 0 0 1
|
||||
0.17857142857142858 0.9285714285714286 1 0 0 1
|
||||
0.125 1 1 0 0 1
|
||||
0.10416666666666667 0.9375 1 0 0 1
|
||||
0.0625 1 1 0 0 1
|
||||
0.050000000000000003 0.94999999999999996 1 0 0 1
|
||||
0 1 1 0 0 1
|
||||
0.14583333333333334 0.8125 1 0 0 1
|
||||
0.1875 0.85416666666666663 1 0 0 1
|
||||
0.25 0.89583333333333337 1 0 0 1
|
||||
0.41666666666666669 0.875 1 0 0 1
|
||||
0.4375 0.8125 1 0 0 1
|
||||
0.24107142857142858 0.38392857142857145 1 0 0 1
|
||||
0.32142857142857145 0.42857142857142855 1 0 0 1
|
||||
0.45833333333333331 0.5625 1 0 0 1
|
||||
0.5 0.5 1 0 0 1
|
||||
0.52083333333333337 0.5625 1 0 0 1
|
||||
0.47916666666666669 0.4375 1 0 0 1
|
||||
0.42857142857142855 0.49107142857142855 1 0 0 1
|
||||
0.5 0.625 1 0 0 1
|
||||
0.5625 0.60416666666666663 1 0 0 1
|
||||
0.5625 0.5625 1 0 0 1
|
||||
0.3125 0.35416666666666669 1 0 0 1
|
||||
0.375 0.375 1 0 0 1
|
||||
0.49107142857142855 0.6964285714285714 1 0 0 1
|
||||
0.5714285714285714 0.6785714285714286 1 0 0 1
|
||||
0.60416666666666663 0.5625 1 0 0 1
|
||||
0.625 0.625 1 0 0 1
|
||||
0.60416666666666663 0.75 1 0 0 1
|
||||
0.54166666666666663 0.75 1 0 0 1
|
||||
0.5 0.75 1 0 0 1
|
||||
0.3125 0.64583333333333337 1 0 0 1
|
||||
0.25892857142857145 0.6785714285714286 1 0 0 1
|
||||
0.45833333333333331 0.75 1 0 0 1
|
||||
0.25 0.75 1 0 0 1
|
||||
0.24107142857142858 0.8214285714285714 1 0 0 1
|
||||
0.1875 0.8125 1 0 0 1
|
||||
0.3125 0.79166666666666663 1 0 0 1
|
||||
0.38392857142857145 0.7589285714285714 1 0 0 1
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,10 +1,15 @@
|
|||
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
||||
#include <CGAL/Surface_mesh.h>
|
||||
#include <CGAL/convex_hull_3.h>
|
||||
#include <CGAL/Convex_hull_traits_3.h>
|
||||
#include <CGAL/Exact_rational.h>
|
||||
#include <CGAL/Cartesian.h>
|
||||
#include <CGAL/Polyhedron_3.h>
|
||||
#include <CGAL/boost/graph/named_params_helper.h>
|
||||
#include <vector>
|
||||
#include <cassert>
|
||||
#include <algorithm>
|
||||
#include <fstream>
|
||||
|
||||
typedef CGAL::Exact_rational NT;
|
||||
typedef CGAL::Cartesian<NT> K;
|
||||
|
|
@ -12,6 +17,7 @@ typedef CGAL::Convex_hull_traits_3<K> Traits;
|
|||
typedef Traits::Polygon_mesh Polyhedron_3;
|
||||
typedef K::Point_3 Point_3;
|
||||
|
||||
|
||||
void test_function_overload()
|
||||
{
|
||||
std::vector<Point_3> points;
|
||||
|
|
@ -23,28 +29,188 @@ void test_function_overload()
|
|||
points.push_back(Point_3(2,5,3));
|
||||
points.push_back(Point_3(1,3,2));
|
||||
|
||||
Polyhedron_3 polyhedron;
|
||||
CGAL::convex_hull_3(points.begin(), points.end(), polyhedron);
|
||||
|
||||
std::vector<Point_3> extreme_points;
|
||||
CGAL::extreme_points_3(points, std::back_inserter(extreme_points));
|
||||
CGAL_assertion(extreme_points.size() == 5);
|
||||
|
||||
Polyhedron_3 polyhedron;
|
||||
CGAL::convex_hull_3(points.begin(), points.end(), polyhedron);
|
||||
typedef Polyhedron_3::Point_iterator Point_iterator;
|
||||
int i = 0;
|
||||
for (Point_iterator p_it = polyhedron.points_begin(); p_it != polyhedron.points_end(); ++p_it)
|
||||
{
|
||||
Point_3 p = *p_it;
|
||||
CGAL_assertion(p == extreme_points[i]);
|
||||
i++;
|
||||
CGAL_assertion(std::find(extreme_points.begin(), extreme_points.end(), p) != extreme_points.end());
|
||||
}
|
||||
}
|
||||
|
||||
void test_triangulated_cube(const char* fname)
|
||||
{
|
||||
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
|
||||
typedef K::Point_3 Point_3;
|
||||
typedef CGAL::Surface_mesh<Point_3> SurfaceMesh;
|
||||
|
||||
std::ifstream input(fname);
|
||||
SurfaceMesh mesh;
|
||||
if (!input || !(input >> mesh) || mesh.is_empty()) {
|
||||
std::cerr << fname << " is not a valid off file.\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
std::vector<Point_3> mesh_points;
|
||||
typedef typename boost::property_map<SurfaceMesh, boost::vertex_point_t>::type Pmap;
|
||||
Pmap vpmap = get_property_map(boost::vertex_point, mesh);
|
||||
|
||||
typedef typename boost::graph_traits<SurfaceMesh>::vertex_descriptor vertex_descriptor;
|
||||
BOOST_FOREACH(vertex_descriptor v, vertices(mesh))
|
||||
{
|
||||
Point_3 p = get(vpmap, v);
|
||||
mesh_points.push_back(p);
|
||||
}
|
||||
|
||||
std::vector<Point_3> extreme_points;
|
||||
CGAL::extreme_points_3(mesh_points, std::back_inserter(extreme_points)) ;
|
||||
CGAL_assertion(extreme_points.size() == 8);
|
||||
}
|
||||
|
||||
void test_coplanar_points(const char* fname)
|
||||
{
|
||||
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
|
||||
typedef K::Point_3 Point_3;
|
||||
|
||||
std::ifstream input(fname);
|
||||
std::vector<Point_3> points;
|
||||
if(input)
|
||||
{
|
||||
Point_3 p;
|
||||
int i = 0;
|
||||
while(input >> p)
|
||||
{
|
||||
if(i % 2 == 0) // avoid normals in .xyz file
|
||||
{
|
||||
points.push_back(p);
|
||||
}
|
||||
++i;
|
||||
}
|
||||
}
|
||||
else
|
||||
std::cerr << "error loading file\n";
|
||||
|
||||
CGAL_assertion(points.size() == 289);
|
||||
std::vector<Point_3> convex_hull;
|
||||
CGAL::extreme_points_3(points, std::back_inserter(convex_hull));
|
||||
CGAL_assertion(convex_hull.size() == 4);
|
||||
}
|
||||
|
||||
void test_3_points()
|
||||
{
|
||||
std::vector<Point_3> points;
|
||||
points.push_back(Point_3(0,0,0));
|
||||
points.push_back(Point_3(10,0,0));
|
||||
points.push_back(Point_3(0,10,0));
|
||||
|
||||
Polyhedron_3 polyhedron;
|
||||
CGAL::convex_hull_3(points.begin(), points.end(), polyhedron);
|
||||
std::vector<Point_3> convex_polyhedron(polyhedron.points_begin(), polyhedron.points_end());
|
||||
CGAL_assertion(convex_polyhedron.size() == 3);
|
||||
|
||||
std::vector<Point_3> extreme_points;
|
||||
CGAL::extreme_points_3(points, std::back_inserter(extreme_points));
|
||||
CGAL_assertion(convex_polyhedron.size() == 3);
|
||||
|
||||
typedef Polyhedron_3::Point_iterator Point_iterator;
|
||||
for (Point_iterator p_it = polyhedron.points_begin(); p_it != polyhedron.points_end(); ++p_it)
|
||||
{
|
||||
Point_3 p = *p_it;
|
||||
CGAL_assertion(std::find(extreme_points.begin(), extreme_points.end(), p) != extreme_points.end());
|
||||
}
|
||||
}
|
||||
|
||||
void test_3_collinear()
|
||||
{
|
||||
std::vector<Point_3> points;
|
||||
points.push_back(Point_3(0,0,0));
|
||||
points.push_back(Point_3(1,0,0));
|
||||
points.push_back(Point_3(2,0,0));
|
||||
|
||||
Polyhedron_3 polyhedron;
|
||||
CGAL::convex_hull_3(points.begin(), points.end(), polyhedron);
|
||||
std::vector<Point_3> convex_polyhedron(polyhedron.points_begin(), polyhedron.points_end());
|
||||
CGAL_assertion(convex_polyhedron.size() == 2);
|
||||
|
||||
std::vector<Point_3> extreme_points;
|
||||
CGAL::extreme_points_3(points, std::back_inserter(extreme_points));
|
||||
CGAL_assertion(convex_polyhedron.size() == 2);
|
||||
|
||||
typedef Polyhedron_3::Point_iterator Point_iterator;
|
||||
for (Point_iterator p_it = polyhedron.points_begin(); p_it != polyhedron.points_end(); ++p_it)
|
||||
{
|
||||
Point_3 p = *p_it;
|
||||
CGAL_assertion(std::find(extreme_points.begin(), extreme_points.end(), p) != extreme_points.end());
|
||||
}
|
||||
}
|
||||
|
||||
void test_up_to_3_extreme_points()
|
||||
{
|
||||
std::vector<Point_3> points;
|
||||
std::vector<Point_3> extreme_points;
|
||||
CGAL::extreme_points_3(points, std::back_inserter(extreme_points));
|
||||
CGAL_assertion(extreme_points.empty());
|
||||
|
||||
Point_3 p1(0, 0, 0);
|
||||
points.push_back(p1);
|
||||
extreme_points.clear();
|
||||
CGAL::extreme_points_3(points, std::back_inserter(extreme_points));
|
||||
CGAL_assertion(extreme_points.size() == 1);
|
||||
|
||||
Point_3 p2(1, 0, 0);
|
||||
points.push_back(p2);
|
||||
extreme_points.clear();
|
||||
CGAL::extreme_points_3(points, std::back_inserter(extreme_points));
|
||||
CGAL_assertion(extreme_points.size() == 2);
|
||||
|
||||
Point_3 p3(1, 1, 0);
|
||||
points.push_back(p3);
|
||||
extreme_points.clear();
|
||||
CGAL::extreme_points_3(points, std::back_inserter(extreme_points));
|
||||
CGAL_assertion(extreme_points.size() == 3);
|
||||
}
|
||||
|
||||
void test_equal_points()
|
||||
{
|
||||
std::vector<Point_3> points;
|
||||
std::vector<Point_3> extreme_points;
|
||||
|
||||
// test two equal
|
||||
Point_3 p1(0, 0, 0);
|
||||
points.push_back(p1);
|
||||
points.push_back(p1);
|
||||
CGAL::extreme_points_3(points, std::back_inserter(extreme_points));
|
||||
CGAL_assertion(extreme_points.size() == 1);
|
||||
|
||||
// test many equal
|
||||
extreme_points.clear();
|
||||
for(int i = 0; i < 10; ++i)
|
||||
points.push_back(p1);
|
||||
CGAL::extreme_points_3(points, std::back_inserter(extreme_points));
|
||||
CGAL_assertion(extreme_points.size() == 1);
|
||||
|
||||
// test with only 2 different
|
||||
extreme_points.clear();
|
||||
Point_3 p3(0.1, 0, 0);
|
||||
points.push_back(p3);
|
||||
CGAL::extreme_points_3(points, std::back_inserter(extreme_points));
|
||||
CGAL_assertion(extreme_points.size() == 2);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
|
||||
test_function_overload();
|
||||
test_3_points();
|
||||
test_up_to_3_extreme_points();
|
||||
test_3_collinear();
|
||||
test_triangulated_cube("data/cube_meshed.off");
|
||||
test_coplanar_points("data/coplanar_points.xyz");
|
||||
test_equal_points();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,6 +44,10 @@ Release date: September 2018
|
|||
to reflect the real needs of the code (some types and operators were used
|
||||
in the code but did not appear in the concepts).
|
||||
|
||||
### Convex hull 3
|
||||
- Added the function `extreme_points_3()` computing the
|
||||
points on the convex hull without underlying connectivity.
|
||||
|
||||
### Polygon Mesh Processing
|
||||
- Added a function to apply a transformation to a mesh:
|
||||
- `CGAL::Polygon_mesh_processing::transform()`
|
||||
|
|
@ -83,7 +87,6 @@ Release date: September 2018
|
|||
- Improve the function `CGAL::Euler::collapse_edge` so that the target
|
||||
vertex of the collapsed edge is always kept after the collapse.
|
||||
|
||||
|
||||
Release 4.12
|
||||
------------
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue