PAL19276 ExportMED does not work when the mesh is too big

optimize a little performance of findIJ()
This commit is contained in:
eap 2008-03-20 13:15:42 +00:00
parent 44b7358139
commit 65d7c9da5b

View File

@ -129,6 +129,25 @@ bool StdMeshers_Hexa_3D::CheckHypothesis
return true; return true;
} }
//=======================================================================
//function : isCloser
//purpose :
//=======================================================================
inline bool isCloser(const int i, const int j, const int nbhoriz,
const FaceQuadStruct* quad, const gp_Pnt2d uv,
double & minDist)
{
int ij = j * nbhoriz + i;
gp_Pnt2d uv2( quad->uv_grid[ij].u, quad->uv_grid[ij].v );
double dist = uv.SquareDistance( uv2 );
if ( dist < minDist ) {
minDist = dist;
return true;
}
return false;
}
//======================================================================= //=======================================================================
//function : findIJ //function : findIJ
//purpose : return i,j of the node //purpose : return i,j of the node
@ -136,26 +155,41 @@ bool StdMeshers_Hexa_3D::CheckHypothesis
static bool findIJ (const SMDS_MeshNode* node, const FaceQuadStruct * quad, int& I, int& J) static bool findIJ (const SMDS_MeshNode* node, const FaceQuadStruct * quad, int& I, int& J)
{ {
I = J = 0;
const SMDS_FacePosition* fpos = const SMDS_FacePosition* fpos =
static_cast<const SMDS_FacePosition*>(node->GetPosition().get()); static_cast<const SMDS_FacePosition*>(node->GetPosition().get());
if ( ! fpos ) return false; if ( ! fpos ) return false;
gp_Pnt2d uv( fpos->GetUParameter(), fpos->GetVParameter() ); gp_Pnt2d uv( fpos->GetUParameter(), fpos->GetVParameter() );
double minDist = DBL_MAX; double minDist = DBL_MAX;
int nbhoriz = Min(quad->side[0]->NbPoints(), quad->side[2]->NbPoints()); const int nbhoriz = quad->side[0]->NbPoints();
int nbvertic = Min(quad->side[1]->NbPoints(), quad->side[3]->NbPoints()); const int nbvertic = quad->side[1]->NbPoints();
for (int i = 1; i < nbhoriz - 1; i++) { I = nbhoriz/2; J = nbvertic/2;
for (int j = 1; j < nbvertic - 1; j++) { int oldI, oldJ;
int ij = j * nbhoriz + i; do {
gp_Pnt2d uv2( quad->uv_grid[ij].u, quad->uv_grid[ij].v ); oldI = I; oldJ = J;
double dist = uv.SquareDistance( uv2 ); while ( I + 2 < nbhoriz && isCloser( I + 1, J, nbhoriz, quad, uv, minDist ))
if ( dist < minDist ) { I += 1;
minDist = dist; if ( I == oldI )
I = i; while ( I - 1 > 0 && isCloser( I - 1, J, nbhoriz, quad, uv, minDist ))
J = j; I -= 1;
} if ( minDist < DBL_MIN )
} break;
while ( J + 2 < nbvertic && isCloser( I, J + 1, nbhoriz, quad, uv, minDist ))
J += 1;
if ( J == oldJ )
while ( J - 1 > 0 && isCloser( I, J - 1, nbhoriz, quad, uv, minDist ))
J -= 1;
if ( minDist < DBL_MIN )
break;
} while ( I != oldI || J != oldJ );
if ( minDist > DBL_MIN ) {
for (int i = 1; i < nbhoriz - 1; i++)
for (int j = 1; j < nbvertic - 1; j++)
if ( isCloser( i, j, nbhoriz, quad, uv, minDist ))
I = i, J = j;
} }
return true; return true;
} }