EgtGeomKernel 1.5g1 :
- alle curve aggiunto il metodo CopyParamRange (per curve chiuse ammatte range che passano dal punto di chiusura) - trasformato il metodo Copy di tutti gli oggetti geometrici in CopyFrom - a TSC aggiunte funzioni CopyCurveByParamRange e SplitCurveByClass - migliorata gestione intersezioni sovrapposte - aggiunta classificazione parti di curva (IN,OUT,ONP,ONM) da intersezioni con altra curva chiusa.
This commit is contained in:
+102
-45
@@ -22,18 +22,53 @@ using namespace std ;
|
||||
bool
|
||||
SortGreater( const IntCrvCrvInfo& aInfo1, const IntCrvCrvInfo& aInfo2)
|
||||
{
|
||||
double dU1 = ( aInfo1.bOverlap ? 0.5 * ( aInfo1.IciA[0].dU + aInfo1.IciA[1].dU) : aInfo1.IciA[0].dU) ;
|
||||
double dU2 = ( aInfo2.bOverlap ? 0.5 * ( aInfo2.IciA[0].dU + aInfo2.IciA[1].dU) : aInfo2.IciA[0].dU) ;
|
||||
double dU1, dU2 ;
|
||||
// determino il primo termine del confronto
|
||||
dU1 = aInfo1.IciA[0].dU ;
|
||||
if ( aInfo1.bOverlap) {
|
||||
// caso normale
|
||||
if ( aInfo1.IciA[0].dU < aInfo1.IciA[1].dU)
|
||||
dU1 = 0.5 * ( aInfo1.IciA[0].dU + aInfo1.IciA[1].dU) ;
|
||||
// a cavallo di fine / inizio
|
||||
else
|
||||
dU1 = aInfo1.IciA[0].dU + SPAN_PARAM ;
|
||||
}
|
||||
// determino il secondo termine del confronto
|
||||
dU2 = aInfo2.IciA[0].dU ;
|
||||
if ( aInfo2.bOverlap) {
|
||||
// caso normale
|
||||
if ( aInfo2.IciA[0].dU < aInfo2.IciA[1].dU)
|
||||
dU2 = 0.5 * ( aInfo2.IciA[0].dU + aInfo2.IciA[1].dU) ;
|
||||
// a cavallo di fine / inizio
|
||||
else
|
||||
dU2 = aInfo2.IciA[0].dU + SPAN_PARAM ;
|
||||
}
|
||||
|
||||
return ( dU2 > dU1 + EPS_PARAM) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void
|
||||
bool
|
||||
SameParamsAB( const ICurveComposite& CCompoA, const IntCrvCrvInfo& Icci1,
|
||||
const ICurveComposite& CCompoB, const IntCrvCrvInfo& Icci2)
|
||||
{
|
||||
int k = ( Icci1.bOverlap ? 1 : 0) ; // del precedente si prende il secondo se overlap
|
||||
if ( fabs( Icci1.IciA[k].dU - Icci2.IciA[0].dU) > 0.1 * SPAN_PARAM &&
|
||||
( ! CCompoA.IsClosed() || fabs( fabs( Icci1.IciA[k].dU - Icci2.IciA[0].dU) - CCompoA.GetCurveNumber()) > 0.1 * SPAN_PARAM))
|
||||
return false ;
|
||||
if ( fabs( Icci1.IciB[k].dU - Icci2.IciB[0].dU) > 0.1 * SPAN_PARAM &&
|
||||
( ! CCompoB.IsClosed() || fabs( fabs( Icci1.IciB[k].dU - Icci2.IciB[0].dU) - CCompoB.GetCurveNumber()) > 0.1 * SPAN_PARAM))
|
||||
return false ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
static void
|
||||
MediaParamPoints( IntCrvInfo& Ici1, IntCrvInfo& Ici2)
|
||||
{
|
||||
// medio i parametri e i punti
|
||||
// per non mediare i parametri tra gli estremi di curva chiusa
|
||||
if ( fabs( Ici1.dU - Ici2.dU) < HSPAN_PARAM) {
|
||||
if ( fabs( Ici1.dU - Ici2.dU) < 0.1 * SPAN_PARAM) {
|
||||
Ici1.dU = 0.5 * ( Ici1.dU + Ici2.dU) ;
|
||||
Ici2.dU = Ici1.dU ;
|
||||
}
|
||||
@@ -44,7 +79,7 @@ MediaParamPoints( IntCrvInfo& Ici1, IntCrvInfo& Ici2)
|
||||
//----------------------------------------------------------------------------
|
||||
// Prev della curva B ma tenendo conto della direzione di A
|
||||
// => se controverse va preso Next
|
||||
int
|
||||
static int
|
||||
GetCrvBDirAPrev( IntCrvCrvInfo& Icci)
|
||||
{
|
||||
// non è overlap, è il prev del primo punto
|
||||
@@ -60,7 +95,7 @@ GetCrvBDirAPrev( IntCrvCrvInfo& Icci)
|
||||
//----------------------------------------------------------------------------
|
||||
// Next della curva B ma tenendo conto della direzione di A
|
||||
// => se controverse va preso Prev
|
||||
int
|
||||
static int
|
||||
GetCrvBDirANext( IntCrvCrvInfo& Icci)
|
||||
{
|
||||
// non è overlap, è il next del primo punto
|
||||
@@ -74,7 +109,7 @@ GetCrvBDirANext( IntCrvCrvInfo& Icci)
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
static bool
|
||||
CalcATypeFromDisk( const ICurveComposite& CCompoA, double dUA, ICurve::Side nSideA,
|
||||
const ICurveComposite& CCompoB, double dUB, int& nType)
|
||||
{
|
||||
@@ -137,7 +172,7 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA,
|
||||
for ( const ICurve* pCrvB = CCompoB.GetFirstCurve() ;
|
||||
pCrvB != nullptr ;
|
||||
pCrvB = CCompoB.GetNextCurve(), ++ nCountB) {
|
||||
// eseguo l'intersezione di queste curve elementari
|
||||
// eseguo l'intersezione di queste curve semplici
|
||||
IntersCurveCurve intCC( *pCrvA, *pCrvB) ;
|
||||
// ne recupero i risultati
|
||||
int nCurrInters = intCC.GetNumInters() ;
|
||||
@@ -164,24 +199,17 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA,
|
||||
|
||||
// sistemazione di intersezioni coincidenti
|
||||
for ( int i = 0 ; i < m_nNumInters ; ++ i) {
|
||||
// calcolo indice precedente
|
||||
int j = i - 1 ;
|
||||
if ( i == 0) {
|
||||
// se prima curva aperta, salto alla prossima
|
||||
if ( ! CCompoA.IsClosed())
|
||||
continue ;
|
||||
// è chiusa quindi prendo l'ultima
|
||||
j = m_nNumInters - 1 ;
|
||||
}
|
||||
// se i due indici coincidono, c'è una sola intersezione e posso uscire
|
||||
for ( int j = 0 ; j < m_nNumInters ; ++ j) {
|
||||
// se i due indici coincidono, passo oltre
|
||||
if ( i == j)
|
||||
break ;
|
||||
continue ;
|
||||
// calcolo sottoindici
|
||||
int ki = 0 ; // del successivo si prende sempre il primo
|
||||
int kj = ( m_Info[j].bOverlap ? 1 : 0) ; // del precedente si prende il secondo se overlap
|
||||
// verifico se precedente e corrente si riferiscono alla stessa intersezione (10 * EPS_SMALL)
|
||||
if ( SqDist( m_Info[i].IciA[ki].ptI, m_Info[j].IciA[kj].ptI) < ( 100 * EPS_SMALL * EPS_SMALL) &&
|
||||
SqDist( m_Info[i].IciB[ki].ptI, m_Info[j].IciB[kj].ptI) < ( 100 * EPS_SMALL * EPS_SMALL)) {
|
||||
SqDist( m_Info[i].IciB[ki].ptI, m_Info[j].IciB[kj].ptI) < ( 100 * EPS_SMALL * EPS_SMALL) &&
|
||||
SameParamsAB( CCompoA, m_Info[j], CCompoB, m_Info[i])) {
|
||||
// caso DET-NULL -> NULL-DET per prima curva
|
||||
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) {
|
||||
@@ -217,10 +245,13 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA,
|
||||
if ( m_Info[j].bOverlap && m_Info[i].bOverlap)
|
||||
continue ;
|
||||
// cancello un singolo
|
||||
int k = ( ! m_Info[i].bOverlap ? i : j) ;
|
||||
m_Info.erase( m_Info.begin() + k) ;
|
||||
-- i ;
|
||||
-- m_nNumInters ;
|
||||
if ( m_Info[i].bOverlap) {
|
||||
EraseOtherInfo( i, j) ;
|
||||
}
|
||||
else {
|
||||
EraseCurrentInfo( i, j) ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
// 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 &&
|
||||
@@ -259,10 +290,13 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA,
|
||||
if ( m_Info[j].bOverlap && m_Info[i].bOverlap)
|
||||
continue ;
|
||||
// cancello un singolo
|
||||
int k = ( ! m_Info[i].bOverlap ? i : j) ;
|
||||
m_Info.erase( m_Info.begin() + k) ;
|
||||
-- i ;
|
||||
-- m_nNumInters ;
|
||||
if ( m_Info[i].bOverlap) {
|
||||
EraseOtherInfo( i, j) ;
|
||||
}
|
||||
else {
|
||||
EraseCurrentInfo( i, j) ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
// 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 &&
|
||||
@@ -301,10 +335,13 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA,
|
||||
if ( m_Info[j].bOverlap && m_Info[i].bOverlap)
|
||||
continue ;
|
||||
// cancello un singolo
|
||||
int k = ( ! m_Info[i].bOverlap ? i : j) ;
|
||||
m_Info.erase( m_Info.begin() + k) ;
|
||||
-- i ;
|
||||
-- m_nNumInters ;
|
||||
if ( m_Info[i].bOverlap) {
|
||||
EraseOtherInfo( i, j) ;
|
||||
}
|
||||
else {
|
||||
EraseCurrentInfo( i, j) ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
// 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 &&
|
||||
@@ -343,29 +380,27 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA,
|
||||
if ( m_Info[j].bOverlap && m_Info[i].bOverlap)
|
||||
continue ;
|
||||
// cancello un singolo
|
||||
int k = ( ! m_Info[i].bOverlap ? i : j) ;
|
||||
m_Info.erase( m_Info.begin() + k) ;
|
||||
-- i ;
|
||||
-- m_nNumInters ;
|
||||
if ( m_Info[i].bOverlap) {
|
||||
EraseOtherInfo( i, j) ;
|
||||
}
|
||||
else {
|
||||
EraseCurrentInfo( i, j) ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
// 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) {
|
||||
// cancello l'intersezione corrente (non aggiunge nulla rispetto alla precedente)
|
||||
m_Info.erase( m_Info.begin() + i) ;
|
||||
-- i ;
|
||||
-- m_nNumInters ;
|
||||
EraseCurrentInfo( i, j) ;
|
||||
break ;
|
||||
}
|
||||
// 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) {
|
||||
// cancello l'intersezione precedente (non aggiunge nulla rispetto alla corrente)
|
||||
m_Info.erase( m_Info.begin() + j) ;
|
||||
if ( j < i)
|
||||
i -= 2 ;
|
||||
else
|
||||
-- i ;
|
||||
-- m_nNumInters ;
|
||||
EraseOtherInfo( i, j) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// verifico se sono rimaste delle intersezioni di tipo non definito e cerco di risolverle
|
||||
@@ -502,3 +537,25 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA,
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
IntersCrvCompoCrvCompo::EraseCurrentInfo( int& nIndCurr, int& nIndOther)
|
||||
{
|
||||
m_Info.erase( m_Info.begin() + nIndCurr) ;
|
||||
-- nIndCurr ;
|
||||
-- m_nNumInters ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
IntersCrvCompoCrvCompo::EraseOtherInfo( int& nIndCurr, int& nIndOther)
|
||||
{
|
||||
m_Info.erase( m_Info.begin() + nIndOther) ;
|
||||
if ( nIndOther < nIndCurr)
|
||||
-- nIndCurr ;
|
||||
-- nIndOther ;
|
||||
-- m_nNumInters ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user