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:
Dario Sassi
2014-07-16 09:08:32 +00:00
parent 19fda49699
commit 56d6307a1c
19 changed files with 1357 additions and 99 deletions
+15 -18
View File
@@ -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