removed SegmentSegmentDistance function, it must be used the one in distance3.h

This commit is contained in:
Nico Pietroni 2010-10-15 15:21:43 +00:00
parent f1a446558f
commit 0b2b8f8700
1 changed files with 84 additions and 84 deletions

View File

@ -389,90 +389,90 @@ std::pair< float, bool > RayLineDistance(const Ray3f & R,const Line3f & Q,Point3
return std::make_pair(Distance(R_s,Q_t),false); return std::make_pair(Distance(R_s,Q_t),false);
} }
/*! ///*!
@brief Calculates the minimal distance between 2 segments. // @brief Calculates the minimal distance between 2 segments.
//
R e Q are the segments, R_s and Q_t are set to be the closest points on // R e Q are the segments, R_s and Q_t are set to be the closest points on
the segments. // the segments.
//
it's returned the distance from R_s and Q_t, and a boolean value which is true // it's returned the distance from R_s and Q_t, and a boolean value which is true
if the segments are parallel enough. // if the segments are parallel enough.
@param R the first segment. // @param R the first segment.
@param Q the second segment. // @param Q the second segment.
@param R_s the point on R closest to Q. // @param R_s the point on R closest to Q.
@param Q_t the point on Q closest to R. // @param Q_t the point on Q closest to R.
@return a std::pair made with the distance from R_s to Q_t and a boolean value, true if and only if P and Q are almost parallel. // @return a std::pair made with the distance from R_s to Q_t and a boolean value, true if and only if P and Q are almost parallel.
*/ //*/
std::pair< float, bool > SegmentSegmentDistance(const Segment3f & R, const Segment3f & Q, Point3f & R_s, Point3f & Q_t) //std::pair< float, bool > SegmentSegmentDistance(const Segment3f & R, const Segment3f & Q, Point3f & R_s, Point3f & Q_t)
{ //{
float R_len=Distance(R.P0(),R.P1()); // float R_len=Distance(R.P0(),R.P1());
float Q_len=Distance(Q.P0(),Q.P1()); // float Q_len=Distance(Q.P0(),Q.P1());
const float EPSILON_LENGTH = std::max(R_len,Q_len)*0.0001f; // const float EPSILON_LENGTH = std::max(R_len,Q_len)*0.0001f;
if(R_len < EPSILON_LENGTH){ // if(R_len < EPSILON_LENGTH){
R_s=R.P0(); // R_s=R.P0();
Q_t=ClosestPoint(Q,R_s); // Q_t=ClosestPoint(Q,R_s);
return std::make_pair(Distance(R_s,Q_t),true); // return std::make_pair(Distance(R_s,Q_t),true);
} // }
if( Q_len < EPSILON_LENGTH){ // if( Q_len < EPSILON_LENGTH){
Q_t=Q.P0(); // Q_t=Q.P0();
R_s=ClosestPoint(R,Q_t); // R_s=ClosestPoint(R,Q_t);
return std::make_pair(Distance(R_s,Q_t),true); // return std::make_pair(Distance(R_s,Q_t),true);
} // }
Point3f r0 = R.P0(), Vr = (R.P1()-R.P0()).normalized(); // Point3f r0 = R.P0(), Vr = (R.P1()-R.P0()).normalized();
Point3f q0 = Q.P0(), Vq = (Q.P1()-Q.P0()).normalized(); // Point3f q0 = Q.P0(), Vq = (Q.P1()-Q.P0()).normalized();
float VRVR = Vr.dot(Vr); // float VRVR = Vr.dot(Vr);
float VQVQ = Vq.dot(Vq); // float VQVQ = Vq.dot(Vq);
float VRVQ = Vr.dot(Vq); // float VRVQ = Vr.dot(Vq);
const float det = ( VRVR * VQVQ ) - ( VRVQ * VRVQ ); // const float det = ( VRVR * VQVQ ) - ( VRVQ * VRVQ );
const float EPSILON = 0.00001f; // const float EPSILON = 0.00001f;
if ( ( det >= 0.0f ? det : -det) < EPSILON ) { // if ( ( det >= 0.0f ? det : -det) < EPSILON ) {
Line3f lR(R.P0(),R.P1()); // Line3f lR(R.P0(),R.P1());
float qa=lR.Projection(Q.P0()); // float qa=lR.Projection(Q.P0());
float qb=lR.Projection(Q.P1()); // float qb=lR.Projection(Q.P1());
if( (qa<=0.0f) && qb<=(0.0f)){ // if( (qa<=0.0f) && qb<=(0.0f)){
R_s=R.P0(); // R_s=R.P0();
Q_t=ClosestPoint(Q,R_s); // Q_t=ClosestPoint(Q,R_s);
} else if ( (qa >= 1.0f) && (qb >= 1.0f) ){ // } else if ( (qa >= 1.0f) && (qb >= 1.0f) ){
R_s=R.P1(); // R_s=R.P1();
Q_t=ClosestPoint(Q,R_s); // Q_t=ClosestPoint(Q,R_s);
} else { // } else {
if( (qa >= 0.0f) && (qa <= 1.0f) ){ // if( (qa >= 0.0f) && (qa <= 1.0f) ){
Q_t=Q.P0(); // Q_t=Q.P0();
R_s=ClosestPoint(R,Q_t); // R_s=ClosestPoint(R,Q_t);
} else if((qb >= 0.0f) && (qb <= 1.0f) ){ // } else if((qb >= 0.0f) && (qb <= 1.0f) ){
Q_t=Q.P1(); // Q_t=Q.P1();
R_s=ClosestPoint(R,Q_t); // R_s=ClosestPoint(R,Q_t);
} else { // } else {
if( ( ((qa<=0.0f)&&(qb>=1.0f)) || (((qb<=0.0f)&&(qa>=1.0f))))){ // if( ( ((qa<=0.0f)&&(qb>=1.0f)) || (((qb<=0.0f)&&(qa>=1.0f))))){
R_s=R.P0(); // R_s=R.P0();
Q_t=ClosestPoint(Q,R_s); // Q_t=ClosestPoint(Q,R_s);
}else{ // }else{
assert(0); // assert(0);
} // }
} // }
} // }
return std::make_pair(Distance(R_s,Q_t),true); // return std::make_pair(Distance(R_s,Q_t),true);
} // }
float b1= (q0 - r0).dot(Vr); // float b1= (q0 - r0).dot(Vr);
float b2= (r0 - q0).dot(Vq); // float b2= (r0 - q0).dot(Vq);
float s = ( (VQVQ * b1) + (VRVQ * b2) ) / det; // float s = ( (VQVQ * b1) + (VRVQ * b2) ) / det;
float t = ( (VRVQ * b1) + (VRVR * b2) ) / det; // float t = ( (VRVQ * b1) + (VRVR * b2) ) / det;
if( s < 0 ){ // if( s < 0 ){
R_s = R.P0(); // R_s = R.P0();
}else if ( s > R_len ){ // }else if ( s > R_len ){
R_s = R.P1(); // R_s = R.P1();
} else { // } else {
R_s = r0 + (Vr * s); // R_s = r0 + (Vr * s);
} // }
if( t < 0){ // if( t < 0){
Q_t = Q.P0(); // Q_t = Q.P0();
}else if ( t > Q_len ){ // }else if ( t > Q_len ){
Q_t = Q.P1(); // Q_t = Q.P1();
}else{ // }else{
Q_t = q0 + (Vq * t); // Q_t = q0 + (Vq * t);
} // }
return std::make_pair(Distance(R_s,Q_t),false); // return std::make_pair(Distance(R_s,Q_t),false);
} //}
/*! /*!
@brief Compute the point on a line closest to the ray projection of a window coordinate point. @brief Compute the point on a line closest to the ray projection of a window coordinate point.