Files
EgtGeomKernel/DistPointLine.cpp
T
Dario Sassi 2ed2a34d55 EgtGeomKernel :
- modifiche per DistPointLine con interfaccia portata in Include.
2024-05-22 08:19:10 +02:00

141 lines
4.0 KiB
C++

//----------------------------------------------------------------------------
// 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 ;
}