Merge branch '3dm_import+trim&mesh'

This commit is contained in:
Daniele Bariletti
2023-11-07 17:50:25 +01:00
13 changed files with 4880 additions and 199 deletions
+128 -85
View File
@@ -66,7 +66,7 @@ SurfTriMesh::Init( int nNumVert, int nNumTria, int nNumFacet)
// se superficie vuota
if ( nNumVert == 0 && nNumTria == 0 && nNumFacet == 0)
return true ;
// verifico validità parametri
// verifico validit parametri
if ( nNumVert < 3 || nNumTria < 1)
return false ;
// prealloco la memoria
@@ -107,28 +107,32 @@ SurfTriMesh::Clear( void)
//----------------------------------------------------------------------------
int
SurfTriMesh::AddVertex( const Point3d& ptVert)
SurfTriMesh::AddVertex( const Point3d& ptVert, const double dU, const double dV)
{
// imposto ricalcolo
// imposto ricalcolo
m_nStatus = TO_VERIFY ;
m_nParts = - 1 ;
m_OGrMgr.Reset() ;
ResetHashGrids3d() ;
// inserisco il vertice
// inserisco il vertice
try { m_vVert.emplace_back( ptVert) ;}
catch(...) { return SVT_NULL ;}
// ne determino l'indice
return int( m_vVert.size() - 1) ;
int nId = int( m_vVert.size() - 1) ;
// aggiugo le coordinate corrispondenti allo spazio parametrico
m_vVert[nId].dU = dU ;
m_vVert[nId].dV = dV ;
return nId ;
}
//----------------------------------------------------------------------------
bool
SurfTriMesh::MoveVertex( int nInd, const Point3d& ptNewVert)
{
// verifico validità indice
// verifico validit indice
if ( nInd < 0 || nInd >= int( m_vVert.size()))
return false ;
// verifico non sia già cancellato
// verifico non sia gi cancellato
if ( m_vVert[nInd].nIdTria == SVT_DEL)
return false ;
// sposto il vertice
@@ -253,14 +257,14 @@ SurfTriMesh::RemoveTriangle( int nId)
// verifico esistenza del triangolo
if ( nId < 0 || nId >= GetTriangleSize())
return false ;
// verifico se già cancellato
// verifico se gi cancellato
if ( m_vTria[nId].nIdVert[0] == SVT_DEL)
return true ;
// aggiorno eventuali riferimenti dei vertici
for ( int i = 0 ; i < 3 ; ++ i) {
// indice vertice
int nV = m_vTria[nId].nIdVert[i] ;
// se vertice non c'è passo al prossimo
// se vertice non c' passo al prossimo
if ( nV < 0 || nV >= int( m_vVert.size()))
continue ;
if ( m_vVert[nV].nIdTria == nId) {
@@ -278,7 +282,7 @@ SurfTriMesh::RemoveTriangle( int nId)
for ( int i = 0 ; i < 3 ; ++ i) {
// indice triangolo adiacente
int nAdjT = m_vTria[nId].nIdAdjac[i] ;
// se triangolo adiacente non c'è passo al prossimo
// se triangolo adiacente non c' passo al prossimo
if ( nAdjT == SVT_NULL || m_vTria[nAdjT].nIdVert[0] == SVT_DEL)
continue ;
// ne sistemo la contro-adiacenza
@@ -291,7 +295,7 @@ SurfTriMesh::RemoveTriangle( int nId)
m_vTria[nId].nIdVert[0] = SVT_DEL ;
// invalido calcolo facce
m_bFaceted = false ;
// invalido calcolo connettività
// invalido calcolo connettivit
m_nParts = - 1 ;
return true ;
}
@@ -357,7 +361,7 @@ SurfTriMesh::GetCentroid( Point3d& ptCen) const
// la superficie deve essere validata
if ( m_nStatus != OK)
return false ;
// se la superficie è chiusa, calcolo il centroide del solido
// se la superficie chiusa, calcolo il centroide del solido
if ( IsClosed()) {
// applico le formule di R. Nurnberg Imperial College London ad ogni faccia
Triangle3d Tria ;
@@ -475,6 +479,20 @@ SurfTriMesh::GetVertex( int nId, Point3d& ptP) const
return true ;
}
//----------------------------------------------------------------------------
bool
SurfTriMesh::GetVertexParam( int nId, double& dU, double& dV) const
{
// verifico esistenza del vertice
if ( nId < 0 || nId >= GetVertexSize() || m_vVert[nId].nIdTria == SVT_DEL)
return false ;
// recupero i dati
dU = m_vVert[nId].dU ;
dV = m_vVert[nId].dV ;
return true ;
}
//----------------------------------------------------------------------------
int
SurfTriMesh::GetFirstVertex( Point3d& ptP) const
@@ -482,6 +500,13 @@ SurfTriMesh::GetFirstVertex( Point3d& ptP) const
return GetNextVertex( SVT_NULL, ptP) ;
}
//----------------------------------------------------------------------------
int
SurfTriMesh::GetFirstVertexParam( int nId, double& dU, double& dV) const
{
return GetNextVertexParam( SVT_NULL, dU, dV) ;
}
//----------------------------------------------------------------------------
int
SurfTriMesh::GetNextVertex( int nId, Point3d& ptP) const
@@ -499,6 +524,24 @@ SurfTriMesh::GetNextVertex( int nId, Point3d& ptP) const
return nId ;
}
//----------------------------------------------------------------------------
int
SurfTriMesh::GetNextVertexParam( int nId, double& dU, double& dV) const
{
// cerco il primo successivo valido
do {
nId ++ ;
} while ( nId < GetVertexSize() && m_vVert[nId].nIdTria == SVT_DEL) ;
// se oltrepassata fine
if ( nId >= GetVertexSize())
return SVT_NULL ;
// recupero i dati
dU = m_vVert[nId].dU ;
dV = m_vVert[nId].dV ;
// ritorno indice triangolo corrente
return nId ;
}
//----------------------------------------------------------------------------
bool
SurfTriMesh::GetTriangle( int nId, int nIdVert[3]) const
@@ -731,13 +774,13 @@ SurfTriMesh::GetTriangleBoundaryEdges( int nId, TriFlags3d& TFlags) const
for ( int i = 0 ; i < 3 ; ++ i) {
// indice triangolo adiacente al lato
int nT = m_vTria[nId].nIdAdjac[i] ;
// se già definite le facce, verifico indice faccia
// se gi definite le facce, verifico indice faccia
if ( m_bFaceted) {
TFlags.bFlag[i] = ( nT == SVT_NULL || m_vTria[nId].nIdFacet != m_vTria[nT].nIdFacet) ;
}
// altrimenti verifico con le normali
else
// se non c'è triangolo adiacente o se forma un angolo oltre il limite, il lato è un contorno
// se non c' triangolo adiacente o se forma un angolo oltre il limite, il lato un contorno
TFlags.bFlag[i] = ( nT == SVT_NULL || m_vTria[nId].vtN * m_vTria[nT].vtN < m_dCosBndAng) ;
}
@@ -821,7 +864,7 @@ SurfTriMesh::GetTriangleSmoothNormal( int nT, int nV, Vector3d& vtN) const
if ( nPos == -1)
return false ;
// medio le normali, finché non incontro degli spigoli
// medio le normali, finch non incontro degli spigoli
vtN = m_vTria[nT].vtN ;
// parto dal triangolo e vado in direzione positiva
int nLim = nPos ;
@@ -852,7 +895,7 @@ SurfTriMesh::GetTriangleSmoothNormal( int nT, int nV, Vector3d& vtN) const
SurfTriMesh*
SurfTriMesh::CloneTriangle( int nT) const
{
// verifico validità superficie ed esistenza del triangolo
// verifico validit superficie ed esistenza del triangolo
if ( ! IsValid() || nT < 0 || nT >= GetTriangleSize() || m_vTria[nT].nIdVert[0] == SVT_DEL)
return nullptr ;
@@ -959,7 +1002,7 @@ SurfTriMesh::GetLoops( POLYLINEVECTOR& vPL) const
if ( ! MarchAlongLoop( nT, 1, m_nTimeStamp, vPL.back()))
return false ;
}
// se il lato 0 è di contorno
// se il lato 0 di contorno
else if ( nAdjT[0] == SVT_NULL) {
// ho trovato l'inizio di un loop
vPL.emplace_back() ;
@@ -971,7 +1014,7 @@ SurfTriMesh::GetLoops( POLYLINEVECTOR& vPL) const
if ( ! MarchAlongLoop( nT, 1, m_nTimeStamp, vPL.back()))
return false ;
}
// se il lato 1 è di contorno
// se il lato 1 di contorno
else if ( nAdjT[1] == SVT_NULL) {
// ho trovato l'inizio di un loop
vPL.emplace_back() ;
@@ -983,7 +1026,7 @@ SurfTriMesh::GetLoops( POLYLINEVECTOR& vPL) const
if ( ! MarchAlongLoop( nT, 2, m_nTimeStamp, vPL.back()))
return false ;
}
// se il lato 2 è di contorno
// se il lato 2 di contorno
else if ( nAdjT[2] == SVT_NULL) {
// ho trovato l'inizio di un loop
vPL.emplace_back() ;
@@ -995,7 +1038,7 @@ SurfTriMesh::GetLoops( POLYLINEVECTOR& vPL) const
if ( ! MarchAlongLoop( nT, 0, m_nTimeStamp, vPL.back()))
return false ;
}
// altrimenti non c'è contorno
// altrimenti non c' contorno
else {
// marco il triangolo come verificato
m_vTria[nT].nTemp = m_nTimeStamp ;
@@ -1040,10 +1083,10 @@ SurfTriMesh::MarchOneTria( int& nT, int& nV, int nTimeStamp,
return false ;
// vertice di fine adiacenza e indice del successivo lato
int nAdjV = Next( nAdjS) ;
// verifico se il lato successivo è un bordo
// verifico se il lato successivo un bordo
int nNextT = m_vTria[nAdjT].nIdAdjac[nAdjV] ;
if ( nNextT == SVT_NULL) {
// se già recuperato
// se gi recuperato
if ( m_vTria[nAdjT].nTemp == nTimeStamp) {
bEnd = true ;
return true ;
@@ -1091,8 +1134,8 @@ SurfTriMesh::GetSilhouette( const Vector3d& vtDir, double dTol, POLYLINEVECTOR&
frOCS.Translate( b3Box.GetMin().z * frOCS.VersZ()) ;
#if 0
// *** 1° Sfruttando le adiacenze ***
// Non funziona perchè genera loop con anelli
// *** 1 Sfruttando le adiacenze ***
// Non funziona perch genera loop con anelli
// Copio la superficie
PtrOwner<SurfTriMesh> pStm( Clone()) ;
if ( IsNull( pStm))
@@ -1100,7 +1143,7 @@ SurfTriMesh::GetSilhouette( const Vector3d& vtDir, double dTol, POLYLINEVECTOR&
// Elimino i triangoli con normale non equiversa alla direzione scelta
for ( int i = 0 ; i < int( pStm->m_vTria.size()) ; ++ i) {
// se già cancellato, passo oltre
// se gi cancellato, passo oltre
if ( pStm->m_vTria[i].nIdVert[0] == SVT_DEL)
continue ;
// verifico la normale
@@ -1159,7 +1202,7 @@ SurfTriMesh::GetSilhouette( const Vector3d& vtDir, double dTol, POLYLINEVECTOR&
vPL.clear() ;
#endif
// *** 2° Mediante unione delle regioni dei triangoli proiettati ***
// *** 2 Mediante unione delle regioni dei triangoli proiettati ***
// calcolo la regione dei triangoli proiettati
PtrOwner<ISurfFlatRegion> pSfr ;
Triangle3d Tria ;
@@ -1289,7 +1332,7 @@ SurfTriMesh::Dump( string& sOut, bool bMM, const char* szNewLine) const
// segnalo eventuale incongruenza di orientamento
if ( ! m_bOriented)
sOut += string( "Inconsistent Orientation") + szNewLine ;
// segnalo numero di parti se più di una
// segnalo numero di parti se pi di una
int nParts = GetPartCount() ;
if ( nParts > 1)
sOut += string( "Parts =") + ToString( nParts) + szNewLine ;
@@ -1519,7 +1562,7 @@ SurfTriMesh::Validate( bool bCorrect)
// Verifico che i triangoli riferiti dalle facce esistano
for ( int i = 0 ; i < GetFacetSize() && m_nStatus == OK && m_bFaceted ; ++ i) {
// verifico validità triangolo riferito
// verifico validit triangolo riferito
if ( m_vFacet[i] <= SVT_NULL ||
m_vFacet[i] >= GetTriangleSize() ||
m_vTria[ m_vFacet[i]].nIdVert[0] == SVT_DEL)
@@ -1674,7 +1717,7 @@ SurfTriMesh::AdjustAdjacencies( void)
bool
SurfTriMesh::AdjustOrientations( void)
{
// se non ci sono almeno 2 triangoli è inutile fare test
// se non ci sono almeno 2 triangoli inutile fare test
if ( m_vTria.size() < 2) {
m_bOriented = true ;
return true ;
@@ -1718,7 +1761,7 @@ SurfTriMesh::AdjustTriaOrientation( TRINTDEQUE& S3iQ)
S3iQ.pop_front() ;
// assegno time stamp al triangolo
m_vTria[nT].nTemp = m_nTimeStamp ;
// se c'è triangolo di riferimento, devo verificare se da invertire
// se c' triangolo di riferimento, devo verificare se da invertire
if ( nRefT != SVT_NULL) {
// cerco indice half-edge in comune
int nE = 0 ;
@@ -1736,7 +1779,7 @@ SurfTriMesh::AdjustTriaOrientation( TRINTDEQUE& S3iQ)
bool bOk = true ;
for ( int j = 0 ; j < 3 ; ++ j) {
int nAdjT = m_vTria[nT].nIdAdjac[j] ;
// se non c'è adiacenza o va sul triangolo di provenienza
// se non c' adiacenza o va sul triangolo di provenienza
if ( nAdjT == SVT_NULL || nAdjT == nRefT)
;
// la verifico
@@ -1791,7 +1834,7 @@ SurfTriMesh::TestSealing( void)
bool
SurfTriMesh::AdjustTopology( void)
{
// se non è rimasto alcunché di valido, pulisco tutto ed esco
// se non rimasto alcunch di valido, pulisco tutto ed esco
if ( GetVertexCount() < 3 || GetTriangleCount() < 1) {
Clear() ;
m_bOriented = true ;
@@ -1808,7 +1851,7 @@ SurfTriMesh::AdjustTopology( void)
// verifica adiacenze
if ( ! AdjustAdjacencies())
return false ;
// verifica continuità orientazione
// verifica continuit orientazione
if ( ! AdjustOrientations())
return false ;
// verifica chiusura
@@ -1846,7 +1889,7 @@ SurfTriMesh::PackVertices( void)
vVId.push_back( SVT_DEL) ;
}
}
// se non c'è stata compattazione, esco
// se non c' stata compattazione, esco
if ( nFirstFree == SVT_NULL)
return true ;
// lunghezza vettore indici vertici
@@ -1861,7 +1904,7 @@ SurfTriMesh::PackVertices( void)
// salto i triangoli cancellati
if ( vOId[0] == SVT_DEL)
continue ;
// verifico la validità degli indici
// verifico la validit degli indici
if ( vOId[0] < 0 || vOId[0] >= nVIdSize ||
vOId[1] < 0 || vOId[1] >= nVIdSize ||
vOId[2] < 0 || vOId[2] >= nVIdSize)
@@ -1901,7 +1944,7 @@ SurfTriMesh::PackTriangles( void)
vTId.push_back( SVT_DEL) ;
}
}
// se non c'è stata compattazione, esco
// se non c' stata compattazione, esco
if ( nFirstFree == SVT_NULL)
return true ;
// Invalido HashGrid
@@ -1915,7 +1958,7 @@ SurfTriMesh::PackTriangles( void)
// salto vertice cancellato
if ( nOId == SVT_DEL)
continue ;
// verifico la validità dell'indice
// verifico la validit dell'indice
if ( nOId < 0 || nOId >= nTIdSize)
return false ;
// aggiorno
@@ -1945,7 +1988,7 @@ SurfTriMesh::PackTriangles( void)
// salto le facets non valide
if ( m_vFacet[nId] == SVT_DEL)
continue ;
// verifico validità indice a triangolo
// verifico validit indice a triangolo
if ( m_vFacet[nId] < 0 || m_vFacet[nId] >= nTIdSize)
return false ;
// aggiorno
@@ -2047,7 +2090,7 @@ SurfTriMesh::CreateByExtrusion( const PolyLine& PL, const Vector3d& vtExtr)
m_OGrMgr.Reset() ;
ResetHashGrids3d() ;
// verifico se la polilinea è chiusa
// verifico se la polilinea chiusa
bool bClosed = PL.IsClosed() ;
// costruisco la mesh
@@ -2080,7 +2123,7 @@ SurfTriMesh::CreateByExtrusion( const PolyLine& PL, const Vector3d& vtExtr)
}
// se curva chiusa, aggiungo gli ultimi due triangoli
if ( bClosed) {
// non devo aggiungere i vertici, perchè coincidono con quelli iniziali
// non devo aggiungere i vertici, perch coincidono con quelli iniziali
// aggiungo i due triangoli relativi
nIdV[0] = nV ;
nIdV[1] = nV - 1 ;
@@ -2099,7 +2142,7 @@ SurfTriMesh::CreateByExtrusion( const PolyLine& PL, const Vector3d& vtExtr)
bool
SurfTriMesh::CreateByPointCurve( const Point3d& ptP, const PolyLine& PL)
{
// verifico validità punto/polilinea
// verifico validit punto/polilinea
bool bClosed = PL.IsClosed() ;
// se chiusa, la polilinea deve avere almeno 3 punti
if ( bClosed) {
@@ -2143,7 +2186,7 @@ SurfTriMesh::CreateByPointCurve( const Point3d& ptP, const PolyLine& PL)
// aggiorno indice punto precedente su curva
nIdV[1] = nIdV[2] ;
}
// se chiusa aggiungo l'ultimo triangolo (non il vertice perchè è il primo della curva)
// se chiusa aggiungo l'ultimo triangolo (non il vertice perch il primo della curva)
if ( bClosed) {
nIdV[2] = 1 ;
// inserisco il triangolo A2p -> A1p -> A1s
@@ -2235,7 +2278,7 @@ SurfTriMesh::CreateByTwoCurves( const PolyLine& PL1, const PolyLine& PL2, int nR
}
// ciclo sui punti
while ( bNext1 || bNext2) {
// se non c'è V2s oppure c'è nuovo V1s e la diagonale più corta è V2p -> V1s
// se non c' V2s oppure c' nuovo V1s e la diagonale pi corta V2p -> V1s
if ( ! bNext2 || ( bNext1 && ( nP1s == vPnt2[nP2p].second || vPnt1[nP1s].second == nP2p))) {
// inserisco il vertice V1s (se ultimo e curve chiuse, prendo il primo)
if ( nP1s == nTotP1 - 1 && bClosed)
@@ -2257,7 +2300,7 @@ SurfTriMesh::CreateByTwoCurves( const PolyLine& PL1, const PolyLine& PL2, int nR
nV1p = nV1s ; nP1p = nP1s ; ++ nP1s ;
bNext1 = ( nP1s < nTotP1) ;
}
// altrimenti è V1p -> V2s
// altrimenti V1p -> V2s
else {
// inserisco il vertice V2s (se ultimo e curve chiuse, prendo il primo)
if ( nP2s == nTotP2 - 1 && bClosed)
@@ -2284,7 +2327,7 @@ SurfTriMesh::CreateByTwoCurves( const PolyLine& PL1, const PolyLine& PL2, int nR
// altrimenti rigata con parametrizzazione sincrona sulle due curve
else {
// verifico validità polilinee (devono avere almeno 2 punti e non coincidere se non agli estremi aperti)
// verifico validit polilinee (devono avere almeno 2 punti e non coincidere se non agli estremi aperti)
if ( ! VerifyPolylinesForTwoCurves( PL1, PL2))
return false ;
@@ -2409,7 +2452,7 @@ SurfTriMesh::CreateByTwoCurves( const PolyLine& PL1, const PolyLine& PL2, int nR
if ( bNext2)
dA2s = ( dU2s - dU2F) / dDeltaU2 ;
}
// se non c'è dA2s oppure c'è nuovo dA1s e la diagonale più corta è dA2p -> dA1s
// se non c' dA2s oppure c' nuovo dA1s e la diagonale pi corta dA2p -> dA1s
else if ( ! bNext2 || ( bNext1 && ( dA1s - dA2p) <= ( dA2s - dA1p) + EPS_PARAM)) {
// inserisco il vertice A1s
if ( ( nV1s = AddVertex( ptP1s)) == SVT_NULL)
@@ -2433,7 +2476,7 @@ SurfTriMesh::CreateByTwoCurves( const PolyLine& PL1, const PolyLine& PL2, int nR
if ( bNext1)
dA1s = ( dU1s - dU1F) / dDeltaU1 ;
}
// altrimenti è dA1p -> dA2s
// altrimenti dA1p -> dA2s
else {
// inserisco il vertice A2s
if ( ( nV2s = AddVertex( ptP2s)) == SVT_NULL)
@@ -2462,7 +2505,7 @@ SurfTriMesh::CreateByTwoCurves( const PolyLine& PL1, const PolyLine& PL2, int nR
if ( bClosed) {
dA1s = 1 ;
dA2s = 1 ;
// se la diagonale più corta è dA2p -> dA1s = 0
// se la diagonale pi corta dA2p -> dA1s = 0
if ( ( dA1s - dA2p) <= ( dA2s - dA1p) + EPS_PARAM) {
// inserisco il triangolo A2p -> A1p -> A1s = 0
nIdV[0] = nV2p ;
@@ -2477,7 +2520,7 @@ SurfTriMesh::CreateByTwoCurves( const PolyLine& PL1, const PolyLine& PL2, int nR
if ( AddTriangle( nIdV) == SVT_NULL)
return false ;
}
// altrimenti è dA1p -> dA2s = 1
// altrimenti dA1p -> dA2s = 1
else {
// inserisco il triangolo A2p -> A1p -> A2s = 1
nIdV[0] = nV2p ;
@@ -2552,7 +2595,7 @@ SurfTriMesh::VerifyPolylinesForTwoCurves( const PolyLine& PL1, const PolyLine& P
return false ;
// verifiche sui punti successivi (non sugli ultimi)
while ( bNext1 || bNext2) {
// se c'è nuovo dA1s e la diagonale più corta è dA2p -> dA1s oppure non c'è dA2s
// se c' nuovo dA1s e la diagonale pi corta dA2p -> dA1s oppure non c' dA2s
if ( ( bNext1 && ( dA1s - dA2p) <= ( dA2s - dA1p) + EPS_PARAM) || ! bNext2) {
// verifico se coincidono
if ( AreSamePointApprox( ptP2p, ptP1s))
@@ -2563,7 +2606,7 @@ SurfTriMesh::VerifyPolylinesForTwoCurves( const PolyLine& PL1, const PolyLine& P
if ( bNext1)
dA1s = ( dU1s - dU1F) / dDeltaU1 ;
}
// altrimenti è dA1p -> dA2s = 1
// altrimenti dA1p -> dA2s = 1
else {
// verifico se coincidono
if ( AreSamePointApprox( ptP1p, ptP2s))
@@ -2667,7 +2710,7 @@ AdjustPolylineForRevolution( PolyLine& PL, const Point3d& ptAx, const Vector3d&
plTrim.Translate( DIST_SIC * vtTrN) ;
PL.Trim( plTrim, false) ;
// Se polilinea risultante è aperta con estremità molto vicine all'asse le porto su questo
// Se polilinea risultante aperta con estremit molto vicine all'asse le porto su questo
if ( ! PL.IsClosed()) {
// verifico l'inizio
double dUStart ;
@@ -2745,7 +2788,7 @@ SurfTriMesh::CreateByScrewing( const PolyLine& PL, const Point3d& ptAx, const Ve
m_OGrMgr.Reset() ;
ResetHashGrids3d() ;
// verifico se la polilinea è chiusa
// verifico se la polilinea chiusa
bool bClosed = MyPL.IsClosed() ;
// costruisco la mesh
@@ -2766,7 +2809,7 @@ SurfTriMesh::CreateByScrewing( const PolyLine& PL, const Point3d& ptAx, const Ve
// verifico se il punto giace sull'asse e vi sta fisso
bool bPrevOnAx = bOnlyRev && DistPointLine( ptP, ptAx, vtAx, 1, false).IsSmall() ;
int nVPrevOnAx = nV ;
// se non è fisso sull'asse, inserisco le copie ruotate
// se non fisso sull'asse, inserisco le copie ruotate
if ( ! bPrevOnAx) {
for ( int i = 1 ; i <= nStep ; ++i) {
ptP.Rotate( ptAx, vtAx, dCosStepRot, dSinStepRot) ;
@@ -2788,7 +2831,7 @@ SurfTriMesh::CreateByScrewing( const PolyLine& PL, const Point3d& ptAx, const Ve
bool bOnAx = bOnlyRev && DistPointLine( ptP, ptAx, vtAx, 1, false).IsSmall() ;
// ciclo sugli step
for ( int i = 1 ; i <= nStep ; ++i) {
// se non è fisso sull'asse, inserisco le copie ruotate
// se non fisso sull'asse, inserisco le copie ruotate
if ( ! bOnAx) {
ptP.Rotate( ptAx, vtAx, dCosStepRot, dSinStepRot) ;
if ( ! bOnlyRev)
@@ -2797,8 +2840,8 @@ SurfTriMesh::CreateByScrewing( const PolyLine& PL, const Point3d& ptAx, const Ve
return false ;
++ nV ;
}
// per i controlli già fatti non è possibile avere contemp. prec e corr su asse
// se il precedente è sull'asse, aggiungo un solo triangolo
// per i controlli gi fatti non possibile avere contemp. prec e corr su asse
// se il precedente sull'asse, aggiungo un solo triangolo
if ( bPrevOnAx) {
nIdV[0] = nVPrevOnAx ;
nIdV[1] = nV ;
@@ -2806,7 +2849,7 @@ SurfTriMesh::CreateByScrewing( const PolyLine& PL, const Point3d& ptAx, const Ve
if ( AddTriangle( nIdV) == SVT_NULL)
return false ;
}
// se il corrente è sull'asse, aggiungo un solo triangolo
// se il corrente sull'asse, aggiungo un solo triangolo
else if ( bOnAx) {
nIdV[0] = nV - ( nStep + 2) + i ;
nIdV[1] = nIdV[0] + 1 ;
@@ -2826,8 +2869,8 @@ SurfTriMesh::CreateByScrewing( const PolyLine& PL, const Point3d& ptAx, const Ve
}
// se rivoluzione completa, aggiungo i due triangoli di chiusura
if ( bFullRev) {
// per i controlli già fatti non è possibile avere contemp. prec e corr su asse
// se il precedente è sull'asse, aggiungo un solo triangolo
// per i controlli gi fatti non possibile avere contemp. prec e corr su asse
// se il precedente sull'asse, aggiungo un solo triangolo
if ( bPrevOnAx) {
nIdV[0] = nVPrevOnAx ;
nIdV[1] = nV - nStep ;
@@ -2835,7 +2878,7 @@ SurfTriMesh::CreateByScrewing( const PolyLine& PL, const Point3d& ptAx, const Ve
if ( AddTriangle( nIdV) == SVT_NULL)
return false ;
}
// se il corrente è sull'asse, aggiungo un solo triangolo
// se il corrente sull'asse, aggiungo un solo triangolo
else if ( bOnAx) {
nIdV[0] = nV - 1 ;
nIdV[1] = nV - ( nStep + 1) ;
@@ -2858,7 +2901,7 @@ SurfTriMesh::CreateByScrewing( const PolyLine& PL, const Point3d& ptAx, const Ve
// altrimenti ultimo punto di polilinea chiusa
if ( bClosed) {
for ( int i = 1 ; i <= nStep ; ++i) {
// non devo aggiungere i vertici, perchè coincidono con quelli iniziali
// non devo aggiungere i vertici, perch coincidono con quelli iniziali
// aggiungo triangolo in basso a sinistra
nIdV[0] = nV - nStep + i - 1 ; nIdV[1] = nV - nStep + i ; nIdV[2] = i ;
if ( AddTriangle( nIdV) == SVT_NULL)
@@ -2894,7 +2937,7 @@ SurfTriMesh::AddBiTriangle( const int nIdVert[4])
// | |
// 1 -> 2
int nIdV[3] ;
// se la diagonale 0->2 è uguale o più corta della 1->3
// se la diagonale 0->2 uguale o pi corta della 1->3
if ( SqDist( m_vVert[nIdVert[0]].ptP, m_vVert[nIdVert[2]].ptP) <=
SqDist( m_vVert[nIdVert[1]].ptP, m_vVert[nIdVert[3]].ptP) + EPS_SMALL) {
// triangolo 0->1->2
@@ -2955,14 +2998,14 @@ SurfTriMesh::DoCompacting( double dTol)
}
// recupero la posizione geometrica del vertice
Point3d ptP = m_vVert[nId].ptP ;
// se non c'è già un vertice con la stessa posizione lo inserisco nel grid
// se non c' gi un vertice con la stessa posizione lo inserisco nel grid
int nAliasId ;
if ( ! VertGrid.Find( ptP, dTol, nAliasId)) {
VertGrid.InsertPoint( ptP, nId) ;
// salvo l'Id nel vettore di reindirizzo
vVId.push_back( nId) ;
}
// c'è un vertice coincidente
// c' un vertice coincidente
else {
// salvo l'Id alias nel vettore di reindirizzo
vVId.push_back( nAliasId) ;
@@ -2981,7 +3024,7 @@ SurfTriMesh::DoCompacting( double dTol)
int vOId[3]{ m_vTria[nId].nIdVert[0],
m_vTria[nId].nIdVert[1],
m_vTria[nId].nIdVert[2]} ;
// verifico la validità degli indici
// verifico la validit degli indici
if ( vOId[0] < 0 || vOId[0] >= nVIdSize ||
vOId[1] < 0 || vOId[1] >= nVIdSize ||
vOId[2] < 0 || vOId[2] >= nVIdSize)
@@ -2990,7 +3033,7 @@ SurfTriMesh::DoCompacting( double dTol)
m_vTria[nId].nIdVert[0] = vVId[vOId[0]] ;
m_vTria[nId].nIdVert[1] = vVId[vOId[1]] ;
m_vTria[nId].nIdVert[2] = vVId[vOId[2]] ;
// se due vertici coincidono o la normale non è calcolabile, cancello il triangolo
// se due vertici coincidono o la normale non calcolabile, cancello il triangolo
if ( m_vTria[nId].nIdVert[0] == m_vTria[nId].nIdVert[1] ||
m_vTria[nId].nIdVert[0] == m_vTria[nId].nIdVert[2] ||
m_vTria[nId].nIdVert[1] == m_vTria[nId].nIdVert[2] ||
@@ -3053,7 +3096,7 @@ SurfTriMesh::DoSewing( const ISurfTriMesh& stmOther, const Frame3d& frOther, dou
Point3d ptOP = pOther->m_vVert[nOId].ptP ;
// la porto nel riferimento della prima superficie
ptOP.ToGlob( frOther) ;
// se non c'è già un vertice con la stessa posizione lo inserisco
// se non c' gi un vertice con la stessa posizione lo inserisco
int nNewId ;
if ( ! VertGrid.Find( ptOP, dTol, nNewId)) {
if ( ( nNewId = AddVertex( ptOP)) == SVT_NULL)
@@ -3075,7 +3118,7 @@ SurfTriMesh::DoSewing( const ISurfTriMesh& stmOther, const Frame3d& frOther, dou
// salto i triangoli cancellati
if ( vOId[0] == SVT_DEL)
continue ;
// verifico la validità degli indici
// verifico la validit degli indici
if ( vOId[0] < 0 || vOId[0] >= nVIdSize ||
vOId[1] < 0 || vOId[1] >= nVIdSize ||
vOId[2] < 0 || vOId[2] >= nVIdSize)
@@ -3127,7 +3170,7 @@ SurfTriMesh::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const
// verifico lo stato
if ( m_nStatus != OK)
return false ;
// verifico validità del frame
// verifico validit del frame
if ( frRef.GetType() == Frame3d::ERR)
return false ;
// assegno il box nel riferimento
@@ -3172,7 +3215,7 @@ SurfTriMesh::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng,
if ( m_nStatus != OK)
return false ;
// verifico validità dell'asse di rotazione
// verifico validit dell'asse di rotazione
if ( vtAx.IsSmall())
return false ;
@@ -3238,7 +3281,7 @@ SurfTriMesh::Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, double
bool bRecalc = ( abs( dCoeffX) < EPS_ZERO || abs( dCoeffY) < EPS_ZERO || abs( dCoeffZ) < EPS_ZERO) ;
for ( int i = 0 ; i < GetTriangleSize() ; ++ i) {
if ( m_vTria[i].nIdVert[0] != SVT_DEL) {
// se c'è mirror, devo invertire la faccia
// se c' mirror, devo invertire la faccia
if ( bMirror)
InvertTriangle( i) ;
// aggiorno la normale
@@ -3260,7 +3303,7 @@ SurfTriMesh::Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, double
bool
SurfTriMesh::InvertTriangle( int nT)
{
// controllo validità triangolo
// controllo validit triangolo
if ( ! ExistsTriangle( nT))
return true ;
// scambio di due vertici
@@ -3276,10 +3319,10 @@ SurfTriMesh::InvertTriangle( int nT)
bool
SurfTriMesh::CalcTriangleNormal( int nT)
{
// controllo validità triangolo
// controllo validit triangolo
if ( m_vTria[nT].nIdVert[0] == SVT_DEL)
return true ;
// controllo validità vertici riferiti dal triangolo
// controllo validit vertici riferiti dal triangolo
if ( m_vTria[nT].nIdVert[0] < 0 ||
m_vTria[nT].nIdVert[0] >= GetVertexSize() ||
m_vVert[m_vTria[nT].nIdVert[0]].nIdTria == SVT_DEL ||
@@ -3308,7 +3351,7 @@ SurfTriMesh::Mirror( const Point3d& ptOn, const Vector3d& vtNorm)
// la superficie deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità del piano di specchiatura
// verifico validit del piano di specchiatura
if ( vtNorm.IsSmall())
return false ;
@@ -3340,7 +3383,7 @@ SurfTriMesh::Shear( const Point3d& ptOn, const Vector3d& vtNorm, const Vector3d&
// la superficie deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità dei parametri
// verifico validit dei parametri
if ( vtNorm.IsSmall() || vtDir.IsSmall())
return false ;
@@ -3371,11 +3414,11 @@ SurfTriMesh::ToGlob( const Frame3d& frRef)
// la superficie deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità del frame
// verifico validit del frame
if ( frRef.GetType() == Frame3d::ERR)
return false ;
// se frame identità, non devo fare alcunché
// se frame identit, non devo fare alcunch
if ( IsGlobFrame( frRef))
return true ;
@@ -3405,11 +3448,11 @@ SurfTriMesh::ToLoc( const Frame3d& frRef)
// la superficie deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità del frame
// verifico validit del frame
if ( frRef.GetType() == Frame3d::ERR)
return false ;
// se frame identità, non devo fare alcunché
// se frame identit, non devo fare alcunch
if ( IsGlobFrame( frRef))
return true ;
@@ -3439,11 +3482,11 @@ SurfTriMesh::LocToLoc( const Frame3d& frOri, const Frame3d& frDest)
// la superficie deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità dei frame
// verifico validit dei frame
if ( frOri.GetType() == Frame3d::ERR || frDest.GetType() == Frame3d::ERR)
return false ;
// se i due riferimenti coincidono, non devo fare alcunché
// se i due riferimenti coincidono, non devo fare alcunch
if ( AreSameFrame( frOri, frDest))
return true ;
@@ -3500,7 +3543,7 @@ SurfTriMesh::ResetHashGrids3d( void) const
bool
SurfTriMesh::VerifyHashGrids3d( void) const
{
// se già calcolato, non devo fare altro
// se gi calcolato, non devo fare altro
if ( m_pHGrd3d != nullptr)
return true ;
// alloco
@@ -3571,7 +3614,7 @@ SurfTriMesh::VerifyConnection( void) const
// ciclo sui triangoli
m_nParts = 0 ;
for ( int i = 0 ; i < int( m_vTria.size()) ; ++ i) {
// salto triangoli cancellati o già assegnati
// salto triangoli cancellati o gi assegnati
if ( m_vTria[i].nIdVert[0] == SVT_DEL ||
m_vTria[i].nPart != SVT_NULL)
continue ;