//---------------------------------------------------------------------------- // EgalTech 2013-2024 //---------------------------------------------------------------------------- // File : DistPointLine.cpp Data : 20.05.24 Versione : 2.6e5 // Contenuto : Implementazione della classe distanza punto da linea/segmento. // // // // Modifiche : 17.12.13 DS Creazione modulo. // 20.05.24 DS Reso pubblico in Include. // //---------------------------------------------------------------------------- //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "/EgtDev/Include/EGkDistPointLine.h" //---------------------------------------------------------------------------- DistPointLine::DistPointLine( const Point3d& ptP, const ICurveLine& crvLine, bool bIsSegment) { if ( &crvLine == nullptr || ! crvLine.IsValid()) { // distanza non calcolata m_dSqDist = - 1 ; return ; } double dLen ; Vector3d vtDir ; DirDist( crvLine.GetStart(), crvLine.GetEnd(), vtDir, dLen) ; Calculate( ptP, crvLine.GetStart(), vtDir, dLen, bIsSegment) ; } //---------------------------------------------------------------------------- DistPointLine::DistPointLine( const Point3d& ptP, const Point3d& ptIni, const Point3d& ptFin, bool bIsSegment) { double dLen ; Vector3d vtDir ; DirDist( ptIni, ptFin, vtDir, dLen) ; Calculate( ptP, ptIni, vtDir, dLen, bIsSegment) ; } //---------------------------------------------------------------------------- DistPointLine::DistPointLine( const Point3d& ptP, const Point3d& ptIni, const Vector3d& vtDir, double dLen, bool bIsSegment) { Vector3d vtDirNorm = vtDir ; if ( dLen > EPS_SMALL && ! vtDirNorm.Normalize( EPS_ZERO)) { // distanza non calcolata m_dSqDist = - 1 ; return ; } Calculate( ptP, ptIni, vtDirNorm, dLen, bIsSegment) ; } //---------------------------------------------------------------------------- void DistPointLine::Calculate( const Point3d& ptP, const Point3d& ptIni, const Vector3d& vtDir, double dLen, bool bIsSegment) { double dProiez ; // se la linea è un punto if ( dLen < EPS_SMALL) { dProiez = 0 ; m_ptMinDist = ptIni ; } // se la linea è illimitata else if ( ! bIsSegment) { dProiez = vtDir * ( ptP - ptIni) ; m_ptMinDist = ptIni + vtDir * dProiez ; } // altrimenti la linea è un segmento else { dProiez = vtDir * ( ptP - ptIni) ; if ( dProiez < 0) dProiez = 0 ; else if ( dProiez > dLen) dProiez = dLen ; m_ptMinDist = ptIni + vtDir * dProiez ; } // calcolo il quadrato della distanza m_dSqDist = SqDist( ptP, m_ptMinDist) ; // dichiaro distanza non calcolata m_dDist = - 1 ; // calcolo il parametro m_dParam = ( ( dLen < EPS_SMALL) ? 0 : ( dProiez / dLen)) ; } //---------------------------------------------------------------------------- bool DistPointLine::GetSqDist( double& dSqDist) const { if ( m_dSqDist < 0) return false ; dSqDist = m_dSqDist ; return true ; } //---------------------------------------------------------------------------- bool DistPointLine::GetDist( double& dDist) const { if ( m_dSqDist < 0) return false ; if ( m_dDist < 0) m_dDist = sqrt( m_dSqDist) ; dDist = m_dDist ; return true ; } //---------------------------------------------------------------------------- bool DistPointLine::GetMinDistPoint( Point3d& ptMinDist) const { if ( m_dSqDist < 0) return false ; ptMinDist = m_ptMinDist ; return true ; } //---------------------------------------------------------------------------- bool DistPointLine::GetParamAtMinDistPoint( double& dParam) const { if ( m_dSqDist < 0) return false ; dParam = m_dParam ; return true ; }