//---------------------------------------------------------------------------- // EgalTech 2013-2013 //---------------------------------------------------------------------------- // File : DistPointLine.cpp Data : 17.12.13 Versione : 1.4l1 // Contenuto : Implementazione dell'oggetto distanza punto da linea/segmento. // // !!! ToDo : Gestire i sistemi di riferimento. // // Modifiche : 17.12.13 DS Creazione modulo. // // //---------------------------------------------------------------------------- //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "\EgtDev\Include\EGkDistPointLine.h" //---------------------------------------------------------------------------- DistPointLine::DistPointLine( void) { m_dLen = 0 ; m_bIsSegment = false ; m_dSqDist = - 1 ; m_dDist = - 1 ; } //---------------------------------------------------------------------------- bool DistPointLine::Set( const Point3d& ptP, const Point3d& ptIni, const Point3d& ptFin, bool bIsSegment) { m_ptP = ptP ; m_ptIni = ptIni ; m_dLen = Dist( ptIni, ptFin) ; if ( m_dLen > EPS_SMALL) m_vtDir = ( ptFin - ptIni) / m_dLen ; else m_vtDir.Set( 0, 0, 0) ; m_bIsSegment = bIsSegment ; m_dSqDist = - 1 ; m_dDist = - 1 ; return true ; } //---------------------------------------------------------------------------- bool DistPointLine::SetPoint( const Point3d& ptP) { m_ptP = ptP ; m_dSqDist = - 1 ; m_dDist = - 1 ; return true ; } //---------------------------------------------------------------------------- bool DistPointLine::SetLine( const Point3d& ptIni, const Point3d& ptFin, bool bIsSegment) { m_ptIni = ptIni ; m_dLen = Dist( ptIni, ptFin) ; if ( m_dLen > EPS_SMALL) m_vtDir = ( ptFin - ptIni) / m_dLen ; else m_vtDir.Set( 0, 0, 0) ; m_bIsSegment = bIsSegment ; m_dSqDist = - 1 ; m_dDist = - 1 ; return true ; } //---------------------------------------------------------------------------- bool DistPointLine::Calculate( void) { // se la linea è un punto if ( m_dLen < EPS_SMALL) m_ptMinDist = m_ptIni ; // se la linea è illimitata else if ( ! m_bIsSegment) m_ptMinDist = m_ptIni + m_vtDir * ( m_vtDir * ( m_ptP - m_ptIni)) ; // altrimenti la linea è un segmento else { double dProiez = m_vtDir * ( m_ptP - m_ptIni) ; if ( dProiez <= 0) m_ptMinDist = m_ptIni ; else if ( dProiez >= m_dLen) m_ptMinDist = m_ptIni + m_vtDir * m_dLen ; else m_ptMinDist = m_ptIni + m_vtDir * dProiez ; } // calcolo il quadrato della distanza m_dSqDist = SqDist( m_ptP, m_ptMinDist) ; return true ; } //---------------------------------------------------------------------------- double DistPointLine::GetSqDist( void) { // se necessario, faccio eseguire i conti if ( m_dSqDist < 0) Calculate() ; return m_dSqDist ; } //---------------------------------------------------------------------------- double DistPointLine::GetDist( void) { // se necessario, faccio eseguire i conti if ( m_dSqDist < 0) Calculate() ; if ( m_dDist < 0) m_dDist = sqrt( m_dSqDist) ; return m_dDist ; } //---------------------------------------------------------------------------- const Point3d& DistPointLine::GetPointMinDist( void) { // se necessario, faccio eseguire i conti if ( m_dSqDist < 0) Calculate() ; return m_ptMinDist ; }