+ gp_XY aProjXY = gp_XY(aPntProj.X(), aPntProj.Y());
+ aProjXY.Subtract(thePoint);
+ double distance = aProjXY.Modulus();
+
+ gp_Vec2d aProjDir = aProjXY;
+ gp_Vec2d aProfileDir(LP, RP);
+ double aSign = 1.0;
+ if( aProfileDir.Dot(aProjDir) < 0 )
+ aSign = -1.0;
+
+ distance *= aSign;
+ DEBTRACE("distance to guideline " << distance);
+
+ if (GetInvertDirection())
+ distance*=-1;
+
+ // get delta altitude on section (supposed symmetric) from guideline distance (aParam)
+ double delta = 0;
+ int i1 = 0;
+ int i2 = 0;
+ gp_XY pt1 = gp_XY();
+ gp_XY pt2 = gp_XY();
+ HYDROData_ProfileUZ::PointsList aSectionPoints = aProfile->GetParametricPoints();
+ for ( int i = 1, aNbPoints = aSectionPoints.Size(); i <= aNbPoints; ++i )
+ {
+ const HYDROData_IPolyline::Point& aPolylinePoint = aSectionPoints.Value( i );
+ DEBTRACE(" i, size, profile point: " << i << " " << aSectionPoints.Size() << " " << aPolylinePoint.X() << " " << aPolylinePoint.Y());
+ if (aPolylinePoint.X() < distance)
+ {
+ i1 = i;
+ pt1 = aPolylinePoint;
+ }
+ if (aPolylinePoint.X() >= distance)
+ {
+ i2 = i;
+ pt2 = aPolylinePoint;
+ break;
+ }
+ }
+ if ((i1 == 0) && (i2 == 0))
+ {
+ DEBTRACE("Projection aborted : non centered profile");
+ return aResAltitude;
+ }
+ else if (i1 == 0) // distance < - profile width
+ {
+ DEBTRACE("distance < - profile width");
+ delta = pt2.Y();
+ }
+ else if (i1 == aSectionPoints.Size()) // distance >= profile width
+ {
+ DEBTRACE("distance >= profile width");
+ delta = pt1.Y();
+ }
+ else
+ {
+ delta = pt1.Y() + (pt2.Y() - pt1.Y())*(distance -pt1.X())/(pt2.X()-pt1.X());
+ }
+ aResAltitude = delta + aDepth;
+ DEBTRACE("distance XY: "<< aParam << " distance to guideline: " << distance << " final altitude: " << aResAltitude << " delta: " << delta);
+ return aResAltitude;