EgtGeomKernel : Aggiunta prima versione distanza punto-arco.
Migliorie varie nei costruttori.
This commit is contained in:
+75
-83
@@ -2,9 +2,9 @@
|
||||
// EgalTech 2013-2013
|
||||
//----------------------------------------------------------------------------
|
||||
// File : DistPointLine.cpp Data : 17.12.13 Versione : 1.4l1
|
||||
// Contenuto : Implementazione dell'oggetto distanza punto da linea/segmento.
|
||||
// Contenuto : Implementazione della classe distanza punto da linea/segmento.
|
||||
//
|
||||
//
|
||||
// !!! ToDo : Gestire i sistemi di riferimento.
|
||||
//
|
||||
// Modifiche : 17.12.13 DS Creazione modulo.
|
||||
//
|
||||
@@ -17,120 +17,112 @@
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
DistPointLine::DistPointLine( void)
|
||||
DistPointLine::DistPointLine( const Point3d& ptP,
|
||||
const ICurveLine& crvLine, bool bIsSegment)
|
||||
{
|
||||
m_dLen = 0 ;
|
||||
m_bIsSegment = false ;
|
||||
m_dSqDist = - 1 ;
|
||||
m_dDist = - 1 ;
|
||||
if ( ! crvLine.IsValid()) {
|
||||
m_dSqDist = -1 ;
|
||||
return ;
|
||||
}
|
||||
|
||||
double dLen ;
|
||||
Vector3d vtDir ;
|
||||
DirDist( crvLine.GetStart(), crvLine.GetEnd(), vtDir, dLen) ;
|
||||
Calculate( ptP, crvLine.GetStart(), vtDir, dLen, bIsSegment) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
DistPointLine::Set( const Point3d& ptP, const Point3d& ptIni, const Point3d& ptFin, bool bIsSegment)
|
||||
DistPointLine::DistPointLine( 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 ;
|
||||
double dLen ;
|
||||
Vector3d vtDir ;
|
||||
|
||||
return true ;
|
||||
|
||||
DirDist( ptIni, ptFin, vtDir, dLen) ;
|
||||
Calculate( ptP, ptIni, vtDir, dLen, bIsSegment) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
DistPointLine::SetPoint( const Point3d& ptP)
|
||||
void
|
||||
DistPointLine::Calculate( const Point3d& ptP,
|
||||
const Point3d& ptIni, const Vector3d& vtDir, double dLen, bool bIsSegment)
|
||||
{
|
||||
m_ptP = ptP ;
|
||||
m_dSqDist = - 1 ;
|
||||
m_dDist = - 1 ;
|
||||
double dProiez ;
|
||||
|
||||
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 ;
|
||||
|
||||
if ( dLen < EPS_SMALL) {
|
||||
dProiez = 0 ;
|
||||
m_ptMinDist = ptIni ;
|
||||
}
|
||||
// se la linea è illimitata
|
||||
else if ( ! m_bIsSegment)
|
||||
m_ptMinDist = m_ptIni + m_vtDir * ( m_vtDir * ( m_ptP - m_ptIni)) ;
|
||||
|
||||
else if ( ! bIsSegment) {
|
||||
dProiez = vtDir * ( ptP - ptIni) ;
|
||||
m_ptMinDist = ptIni + vtDir * dProiez ;
|
||||
}
|
||||
// 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 ;
|
||||
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( m_ptP, m_ptMinDist) ;
|
||||
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)
|
||||
{
|
||||
if ( m_dSqDist < 0)
|
||||
return false ;
|
||||
|
||||
dSqDist = m_dSqDist ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
double
|
||||
DistPointLine::GetSqDist( void)
|
||||
bool
|
||||
DistPointLine::GetDist( double& dDist)
|
||||
{
|
||||
// se necessario, faccio eseguire i conti
|
||||
if ( m_dSqDist < 0)
|
||||
Calculate() ;
|
||||
return false ;
|
||||
|
||||
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 ;
|
||||
dDist = m_dDist ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
const Point3d&
|
||||
DistPointLine::GetPointMinDist( void)
|
||||
bool
|
||||
DistPointLine::GetPointMinDist( Point3d& ptMinDist)
|
||||
{
|
||||
// se necessario, faccio eseguire i conti
|
||||
if ( m_dSqDist < 0)
|
||||
Calculate() ;
|
||||
return false ;
|
||||
|
||||
return m_ptMinDist ;
|
||||
ptMinDist = m_ptMinDist ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
DistPointLine::GetParamAtPointMinDist( double& dParam)
|
||||
{
|
||||
if ( m_dSqDist < 0)
|
||||
return false ;
|
||||
|
||||
dParam = m_dParam ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user