diff --git a/IntersCrvCompoCrvCompo.cpp b/IntersCrvCompoCrvCompo.cpp index 024c502..e626b2d 100644 --- a/IntersCrvCompoCrvCompo.cpp +++ b/IntersCrvCompoCrvCompo.cpp @@ -270,11 +270,8 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, EraseOtherInfo( i, j) ; EraseCurrentInfo( i, j) ; } - // caso DET-NULL -> NULL-DET per prima curva - else if ( m_Info[j].IciA[kj].nPrevTy != ICCT_NULL /*&& m_Info[j].IciA[kj].nNextTy == ICCT_NULL && - m_Info[i].IciA[ki].nPrevTy == ICCT_NULL*/ && m_Info[i].IciA[ki].nNextTy != ICCT_NULL) { - //else if ( m_Info[j].IciA[kj].nPrevTy != ICCT_NULL && m_Info[j].IciA[kj].nNextTy == ICCT_NULL && - // m_Info[i].IciA[ki].nPrevTy == ICCT_NULL && m_Info[i].IciA[ki].nNextTy != ICCT_NULL) { + // caso DET-(NULL) -> (NULL)-DET per prima curva + else if ( m_Info[j].IciA[kj].nPrevTy != ICCT_NULL && m_Info[i].IciA[ki].nNextTy != ICCT_NULL) { // per la prima curva tengo i determinati m_Info[i].IciA[ki].nPrevTy = m_Info[j].IciA[kj].nPrevTy ; m_Info[j].IciA[kj].nNextTy = m_Info[i].IciA[ki].nNextTy ; @@ -327,11 +324,8 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, EraseCurrentInfo( i, j) ; } } - // caso NULL-DET -> DET-NULL per prima curva (possibile su inizio/fine di curva chiusa) - else if ( /*m_Info[j].IciA[kj].nPrevTy == ICCT_NULL &&*/ m_Info[j].IciA[kj].nNextTy != ICCT_NULL && - m_Info[i].IciA[ki].nPrevTy != ICCT_NULL /*&& m_Info[i].IciA[ki].nNextTy == ICCT_NULL*/) { - //else if ( m_Info[j].IciA[kj].nPrevTy == ICCT_NULL && m_Info[j].IciA[kj].nNextTy != ICCT_NULL && - // m_Info[i].IciA[ki].nPrevTy != ICCT_NULL && m_Info[i].IciA[ki].nNextTy == ICCT_NULL) { + // caso (NULL)-DET -> DET-(NULL) per prima curva (possibile su inizio/fine di curva chiusa) + else if ( m_Info[j].IciA[kj].nNextTy != ICCT_NULL && m_Info[i].IciA[ki].nPrevTy != ICCT_NULL ) { // per la prima curva tengo i determinati m_Info[i].IciA[ki].nNextTy = m_Info[j].IciA[kj].nNextTy ; m_Info[j].IciA[kj].nPrevTy = m_Info[i].IciA[ki].nPrevTy ; @@ -406,11 +400,6 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, } // caso NULL-NULL per corrente di prima curva else if ( m_Info[i].IciA[ki].nPrevTy == ICCT_NULL && m_Info[i].IciA[ki].nNextTy == ICCT_NULL) { - //m_Info[j].IciA[kj].nNextTy = m_Info[i].IciA[ki].nNextTy ; - //if ( m_Info[i].IciB[ki].dU > m_Info[j].IciB[kj].dU + EPS_PARAM) - // m_Info[j].IciB[kj].nNextTy = m_Info[i].IciB[ki].nNextTy ; - - //m_Info[j].IciA[kj].nNextTy = ICCT_NULL ; if ( m_Info[j].IciB[kj].nNextTy == ICCT_NULL) m_Info[j].IciB[kj].nNextTy = m_Info[i].IciB[ki].nNextTy ; if ( m_Info[j].IciB[kj].nPrevTy == ICCT_NULL) @@ -420,11 +409,6 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, } // caso NULL-NULL per precedente di prima curva else if ( m_Info[j].IciA[kj].nPrevTy == ICCT_NULL && m_Info[j].IciA[kj].nNextTy == ICCT_NULL) { - //m_Info[i].IciA[ki].nPrevTy = m_Info[j].IciA[kj].nPrevTy ; - //if ( m_Info[j].IciB[kj].dU < m_Info[i].IciB[ki].dU - EPS_PARAM) - // m_Info[i].IciB[ki].nPrevTy = m_Info[j].IciB[kj].nPrevTy ; - - //m_Info[i].IciA[ki].nPrevTy = ICCT_NULL ; if ( m_Info[i].IciB[ki].nPrevTy == ICCT_NULL) m_Info[i].IciB[ki].nPrevTy = m_Info[j].IciB[kj].nPrevTy ; if ( m_Info[i].IciB[ki].nNextTy == ICCT_NULL) @@ -462,9 +446,8 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, EraseOtherInfo( i, j) ; EraseCurrentInfo( i, j) ; } - // caso DET-NULL -> NULL-DET per seconda curva - else if ( m_Info[j].IciB[kj].nPrevTy != ICCT_NULL /*&& m_Info[j].IciB[kj].nNextTy == ICCT_NULL && - m_Info[i].IciB[ki].nPrevTy == ICCT_NULL*/ && m_Info[i].IciB[ki].nNextTy != ICCT_NULL) { + // caso DET-(NULL) -> (NULL)-DET per seconda curva + else if ( m_Info[j].IciB[kj].nPrevTy != ICCT_NULL && m_Info[i].IciB[ki].nNextTy != ICCT_NULL) { // per la seconda curva tengo i determinati m_Info[i].IciB[ki].nPrevTy = m_Info[j].IciB[kj].nPrevTy ; m_Info[j].IciB[kj].nNextTy = m_Info[i].IciB[ki].nNextTy ; @@ -506,9 +489,8 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, EraseCurrentInfo( i, j) ; } } - // caso NULL-DET -> DET-NULL per seconda curva (possibile su inizio/fine di curva chiusa) - else if ( /*m_Info[j].IciB[kj].nPrevTy == ICCT_NULL &&*/ m_Info[j].IciB[kj].nNextTy != ICCT_NULL && - m_Info[i].IciB[ki].nPrevTy != ICCT_NULL /*&& m_Info[i].IciB[ki].nNextTy == ICCT_NULL*/) { + // caso (NULL)-DET -> DET-(NULL) per seconda curva (possibile su inizio/fine di curva chiusa) + else if ( m_Info[j].IciB[kj].nNextTy != ICCT_NULL && m_Info[i].IciB[ki].nPrevTy != ICCT_NULL) { // per la seconda curva tengo i determinati m_Info[i].IciB[ki].nNextTy = m_Info[j].IciB[kj].nNextTy ; m_Info[j].IciB[kj].nPrevTy = m_Info[i].IciB[ki].nPrevTy ; @@ -570,11 +552,6 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, } // caso NULL-NULL per corrente di seconda curva else if ( m_Info[i].IciB[ki].nPrevTy == ICCT_NULL && m_Info[i].IciB[ki].nNextTy == ICCT_NULL) { - //m_Info[j].IciB[kj].nNextTy = m_Info[i].IciB[ki].nNextTy ; - //if ( m_Info[i].IciA[ki].dU > m_Info[j].IciA[kj].dU + EPS_PARAM) - // m_Info[j].IciA[kj].nNextTy = m_Info[i].IciA[ki].nNextTy ; - - //m_Info[j].IciB[kj].nNextTy = ICCT_NULL ; if ( m_Info[j].IciA[kj].nNextTy == ICCT_NULL) m_Info[j].IciA[kj].nNextTy = m_Info[i].IciA[ki].nNextTy ; if ( m_Info[j].IciA[kj].nPrevTy == ICCT_NULL) @@ -584,11 +561,6 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, } // caso NULL-NULL per precedente di seconda curva else if ( m_Info[j].IciB[kj].nPrevTy == ICCT_NULL && m_Info[j].IciB[kj].nNextTy == ICCT_NULL) { - //m_Info[i].IciB[0].nPrevTy = m_Info[j].IciB[0].nPrevTy ; - //if ( m_Info[j].IciA[0].dU < m_Info[i].IciA[0].dU - EPS_PARAM) - // m_Info[i].IciA[0].nPrevTy = m_Info[j].IciA[0].nPrevTy ; - - //m_Info[i].IciB[0].nPrevTy = ICCT_NULL ; if ( m_Info[i].IciA[ki].nPrevTy == ICCT_NULL) m_Info[i].IciA[ki].nPrevTy = m_Info[j].IciA[kj].nPrevTy ; if ( m_Info[i].IciA[ki].nNextTy == ICCT_NULL) @@ -687,70 +659,70 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, else { // se il tipo di accostamento è non definito per la curva A if ( m_Info[i].IciA[0].nPrevTy == ICCT_NULL) { - // se autointersezione con spike - double dDeltaU = abs( m_Info[i].IciA[0].dU - m_Info[i].IciB[0].dU) ; - if ( bAutoInters && ( dDeltaU < EPS_PARAM || ( bCrvAClosed && abs( dDeltaU - dCrvASpan) < EPS_PARAM))) { - // è punta di spike - int nType = ICCT_SPK ; - // aggiorno il tipo di allontanamento della curva A dalla curva B + // devo studiare un intorno dell'intersezione + int nType ; + if ( CalcATypeFromDisk( CCompoA, m_Info[i].IciA[0].dU, ICurve::FROM_MINUS, + CCompoB, m_Info[i].IciB[0].dU, nType)) { + // aggiorno il tipo di accostamento della curva A alla curva B m_Info[i].IciA[0].nPrevTy = nType ; - // aggiorno anche il corrispondente tipo sulla curva B + // aggiorno anche il corrispondente tipo sulla curva B if ( m_Info[i].bCBOverEq) m_Info[i].IciB[0].nPrevTy = GetDualIcct( nType) ; else m_Info[i].IciB[0].nNextTy = nType ; } - // caso standard - else { - // devo studiare un intorno dell'intersezione - int nType ; - if ( CalcATypeFromDisk( CCompoA, m_Info[i].IciA[0].dU, ICurve::FROM_MINUS, - CCompoB, m_Info[i].IciB[0].dU, nType)) { - // aggiorno il tipo di accostamento della curva A alla curva B - m_Info[i].IciA[0].nPrevTy = nType ; - // aggiorno anche il corrispondente tipo sulla curva B - if ( m_Info[i].bCBOverEq) - m_Info[i].IciB[0].nPrevTy = GetDualIcct( nType) ; - else - m_Info[i].IciB[0].nNextTy = nType ; - } - } } // se il tipo di allontanamento è non definito per la curva A if ( m_Info[i].IciA[1].nNextTy == ICCT_NULL) { - // se autointersezione con spike - double dDeltaU = abs( m_Info[i].IciA[1].dU - m_Info[i].IciB[1].dU) ; - if ( bAutoInters && ( dDeltaU < EPS_PARAM || ( bCrvAClosed && abs( dDeltaU - dCrvASpan) < EPS_PARAM))) { - // è punta di spike - int nType = ICCT_SPK ; - // aggiorno il tipo di allontanamento della curva A dalla curva B + // devo studiare un intorno dell'intersezione + int nType ; + if ( CalcATypeFromDisk( CCompoA, m_Info[i].IciA[1].dU, ICurve::FROM_PLUS, + CCompoB, m_Info[i].IciB[1].dU, nType)) { + // aggiorno il tipo di allontanamento della curva A dalla curva B m_Info[i].IciA[1].nNextTy = nType ; - // aggiorno anche il corrispondente tipo sulla curva B + // aggiorno anche il corrispondente tipo sulla curva B if ( m_Info[i].bCBOverEq) m_Info[i].IciB[1].nNextTy = GetDualIcct( nType) ; else m_Info[i].IciB[1].nPrevTy = nType ; } - // caso standard - else { - // devo studiare un intorno dell'intersezione - int nType ; - if ( CalcATypeFromDisk( CCompoA, m_Info[i].IciA[1].dU, ICurve::FROM_PLUS, - CCompoB, m_Info[i].IciB[1].dU, nType)) { - // aggiorno il tipo di allontanamento della curva A dalla curva B - m_Info[i].IciA[1].nNextTy = nType ; - // aggiorno anche il corrispondente tipo sulla curva B - if ( m_Info[i].bCBOverEq) - m_Info[i].IciB[1].nNextTy = GetDualIcct( nType) ; - else - m_Info[i].IciB[1].nPrevTy = nType ; - } - } } } } - //////// qui metto il controllo degli spike + if ( bAutoInters) { + // controllo l'eventuale presenza di spike + for ( int i = 0 ; i < m_nNumInters ; ++ i) { + if ( m_Info[i].bOverlap && ! m_Info[i].bCBOverEq) { + // se secondo tratto dello spike + double dDeltaU = abs( m_Info[i].IciA[0].dU - m_Info[i].IciB[0].dU) ; + if ( dDeltaU < EPS_PARAM || ( bCrvAClosed && abs( dDeltaU - dCrvASpan) < EPS_PARAM)) { + // è punta di spike + int nType = ICCT_SPK ; + // aggiorno il tipo di allontanamento della curva A dalla curva B + m_Info[i].IciA[0].nPrevTy = nType ; + // aggiorno anche il corrispondente tipo sulla curva B + if ( m_Info[i].bCBOverEq) + m_Info[i].IciB[0].nPrevTy = GetDualIcct( nType) ; + else + m_Info[i].IciB[0].nNextTy = nType ; + } + // se primo tratto dello spike + dDeltaU = abs( m_Info[i].IciA[1].dU - m_Info[i].IciB[1].dU) ; + if ( dDeltaU < EPS_PARAM || ( bCrvAClosed && abs( dDeltaU - dCrvASpan) < EPS_PARAM)) { + // è punta di spike + int nType = ICCT_SPK ; + // aggiorno il tipo di allontanamento della curva A dalla curva B + m_Info[i].IciA[1].nNextTy = nType ; + // aggiorno anche il corrispondente tipo sulla curva B + if ( m_Info[i].bCBOverEq) + m_Info[i].IciB[1].nNextTy = GetDualIcct( nType) ; + else + m_Info[i].IciB[1].nPrevTy = nType ; + } + } + } + } // verifico se due intersezioni consecutive di tipo overlap si possono ridurre a una sola for ( int i = 0 ; i < m_nNumInters ; ++ i) {