add tests for intersection of segments

This commit is contained in:
Sébastien Loriot 2021-02-01 11:19:30 +01:00
parent 3082808434
commit 2c1b967db1
1 changed files with 68 additions and 0 deletions

View File

@ -60,6 +60,67 @@ bool test(std::string test_name)
return cdt.is_valid();
}
template <class K, typename CDT_2_traits>
bool test_segment_intersections(std::string test_name)
{
std::cerr << "Testing " << test_name << std::endl;
CDT_2_traits traits(typename K::Vector_3(0,0,1));
typename CDT_2_traits::Intersect_2 intersect = traits.intersect_2_object();
typedef typename CDT_2_traits::Segment_2 Segment_2;
typedef typename CDT_2_traits::Point_2 Point_2;
// test point intersection
Segment_2 s1( Point_2(0,0,0), Point_2(1,1,0) ),
s2( Point_2(0,1,0), Point_2(1,0,0) );
CGAL::Object o = intersect(s1,s2);
assert( o.is<Point_2>() );
// test segment overlap
Point_2 pts[4] = { Point_2(0,0,0), Point_2(1,0,1), Point_2(2,0,2), Point_2(4,0,3) };
o = intersect( Segment_2(pts[0], pts[1]), Segment_2(pts[2], pts[3]) );
assert( o.empty() );
// pure overlap
o = intersect( Segment_2(pts[0], pts[2]), Segment_2(pts[1], pts[3]) );
assert( o.is<Segment_2>() );
o = intersect( Segment_2(pts[0], pts[2]), Segment_2(pts[3], pts[1]) );
assert( o.is<Segment_2>() );
o = intersect( Segment_2(pts[2], pts[0]), Segment_2(pts[1], pts[3]) );
assert( o.is<Segment_2>() );
o = intersect( Segment_2(pts[2], pts[0]), Segment_2(pts[3], pts[1]) );
assert( o.is<Segment_2>() );
// segment fully included
o = intersect( Segment_2(pts[0], pts[3]), Segment_2(pts[1], pts[2]) );
assert( o.is<Segment_2>() );
assert( CGAL::object_cast<Segment_2>(o) == Segment_2(pts[1], pts[2]) );
// segment fully included with shared vertex
o = intersect( Segment_2(pts[0], pts[1]), Segment_2(pts[0], pts[2]) );
assert( o.is<Segment_2>() );
assert( CGAL::object_cast<Segment_2>(o) == Segment_2(pts[0], pts[1]) );
// segment sharing a vertex
o = intersect( Segment_2(pts[0], pts[1]), Segment_2(pts[1], pts[2]) );
assert( o.is<Point_2>() );
assert( CGAL::object_cast<Point_2>(o) == pts[1]);
// degenerate segment
Segment_2 sd(Point_2(1,0,6), Point_2(1,0,7));
o = intersect( Segment_2(pts[0], pts[2]), sd );
assert( o.is<Point_2>() );
o = intersect( Segment_2(pts[0], pts[1]), sd );
assert( o.is<Point_2>() );
o = intersect( Segment_2(pts[1], pts[0]), sd );
assert( o.is<Point_2>() );
o = intersect( Segment_2(pts[2], pts[3]), sd );
assert( o.empty() );
return true;
}
int main()
{
std::cerr.precision(17);
@ -75,5 +136,12 @@ int main()
test<CGAL::Epeck,
CGAL::Triangulation_2_projection_traits_3<Epeck> >
("CDT_2 in a 3D plane, with Epeck");
ok = ok && test_segment_intersections<CGAL::Epick,
CGAL::Triangulation_2_projection_traits_3<Epick> >
("CDT_2 traits intersection with Epick");
ok = ok && test_segment_intersections<CGAL::Epeck,
CGAL::Triangulation_2_projection_traits_3<Epeck> >
("CDT_2 traits intersection with Epeck");
return ok ? 0 : 1;
}