06b8c000fd
- aggiunta DistPointSurfTm - corretta IntersLineSurfTm - migliorato IdManager in UpdateMaxId.
117 lines
3.6 KiB
C++
117 lines
3.6 KiB
C++
//----------------------------------------------------------------------------
|
|
// EgalTech 2018-2018
|
|
//----------------------------------------------------------------------------
|
|
// File : EGkDistPointTria.h Data : 11.12.18 Versione : 1.9l2
|
|
// Contenuto : Implementazione della classe distanza Punto da Trimesh.
|
|
//
|
|
//
|
|
//
|
|
// Modifiche : 07.12.18 LM Creazione modulo.
|
|
//
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "stdafx.h"
|
|
#include "SurfTriMesh.h"
|
|
#include "/EgtDev/Include/EGkTriangle3d.h"
|
|
#include "/EgtDev/Include/EGkDistPointTria.h"
|
|
#include "/EgtDev/Include/EGkDistPointSurfTm.h"
|
|
#include <cmath>
|
|
|
|
using namespace std ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
DistPointSurfTm::DistPointSurfTm( const Point3d& ptP, const ISurfTriMesh& tmSurf)
|
|
{
|
|
// Trimesh non valida
|
|
if ( &tmSurf == nullptr || ! tmSurf.IsValid()) {
|
|
m_dDist = - 1. ;
|
|
return ;
|
|
}
|
|
// Calcolo la distanza
|
|
Calculate( ptP, tmSurf) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void
|
|
DistPointSurfTm::Calculate( const Point3d& ptP, const ISurfTriMesh& tmSurf)
|
|
{
|
|
// Box locale della superficie
|
|
BBox3d boxS ;
|
|
boxS = tmSurf.GetAllTriaBox() ;
|
|
if ( boxS.IsEmpty()) {
|
|
m_dDist = - 1. ;
|
|
return ;
|
|
}
|
|
|
|
// Determino i triangoli vicini
|
|
Point3d ptMin, ptMax ;
|
|
boxS.GetMinMax( ptMin, ptMax) ;
|
|
double dDeltaLen = min( min( ptMax.x - ptMin.x, ptMax.y - ptMin.y), ptMax.z - ptMin.z) / 10. ;
|
|
double dBoxHalfLenX = min( abs( ptP.x - ptMin.x), abs( ptP.x - ptMax.x)) + dDeltaLen ;
|
|
double dBoxHalfLenY = min( abs( ptP.y - ptMin.y), abs( ptP.y - ptMax.y)) + dDeltaLen ;
|
|
double dBoxHalfLenZ = min( abs( ptP.z - ptMin.z), abs( ptP.z - ptMax.z)) + dDeltaLen ;
|
|
BBox3d boxP( ptP, dBoxHalfLenX, dBoxHalfLenY, dBoxHalfLenZ) ;
|
|
INTVECTOR vnIds ;
|
|
while ( ! tmSurf.GetAllTriaOverlapBox( boxP, vnIds))
|
|
boxP.Expand( dDeltaLen) ;
|
|
|
|
// Fra i triangoli vicini cerco quello di minima distanza
|
|
double dDist = DBL_MAX ;
|
|
int nMinDistIndex = SVT_NULL ;
|
|
Point3d ptMinDistPoint ;
|
|
for ( size_t t = 0 ; t < vnIds.size() ; ++ t) {
|
|
Triangle3d trCurTria ;
|
|
tmSurf.GetTriangle( vnIds[t], trCurTria) ;
|
|
DistPointTriangle DistPointTria( ptP, trCurTria) ;
|
|
double dCurDist ;
|
|
if ( DistPointTria.GetDist( dCurDist)) {
|
|
if ( dCurDist < dDist) {
|
|
dDist = dCurDist ;
|
|
nMinDistIndex = vnIds[t] ;
|
|
DistPointTria.GetMinDistPoint( ptMinDistPoint) ;
|
|
}
|
|
}
|
|
}
|
|
|
|
m_dDist = dDist ;
|
|
m_nMinDistTriaIndex = nMinDistIndex ;
|
|
m_ptMinDistPoint = ptMinDistPoint ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
DistPointSurfTm::GetDist( double& dDist)
|
|
{
|
|
// Distanza non valida
|
|
if ( m_dDist < -EPS_ZERO)
|
|
return false ;
|
|
// Distanza valida
|
|
dDist = m_dDist ;
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
DistPointSurfTm::GetMinDistPoint( Point3d& ptMinDistPoint)
|
|
{
|
|
// Distanza non valida
|
|
if ( m_dDist < -EPS_ZERO)
|
|
return false ;
|
|
// Distanza valida
|
|
ptMinDistPoint = m_ptMinDistPoint ;
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
DistPointSurfTm::GetMinDistTriaIndex( int& nMinDistIndex)
|
|
{
|
|
// Distanza non valida
|
|
if ( m_dDist < -EPS_ZERO)
|
|
return false ;
|
|
// Distanza valida
|
|
nMinDistIndex = m_nMinDistTriaIndex ;
|
|
return true ;
|
|
}
|