EgtGeomKernel 1.8j4 :
- aggiunta classe Polygon3d (da EgtExchange) - razionalizzata classe Plane3d - corretta funzione IntersLineTria.
This commit is contained in:
+20
-7
@@ -46,8 +46,7 @@ IntersLineTria( const Point3d& ptL, const Vector3d& vtL, double dLen, const Tria
|
||||
{
|
||||
// determino il piano del triangolo
|
||||
Plane3d plPlane ;
|
||||
plPlane.vtN = trTria.GetN() ;
|
||||
plPlane.dDist = ( trTria.GetP(0) - ORIG) * plPlane.vtN ;
|
||||
plPlane.Set( trTria.GetP( 0), trTria.GetN()) ;
|
||||
// calcolo l'intersezione tra il segmento di linea e il piano del triangolo
|
||||
int nRes = IntersLinePlane( ptL, vtL, dLen, plPlane, ptInt) ;
|
||||
// se non c'è intersezione
|
||||
@@ -83,8 +82,17 @@ IntersCoplanarLineTria( const Point3d& ptL, const Vector3d& vtL, double dLen, co
|
||||
ptInt2 = ptL + vtL * dLen ;
|
||||
int nPTT = PointInTria( ptInt, trTria) ;
|
||||
int nPTT2 = PointInTria( ptInt2, trTria) ;
|
||||
if ( nPTT != PTT_OUT && nPTT2 != PTT_OUT)
|
||||
if ( ( nPTT == PTT_IN && nPTT2 != PTT_OUT) || ( nPTT != PTT_OUT && nPTT2 == PTT_IN))
|
||||
return ILTT_SEGM ;
|
||||
if ( nPTT == PTT_VERT && nPTT2 == PTT_VERT)
|
||||
return ILTT_SEGM_ON_EDGE ;
|
||||
if ( ( nPTT == PTT_VERT || nPTT == PTT_EDGE) && ( nPTT2 == PTT_VERT || nPTT2 == PTT_EDGE)) {
|
||||
Point3d ptMed = Media( ptInt, ptInt2, 0.5) ;
|
||||
if ( PointInTria( ptMed, trTria) == PTT_IN)
|
||||
return ILTT_SEGM ;
|
||||
else
|
||||
return ILTT_SEGM_ON_EDGE ;
|
||||
}
|
||||
// se segmento nullo, basta verificare la posizione del punto iniziale
|
||||
if ( dLen < EPS_SMALL || vtL.IsSmall()) {
|
||||
switch ( nPTT) {
|
||||
@@ -140,13 +148,18 @@ IntersCoplanarLineTria( const Point3d& ptL, const Vector3d& vtL, double dLen, co
|
||||
else {
|
||||
// se l'inizio è nel triangolo
|
||||
if ( nPTT == PTT_IN) {
|
||||
ptInt2 = ptInt ;
|
||||
ptInt = ptL ;
|
||||
ptInt2 = ptInt ;
|
||||
return ILTT_SEGM ;
|
||||
}
|
||||
// altrimenti è la fine nel triangolo
|
||||
else
|
||||
// se altrimenti è la fine nel triangolo
|
||||
else if ( nPTT2 == PTT_IN) {
|
||||
ptInt2 = ptL + vtL * dLen ;
|
||||
return ILTT_SEGM ;
|
||||
return ILTT_SEGM ;
|
||||
}
|
||||
// altrimenti entrambi esterni, è un vertice
|
||||
else
|
||||
return ILTT_VERT ;
|
||||
}
|
||||
}
|
||||
// se 2 intersezioni
|
||||
|
||||
Reference in New Issue
Block a user