mirror of https://github.com/CGAL/cgal
Factorize code in CGAL/internal/Static_filters/Do_intersect_3.h
The static filters of Do_intersect(BBox_3, Segment_3) and Do_intersect(BBox_3, Segment_3) now use do_intersect_bbox_segment_aux(..) from CGAL/internal/Intersections_3/Bbox_3_Segment_3_do_intersect.h
This commit is contained in:
parent
a72bd80380
commit
1c6ba1851b
|
|
@ -130,179 +130,6 @@ public:
|
||||||
|
|
||||||
if(is_indeterminate(ub)) return Base::operator()(s,b);
|
if(is_indeterminate(ub)) return Base::operator()(s,b);
|
||||||
else return ub.sup();
|
else return ub.sup();
|
||||||
|
|
||||||
// -----------------------------------
|
|
||||||
// treat x coord
|
|
||||||
// -----------------------------------
|
|
||||||
double dmin, dmax, tmin, tmax;
|
|
||||||
if ( qx >= px ) // this is input and needs no epsilon
|
|
||||||
{
|
|
||||||
if(px > bxmax) return false; // segment on the right of bbox
|
|
||||||
if(qx < bxmin) return false; // segment on the left of bbox
|
|
||||||
|
|
||||||
tmax = bxmax - px;
|
|
||||||
|
|
||||||
dmax = qx - px;
|
|
||||||
if ( bxmin < px ) // tmin < 0 means px is in the x-range of bbox
|
|
||||||
{
|
|
||||||
tmin = 0;
|
|
||||||
dmin = 1;
|
|
||||||
} else {
|
|
||||||
tmin = bxmin - px;
|
|
||||||
dmin = dmax;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(qx > bxmax) return false; // segment on the right of bbox
|
|
||||||
if(px < bxmin) return false; // segment on the left of bbox
|
|
||||||
|
|
||||||
tmax = px - bxmin;
|
|
||||||
|
|
||||||
dmax = px - qx;
|
|
||||||
if ( px < bxmax ) // tmin < 0 means px is in the x-range of bbox
|
|
||||||
{
|
|
||||||
tmin = 0;
|
|
||||||
dmin = 1;
|
|
||||||
} else {
|
|
||||||
tmin = px - bxmax;
|
|
||||||
dmin = dmax;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
double m = CGAL::abs(tmin), m2;
|
|
||||||
m2 = CGAL::abs(tmax); if(m2 > m) { m = m2; }
|
|
||||||
m2 = CGAL::abs(dmin); if(m2 > m) { m = m2; }
|
|
||||||
|
|
||||||
if(m < 7e-294) {
|
|
||||||
// underflow in the computation of 'error'
|
|
||||||
return Base::operator()(s,b);
|
|
||||||
}
|
|
||||||
|
|
||||||
const double EPS_1 = 3.55618e-15;
|
|
||||||
|
|
||||||
double error = EPS_1 * m;
|
|
||||||
|
|
||||||
switch(sign_with_error( tmax - dmax, error)) {
|
|
||||||
case POSITIVE:
|
|
||||||
tmax = 1;
|
|
||||||
dmax = 1;
|
|
||||||
break;
|
|
||||||
case NEGATIVE:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// ambiguity of the comparison tmax > dmin
|
|
||||||
// let's call the exact predicate
|
|
||||||
return Base::operator()(s,b);
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------
|
|
||||||
// treat y coord
|
|
||||||
// -----------------------------------
|
|
||||||
double d_, tmin_, tmax_;
|
|
||||||
if ( qy >= py ) // this is input and needs no epsilon
|
|
||||||
{
|
|
||||||
tmin_ = bymin - py;
|
|
||||||
tmax_ = bymax - py;
|
|
||||||
d_ = qy - py;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tmin_ = py - bymax;
|
|
||||||
tmax_ = py - bymin;
|
|
||||||
d_ = py - qy;
|
|
||||||
}
|
|
||||||
|
|
||||||
m2 = CGAL::abs(tmin_); if(m2 > m) { m = m2; }
|
|
||||||
m2 = CGAL::abs(tmax_); if(m2 > m) { m = m2; }
|
|
||||||
m2 = CGAL::abs(d_); if(m2 > m) { m = m2; }
|
|
||||||
|
|
||||||
if(m < 3e-147) {
|
|
||||||
// underflow in the computation of 'error'
|
|
||||||
return Base::operator()(s,b);
|
|
||||||
}
|
|
||||||
|
|
||||||
error = EPS_1 * m * m;
|
|
||||||
|
|
||||||
if(m > 1e153) { /* sqrt(max_double [hadamard]/2) */
|
|
||||||
// potential overflow on the computation of 'sign1' and 'sign2'
|
|
||||||
return Base::operator()(s,b);
|
|
||||||
}
|
|
||||||
Sign sign1 = sign_with_error( (d_*tmin) - (dmin*tmax_) , error);
|
|
||||||
Sign sign2 = sign_with_error( (dmax*tmin_) - (d_*tmax) , error);
|
|
||||||
|
|
||||||
if(sign1 == POSITIVE || sign2 == POSITIVE)
|
|
||||||
return false; // We are *sure* the segment is outside the box, on one
|
|
||||||
// side or the other.
|
|
||||||
if(sign1 == ZERO || sign2 == ZERO) {
|
|
||||||
return Base::operator()(s,b); // We are *unsure*: one *may be*
|
|
||||||
// positive.
|
|
||||||
}
|
|
||||||
|
|
||||||
// Here we are sure the two signs are negative. We can continue with
|
|
||||||
// the rest of the function...
|
|
||||||
|
|
||||||
// epsilons needed
|
|
||||||
switch(sign_with_error((dmin*tmin_) - (d_*tmin) , error)) {
|
|
||||||
case POSITIVE:
|
|
||||||
tmin = tmin_;
|
|
||||||
dmin = d_;
|
|
||||||
break;
|
|
||||||
case NEGATIVE:
|
|
||||||
break;
|
|
||||||
default: // uncertainty
|
|
||||||
return Base::operator()(s,b);
|
|
||||||
}
|
|
||||||
|
|
||||||
// epsilons needed
|
|
||||||
switch(sign_with_error((d_*tmax) - (dmax*tmax_) , error)) {
|
|
||||||
case POSITIVE:
|
|
||||||
tmax = tmax_;
|
|
||||||
dmax = d_;
|
|
||||||
case NEGATIVE:
|
|
||||||
break;
|
|
||||||
default: // uncertainty
|
|
||||||
return Base::operator()(s,b);
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------
|
|
||||||
// treat z coord
|
|
||||||
// -----------------------------------
|
|
||||||
if ( qz >= pz ) // this is input and needs no epsilon
|
|
||||||
{
|
|
||||||
tmin_ = bzmin - pz;
|
|
||||||
tmax_ = bzmax - pz;
|
|
||||||
d_ = qz - pz;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tmin_ = pz - bzmax;
|
|
||||||
tmax_ = pz - bzmin;
|
|
||||||
d_ = pz - qz;
|
|
||||||
}
|
|
||||||
|
|
||||||
m2 = CGAL::abs(tmin_); if(m2 > m) { m = m2; }
|
|
||||||
m2 = CGAL::abs(tmax_); if(m2 > m) { m = m2; }
|
|
||||||
m2 = CGAL::abs(d_); if(m2 > m) { m = m2; }
|
|
||||||
|
|
||||||
// m may have changed
|
|
||||||
error = EPS_1 * m * m;
|
|
||||||
|
|
||||||
if(m > 1e153) { /* sqrt(max_double [hadamard]/2) */
|
|
||||||
// potential overflow on the computation of 'sign1' and 'sign2'
|
|
||||||
return Base::operator()(s,b);
|
|
||||||
}
|
|
||||||
sign1 = sign_with_error( (dmin*tmax_) - (d_*tmin) , error);
|
|
||||||
sign2 = sign_with_error( (d_*tmax) - (dmax*tmin_) , error);
|
|
||||||
if(sign1 == NEGATIVE || sign2 == NEGATIVE) {
|
|
||||||
return false; // We are *sure* the segment is outside the box, on one
|
|
||||||
// side or the other.
|
|
||||||
}
|
|
||||||
if(sign1 == ZERO || sign2 == ZERO) {
|
|
||||||
return Base::operator()(s,b); // We are *unsure*: one *may be*
|
|
||||||
// negative.
|
|
||||||
}
|
|
||||||
return true; // We are *sure* the two signs are positive.
|
|
||||||
}
|
}
|
||||||
return Base::operator()(s,b);
|
return Base::operator()(s,b);
|
||||||
}
|
}
|
||||||
|
|
@ -337,155 +164,14 @@ public:
|
||||||
{
|
{
|
||||||
CGAL_BRANCH_PROFILER_BRANCH_1(tmp);
|
CGAL_BRANCH_PROFILER_BRANCH_1(tmp);
|
||||||
|
|
||||||
// -----------------------------------
|
const Uncertain<result_type> ub =
|
||||||
// treat x coord
|
do_intersect_bbox_segment_aux<double, true, false, true>
|
||||||
// -----------------------------------
|
(px, py, pz,
|
||||||
double dmin, dmax, tmin, tmax;
|
qx, qy, qz,
|
||||||
if ( qx >= px ) // this is input and needs no epsilon
|
b);
|
||||||
{
|
|
||||||
if(px > bxmax) return false; // if tmax < 0, ray on the right of bbox
|
|
||||||
tmax = bxmax - px;
|
|
||||||
|
|
||||||
dmax = qx - px;
|
|
||||||
if ( bxmin < px ) // tmin < 0 means px is in the x-range of bbox
|
|
||||||
{
|
|
||||||
tmin = 0;
|
|
||||||
dmin = 1;
|
|
||||||
} else {
|
|
||||||
if( px == qx ) return false; // if dmin == 0
|
|
||||||
tmin = bxmin - px;
|
|
||||||
dmin = dmax;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(px < bxmin) return false; // if tmax < 0, ray on the left of bbox
|
|
||||||
tmax = px - bxmin;
|
|
||||||
|
|
||||||
dmax = px - qx;
|
if(is_indeterminate(ub)) return Base::operator()(r,b);
|
||||||
if ( px < bxmax ) // tmin < 0 means px is in the x-range of bbox
|
else return ub.sup();
|
||||||
{
|
|
||||||
tmin = 0;
|
|
||||||
dmin = 1;
|
|
||||||
} else {
|
|
||||||
if( px == qx ) return false; // if dmin == 0
|
|
||||||
tmin = px - bxmax;
|
|
||||||
dmin = dmax;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------
|
|
||||||
// treat y coord
|
|
||||||
// -----------------------------------
|
|
||||||
double d_, tmin_, tmax_;
|
|
||||||
if ( qy >= py ) // this is input and needs no epsilon
|
|
||||||
{
|
|
||||||
tmin_ = bymin - py;
|
|
||||||
tmax_ = bymax - py;
|
|
||||||
d_ = qy - py;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tmin_ = py - bymax;
|
|
||||||
tmax_ = py - bymin;
|
|
||||||
d_ = py - qy;
|
|
||||||
}
|
|
||||||
|
|
||||||
double m = CGAL::abs(tmin), m2;
|
|
||||||
m2 = CGAL::abs(tmax); if(m2 > m) { m = m2; }
|
|
||||||
m2 = CGAL::abs(dmin); if(m2 > m) { m = m2; }
|
|
||||||
m2 = CGAL::abs(tmin_); if(m2 > m) { m = m2; }
|
|
||||||
m2 = CGAL::abs(tmax_); if(m2 > m) { m = m2; }
|
|
||||||
m2 = CGAL::abs(d_); if(m2 > m) { m = m2; }
|
|
||||||
|
|
||||||
if(m < 3e-147) {
|
|
||||||
// underflow in the computation of 'error'
|
|
||||||
return Base::operator()(r,b);
|
|
||||||
}
|
|
||||||
|
|
||||||
const double EPS_1 = 3.55618e-15;
|
|
||||||
|
|
||||||
double error = EPS_1 * m * m;
|
|
||||||
|
|
||||||
if(m > 1e153) { /* sqrt(max_double [hadamard]/2) */
|
|
||||||
// potential overflow on the computation of 'sign1' and 'sign2'
|
|
||||||
return Base::operator()(r,b);
|
|
||||||
}
|
|
||||||
Sign sign1 = sign_with_error( (d_*tmin) - (dmin*tmax_) , error);
|
|
||||||
Sign sign2 = sign_with_error( (dmax*tmin_) - (d_*tmax) , error);
|
|
||||||
|
|
||||||
if(sign1 == POSITIVE || sign2 == POSITIVE)
|
|
||||||
return false; // We are *sure* the ray is outside the box, on one
|
|
||||||
// side or the other.
|
|
||||||
if(sign1 == ZERO || sign2 == ZERO) {
|
|
||||||
return Base::operator()(r,b); // We are *unsure*: one *may be*
|
|
||||||
// positive.
|
|
||||||
}
|
|
||||||
|
|
||||||
// Here we are sure the two signs are negative. We can continue with
|
|
||||||
// the rest of the function...
|
|
||||||
|
|
||||||
// epsilons needed
|
|
||||||
switch(sign_with_error((dmin*tmin_) - (d_*tmin) , error)) {
|
|
||||||
case POSITIVE:
|
|
||||||
tmin = tmin_;
|
|
||||||
dmin = d_;
|
|
||||||
break;
|
|
||||||
case NEGATIVE:
|
|
||||||
break;
|
|
||||||
default: // uncertainty
|
|
||||||
return Base::operator()(r,b);
|
|
||||||
}
|
|
||||||
|
|
||||||
// epsilons needed
|
|
||||||
switch(sign_with_error((d_*tmax) - (dmax*tmax_) , error)) {
|
|
||||||
case POSITIVE:
|
|
||||||
tmax = tmax_;
|
|
||||||
dmax = d_;
|
|
||||||
case NEGATIVE:
|
|
||||||
break;
|
|
||||||
default: // uncertainty
|
|
||||||
return Base::operator()(r,b);
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------
|
|
||||||
// treat z coord
|
|
||||||
// -----------------------------------
|
|
||||||
if ( qz >= pz ) // this is input and needs no epsilon
|
|
||||||
{
|
|
||||||
tmin_ = bzmin - pz;
|
|
||||||
tmax_ = bzmax - pz;
|
|
||||||
d_ = qz - pz;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tmin_ = pz - bzmax;
|
|
||||||
tmax_ = pz - bzmin;
|
|
||||||
d_ = pz - qz;
|
|
||||||
}
|
|
||||||
|
|
||||||
m2 = CGAL::abs(tmin_); if(m2 > m) { m = m2; }
|
|
||||||
m2 = CGAL::abs(tmax_); if(m2 > m) { m = m2; }
|
|
||||||
m2 = CGAL::abs(d_); if(m2 > m) { m = m2; }
|
|
||||||
|
|
||||||
// m may have changed
|
|
||||||
error = EPS_1 * m * m;
|
|
||||||
|
|
||||||
if(m > 1e153) { /* sqrt(max_double [hadamard]/2) */
|
|
||||||
// potential overflow on the computation of 'sign1' and 'sign2'
|
|
||||||
return Base::operator()(r,b);
|
|
||||||
}
|
|
||||||
sign1 = sign_with_error( (dmin*tmax_) - (d_*tmin) , error);
|
|
||||||
sign2 = sign_with_error( (d_*tmax) - (dmax*tmin_) , error);
|
|
||||||
if(sign1 == NEGATIVE || sign2 == NEGATIVE) {
|
|
||||||
return false; // We are *sure* the ray is outside the box, on one
|
|
||||||
// side or the other.
|
|
||||||
}
|
|
||||||
if(sign1 == ZERO || sign2 == ZERO) {
|
|
||||||
return Base::operator()(r,b); // We are *unsure*: one *may be*
|
|
||||||
// negative.
|
|
||||||
}
|
|
||||||
return true; // We are *sure* the two signs are positive.
|
|
||||||
}
|
}
|
||||||
return Base::operator()(r,b);
|
return Base::operator()(r,b);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue