mirror of https://github.com/CGAL/cgal
Computation and code factorization (to avoid early roundings).
This commit is contained in:
parent
bbabad8e7a
commit
aa3e601755
|
|
@ -39,9 +39,10 @@ namespace internal {
|
||||||
bool do_bbox_intersect(const typename K::Triangle_3& triangle,
|
bool do_bbox_intersect(const typename K::Triangle_3& triangle,
|
||||||
const CGAL::Bbox_3& bbox)
|
const CGAL::Bbox_3& bbox)
|
||||||
{
|
{
|
||||||
const typename K::Point_3& p = triangle.vertex(0),
|
const typename K::Point_3& p = triangle.vertex(0);
|
||||||
q = triangle.vertex(1),
|
const typename K::Point_3& q = triangle.vertex(1);
|
||||||
r = triangle.vertex(2);
|
const typename K::Point_3& r = triangle.vertex(2);
|
||||||
|
|
||||||
for(int i = 0; i < 3; ++i) {
|
for(int i = 0; i < 3; ++i) {
|
||||||
if(p[i] <= q[i]) {
|
if(p[i] <= q[i]) {
|
||||||
if(q[i] <= r[i]) { // pqr
|
if(q[i] <= r[i]) { // pqr
|
||||||
|
|
@ -94,33 +95,72 @@ namespace internal {
|
||||||
{
|
{
|
||||||
if(AXE == 0 || px > 0) {
|
if(AXE == 0 || px > 0) {
|
||||||
if(AXE == 1 || py > 0) {
|
if(AXE == 1 || py > 0) {
|
||||||
if(AXE == 2 || pz > 0) { p_min = typename K::Point_3(c.xmin(), c.ymin(),c.zmin());
|
if(AXE == 2 || pz > 0) {
|
||||||
p_max = typename K::Point_3(c.xmax(), c.ymax(),c.zmax());}
|
p_min = typename K::Point_3(c.xmin(), c.ymin(),c.zmin());
|
||||||
else { p_min = typename K::Point_3(c.xmin(), c.ymin(),c.zmax());
|
p_max = typename K::Point_3(c.xmax(), c.ymax(),c.zmax());
|
||||||
p_max = typename K::Point_3(c.xmax(), c.ymax(),c.zmin());}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(AXE == 2 || pz > 0) { p_min = typename K::Point_3(c.xmin(), c.ymax(),c.zmin());
|
p_min = typename K::Point_3(c.xmin(), c.ymin(),c.zmax());
|
||||||
p_max = typename K::Point_3(c.xmax(), c.ymin(),c.zmax());}
|
p_max = typename K::Point_3(c.xmax(), c.ymax(),c.zmin());
|
||||||
else { p_min = typename K::Point_3(c.xmin(), c.ymax(),c.zmax());
|
}
|
||||||
p_max = typename K::Point_3(c.xmax(), c.ymin(),c.zmin());}
|
}
|
||||||
|
else {
|
||||||
|
if(AXE == 2 || pz > 0) {
|
||||||
|
p_min = typename K::Point_3(c.xmin(), c.ymax(),c.zmin());
|
||||||
|
p_max = typename K::Point_3(c.xmax(), c.ymin(),c.zmax());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
p_min = typename K::Point_3(c.xmin(), c.ymax(),c.zmax());
|
||||||
|
p_max = typename K::Point_3(c.xmax(), c.ymin(),c.zmin());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(AXE == 1 || py > 0) {
|
if(AXE == 1 || py > 0) {
|
||||||
if(AXE == 2 || pz > 0) { p_min = typename K::Point_3(c.xmax(), c.ymin(),c.zmin());
|
if(AXE == 2 || pz > 0) {
|
||||||
p_max = typename K::Point_3(c.xmin(), c.ymax(),c.zmax());}
|
p_min = typename K::Point_3(c.xmax(), c.ymin(),c.zmin());
|
||||||
else { p_min = typename K::Point_3(c.xmax(), c.ymin(),c.zmax());
|
p_max = typename K::Point_3(c.xmin(), c.ymax(),c.zmax());
|
||||||
p_max = typename K::Point_3(c.xmin(), c.ymax(),c.zmin());}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(AXE == 2 || pz > 0) { p_min = typename K::Point_3(c.xmax(), c.ymax(),c.zmin());
|
p_min = typename K::Point_3(c.xmax(), c.ymin(),c.zmax());
|
||||||
p_max = typename K::Point_3(c.xmin(), c.ymin(),c.zmax());}
|
p_max = typename K::Point_3(c.xmin(), c.ymax(),c.zmin());
|
||||||
else { p_min = typename K::Point_3(c.xmax(), c.ymax(),c.zmax());
|
}
|
||||||
p_max = typename K::Point_3(c.xmin(), c.ymin(),c.zmin());}
|
}
|
||||||
|
else {
|
||||||
|
if(AXE == 2 || pz > 0) {
|
||||||
|
p_min = typename K::Point_3(c.xmax(), c.ymax(),c.zmin());
|
||||||
|
p_max = typename K::Point_3(c.xmin(), c.ymin(),c.zmax());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
p_min = typename K::Point_3(c.xmax(), c.ymax(),c.zmax());
|
||||||
|
p_max = typename K::Point_3(c.xmin(), c.ymin(),c.zmin());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template <class K, int AXE, int SIDE>
|
||||||
|
inline
|
||||||
|
typename K::FT
|
||||||
|
do_axis_intersect_aux(const typename K::FT& alpha,
|
||||||
|
const typename K::FT& beta,
|
||||||
|
const typename K::Vector_3* sides)
|
||||||
|
{
|
||||||
|
switch ( AXE )
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
return -sides[SIDE].z()*alpha + sides[SIDE].y()*beta;
|
||||||
|
case 1:
|
||||||
|
return sides[SIDE].z()*alpha - sides[SIDE].x()*beta;
|
||||||
|
case 2:
|
||||||
|
return -sides[SIDE].y()*alpha + sides[SIDE].x()*beta;
|
||||||
|
default:
|
||||||
|
CGAL_kernel_assertion(false);
|
||||||
|
return typename K::FT(0.);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template <class K, int AXE, int SIDE>
|
template <class K, int AXE, int SIDE>
|
||||||
inline
|
inline
|
||||||
|
|
@ -131,35 +171,53 @@ namespace internal {
|
||||||
const typename K::Point_3& j = triangle.vertex(SIDE);
|
const typename K::Point_3& j = triangle.vertex(SIDE);
|
||||||
const typename K::Point_3& k = triangle.vertex((SIDE+2)%3);
|
const typename K::Point_3& k = triangle.vertex((SIDE+2)%3);
|
||||||
|
|
||||||
typename K::FT t_min = AXE==0? -sides[SIDE].z()*j.y() + sides[SIDE].y()*j.z():
|
|
||||||
AXE==1? sides[SIDE].z()*j.x() - sides[SIDE].x()*j.z():
|
|
||||||
-sides[SIDE].y()*j.x() + sides[SIDE].x()*j.y();
|
|
||||||
|
|
||||||
typename K::FT t_max = AXE==0? -sides[SIDE].z()*k.y() + sides[SIDE].y()*k.z():
|
|
||||||
AXE==1? sides[SIDE].z()*k.x() - sides[SIDE].x()*k.z():
|
|
||||||
-sides[SIDE].y()*k.x() + sides[SIDE].x()*k.y();
|
|
||||||
|
|
||||||
typename K::FT tmp;
|
|
||||||
if(t_max < t_min)
|
|
||||||
{
|
|
||||||
tmp = t_min;
|
|
||||||
t_min = t_max;
|
|
||||||
t_max = tmp;
|
|
||||||
}
|
|
||||||
typename K::Point_3 p_min, p_max;
|
|
||||||
get_min_max<K, AXE>(AXE==0? 0: AXE==1? sides[SIDE].z(): -sides[SIDE].y(),
|
get_min_max<K, AXE>(AXE==0? 0: AXE==1? sides[SIDE].z(): -sides[SIDE].y(),
|
||||||
AXE==0? -sides[SIDE].z(): AXE==1? 0: sides[SIDE].x(),
|
AXE==0? -sides[SIDE].z(): AXE==1? 0: sides[SIDE].x(),
|
||||||
AXE==0? sides[SIDE].y(): AXE==1? -sides[SIDE].x(): 0,
|
AXE==0? sides[SIDE].y(): AXE==1? -sides[SIDE].x(): 0,
|
||||||
bbox, p_min, p_max);
|
bbox, p_min, p_max);
|
||||||
|
|
||||||
if((AXE==0? -sides[SIDE].z()*p_min.y() + sides[SIDE].y()*p_min.z() :
|
switch ( AXE )
|
||||||
AXE==1? sides[SIDE].z()*p_min.x() - sides[SIDE].x()*p_min.z() :
|
{
|
||||||
-sides[SIDE].y()*p_min.x() + sides[SIDE].x()*p_min.y() ) > t_max ||
|
case 0:
|
||||||
(AXE==0? -sides[SIDE].z()*p_max.y() + sides[SIDE].y()*p_max.z() :
|
// t_max >= t_min
|
||||||
AXE==1? sides[SIDE].z()*p_max.x() - sides[SIDE].x()*p_max.z() :
|
if ( do_axis_intersect_aux<K,AXE,SIDE>(k.y()-j.y(), k.z()-j.z(), sides) >= 0 )
|
||||||
-sides[SIDE].y()*p_max.x() + sides[SIDE].x()*p_max.y() ) < t_min )
|
{
|
||||||
return false;
|
return ( do_axis_intersect_aux<K,AXE,SIDE>(p_min.y()-k.y(), p_min.z()-k.z(), sides) <= 0
|
||||||
return true;
|
|| do_axis_intersect_aux<K,AXE,SIDE>(p_max.y()-j.y(), p_max.z()-j.z(), sides) >= 0 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return ( do_axis_intersect_aux<K,AXE,SIDE>(p_min.y()-j.y(), p_min.z()-j.z(), sides) <= 0
|
||||||
|
|| do_axis_intersect_aux<K,AXE,SIDE>(p_max.y()-k.y(), p_max.z()-k.z(), sides) >= 0 );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
// t_max >= t_min
|
||||||
|
if ( do_axis_intersect_aux<K,AXE,SIDE>(k.x()-j.x(), k.z()-j.z(), sides) >= 0 )
|
||||||
|
{
|
||||||
|
return ( do_axis_intersect_aux<K,AXE,SIDE>(p_min.x()-k.x(), p_min.z()-k.z(), sides) <= 0
|
||||||
|
|| do_axis_intersect_aux<K,AXE,SIDE>(p_max.x()-j.x(), p_max.z()-j.z(), sides) >= 0 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return ( do_axis_intersect_aux<K,AXE,SIDE>(p_min.x()-j.x(), p_min.z()-j.z(), sides) <= 0
|
||||||
|
|| do_axis_intersect_aux<K,AXE,SIDE>(p_max.x()-k.x(), p_max.z()-k.z(), sides) >= 0 );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
// t_max >= t_min
|
||||||
|
if ( do_axis_intersect_aux<K,AXE,SIDE>(k.x()-j.x(), k.y()-j.y(), sides) >= 0 )
|
||||||
|
{
|
||||||
|
return ( do_axis_intersect_aux<K,AXE,SIDE>(p_min.x()-k.x(), p_min.y()-k.y(), sides) <= 0
|
||||||
|
|| do_axis_intersect_aux<K,AXE,SIDE>(p_max.x()-j.x(), p_max.y()-j.y(), sides) >= 0 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return ( do_axis_intersect_aux<K,AXE,SIDE>(p_min.x()-j.x(), p_min.y()-j.y(), sides) <= 0
|
||||||
|
|| do_axis_intersect_aux<K,AXE,SIDE>(p_max.x()-k.x(), p_max.y()-k.y(), sides) >= 0 );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// assumes that the intersection with the supporting plane has
|
// assumes that the intersection with the supporting plane has
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue