mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-03-01 02:45:38 +05:00
PAL19276 ExportMED does not work when the mesh is too big
optimize a little performance of findIJ()
This commit is contained in:
parent
44b7358139
commit
65d7c9da5b
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user