EgtGeomKernel 1.6h4 :
- aggiunto metodo GetCrossOrOverlapIntersCount a SelfIntersCurve - aggiunti metodi GetCrossIntersCount e GetCrossOrOverlapIntersCount a IntersCurveCurve - allentati controlli sui loop delle regioni, ora possono toccarsi ma non attraversarsi in punti isolati - aggiunte funzioni per operazioni booleante tra regioni Add, Subtract e Intersect.
This commit is contained in:
+59
-20
@@ -36,7 +36,7 @@ IntersCurveCurve::IntersCurveCurve( const ICurve& CurveA, const ICurve& CurveB,
|
||||
|
||||
// inizializzazioni
|
||||
m_bOverlaps = false ;
|
||||
m_nNumInters = 0 ;
|
||||
m_nIntersCount = 0 ;
|
||||
m_pCurve[0] = &CurveA ;
|
||||
m_pCurve[1] = &CurveB ;
|
||||
|
||||
@@ -132,8 +132,8 @@ IntersCurveCurve::LineLineCalculate( const ICurve& CurveA, const ICurve& CurveB,
|
||||
|
||||
if ( intLnLn.m_nNumInters > 0) {
|
||||
m_bOverlaps = intLnLn.m_bOverlaps ;
|
||||
m_nNumInters = intLnLn.m_nNumInters ;
|
||||
if ( m_nNumInters == 1)
|
||||
m_nIntersCount = intLnLn.m_nNumInters ;
|
||||
if ( m_nIntersCount == 1)
|
||||
m_Info.push_back( intLnLn.m_Info) ;
|
||||
}
|
||||
}
|
||||
@@ -146,8 +146,8 @@ IntersCurveCurve::LineArcCalculate( const ICurve& CurveA, const ICurve& CurveB)
|
||||
|
||||
if ( intLnAr.m_nNumInters > 0) {
|
||||
m_bOverlaps = false ;
|
||||
m_nNumInters = intLnAr.m_nNumInters ;
|
||||
for ( int i = 0 ; i < m_nNumInters ; ++ i)
|
||||
m_nIntersCount = intLnAr.m_nNumInters ;
|
||||
for ( int i = 0 ; i < m_nIntersCount ; ++ i)
|
||||
m_Info.push_back( intLnAr.m_Info[i]) ;
|
||||
}
|
||||
}
|
||||
@@ -171,8 +171,8 @@ IntersCurveCurve::ArcLineCalculate( const ICurve& CurveA, const ICurve& CurveB)
|
||||
|
||||
if ( intLnAr.m_nNumInters > 0) {
|
||||
m_bOverlaps = false ;
|
||||
m_nNumInters = intLnAr.m_nNumInters ;
|
||||
for ( int i = 0 ; i < m_nNumInters ; ++ i)
|
||||
m_nIntersCount = intLnAr.m_nNumInters ;
|
||||
for ( int i = 0 ; i < m_nIntersCount ; ++ i)
|
||||
m_Info.push_back( intLnAr.m_Info[i]) ;
|
||||
// devo scambiare opportunamente le info di intersezione tra A e B
|
||||
SwapInfoAB( m_Info, 0) ;
|
||||
@@ -187,8 +187,8 @@ IntersCurveCurve::ArcArcCalculate( const ICurve& CurveA, const ICurve& CurveB)
|
||||
|
||||
if ( intArAr.m_nNumInters > 0) {
|
||||
m_bOverlaps = intArAr.m_bOverlaps ;
|
||||
m_nNumInters = intArAr.m_nNumInters ;
|
||||
for ( int i = 0 ; i < m_nNumInters ; ++ i)
|
||||
m_nIntersCount = intArAr.m_nNumInters ;
|
||||
for ( int i = 0 ; i < m_nIntersCount ; ++ i)
|
||||
m_Info.push_back( intArAr.m_Info[i]) ;
|
||||
}
|
||||
}
|
||||
@@ -234,8 +234,8 @@ IntersCurveCurve::CrvCompoCrvCompoCalculate( const ICurve& CurveA, const ICurve&
|
||||
|
||||
if ( intCcCc.m_nNumInters > 0) {
|
||||
m_bOverlaps = intCcCc.m_bOverlaps ;
|
||||
m_nNumInters = intCcCc.m_nNumInters ;
|
||||
for ( int i = 0 ; i < m_nNumInters ; ++ i)
|
||||
m_nIntersCount = intCcCc.m_nNumInters ;
|
||||
for ( int i = 0 ; i < m_nIntersCount ; ++ i)
|
||||
m_Info.push_back( intCcCc.m_Info[i]) ;
|
||||
}
|
||||
}
|
||||
@@ -278,16 +278,55 @@ IntersCurveCurve::GetOverlaps( void)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
IntersCurveCurve::GetNumInters( void)
|
||||
IntersCurveCurve::GetIntersCount( void)
|
||||
{
|
||||
return m_nNumInters ;
|
||||
return m_nIntersCount ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
IntersCurveCurve::GetCrossIntersCount( void)
|
||||
{
|
||||
int nCrossIntersCount = 0 ;
|
||||
for ( int i = 0 ; i < m_nIntersCount ; ++ i) {
|
||||
// se con sovrapposizione
|
||||
if ( m_Info[i].bOverlap) {
|
||||
if ( m_Info[i].IciA[0].nPrevTy != m_Info[i].IciA[1].nNextTy &&
|
||||
m_Info[i].IciA[0].nPrevTy != ICCT_NULL && m_Info[i].IciA[1].nNextTy != ICCT_NULL)
|
||||
++ nCrossIntersCount ;
|
||||
}
|
||||
// altrimenti
|
||||
else {
|
||||
if ( m_Info[i].IciA[0].nPrevTy != m_Info[i].IciA[0].nNextTy &&
|
||||
m_Info[i].IciA[0].nPrevTy != ICCT_NULL && m_Info[i].IciA[0].nNextTy != ICCT_NULL)
|
||||
++ nCrossIntersCount ;
|
||||
}
|
||||
}
|
||||
return nCrossIntersCount ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
IntersCurveCurve::GetCrossOrOverlapIntersCount( void)
|
||||
{
|
||||
int nCrossOverIntersCount = 0 ;
|
||||
for ( int i = 0 ; i < m_nIntersCount ; ++ i) {
|
||||
// se con sovrapposizione
|
||||
if ( m_Info[i].bOverlap)
|
||||
++ nCrossOverIntersCount ;
|
||||
// se altrimenti con attraversamento
|
||||
else if ( m_Info[i].IciA[0].nPrevTy != m_Info[i].IciA[0].nNextTy &&
|
||||
m_Info[i].IciA[0].nPrevTy != ICCT_NULL && m_Info[i].IciA[0].nNextTy != ICCT_NULL)
|
||||
++ nCrossOverIntersCount ;
|
||||
}
|
||||
return nCrossOverIntersCount ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
IntersCurveCurve::GetIntCrvCrvInfo( int nInd, IntCrvCrvInfo& aInfo)
|
||||
{
|
||||
if ( nInd < 0 || nInd >= m_nNumInters)
|
||||
if ( nInd < 0 || nInd >= m_nIntersCount)
|
||||
return false ;
|
||||
aInfo = m_Info[nInd] ;
|
||||
return true ;
|
||||
@@ -297,13 +336,13 @@ IntersCurveCurve::GetIntCrvCrvInfo( int nInd, IntCrvCrvInfo& aInfo)
|
||||
bool
|
||||
IntersCurveCurve::GetIntersPointNearTo( int nCrv, const Point3d& ptNear, Point3d& ptI)
|
||||
{
|
||||
if ( m_nNumInters == 0 || nCrv < 0 || nCrv > 1)
|
||||
if ( m_nIntersCount == 0 || nCrv < 0 || nCrv > 1)
|
||||
return false ;
|
||||
|
||||
// ricerca del punto più vicino tra le intersezioni singole
|
||||
bool bFound = false ;
|
||||
double dMinSqDist = INFINITO * INFINITO ;
|
||||
for ( int i = 0 ; i < m_nNumInters ; ++ i) {
|
||||
for ( int i = 0 ; i < m_nIntersCount ; ++ i) {
|
||||
// se è un'intersezione singola
|
||||
if ( ! m_Info[i].bOverlap) {
|
||||
// faccio la verifica sul punto
|
||||
@@ -367,7 +406,7 @@ IntersCurveCurve::GetCurveClassification( int nCrv, CRVCVECTOR& ccClass)
|
||||
if ( ! m_pCurve[1]->IsClosed())
|
||||
return false ;
|
||||
// se esiste almeno una intersezione
|
||||
if ( m_nNumInters >= 1)
|
||||
if ( m_nIntersCount >= 1)
|
||||
return CalcCurveClassification( m_pCurve[0], m_Info, ccClass) ;
|
||||
// altrimenti la curva è completamente interna oppure completamente esterna
|
||||
else
|
||||
@@ -384,7 +423,7 @@ IntersCurveCurve::GetCurveClassification( int nCrv, CRVCVECTOR& ccClass)
|
||||
// esecuzione scambio e controlli
|
||||
SwapInfoAB( InfoTmp, 1) ;
|
||||
// se esiste almeno una intersezione
|
||||
if ( m_nNumInters >= 1)
|
||||
if ( m_nIntersCount >= 1)
|
||||
return CalcCurveClassification( m_pCurve[1], InfoTmp, ccClass) ;
|
||||
// altrimenti la curva è completamente interna oppure completamente esterna
|
||||
else
|
||||
@@ -403,7 +442,7 @@ IntersCurveCurve::SwapInfoAB( ICCIVECTOR& Info, int IndCrvOrd)
|
||||
return false ;
|
||||
|
||||
// eseguo lo scambio
|
||||
for ( int i = 0 ; i < m_nNumInters ; ++ i) {
|
||||
for ( int i = 0 ; i < m_nIntersCount ; ++ i) {
|
||||
// scambio le informazioni tra A e B
|
||||
swap( Info[i].IciA[0], Info[i].IciB[0]) ;
|
||||
swap( Info[i].IciA[1], Info[i].IciB[1]) ;
|
||||
@@ -538,7 +577,7 @@ IntersCurveCurve::CalcCurveInOrOut( const ICurve* pCurveA, const ICurve* pCurveB
|
||||
// dichiaro la classe della curva per default
|
||||
int nClass = CRVC_OUT ;
|
||||
// se c'è almeno una intersezione
|
||||
if ( iCC.GetNumInters() > 0) {
|
||||
if ( iCC.GetIntersCount() > 0) {
|
||||
// se quanto precede la prima intersezione è interno, allora la curva è interna
|
||||
IntCrvCrvInfo aInfo ;
|
||||
iCC.GetIntCrvCrvInfo( 0, aInfo) ;
|
||||
|
||||
Reference in New Issue
Block a user