mirror of https://github.com/CGAL/cgal
fix the concept ConvexHullTraits_3 in the case of coplanar points
This commit is contained in:
parent
4ed2497f2e
commit
7b05330a75
|
|
@ -77,7 +77,11 @@ typedef R::Construct_centroid_3 Construct_centroid_3;
|
||||||
/*!
|
/*!
|
||||||
|
|
||||||
*/
|
*/
|
||||||
typedef unspecified_type Construct_orthogonal_vector_3;
|
typedef R::Construct_vector_3 Construct_vector_3;
|
||||||
|
/*!
|
||||||
|
|
||||||
|
*/
|
||||||
|
typedef R::Orientation_3 Orientation_3;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -128,6 +128,23 @@ Same as above but in the `xz`-plane
|
||||||
*/
|
*/
|
||||||
typedef unspecified_type Traits_xz_3;
|
typedef unspecified_type Traits_xz_3;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Function object type that provides
|
||||||
|
`Vector_3 operator()(Point_3 p1, Point_3 p2)`, which
|
||||||
|
constructs and returns the vector `p1p2`, and
|
||||||
|
`Vector_3 operator()(int x,int y,int z)` which constructs and returns
|
||||||
|
a vector with integer Cartesian coordinates.
|
||||||
|
*/
|
||||||
|
typedef unspecified_type Construct_vector_3;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Predicate object type that
|
||||||
|
provides `CGAL::Orientation operator()(Vector_3 u, Vector_3 v, Vector_3 w)`
|
||||||
|
which returns `CGAL::NEGATIVE` if u, v and w are negatively oriented,
|
||||||
|
`CGAL::POSITIVE` if u, v and w are positively oriented and
|
||||||
|
`CGAL::COPLANAR` if u, v and w are coplanar.
|
||||||
|
*/
|
||||||
|
typedef unspecified_type Orientation_3;
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -130,29 +130,6 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
class Max_coordinate_3
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
int operator()(const T& v)
|
|
||||||
{
|
|
||||||
if (CGAL_NTS abs(v.x()) >= CGAL_NTS abs(v.y()))
|
|
||||||
{
|
|
||||||
if (CGAL_NTS abs(v.x()) >= CGAL_NTS abs(v.z())) return 0;
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (CGAL_NTS abs(v.y()) >= CGAL_NTS abs(v.z())) return 1;
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <typename GT>
|
template <typename GT>
|
||||||
struct GT3_for_CH3 {
|
struct GT3_for_CH3 {
|
||||||
typedef typename GT::Point_3 Point_2;
|
typedef typename GT::Point_3 Point_2;
|
||||||
|
|
@ -201,10 +178,10 @@ class Convex_hull_traits_3
|
||||||
Less_signed_distance_to_plane_3;
|
Less_signed_distance_to_plane_3;
|
||||||
|
|
||||||
// required for degenerate case of all points coplanar
|
// required for degenerate case of all points coplanar
|
||||||
typedef CGAL::Max_coordinate_3<Vector_3> Max_coordinate_3;
|
|
||||||
typedef CGAL::Projection_traits_xy_3<R> Traits_xy_3;
|
typedef CGAL::Projection_traits_xy_3<R> Traits_xy_3;
|
||||||
typedef CGAL::Projection_traits_yz_3<R> Traits_yz_3;
|
typedef CGAL::Projection_traits_yz_3<R> Traits_yz_3;
|
||||||
typedef CGAL::Projection_traits_xz_3<R> Traits_xz_3;
|
typedef CGAL::Projection_traits_xz_3<R> Traits_xz_3;
|
||||||
|
typedef typename R::Construct_vector_3 Construct_vector_3;
|
||||||
// for postcondition checking
|
// for postcondition checking
|
||||||
typedef typename R::Ray_3 Ray_3;
|
typedef typename R::Ray_3 Ray_3;
|
||||||
|
|
||||||
|
|
@ -272,9 +249,14 @@ class Convex_hull_traits_3
|
||||||
less_signed_distance_to_plane_3_object() const
|
less_signed_distance_to_plane_3_object() const
|
||||||
{ return Less_signed_distance_to_plane_3(); }
|
{ return Less_signed_distance_to_plane_3(); }
|
||||||
|
|
||||||
Max_coordinate_3
|
Orientation_3
|
||||||
max_coordinate_3_object() const
|
orientation_3_object() const
|
||||||
{ return Max_coordinate_3(); }
|
{ return Orientation_3(); }
|
||||||
|
|
||||||
|
Construct_vector_3
|
||||||
|
construct_vector_3_object() const
|
||||||
|
{ return Construct_vector_3(); }
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace CGAL
|
} // namespace CGAL
|
||||||
|
|
|
||||||
|
|
@ -309,14 +309,15 @@ struct Projection_traits<T,true>{
|
||||||
|
|
||||||
} } //end of namespace internal::Convex_hull_3
|
} } //end of namespace internal::Convex_hull_3
|
||||||
|
|
||||||
template <class InputIterator, class Plane_3, class Polyhedron_3, class Traits>
|
template <class InputIterator, class Point_3, class Polyhedron_3, class Traits>
|
||||||
void coplanar_3_hull(InputIterator first, InputIterator beyond,
|
void coplanar_3_hull(InputIterator first, InputIterator beyond,
|
||||||
Plane_3 plane, Polyhedron_3& P, const Traits& traits)
|
const Point_3& p1, const Point_3& p2, const Point_3& p3,
|
||||||
|
Polyhedron_3& P, const Traits& traits)
|
||||||
{
|
{
|
||||||
typedef typename Traits::Point_3 Point_3;
|
|
||||||
typedef typename Traits::Vector_3 Vector_3;
|
typedef typename Traits::Vector_3 Vector_3;
|
||||||
typedef Max_coordinate_3<Vector_3> Max_coordinate_3;
|
typedef typename Traits::Construct_vector_3 Construct_vector_3;
|
||||||
typedef Polyhedron_3 Polyhedron;
|
typedef typename Traits::Orientation_3 Orientation_3;
|
||||||
|
|
||||||
typedef typename internal::Convex_hull_3::Projection_traits<Traits> PTraits;
|
typedef typename internal::Convex_hull_3::Projection_traits<Traits> PTraits;
|
||||||
typedef typename PTraits::Traits_xy_3 Traits_xy_3;
|
typedef typename PTraits::Traits_xy_3 Traits_xy_3;
|
||||||
typedef typename PTraits::Traits_yz_3 Traits_yz_3;
|
typedef typename PTraits::Traits_yz_3 Traits_yz_3;
|
||||||
|
|
@ -324,38 +325,36 @@ void coplanar_3_hull(InputIterator first, InputIterator beyond,
|
||||||
|
|
||||||
std::list<Point_3> CH_2;
|
std::list<Point_3> CH_2;
|
||||||
typedef typename std::list<Point_3>::iterator CH_2_iterator;
|
typedef typename std::list<Point_3>::iterator CH_2_iterator;
|
||||||
typedef typename Traits::Construct_orthogonal_vector_3
|
|
||||||
Construct_normal_vec;
|
|
||||||
Max_coordinate_3 max_coordinate;
|
|
||||||
|
|
||||||
Construct_normal_vec c_normal =
|
Construct_vector_3 vector_3 = traits.construct_vector_3_object();
|
||||||
traits.construct_orthogonal_vector_3_object();
|
Orientation_3 orientation = traits.orientation_3_object();
|
||||||
Vector_3 normal = c_normal(plane);
|
Vector_3 v1 = vector_3(p1,p2);
|
||||||
int max_coord = max_coordinate(normal);
|
Vector_3 v2 = vector_3(p1,p3);
|
||||||
switch (max_coord)
|
|
||||||
{
|
Vector_3 vx = vector_3(1,0,0);
|
||||||
case 0:
|
|
||||||
{
|
|
||||||
|
|
||||||
|
if ( orientation(v1, v2, vx) != COPLANAR )
|
||||||
convex_hull_points_2( first, beyond,
|
convex_hull_points_2( first, beyond,
|
||||||
std::back_inserter(CH_2), Traits_yz_3());
|
std::back_inserter(CH_2),
|
||||||
break;
|
Traits_yz_3() );
|
||||||
}
|
else{
|
||||||
case 1:
|
Vector_3 vy = vector_3(0,1,0);
|
||||||
{
|
if ( orientation(v1,v2,vy) != COPLANAR )
|
||||||
convex_hull_points_2( first, beyond,
|
convex_hull_points_2( first, beyond,
|
||||||
std::back_inserter(CH_2), Traits_xz_3());
|
std::back_inserter(CH_2),
|
||||||
break;
|
Traits_xz_3() );
|
||||||
}
|
else{
|
||||||
case 2:
|
CGAL_assertion_code( Vector_3 vz = vector_3(0,0,1); )
|
||||||
{
|
CGAL_assertion( orientation(v1,v2,vz) != COPLANAR );
|
||||||
convex_hull_points_2( first, beyond,
|
convex_hull_points_2( first, beyond,
|
||||||
std::back_inserter(CH_2), Traits_xy_3());
|
std::back_inserter(CH_2),
|
||||||
break;
|
Traits_xy_3() );
|
||||||
}
|
}
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
typedef typename Polyhedron::Halfedge_data_structure HDS;
|
|
||||||
|
typedef typename Polyhedron_3::Halfedge_data_structure HDS;
|
||||||
|
|
||||||
Build_coplanar_poly<HDS,CH_2_iterator> poly(CH_2.begin(),CH_2.end());
|
Build_coplanar_poly<HDS,CH_2_iterator> poly(CH_2.begin(),CH_2.end());
|
||||||
P.delegate(poly);
|
P.delegate(poly);
|
||||||
|
|
@ -745,7 +744,7 @@ ch_quickhull_polyhedron_3(std::list<typename Traits::Point_3>& points,
|
||||||
|
|
||||||
// if the maximum distance point is on the plane then all are coplanar
|
// if the maximum distance point is on the plane then all are coplanar
|
||||||
if (coplanar(*point1_it, *point2_it, *point3_it, *max_it)) {
|
if (coplanar(*point1_it, *point2_it, *point3_it, *max_it)) {
|
||||||
coplanar_3_hull(points.begin(), points.end(), plane, P, traits);
|
coplanar_3_hull(points.begin(), points.end(), *point1_it, *point2_it, *point3_it, P, traits);
|
||||||
} else {
|
} else {
|
||||||
Tds tds;
|
Tds tds;
|
||||||
Vertex_handle v0 = tds.create_vertex(); v0->set_point(*point1_it);
|
Vertex_handle v0 = tds.create_vertex(); v0->set_point(*point1_it);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue