EgtGeomKernel 2.2j2 :
- nella CurveComposite::MergeTwoCurves vengono eliminate le curve molto corte (minori di 10 volte la tolleranza lineare) - nell'offset avanzato migliorata gestione angoli interni per curve molto corte.
This commit is contained in:
+48
-14
@@ -1,13 +1,14 @@
|
||||
//----------------------------------------------------------------------------
|
||||
// EgalTech 2015-2019
|
||||
// EgalTech 2015-2020
|
||||
//----------------------------------------------------------------------------
|
||||
// File : OffsetCurve.cpp Data : 24.06.19 Versione : 2.1f2
|
||||
// File : OffsetCurve.cpp Data : 10.10.20 Versione : 2.2j2
|
||||
// Contenuto : Classe per offset avanzato di Curve.
|
||||
//
|
||||
//
|
||||
//
|
||||
// Modifiche : 23.09.15 DS Creazione modulo.
|
||||
// 24.06.19 DS Agg. GetShorterCurve.
|
||||
// 10.10.20 DS Migliorata gestione angoli interni.
|
||||
//
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
@@ -32,8 +33,8 @@ static bool PreviousIsLonger( int nInd1, const DBLVECTOR& vLens, bool bClosed) ;
|
||||
static bool NextIsLine( ICURVEPLIST::const_iterator iIter, const ICURVEPLIST& CrvLst, bool bClosed) ;
|
||||
static bool NextIsLonger( int nInd1, const DBLVECTOR& vLens, bool bClosed) ;
|
||||
static bool CalcAngle( const ICurve* pCrv1, const ICurve* pCrv2, double& dAngDeg) ;
|
||||
static bool VerifyAndAdjustSamePoint( ICurve* pCrv1, ICurve* pCrv2) ;
|
||||
static bool VerifyAndAdjustInternalAngle( ICurve* pCrv1, ICurve* pCrv2) ;
|
||||
static bool VerifyAndAdjustSamePoint( ICurve* pCrv1, ICurve* pCrv2, int& nRes) ;
|
||||
static bool VerifyAndAdjustInternalAngle( ICurve* pCrv1, ICurve* pCrv2, int& nRes) ;
|
||||
static bool VerifyAndAdjustExternalAngle( ICurve* pCrv1, ICurve* pCrv2, double dAngDeg, double dDist, int nType,
|
||||
CurveComposite& ccAux) ;
|
||||
static double GetMinDist( double dCoeff, ICurve* pCrv1, ICurve* pCrv2) ;
|
||||
@@ -283,8 +284,27 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
|
||||
ICurve* pCrv = *iIter ;
|
||||
// gestione e verifica di estremi quasi coincidenti ed angoli interni
|
||||
if ( pPrev != nullptr) {
|
||||
if ( ! VerifyAndAdjustSamePoint( pPrev, pCrv))
|
||||
VerifyAndAdjustInternalAngle( pPrev, pCrv) ;
|
||||
int nRes ;
|
||||
if ( VerifyAndAdjustSamePoint( pPrev, pCrv, nRes)) {
|
||||
if ( nRes == 4)
|
||||
VerifyAndAdjustInternalAngle( pPrev, pCrv, nRes) ;
|
||||
// precedente da cancellare
|
||||
if ( ( nRes & 1) != 0) {
|
||||
auto iErase = prev( iIter != m_CrvLst.begin() ? iIter : m_CrvLst.end()) ;
|
||||
delete pPrev ;
|
||||
m_CrvLst.erase( iErase) ;
|
||||
auto iPrev = prev( iIter != m_CrvLst.begin() ? iIter : m_CrvLst.end()) ;
|
||||
pPrev = *iPrev ;
|
||||
}
|
||||
// corrente da cancellare
|
||||
if ( ( nRes & 2) != 0) {
|
||||
delete pCrv ;
|
||||
iIter = m_CrvLst.erase( iIter) ;
|
||||
}
|
||||
// se eseguita una cancellazione, non devo incrementare
|
||||
if ( ( nRes & 3) != 0)
|
||||
continue ;
|
||||
}
|
||||
}
|
||||
// passo al successivo
|
||||
pPrev = pCrv ;
|
||||
@@ -742,7 +762,7 @@ CalcAngle( const ICurve* pCrv1, const ICurve* pCrv2, double& dAngDeg)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
VerifyAndAdjustSamePoint( ICurve* pCrv1, ICurve* pCrv2)
|
||||
VerifyAndAdjustSamePoint( ICurve* pCrv1, ICurve* pCrv2, int& nRes)
|
||||
{
|
||||
// verifica dei puntatori
|
||||
if ( pCrv1 == nullptr || pCrv2 == nullptr)
|
||||
@@ -753,19 +773,28 @@ VerifyAndAdjustSamePoint( ICurve* pCrv1, ICurve* pCrv2)
|
||||
if ( ! pCrv1->GetEndPoint( ptP1) || ! pCrv2->GetStartPoint( ptP2))
|
||||
return false ;
|
||||
// verifica distanza tra estremi
|
||||
if ( ! AreSamePointXYEpsilon( ptP1, ptP2, 10 * EPS_SMALL))
|
||||
return false ;
|
||||
// se coincidono esattamente, va bene così
|
||||
if ( AreSamePointExact( ptP1, ptP2))
|
||||
if ( ! AreSamePointXYEpsilon( ptP1, ptP2, 10 * EPS_SMALL)) {
|
||||
nRes = 4 ;
|
||||
return true ;
|
||||
}
|
||||
// se coincidono esattamente, va bene così
|
||||
if ( AreSamePointExact( ptP1, ptP2)) {
|
||||
nRes = 0 ;
|
||||
return true ;
|
||||
}
|
||||
// sono in tolleranza, ma devo ricongiungere gli estremi
|
||||
nRes = 0 ;
|
||||
Point3d ptMid = 0.5 * ( ptP1 + ptP2) ;
|
||||
return ( pCrv1->ModifyEnd( ptMid) && pCrv2->ModifyStart( ptMid)) ;
|
||||
if ( ! pCrv1->ModifyEnd( ptMid))
|
||||
nRes += 1 ;
|
||||
if ( ! pCrv2->ModifyStart( ptMid))
|
||||
nRes += 2 ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
VerifyAndAdjustInternalAngle( ICurve* pCrv1, ICurve* pCrv2)
|
||||
VerifyAndAdjustInternalAngle( ICurve* pCrv1, ICurve* pCrv2, int& nRes)
|
||||
{
|
||||
// verifica dei puntatori
|
||||
if ( pCrv1 == nullptr || pCrv2 == nullptr)
|
||||
@@ -785,8 +814,13 @@ VerifyAndAdjustInternalAngle( ICurve* pCrv1, ICurve* pCrv2)
|
||||
! intCC.GetIntersPointNearTo( 1, ptMid, ptNew2))
|
||||
return false ;
|
||||
// modifico le due curve sul punto medio di intersezione
|
||||
nRes = 0 ;
|
||||
Point3d ptNew = 0.5 * ( ptNew1 + ptNew2) ;
|
||||
return ( pCrv1->ModifyEnd( ptNew) && pCrv2->ModifyStart( ptNew)) ;
|
||||
if ( ! pCrv1->ModifyEnd( ptNew))
|
||||
nRes += 1 ;
|
||||
if ( ! pCrv2->ModifyStart( ptNew))
|
||||
nRes += 2 ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user