changed BASIC VERSION of the Point-face distance that does not require the EdgePlane Additional data.

now it does not require any more the dreaded face bit flags...
This commit is contained in:
Paolo Cignoni 2011-11-21 08:56:52 +00:00
parent 4c4d505b6f
commit 8f7aab147d
1 changed files with 19 additions and 11 deletions

View File

@ -301,9 +301,8 @@ namespace vcg {
/// BASIC VERSION of the Point-face distance that does not require the EdgePlane Additional data. /// BASIC VERSION of the Point-face distance that does not require the EdgePlane Additional data.
/// Given a face and a point, returns the closest point of the face to p. /// Given a face and a point, returns the closest point of the face to p.
/// it assumes that the face has Normalized Normal and on the flags stored the preferred orientation. /// it assumes that the face has Normalized Normal.
// UpdateNormals::PerFaceNormalized(m) // UpdateNormals::PerFaceNormalized(m)
// UpdateFlags<>::FaceProjection(m);
template <class FaceType> template <class FaceType>
bool PointDistanceBase( bool PointDistanceBase(
@ -342,7 +341,7 @@ namespace vcg {
const ScalarType EPS = ScalarType( 0.000001); const ScalarType EPS = ScalarType( 0.000001);
ScalarType b,b0,b1,b2; ScalarType b,b0,b1,b2;
// Calcolo distanza punto piano // Calcolo distanza punto piano
ScalarType d = Distance( fPlane, q ); ScalarType d = DistancePlanePoint( fPlane, q );
if( d>dist || d<-dist ) // Risultato peggiore: niente di fatto if( d>dist || d<-dist ) // Risultato peggiore: niente di fatto
return false; return false;
@ -368,16 +367,25 @@ namespace vcg {
f.Edge(0)*=d; f.Edge(1)*=d;f.Edge(2)*=d; f.Edge(0)*=d; f.Edge(1)*=d;f.Edge(2)*=d;
So we must apply the same scaling according to the plane orientation, eg in the case of NORMX So we must apply the same scaling according to the plane orientation, eg in the case of NORMX
scaleFactor= 1/fPlane.Direction()[0];
scaleFactor= 1/fPlane.Direction()[0]; fEdge[0]*=d; fEdge[1]*=d;fEdge[2]*=d;
fEdge[0]*=d; fEdge[1]*=d;fEdge[2]*=d;
*/ */
int bestAxis;
if(fabs(f.cN()[0])>fabs(f.cN()[1]))
{
if(fabs(f.cN()[0])>fabs(f.cN()[2])) bestAxis = 0;
else bestAxis = 2;
} else {
if(fabs(f.cN()[1])>fabs(f.cN()[2])) bestAxis=1; /* 1 > 0 ? 2 */
else bestAxis=2; /* 2 > 1 ? 2 */
}
ScalarType scaleFactor; ScalarType scaleFactor;
switch( f.Flags() & (FaceType::NORMX|FaceType::NORMY|FaceType::NORMZ) ) switch( bestAxis )
{ {
case FaceType::NORMX: case 0: /************* X AXIS **************/
scaleFactor= 1/fPlane.Direction()[0]; scaleFactor= 1/fPlane.Direction()[0];
fEdge[0]*=scaleFactor; fEdge[1]*=scaleFactor; fEdge[2]*=scaleFactor; fEdge[0]*=scaleFactor; fEdge[1]*=scaleFactor; fEdge[2]*=scaleFactor;
@ -421,7 +429,7 @@ namespace vcg {
} }
break; break;
case FaceType::NORMY: case 1: /************* Y AXIS **************/
scaleFactor= 1/fPlane.Direction()[1]; scaleFactor= 1/fPlane.Direction()[1];
fEdge[0]*=scaleFactor; fEdge[1]*=scaleFactor; fEdge[2]*=scaleFactor; fEdge[0]*=scaleFactor; fEdge[1]*=scaleFactor; fEdge[2]*=scaleFactor;
@ -458,7 +466,7 @@ namespace vcg {
} }
break; break;
case FaceType::NORMZ: case 2: /************* Z AXIS **************/
scaleFactor= 1/fPlane.Direction()[2]; scaleFactor= 1/fPlane.Direction()[2];
fEdge[0]*=scaleFactor; fEdge[1]*=scaleFactor; fEdge[2]*=scaleFactor; fEdge[0]*=scaleFactor; fEdge[1]*=scaleFactor; fEdge[2]*=scaleFactor;