- for ( size_t i = Max( 1, iSmoothed-1 ); i < _pos.size()-1; ++i )
- {
- gp_XYZ midPos = 0.5 * ( _pos[i-1] + _pos[i+1] );
- gp_XYZ newPos = 0.5 * ( midPos + _pos[i] );
- _pos[i] = newPos;
- double midLen = 0.5 * ( segLen[i-1] + segLen[i+1] );
- double newLen = 0.5 * ( midLen + segLen[i] );
- const_cast< double& >( segLen[i] ) = newLen;
- }
- }
- else
- {
- for ( size_t i = 1; i < _pos.size()-1; ++i )
- {
- if ((int) i < iSmoothed && ( segLen[i] / segLen.back() < 0.5 ))
- continue;
-
- double wgt = segLen[i] / segLen.back();
- gp_XYZ normPos = _pos[0] + _normal * wgt * _len;
- gp_XYZ tgtPos = ( 1 - wgt ) * _pos[0] + wgt * _pos.back();
- gp_XYZ newPos = ( 1 - wgt ) * normPos + wgt * tgtPos;
- _pos[i] = newPos;
+ gp_XYZ normal = _normal;
+ if ( Is( NORMAL_UPDATED ))
+ for ( size_t i = 1; i < _pos.size(); ++i )
+ {
+ normal = _pos[i] - _pos[0];
+ double size = normal.Modulus();
+ if ( size > RealSmall() )
+ {
+ normal /= size;
+ break;
+ }
+ }
+ const double r = 0.2;
+ for ( int iter = 0; iter < 3; ++iter )
+ {
+ double minDot = 1;
+ for ( size_t i = Max( 1, iSmoothed-1-iter ); i < _pos.size()-1; ++i )
+ {
+ gp_XYZ midPos = 0.5 * ( _pos[i-1] + _pos[i+1] );
+ gp_XYZ newPos = ( 1-r ) * midPos + r * _pos[i];
+ _pos[i] = newPos;
+ double midLen = 0.5 * ( segLen[i-1] + segLen[i+1] );
+ double newLen = ( 1-r ) * midLen + r * segLen[i];
+ const_cast< double& >( segLen[i] ) = newLen;
+ // check angle between normal and (_pos[i+1], _pos[i] )
+ gp_XYZ posDir = _pos[i+1] - _pos[i];
+ double size = posDir.Modulus();
+ if ( size > RealSmall() )
+ minDot = Min( minDot, ( normal * posDir ) / size );
+ }
+ if ( minDot > 0.5 )
+ break;