mirror of https://github.com/CGAL/cgal
report only what's needed for Intersect_2
This commit is contained in:
parent
c814d11c8e
commit
ae04cb8be6
|
|
@ -36,6 +36,10 @@ namespace Intersections {
|
||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
|
||||||
|
// struct used to report the combinaric of the intersection
|
||||||
|
// of 2 2D segments.
|
||||||
|
// More information could be gathered if exposed in do_intersect.
|
||||||
|
// See comments with DI_MORE_INFO_TAG
|
||||||
struct S2S2_inter_info
|
struct S2S2_inter_info
|
||||||
{
|
{
|
||||||
bool inter = false;
|
bool inter = false;
|
||||||
|
|
@ -46,15 +50,17 @@ struct S2S2_inter_info
|
||||||
: inter(inter)
|
: inter(inter)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
// intersection is an input endpoint
|
||||||
S2S2_inter_info(int id)
|
S2S2_inter_info(int id)
|
||||||
: inter(true)
|
: inter(true)
|
||||||
{
|
{
|
||||||
pt_ids[0]=id;
|
pt_ids[0]=id;
|
||||||
}
|
}
|
||||||
|
|
||||||
S2S2_inter_info(int id1,int id2, int dim)
|
// intersection is a segment
|
||||||
|
S2S2_inter_info(int id1,int id2)
|
||||||
: inter(true)
|
: inter(true)
|
||||||
, dim(dim)
|
, dim(1)
|
||||||
{
|
{
|
||||||
pt_ids[0]=id1;
|
pt_ids[0]=id1;
|
||||||
pt_ids[1]=id2;
|
pt_ids[1]=id2;
|
||||||
|
|
@ -102,7 +108,7 @@ seg_seg_do_intersect_crossing(
|
||||||
}
|
}
|
||||||
case COLLINEAR:
|
case COLLINEAR:
|
||||||
if (extra_test && k.collinear_2_object()(p3,p4,p2))
|
if (extra_test && k.collinear_2_object()(p3,p4,p2))
|
||||||
return S2S2_inter_info(i3, i2, 1);
|
return S2S2_inter_info(i3, i2);
|
||||||
return S2S2_inter_info(i3);
|
return S2S2_inter_info(i3);
|
||||||
}
|
}
|
||||||
CGAL_kernel_assertion(false);
|
CGAL_kernel_assertion(false);
|
||||||
|
|
@ -146,7 +152,7 @@ seg_seg_do_intersect_contained(
|
||||||
}
|
}
|
||||||
case COLLINEAR:
|
case COLLINEAR:
|
||||||
if (extra_test && k.collinear_2_object()(p3,p4,p2))
|
if (extra_test && k.collinear_2_object()(p3,p4,p2))
|
||||||
return S2S2_inter_info(i3, i4, 1);
|
return S2S2_inter_info(i3, i4);
|
||||||
return S2S2_inter_info(i3);
|
return S2S2_inter_info(i3);
|
||||||
}
|
}
|
||||||
CGAL_kernel_assertion(false);
|
CGAL_kernel_assertion(false);
|
||||||
|
|
@ -188,7 +194,7 @@ do_intersect_with_info(const typename K::Segment_2 &seg1,
|
||||||
case SMALLER:
|
case SMALLER:
|
||||||
return S2S2_inter_info(false);
|
return S2S2_inter_info(false);
|
||||||
case EQUAL:
|
case EQUAL:
|
||||||
return S2S2_inter_info(A2_id, B1_id+2, 0);
|
return S2S2_inter_info(A2_id); // DI_MORE_INFO_TAG: A2==B1 but only A2 is reported
|
||||||
default: // LARGER
|
default: // LARGER
|
||||||
switch(make_certain(compare_xy(A2,B2))) {
|
switch(make_certain(compare_xy(A2,B2))) {
|
||||||
case SMALLER:
|
case SMALLER:
|
||||||
|
|
@ -196,8 +202,8 @@ do_intersect_with_info(const typename K::Segment_2 &seg1,
|
||||||
case EQUAL:
|
case EQUAL:
|
||||||
// A1 < B1 < B2 = A1
|
// A1 < B1 < B2 = A1
|
||||||
if (extra_test && k.collinear_2_object()(A1, A2, B1))
|
if (extra_test && k.collinear_2_object()(A1, A2, B1))
|
||||||
return S2S2_inter_info(B1_id+2, B2_id+2, 1); // TODO: A2==B2 too but bit is not set
|
return S2S2_inter_info(B1_id+2, B2_id+2); // DI_MORE_INFO_TAG: A2==B2 but only B2 is reported
|
||||||
return S2S2_inter_info(A2_id, B2_id+2, 0);
|
return S2S2_inter_info(A2_id); // DI_MORE_INFO_TAG: A2==B2 but only A2 is reported
|
||||||
default: // LARGER
|
default: // LARGER
|
||||||
return seg_seg_do_intersect_contained(A1,A2,B1,B2, A1_id,A2_id,B1_id+2,B2_id+2, k, extra_test);
|
return seg_seg_do_intersect_contained(A1,A2,B1,B2, A1_id,A2_id,B1_id+2,B2_id+2, k, extra_test);
|
||||||
}
|
}
|
||||||
|
|
@ -209,24 +215,24 @@ do_intersect_with_info(const typename K::Segment_2 &seg1,
|
||||||
case SMALLER:
|
case SMALLER:
|
||||||
// A1 = B1 < A2 < B2
|
// A1 = B1 < A2 < B2
|
||||||
if (k.collinear_2_object()(A1,A2,B2))
|
if (k.collinear_2_object()(A1,A2,B2))
|
||||||
return S2S2_inter_info(A1_id, A2_id, 1); // TODO A1==B1 too but bit is not set
|
return S2S2_inter_info(A1_id, A2_id); // DI_MORE_INFO_TAG: A1==B1 but only A1 is reported
|
||||||
break;
|
break;
|
||||||
case EQUAL:
|
case EQUAL:
|
||||||
// A1 = B1 < A2 = B2
|
// A1 = B1 < A2 = B2
|
||||||
return S2S2_inter_info(A1_id, A2_id, 1); // TODO A1==B1 and A2==B2 too but bits are not set
|
return S2S2_inter_info(A1_id, A2_id); // DI_MORE_INFO_TAG: A1==B1 and A2==B2 but only A1 and A2 are reported
|
||||||
default: // LARGER
|
default: // LARGER
|
||||||
// A1 = B1 < B2 < A2
|
// A1 = B1 < B2 < A2
|
||||||
if (k.collinear_2_object()(A1,A2,B2))
|
if (k.collinear_2_object()(A1,A2,B2))
|
||||||
return S2S2_inter_info(B1_id+2, B2_id+2, 1); // TODO A1==B1 too but bit is not set
|
return S2S2_inter_info(B1_id+2, B2_id+2); // DI_MORE_INFO_TAG: A1==B1 but only B1 is reported
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return S2S2_inter_info(A1_id, B1_id+2, 0);
|
return S2S2_inter_info(A1_id); // DI_MORE_INFO_TAG: A1==B1 but only A1 is reported
|
||||||
default: // LARGER
|
default: // LARGER
|
||||||
switch(make_certain(compare_xy(B2,A1))) {
|
switch(make_certain(compare_xy(B2,A1))) {
|
||||||
case SMALLER:
|
case SMALLER:
|
||||||
return S2S2_inter_info(false);
|
return S2S2_inter_info(false);
|
||||||
case EQUAL:
|
case EQUAL:
|
||||||
return S2S2_inter_info(A1_id, B2_id+2, 0);
|
return S2S2_inter_info(A1_id); // DI_MORE_INFO_TAG: A1==B2 but only A1 is reported
|
||||||
default: // LARGER
|
default: // LARGER
|
||||||
switch(make_certain(compare_xy(B2,A2))) {
|
switch(make_certain(compare_xy(B2,A2))) {
|
||||||
case SMALLER:
|
case SMALLER:
|
||||||
|
|
@ -234,8 +240,8 @@ do_intersect_with_info(const typename K::Segment_2 &seg1,
|
||||||
case EQUAL:
|
case EQUAL:
|
||||||
// B1 < A1 < A2 = B2
|
// B1 < A1 < A2 = B2
|
||||||
if (extra_test && k.collinear_2_object()(B1, A1, B2))
|
if (extra_test && k.collinear_2_object()(B1, A1, B2))
|
||||||
return S2S2_inter_info(A1_id, A2_id, 1); // TODO A2==B2 too but bit not set
|
return S2S2_inter_info(A1_id, A2_id); // DI_MORE_INFO_TAG: A2==B2 but only A2 is reported
|
||||||
return S2S2_inter_info(A2_id, B2_id+2, 0);
|
return S2S2_inter_info(A2_id); // DI_MORE_INFO_TAG: A2==B2 but only A2 is reported
|
||||||
default: // LARGER
|
default: // LARGER
|
||||||
return seg_seg_do_intersect_contained(B1,B2,A1,A2, B1_id+2,B2_id+2,A1_id,A2_id, k, extra_test);
|
return seg_seg_do_intersect_contained(B1,B2,A1,A2, B1_id+2,B2_id+2,A1_id,A2_id, k, extra_test);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue