Include :

- modificate costanti per tipo intersezione tra due triangoli IntTriaTriaType
- aggiunto prototipo GetSurfFlatRegionFromPolyLineVector
- aggiunta funzione IsPointOnTriangleVertex.
This commit is contained in:
DarioS
2021-05-14 17:26:44 +02:00
parent e2dcf79571
commit c4db78c2d4
3 changed files with 30 additions and 34 deletions
+16 -31
View File
@@ -1,13 +1,14 @@
//----------------------------------------------------------------------------
// EgalTech 2018-2019
// EgalTech 2018-2021
//----------------------------------------------------------------------------
// File : EGkIntersTriaTria.h Data : 01.10.19 Versione : 2.1i3
// File : EGkIntersTriaTria.h Data : 14.05.21 Versione : 2.3e1
// Contenuto : Dichiarazione della classe intersezione triangolo/triangolo.
//
//
//
// Modifiche : 27.08.18 DS Creazione modulo.
// 01.10.19 LM Aggiunte costanti
// 14.05.21 LM Ridefinizione costanti intersezione tra triangoli.
//
//----------------------------------------------------------------------------
@@ -30,33 +31,17 @@ EGK_EXPORT int IntersTriaTria( const Triangle3d& trTria1, const Triangle3d& trTr
Point3d& ptInt, Point3d& ptInt2, TRIA3DVECTOR& vTria) ;
//-----------------------------------------------------------------------------
// Tipo di intersezione triangolo-triangolo
// Tipo di intersezione triangolo-triangolo
enum IntTriaTriaType { ITTT_NO = 0, // non c'è intersezione
ITTT_OVERLAPS = 1, // i triangoli si sovrappongono (i triangoli del poligono sono in vTria)
ITTT_VERT = 2, // l'intersezione coincide con un vertice di un triangolo (ptInt)
ITTT_PNT = 3, // l'intersezione è un punto sui lati di entrambi i triangoli (ptInt)
ITTT_EDGE = 4, // l'intersezione coincide con un lato di un triangolo (ptInt, ptInt2)
ITTT_YES = 5} ; // l'intersezione è un segmento (ptInt, ptInt2)
// Tipi estesi
enum IntTriaTriaSpecialType { ITTTS_NO = 0, // non c'è intersezione
ITTTS_OVERLAPS = 1, // i triangoli si sovrappongono (i triangoli del poligono sono in vTria)
ITTTS_VERT_VERT = 2, // intersezione coppia di vertici
ITTTS_VERT_EDGE = 3, // vertice del primo su lato del secondo
ITTTS_VERT_INT = 4, // vertice del primo nell'interno del secondo
ITTTS_EDGE_VERT = 5, // vertice del secondo su lato del primo
ITTTS_EDGE_EDGE_PNT = 6, // punto sull'intersezione di due lati
ITTTS_INT_VERT = 7, // vertice del secondo nell'interno del primo
ITTTS_EDGE_EDGE_SEG = 8, // sovrapposizione di lati
ITTTS_EDGE_INT = 9, // lato del primo nell'interno del secondo
ITTTS_INT_EDGE = 10, // lato del secondo nell'interno del primo
ITTTS_INT_INT_SEG = 11 // segmento all'interno di entrambi i triangoli
} ;
// Conversione dai nuovi ai vecchi tipi
inline int FromSpecialToNormal( int nRes)
{
if ( nRes < ITTTS_NO || nRes > ITTTS_INT_INT_SEG)
return ITTT_NO ;
const int nFromSpecialToNormal[] = { ITTT_NO, ITTT_OVERLAPS, ITTT_VERT, ITTT_VERT, ITTT_VERT, ITTT_VERT, ITTT_PNT, ITTT_VERT, ITTT_EDGE, ITTT_EDGE, ITTT_EDGE, ITTT_YES } ;
return nFromSpecialToNormal[nRes] ;
}
ITTT_OVERLAPS = 1, // i triangoli si sovrappongono (i triangoli del poligono sono in vTria)
ITTT_VERT_VERT = 2, // intersezione coppia di vertici
ITTT_VERT_EDGE = 3, // vertice del primo su lato del secondo
ITTT_EDGE_VERT = 4, // vertice del secondo su lato del primo
ITTT_VERT_INT = 5, // vertice del primo nell'interno del secondo
ITTT_INT_VERT = 6, // vertice del secondo nell'interno del primo
ITTT_EDGE_EDGE_PNT = 7, // punto sull'intersezione di due lati
ITTT_EDGE_EDGE_SEG = 8, // sovrapposizione di lati
ITTT_EDGE_INT = 9, // lato del primo nell'interno del secondo
ITTT_INT_EDGE = 10, // lato del secondo nell'interno del primo
ITTT_INT_INT_SEG = 11, // segmento all'interno di entrambi i triangoli
} ;
+1
View File
@@ -30,6 +30,7 @@ EGK_EXPORT ISurfFlatRegion* GetSurfFlatRegionDisk( double dRadius) ;
// la curva ingrassata non deve autointersecarsi
EGK_EXPORT ISurfFlatRegion* GetSurfFlatRegionFromFatCurve( ICurve* pCrv, double dRadius,
bool bSquareEnds, bool bSquareMids) ;
EGK_EXPORT ISurfFlatRegion* GetSurfFlatRegionFromPolyLineVector( const POLYLINEVECTOR& vContoursPolyLineVec) ;
//----------------------------------------------------------------------------
class SurfFlatRegionByContours
+13 -3
View File
@@ -449,7 +449,7 @@ CalcNormal( const Point3d& ptP, const Triangle3d& Tria, const TriNormals3d& Tnor
enum TriangleType { OPEN = -1, EXACT = 0, CLOSED = 1 };
//----------------------------------------------------------------------------
// Stabilisce se un punto appartiene a un triangolo aperto, esatto o chiuso.
// Stabilisce se un punto appartiene al triangolo aperto, esatto o chiuso.
inline bool
IsPointInsideTriangle( const Point3d& ptP, const Triangle3d& trTria, int nTriType)
{
@@ -458,7 +458,7 @@ IsPointInsideTriangle( const Point3d& ptP, const Triangle3d& trTria, int nTriTyp
b3Tria.Add( trTria.GetP( 1)) ;
b3Tria.Add( trTria.GetP( 2)) ;
if ( ! b3Tria.Encloses( ptP))
return false;
return false ;
// Se il punto non sta sul piano del triangolo, è sicuramente esterno
if ( abs( ( ptP - trTria.GetP(0)) * trTria.GetN()) > EPS_SMALL)
@@ -473,7 +473,7 @@ IsPointInsideTriangle( const Point3d& ptP, const Triangle3d& trTria, int nTriTyp
case EXACT :
dEps = 0 ;
break ;
case CLOSED:
case CLOSED :
dEps = -EPS_SMALL ;
break ;
default :
@@ -502,6 +502,16 @@ IsPointInsideTriangle( const Point3d& ptP, const Triangle3d& trTria, int nTriTyp
return true ;
}
//----------------------------------------------------------------------------
// Stabilisce se un punto appartiene a un vertice del triangolo
inline bool
IsPointOnTriangleVertex( const Point3d& ptP, const Triangle3d& trTria)
{
return ( AreSamePointApprox( trTria.GetP( 0), ptP) ||
AreSamePointApprox( trTria.GetP( 1), ptP) ||
AreSamePointApprox( trTria.GetP( 2), ptP)) ;
}
//----------------------------------------------------------------------------
inline bool
GetTriaVertexNearestToLine( const Triangle3d& trTria, const Point3d& ptL, const Vector3d& vtL,