EgtGeomKernel 2.3l3 :
- altre modifiche per triangolazioni.
This commit is contained in:
+32
-29
@@ -72,16 +72,9 @@ Triangulate::Make( const PolyLine& PL, PNTVECTOR& vPt, INTVECTOR& vTr)
|
||||
if ( ! bCCW)
|
||||
reverse( vPt.begin(), vPt.end()) ;
|
||||
|
||||
// creo il vettore degli indici del Poligono
|
||||
INTVECTOR vPol ;
|
||||
int n = int( vPt.size()) ;
|
||||
vPol.reserve( n) ;
|
||||
for ( int i = 0 ; i < n ; ++ i)
|
||||
vPol.push_back( i) ;
|
||||
|
||||
// eseguo la triangolazione
|
||||
if ( ! MakeByEC2( vPt, vPol, vTr) &&
|
||||
! MakeByEC3( vPt, vPol, vTr)) {
|
||||
if ( ! MakeByEC2( vPt, vTr) &&
|
||||
! MakeByEC3( vPt, vTr)) {
|
||||
LOG_ERROR( GetEGkLogger(), "Error in MakeByEC23(1)")
|
||||
return MakeByEC_HPP( PL, bCCW, vPt, vTr) ;
|
||||
}
|
||||
@@ -191,19 +184,11 @@ Triangulate::Make( const POLYLINEVECTOR& vPL, PNTVECTOR& vPt, INTVECTOR& vTr)
|
||||
const_cast<PolyLine&>(vPL[i]).Invert( true) ;
|
||||
}
|
||||
if ( ! bOk)
|
||||
return false ;
|
||||
|
||||
// creo il vettore degli indici del Poligono
|
||||
INTVECTOR vPol ;
|
||||
int n = int( vPt.size()) ;
|
||||
vPol.reserve( n) ;
|
||||
// non devo gestire separatamente CCW perchè ho già invertito i punti
|
||||
for ( int i = 0 ; i < n ; ++ i)
|
||||
vPol.push_back( i) ;
|
||||
return MakeByEC_HPP( vPL, bCCW, vPt, vTr) ;
|
||||
|
||||
// eseguo la triangolazione
|
||||
if ( ! MakeByEC2( vPt, vPol, vTr) &&
|
||||
! MakeByEC3( vPt, vPol, vTr)) {
|
||||
if ( ! MakeByEC2( vPt, vTr) &&
|
||||
! MakeByEC3( vPt, vTr)) {
|
||||
LOG_ERROR( GetEGkLogger(), "Error in MakeByEC23(N)")
|
||||
return MakeByEC_HPP( vPL, bCCW, vPt, vTr) ;
|
||||
}
|
||||
@@ -330,16 +315,22 @@ Triangulate::MakeByEC_HPP( const POLYLINEVECTOR& vPL, bool bCCW, PNTVECTOR& vPt,
|
||||
// Ear Clipping algorithm
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Triangulate::MakeByEC( const PNTVECTOR& vPt, const INTVECTOR& vPol, INTVECTOR& vTr)
|
||||
Triangulate::MakeByEC( const PNTVECTOR& vPt, INTVECTOR& vTr)
|
||||
{
|
||||
// Clear triangle vector
|
||||
vTr.clear() ;
|
||||
|
||||
// At least 3 points
|
||||
int n = int( vPol.size()) ;
|
||||
int n = int( vPt.size()) ;
|
||||
if ( n < 3)
|
||||
return false ;
|
||||
|
||||
// Creo il vettore degli indici del Poligono
|
||||
INTVECTOR vPol ;
|
||||
vPol.reserve( n) ;
|
||||
for ( int i = 0 ; i < n ; ++ i)
|
||||
vPol.push_back( i) ;
|
||||
|
||||
// Preallocate triangle vector ( #triangles = n - 2)
|
||||
vTr.reserve( 3 * ( n - 2)) ;
|
||||
|
||||
@@ -402,16 +393,22 @@ Triangulate::MakeByEC( const PNTVECTOR& vPt, const INTVECTOR& vPol, INTVECTOR& v
|
||||
// Ear Clipping algorithm enhanced, choose smaller diagonal
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Triangulate::MakeByEC2( const PNTVECTOR& vPt, const INTVECTOR& vPol, INTVECTOR& vTr)
|
||||
Triangulate::MakeByEC2( const PNTVECTOR& vPt, INTVECTOR& vTr)
|
||||
{
|
||||
// Clear triangle vector
|
||||
vTr.clear() ;
|
||||
|
||||
// At least 3 points
|
||||
int n = int( vPol.size()) ;
|
||||
int n = int( vPt.size()) ;
|
||||
if ( n < 3)
|
||||
return false ;
|
||||
|
||||
// Creo il vettore degli indici del Poligono
|
||||
INTVECTOR vPol ;
|
||||
vPol.reserve( n) ;
|
||||
for ( int i = 0 ; i < n ; ++ i)
|
||||
vPol.push_back( i) ;
|
||||
|
||||
// Preallocate triangle vector ( #triangles = n - 2)
|
||||
vTr.reserve( 3 * ( n - 2)) ;
|
||||
|
||||
@@ -523,16 +520,22 @@ Triangulate::MakeByEC2( const PNTVECTOR& vPt, const INTVECTOR& vPol, INTVECTOR&
|
||||
// AR = ( Lmax * Lmax) / ( 2 * Area) = SqLenMax / L1 * L2
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Triangulate::MakeByEC3( const PNTVECTOR& vPt, const INTVECTOR& vPol, INTVECTOR& vTr)
|
||||
Triangulate::MakeByEC3( const PNTVECTOR& vPt, INTVECTOR& vTr)
|
||||
{
|
||||
// Clear triangle vector
|
||||
vTr.clear() ;
|
||||
|
||||
// At least 3 points
|
||||
int n = int( vPol.size()) ;
|
||||
int n = int( vPt.size()) ;
|
||||
if ( n < 3)
|
||||
return false ;
|
||||
|
||||
// Creo il vettore degli indici del Poligono
|
||||
INTVECTOR vPol ;
|
||||
vPol.reserve( n) ;
|
||||
for ( int i = 0 ; i < n ; ++ i)
|
||||
vPol.push_back( i) ;
|
||||
|
||||
// Preallocate triangle vector ( #triangles = n - 2)
|
||||
vTr.reserve( 3 * ( n - 2)) ;
|
||||
|
||||
@@ -959,7 +962,7 @@ Triangulate::GetOuterPntToJoin( const PNTVECTOR& vPt, const Point3d& ptP, int& n
|
||||
double dCoeff = ( ptP.y - vPt[i].y) / ( vPt[j].y - vPt[i].y) ;
|
||||
double dX = vPt[i].x + ( vPt[j].x - vPt[i].x) * dCoeff ;
|
||||
// se sta sul raggio e distanza minore della minima
|
||||
if ( dX > ptP.x - 5 * EPS_SMALL && ( dX - ptP.x) < dMinDist) {
|
||||
if ( dX > ptP.x - EPS_SMALL && ( dX - ptP.x) < dMinDist) {
|
||||
dMinDist = dX - ptP.x ;
|
||||
nI = ( vPt[i].x >= vPt[j].x) ? i : j ;
|
||||
double dZ = vPt[i].z + ( vPt[j].z - vPt[i].z) * dCoeff ;
|
||||
@@ -990,7 +993,7 @@ Triangulate::GetOuterPntToJoin( const PNTVECTOR& vPt, const Point3d& ptP, int& n
|
||||
double dCoeff = ( ptP.z - vPt[i].z) / ( vPt[j].z - vPt[i].z) ;
|
||||
double dY = vPt[i].y + ( vPt[j].y - vPt[i].y) * dCoeff ;
|
||||
// se sta sul raggio e distanza minore della minima
|
||||
if ( dY > ptP.y - 5 * EPS_SMALL && ( dY - ptP.y) < dMinDist) {
|
||||
if ( dY > ptP.y - EPS_SMALL && ( dY - ptP.y) < dMinDist) {
|
||||
dMinDist = dY - ptP.y ;
|
||||
nI = ( vPt[i].y >= vPt[j].y) ? i : j ;
|
||||
double dX = vPt[i].x + ( vPt[j].x - vPt[i].x) * dCoeff ;
|
||||
@@ -1021,7 +1024,7 @@ Triangulate::GetOuterPntToJoin( const PNTVECTOR& vPt, const Point3d& ptP, int& n
|
||||
double dCoeff = ( ptP.x - vPt[i].x) / ( vPt[j].x - vPt[i].x) ;
|
||||
double dZ = vPt[i].z + ( vPt[j].z - vPt[i].z) * dCoeff ;
|
||||
// se sta sul raggio e distanza minore della minima
|
||||
if ( dZ > ptP.z - 5 * EPS_SMALL && ( dZ - ptP.z) < dMinDist) {
|
||||
if ( dZ > ptP.z - EPS_SMALL && ( dZ - ptP.z) < dMinDist) {
|
||||
dMinDist = dZ - ptP.z ;
|
||||
nI = ( vPt[i].z >= vPt[j].z) ? i : j ;
|
||||
double dY = vPt[i].y + ( vPt[j].y - vPt[i].y) * dCoeff ;
|
||||
|
||||
Reference in New Issue
Block a user