EgtGeomKernel 1.5g2 :
- aggiunte intersezioni tra linee ed archi - aggiunte intersezioni tra archi e archi - aggiunte funzioni di utilità per angoli.
This commit is contained in:
+15
-18
@@ -158,26 +158,24 @@ IntersLineLine::IntersFiniteLines( const ICurveLine& Line1, const ICurveLine& Li
|
||||
// posizioni parametriche dell'intersezione sulle linee
|
||||
m_Info.IciA[0].dU = CrossXY( ( ptS2 - ptS1), vtDir2) / dCrossXY ;
|
||||
m_Info.IciB[0].dU = CrossXY( ( ptS2 - ptS1), vtDir1) / dCrossXY ;
|
||||
// tipo di posizione
|
||||
enum IntPos { IP_NULL = 0, IP_START = 1, IP_MID = 2, IP_END = 3} ;
|
||||
// verifica posizione intersezione su prima linea
|
||||
int nPos1 = IP_NULL ; // fuori
|
||||
int nPos1 = ICurve::PP_NULL ; // fuori
|
||||
if ( ( m_Info.IciA[0].dU * vtDir1).IsSmall())
|
||||
nPos1 = IP_START ; // vicino a inizio
|
||||
nPos1 = ICurve::PP_START ; // vicino a inizio
|
||||
else if ( (( 1 - m_Info.IciA[0].dU) * vtDir1).IsSmall())
|
||||
nPos1 = IP_END ; // vicino a fine
|
||||
nPos1 = ICurve::PP_END ; // vicino a fine
|
||||
else if ( m_Info.IciA[0].dU > 0 && m_Info.IciA[0].dU < 1)
|
||||
nPos1 = IP_MID ; // nell'interno
|
||||
nPos1 = ICurve::PP_MID ; // nell'interno
|
||||
// verifica posizione intersezione su seconda linea
|
||||
int nPos2 = IP_NULL ; // fuori
|
||||
int nPos2 = ICurve::PP_NULL ; // fuori
|
||||
if ( ( m_Info.IciB[0].dU * vtDir2).IsSmall())
|
||||
nPos2 = IP_START ; // vicino a inizio
|
||||
nPos2 = ICurve::PP_START ; // vicino a inizio
|
||||
else if ( (( 1 - m_Info.IciB[0].dU) * vtDir2).IsSmall())
|
||||
nPos2 = IP_END ; // vicino a fine
|
||||
nPos2 = ICurve::PP_END ; // vicino a fine
|
||||
else if ( m_Info.IciB[0].dU > 0 && m_Info.IciB[0].dU < 1)
|
||||
nPos2 = IP_MID ; // nell'interno
|
||||
nPos2 = ICurve::PP_MID ; // nell'interno
|
||||
// se soluzione non accettata, esco
|
||||
if ( nPos1 == IP_NULL || nPos2 == IP_NULL)
|
||||
if ( nPos1 == ICurve::PP_NULL || nPos2 == ICurve::PP_NULL)
|
||||
return ;
|
||||
// limito i parametri a stare sui segmenti (0...1)
|
||||
m_Info.IciA[0].dU = min( max( m_Info.IciA[0].dU, 0.), 1.) ;
|
||||
@@ -191,12 +189,12 @@ IntersLineLine::IntersFiniteLines( const ICurveLine& Line1, const ICurveLine& Li
|
||||
m_Info.IciB[0].nPrevTy = ICCT_NULL ;
|
||||
m_Info.IciB[0].nNextTy = ICCT_NULL ;
|
||||
// si incontrano alle estremità, non si può dire alcunché
|
||||
if ( ( nPos1 == IP_START || nPos1 == IP_END) &&
|
||||
( nPos2 == IP_START || nPos2 == IP_END)) {
|
||||
if ( ( nPos1 == ICurve::PP_START || nPos1 == ICurve::PP_END) &&
|
||||
( nPos2 == ICurve::PP_START || nPos2 == ICurve::PP_END)) {
|
||||
; // rimangono tutti NULL
|
||||
}
|
||||
// l'inizio di 1 interseca il mezzo di 2
|
||||
else if ( nPos1 == IP_START) {
|
||||
else if ( nPos1 == ICurve::PP_START) {
|
||||
if ( dCrossXY > 0)
|
||||
m_Info.IciA[0].nNextTy = ICCT_OUT ; // NULL + OUT
|
||||
else
|
||||
@@ -204,7 +202,7 @@ IntersLineLine::IntersFiniteLines( const ICurveLine& Line1, const ICurveLine& Li
|
||||
// curva B NULL + NULL
|
||||
}
|
||||
// la fine di 1 interseca il mezzo di 2
|
||||
else if ( nPos1 == IP_END) {
|
||||
else if ( nPos1 == ICurve::PP_END) {
|
||||
if ( dCrossXY < 0)
|
||||
m_Info.IciA[0].nPrevTy = ICCT_OUT ; // OUT + NULL
|
||||
else
|
||||
@@ -212,7 +210,7 @@ IntersLineLine::IntersFiniteLines( const ICurveLine& Line1, const ICurveLine& Li
|
||||
// curva B NULL + NULL
|
||||
}
|
||||
// l'inizio di 2 interseca il mezzo di 1
|
||||
else if ( nPos2 == IP_START) {
|
||||
else if ( nPos2 == ICurve::PP_START) {
|
||||
// curva A NULL + NULL
|
||||
if ( - dCrossXY > 0)
|
||||
m_Info.IciB[0].nNextTy = ICCT_OUT ; // NULL + OUT
|
||||
@@ -220,7 +218,7 @@ IntersLineLine::IntersFiniteLines( const ICurveLine& Line1, const ICurveLine& Li
|
||||
m_Info.IciB[0].nNextTy = ICCT_IN ; // NULL + IN
|
||||
}
|
||||
// la fine di 2 interseca il mezzo di 1
|
||||
else if ( nPos2 == IP_END) {
|
||||
else if ( nPos2 == ICurve::PP_END) {
|
||||
// curva A NULL + NULL
|
||||
if ( - dCrossXY < 0)
|
||||
m_Info.IciB[0].nPrevTy = ICCT_OUT ; // OUT + NULL
|
||||
@@ -253,7 +251,6 @@ IntersLineLine::IntersFiniteLines( const ICurveLine& Line1, const ICurveLine& Li
|
||||
}
|
||||
|
||||
// se le linee sono parallele e non coincidenti
|
||||
//if ( fabs( CrossXY( ( ptS2 - ptS1), vtDir1)) > EPS_SMALL * dLen1XY)
|
||||
if ( bParallel && bFarEnds)
|
||||
return ; // non ci sono intersezioni
|
||||
|
||||
|
||||
Reference in New Issue
Block a user