#include <TopTools_SequenceOfShape.hxx>
+#include <Geom_Line.hxx>
+
#include <QStringList>
#ifdef DEB_CLASS2D
Standard_Real aResAlt = 0.0;
gp_XY aFirstPoint, aLastPoint;
- if ( !theProfile->GetLeftPoint( aFirstPoint ) ||
- !theProfile->GetRightPoint( aLastPoint ) )
+ if ( !theProfile->GetLeftPoint( aFirstPoint, false ) ||
+ !theProfile->GetRightPoint( aLastPoint, false ) )
return aResAlt;
gp_Pnt aPnt1( aFirstPoint.X(), aFirstPoint.Y(), 0 );
gp_Pnt aPrevPoint;
gp_Lin aPrevNormal;
- HYDROData_Profile::ProfilePoints aProfilePoints = theProfile->GetProfilePoints();
+ HYDROData_Profile::ProfilePoints aProfilePoints = theProfile->GetProfilePoints( false );
for ( int i = 1, n = aProfilePoints.Length(); i <= n; ++i )
{
gp_Pnt aProfPoint( aProfilePoints.Value( i ) );
continue;
gp_XY aFirstPoint, aLastPoint;
- if ( !aProfile->GetLeftPoint( aFirstPoint ) || !aProfile->GetRightPoint( aLastPoint ) )
+ if ( !aProfile->GetLeftPoint( aFirstPoint, false ) ||
+ !aProfile->GetRightPoint( aLastPoint, false ) )
continue;
gp_Pnt aPnt1( aFirstPoint.X(), aFirstPoint.Y(), 0 );
Standard_Real aRightAlt = getAltitudeFromProfile( aRightProfile, aLeftDist, aRightDist );
// Interpolate altitudes
- Standard_Real aFirstCoeff = aLeftDist / ( aLeftDist + aRightDist );
- Standard_Real aSecCoeff = aRightDist / ( aLeftDist + aRightDist );
-
- aResAltitude = aLeftAlt * aFirstCoeff + aRightAlt * aSecCoeff;
+ // Left profile line ( the segment between the firts and the last profile point )
+ HYDROData_Profile::ProfilePoints aLeftProfilePoints = aLeftProfile->GetProfilePoints( false );
+ gp_Pnt aLeftProfileP1( aLeftProfilePoints.First() );
+ aLeftProfileP1.SetZ( 0 );
+ gp_Pnt aLeftProfileP2( aLeftProfilePoints.Last() );
+ aLeftProfileP2.SetZ( 0 );
+ gp_Vec aLeftProfileVec( aLeftProfileP1, aLeftProfileP2 );
+ Handle(Geom_Line) aLeftProfileLine = new Geom_Line( gp_Ax1( aLeftProfileP1, aLeftProfileVec ) );
+ // Right profile line
+ HYDROData_Profile::ProfilePoints aRightProfilePoints = aRightProfile->GetProfilePoints( false );
+ gp_Pnt aRightProfileP1( aRightProfilePoints.First() );
+ aRightProfileP1.SetZ( 0 );
+ gp_Pnt aRightProfileP2( aRightProfilePoints.Last() );
+ aRightProfileP2.SetZ( 0 );
+ gp_Vec aRightProfileVec( aRightProfileP1, aRightProfileP2 );
+ Handle(Geom_Line) aRightProfileLine = new Geom_Line( gp_Ax1( aRightProfileP1, aRightProfileVec ) );
+ // The point projections on the left and right profiles
+ GeomAPI_ProjectPointOnCurve aLeftProfileProject( aPointToTest, aLeftProfileLine );
+ GeomAPI_ProjectPointOnCurve aRightProfileProject( aPointToTest, aRightProfileLine );
+ // The point distance to the left and right profiles
+ Standard_Real aLeftProfileDist = aLeftProfileProject.LowerDistance();
+ Standard_Real aRightProfileDist = aRightProfileProject.LowerDistance();
+ // The coefficients
+ Standard_Real aFirstCoeff = aLeftProfileDist / ( aLeftProfileDist + aRightProfileDist );
+ Standard_Real aSecCoeff = aRightProfileDist / ( aLeftProfileDist + aRightProfileDist );
+
+ aResAltitude = aLeftAlt * ( 1 - aFirstCoeff ) + aRightAlt * ( 1 - aSecCoeff );
return aResAltitude;
}