From d2b77833fd324380c75d4ef05f330b33e4223273 Mon Sep 17 00:00:00 2001 From: DarioS Date: Thu, 23 Dec 2021 15:44:49 +0100 Subject: [PATCH] EgtGeomKernel 2.3l3 : - altre modifiche per triangolazioni. --- CurveComposite.cpp | 5 ++-- EgtGeomKernel.rc | Bin 11718 -> 11718 bytes SurfTriMeshUtilities.cpp | 6 ++-- Triangulate.cpp | 61 ++++++++++++++++++++------------------- Triangulate.h | 6 ++-- 5 files changed, 41 insertions(+), 37 deletions(-) diff --git a/CurveComposite.cpp b/CurveComposite.cpp index 2c34eab..974abd7 100644 --- a/CurveComposite.cpp +++ b/CurveComposite.cpp @@ -30,6 +30,7 @@ #include "/EgtDev/Include/EGkSfrCreate.h" #include "/EgtDev/Include/EGkIntervals.h" #include "/EgtDev/Include/EGkStringUtils3d.h" +#include "/EgtDev/Include/EgtNumUtils.h" #include "/EgtDev/Include/EgtPointerOwner.h" #include @@ -1321,8 +1322,8 @@ CurveComposite::ApproxWithLines( double dLinTol, double dAngTolDeg, int nType, P // se lineare con lato obbligato... if ( nType == APL_LEFT || nType == APL_LEFT_CONVEX || nType == APL_RIGHT || nType == APL_RIGHT_CONVEX) { - // prima approssimazione lineare a 10 * Epsilon - if ( ! ApproxWithLines( 10 * EPS_SMALL, dAngTolDeg, APL_SPECIAL, PL)) + // prima approssimazione lineare alla tolleranza minima del programma + if ( ! ApproxWithLines( EPS_SMALL, dAngTolDeg, APL_SPECIAL, PL)) return false ; // eliminazione dei punti in tolleranza andando solo dalla parte ammessa Vector3d vtExtr = ( m_VtExtr.IsSmall() ? Z_AX : m_VtExtr) ; diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 1feb06af55da644ad17e5ac009b711e0f2907d0c..6280b382fc490d1b7a5c5d006323981dc9c44afa 100644 GIT binary patch delta 110 zcmX>WeJpyzA2vqg&G-4vGfl1&(wY2&Q;pGhvZAo=W*@FeEMOU1X1ItO delta 110 zcmX>WeJpyzA2vp#&G-4vGfl1&(wY2&Q;pGRvZAo=W*@FeEMOU1X1ItO(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 ; diff --git a/Triangulate.h b/Triangulate.h index ec16b8c..ac19507 100644 --- a/Triangulate.h +++ b/Triangulate.h @@ -26,9 +26,9 @@ class Triangulate private : bool MakeByEC_HPP( const PolyLine& PL, bool bCCW, PNTVECTOR& vPt, INTVECTOR& vTr) ; bool MakeByEC_HPP( const POLYLINEVECTOR& vPL, bool bCCW, PNTVECTOR& vPt, INTVECTOR& vTr) ; - bool MakeByEC( const PNTVECTOR& vPt, const INTVECTOR& vPol, INTVECTOR& vTr) ; - bool MakeByEC2( const PNTVECTOR& vPt, const INTVECTOR& vPol, INTVECTOR& vTr) ; - bool MakeByEC3( const PNTVECTOR& vPt, const INTVECTOR& vPol, INTVECTOR& vTr) ; + bool MakeByEC( const PNTVECTOR& vPt, INTVECTOR& vTr) ; + bool MakeByEC2( const PNTVECTOR& vPt, INTVECTOR& vTr) ; + bool MakeByEC3( const PNTVECTOR& vPt, INTVECTOR& vTr) ; bool PrepareGrid( const PNTVECTOR& vPt, const INTVECTOR& vPol, const INTVECTOR& vPrev, const INTVECTOR& vNext) ; bool TestTriangle( const PNTVECTOR& vPt, const INTVECTOR& vPol,