+ Standard_Real aTol = BRep_Tool::Tolerance(theFace);
+ BRepAdaptor_Surface Ads ( theFace, Standard_False );
+ Standard_Real toluv = Min ( Ads.UResolution(aTol), Ads.VResolution(aTol) );
+ const gp_Pln& aPlane = Ads.Surface().Plane();
+ gp_Pnt aPnt(theXY.X(), theXY.Y(), 0.);
+ Standard_Real aU1, aV1;
+ ElSLib::Parameters(aPlane,aPnt, aU1, aV1);
+ BRepTopAdaptor_FClass2d aClassifier( theFace, toluv );
+ aState = aClassifier.Perform( gp_Pnt2d(aU1, aV1), Standard_False );
+ return aState;
+}
+
+double HYDROData_Tool::GetAltitudeForEdge( const TopoDS_Edge& theEdge,
+ const gp_XY& thePoint,
+ double theParameterTolerance,
+ double theSquareDistanceTolerance,
+ double theInvalidAltitude )
+{
+ double aFirst, aLast;
+ Handle(Geom_Curve) aCurve = BRep_Tool::Curve( theEdge, aFirst, aLast );
+ if( aCurve.IsNull() )
+ return theInvalidAltitude;
+
+ gp_Pnt aFirstPnt, aLastPnt;
+
+ aCurve->D0( aFirst, aFirstPnt );
+ aCurve->D0( aLast, aLastPnt );
+
+ gp_Pnt2d aFirstPnt2d( aFirstPnt.X(), aFirstPnt.Y() );
+ gp_Pnt2d aLastPnt2d( aLastPnt.X(), aLastPnt.Y() );
+
+ double aFirstDist = 0;
+ double aLastDist = aFirstPnt2d.SquareDistance( aLastPnt2d );
+ double aNecDist = aFirstPnt2d.SquareDistance( thePoint );
+
+ while( fabs( aLast - aFirst ) > theParameterTolerance )
+ {
+ double aMid = ( aFirst + aLast ) / 2;
+ gp_Pnt aMidPnt;
+ aCurve->D0( aMid, aMidPnt );
+ double aDist = aFirstPnt2d.SquareDistance( gp_Pnt2d( aMidPnt.X(), aMidPnt.Y() ) );