137 lines
3.5 KiB
C++
137 lines
3.5 KiB
C++
//----------------------------------------------------------------------------
|
|
// 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 ;
|
|
}
|