2e4b67f9e9
- aggiunte GetNfeFontDir e GetDefaultFont - modifiche a Set di ExtText - migliorata gestione materiali - GeomDB::Load ora può funzionare aggiungendo a DB già carico per Insert.
130 lines
3.4 KiB
C++
130 lines
3.4 KiB
C++
//----------------------------------------------------------------------------
|
|
// EgalTech 2013-2013
|
|
//----------------------------------------------------------------------------
|
|
// File : DistPointLine.cpp Data : 17.12.13 Versione : 1.4l1
|
|
// Contenuto : Implementazione della classe distanza punto da linea/segmento.
|
|
//
|
|
//
|
|
//
|
|
// Modifiche : 17.12.13 DS Creazione modulo.
|
|
//
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
//--------------------------- Include ----------------------------------------
|
|
#include "stdafx.h"
|
|
#include "DistPointLine.h"
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
DistPointLine::DistPointLine( const Point3d& ptP,
|
|
const ICurveLine& crvLine, bool bIsSegment)
|
|
{
|
|
// distanza non calcolata
|
|
m_dSqDist = - 1 ;
|
|
|
|
if ( &crvLine == nullptr || ! crvLine.IsValid())
|
|
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) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
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)
|
|
{
|
|
if ( m_dSqDist < 0)
|
|
return false ;
|
|
|
|
dSqDist = m_dSqDist ;
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
DistPointLine::GetDist( double& dDist)
|
|
{
|
|
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)
|
|
{
|
|
if ( m_dSqDist < 0)
|
|
return false ;
|
|
|
|
ptMinDist = m_ptMinDist ;
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
DistPointLine::GetParamAtMinDistPoint( double& dParam)
|
|
{
|
|
if ( m_dSqDist < 0)
|
|
return false ;
|
|
|
|
dParam = m_dParam ;
|
|
return true ;
|
|
}
|