Include :
- aggiunti prototipi per Polygon3d, per IntersPlanePlane e per Inters3Planes - aggiornati Plane3d e IntersLinePlane.
This commit is contained in:
@@ -25,9 +25,9 @@
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
EGK_EXPORT int IntersLinePlane( const Point3d& ptL1, const Point3d& ptL2, const Plane3d& plPlane,
|
||||
Point3d& ptInt) ;
|
||||
Point3d& ptInt, bool bFinite = true) ;
|
||||
EGK_EXPORT int IntersLinePlane( const Point3d& ptL, const Vector3d& vtL, double dLen, const Plane3d& plPlane,
|
||||
Point3d& ptInt) ;
|
||||
Point3d& ptInt, bool bFinite = true) ;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Tipo di intersezione linea-piano
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
//----------------------------------------------------------------------------
|
||||
// EgalTech 2017-2017
|
||||
//----------------------------------------------------------------------------
|
||||
// File : EGkIntersPlanePlane.h Data : 15.10.17 Versione : 1.8j3
|
||||
// Contenuto : Dichiarazione della classe intersezione piano/piano.
|
||||
//
|
||||
//
|
||||
//
|
||||
// Modifiche : 15.10.17 DS Creazione modulo.
|
||||
//
|
||||
//
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "/EgtDev/Include/EGkPlane3d.h"
|
||||
|
||||
//----------------------- Macro per import/export ----------------------------
|
||||
#undef EGK_EXPORT
|
||||
#if defined( I_AM_EGK) // da definirsi solo nella DLL
|
||||
#define EGK_EXPORT __declspec( dllexport)
|
||||
#else
|
||||
#define EGK_EXPORT __declspec( dllimport)
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
EGK_EXPORT int IntersPlanePlane( const Plane3d& plPlane1, const Plane3d& plPlane2,
|
||||
Point3d& ptInt, Vector3d& vtDir) ;
|
||||
EGK_EXPORT int Inters3Planes( const Plane3d& plPlane1, const Plane3d& plPlane2, const Plane3d& plPlane3,
|
||||
Point3d& ptInt) ;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Tipo di intersezione piano-piano
|
||||
const int IPPT_NO = 0 ; // non c'è intersezione (piani paralleli)
|
||||
const int IPPT_OVERLAPS = 1 ; // piani coincidenti
|
||||
const int IPPT_YES = 2 ; // intersezione
|
||||
|
||||
+56
-39
@@ -19,98 +19,115 @@
|
||||
class Plane3d
|
||||
{
|
||||
public :
|
||||
Vector3d vtN ;
|
||||
double dDist ;
|
||||
Plane3d( void) : m_vtN( V_NULL), m_dDist( 0) {}
|
||||
bool Set( double dDist, const Vector3d& vtN)
|
||||
{ m_vtN = vtN ;
|
||||
if ( ! m_vtN.Normalize()) {
|
||||
m_vtN = V_NULL ;
|
||||
return false ;
|
||||
}
|
||||
m_dDist = dDist ;
|
||||
return true ;
|
||||
}
|
||||
bool Set( const Point3d& ptP, const Vector3d& vtN)
|
||||
{ m_vtN = vtN ;
|
||||
if ( ! m_vtN.Normalize()) {
|
||||
m_vtN = V_NULL ;
|
||||
return false ;
|
||||
}
|
||||
m_dDist = ( ptP - ORIG) * m_vtN ;
|
||||
return true ;
|
||||
}
|
||||
void Reset( void)
|
||||
{ m_vtN = V_NULL ;
|
||||
m_dDist = 0 ;
|
||||
}
|
||||
const Vector3d& GetVersN( void) const
|
||||
{ return m_vtN ; }
|
||||
double GetDist( void) const
|
||||
{ return m_dDist ; }
|
||||
|
||||
public :
|
||||
void Translate( const Vector3d& vtMove)
|
||||
{ Point3d ptP = ORIG + dDist * vtN ;
|
||||
{ Point3d ptP = ORIG + m_dDist * m_vtN ;
|
||||
ptP.Translate( vtMove) ;
|
||||
dDist = ( ptP - ORIG) * vtN ; }
|
||||
m_dDist = ( ptP - ORIG) * m_vtN ; }
|
||||
bool Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dAngDeg)
|
||||
{ double dAngRad = dAngDeg * DEGTORAD ;
|
||||
return Rotate( ptAx, vtAx, cos( dAngRad), sin( dAngRad)) ; }
|
||||
bool Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, double dSinAng)
|
||||
{ Point3d ptP = ORIG + dDist * vtN ;
|
||||
if ( ! ptP.Rotate( ptAx, vtAx, dCosAng, dSinAng) || ! vtN.Rotate( vtAx, dCosAng, dSinAng))
|
||||
{ Point3d ptP = ORIG + m_dDist * m_vtN ;
|
||||
if ( ! ptP.Rotate( ptAx, vtAx, dCosAng, dSinAng) || ! m_vtN.Rotate( vtAx, dCosAng, dSinAng))
|
||||
return false ;
|
||||
dDist = ( ptP - ORIG) * vtN ;
|
||||
m_dDist = ( ptP - ORIG) * m_vtN ;
|
||||
return true ; }
|
||||
bool Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, double dCoeffZ)
|
||||
{ Point3d ptP = ORIG + dDist * vtN ;
|
||||
{ Point3d ptP = ORIG + m_dDist * m_vtN ;
|
||||
Frame3d frOCS ;
|
||||
if ( ! frOCS.Set( ptP, vtN) || ! frOCS.PseudoScale( frRef, dCoeffX, dCoeffY, dCoeffZ))
|
||||
if ( ! frOCS.Set( ptP, m_vtN) || ! frOCS.PseudoScale( frRef, dCoeffX, dCoeffY, dCoeffZ))
|
||||
return false ;
|
||||
vtN = frOCS.VersZ() ;
|
||||
dDist = ( frOCS.Orig() - ORIG) * vtN ;
|
||||
m_vtN = frOCS.VersZ() ;
|
||||
m_dDist = ( frOCS.Orig() - ORIG) * m_vtN ;
|
||||
return true ; }
|
||||
bool Mirror( const Point3d& ptOn, const Vector3d& vtNorm)
|
||||
{ Point3d ptP = ORIG + dDist * vtN ;
|
||||
if ( ! ptP.Mirror( ptOn, vtNorm) || ! vtN.Mirror( vtNorm))
|
||||
{ Point3d ptP = ORIG + m_dDist * m_vtN ;
|
||||
if ( ! ptP.Mirror( ptOn, vtNorm) || ! m_vtN.Mirror( vtNorm))
|
||||
return false ;
|
||||
dDist = ( ptP - ORIG) * vtN ;
|
||||
m_dDist = ( ptP - ORIG) * m_vtN ;
|
||||
return true ; }
|
||||
bool Shear( const Point3d& ptOn, const Vector3d& vtNorm, const Vector3d& vtDir, double dCoeff)
|
||||
{ Point3d ptP = ORIG + dDist * vtN ;
|
||||
{ Point3d ptP = ORIG + m_dDist * m_vtN ;
|
||||
Frame3d frOCS ;
|
||||
if ( ! frOCS.Set( ptP, vtN) || ! frOCS.PseudoShear( ptOn, vtNorm, vtDir, dCoeff))
|
||||
if ( ! frOCS.Set( ptP, m_vtN) || ! frOCS.PseudoShear( ptOn, vtNorm, vtDir, dCoeff))
|
||||
return false ;
|
||||
vtN = frOCS.VersZ() ;
|
||||
dDist = ( frOCS.Orig() - ORIG) * vtN ;
|
||||
m_vtN = frOCS.VersZ() ;
|
||||
m_dDist = ( frOCS.Orig() - ORIG) * m_vtN ;
|
||||
return true ; }
|
||||
bool ToGlob( const Frame3d& frRef)
|
||||
{ Point3d ptP = ORIG + dDist * vtN ;
|
||||
if ( ! ptP.ToGlob( frRef) || ! vtN.ToGlob( frRef))
|
||||
{ Point3d ptP = ORIG + m_dDist * m_vtN ;
|
||||
if ( ! ptP.ToGlob( frRef) || ! m_vtN.ToGlob( frRef))
|
||||
return false ;
|
||||
dDist = ( ptP - ORIG) * vtN ;
|
||||
m_dDist = ( ptP - ORIG) * m_vtN ;
|
||||
return true ; }
|
||||
bool ToLoc( const Frame3d& frRef)
|
||||
{ Point3d ptP = ORIG + dDist * vtN ;
|
||||
if ( ! ptP.ToLoc( frRef) || ! vtN.ToLoc( frRef))
|
||||
{ Point3d ptP = ORIG + m_dDist * m_vtN ;
|
||||
if ( ! ptP.ToLoc( frRef) || ! m_vtN.ToLoc( frRef))
|
||||
return false ;
|
||||
dDist = ( ptP - ORIG) * vtN ;
|
||||
m_dDist = ( ptP - ORIG) * m_vtN ;
|
||||
return true ; }
|
||||
bool LocToLoc( const Frame3d& frOri, const Frame3d& frDest)
|
||||
{ if ( AreSameFrame( frOri, frDest))
|
||||
return true ;
|
||||
return ( ToGlob( frOri) && ToLoc( frDest)) ; }
|
||||
private :
|
||||
Vector3d m_vtN ;
|
||||
double m_dDist ;
|
||||
} ;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
inline bool
|
||||
SetPlane( const Point3d& ptP, const Vector3d& vtN, Plane3d& plPlane)
|
||||
{
|
||||
plPlane.vtN = vtN ;
|
||||
if ( ! plPlane.vtN.Normalize())
|
||||
return false ;
|
||||
plPlane.dDist = ( ptP - ORIG) * plPlane.vtN ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
inline double
|
||||
DistPointPlane( const Point3d& ptP, const Plane3d& plPlane)
|
||||
{
|
||||
return ((( ptP - ORIG) * plPlane.vtN) - plPlane.dDist) ;
|
||||
return ((( ptP - ORIG) * plPlane.GetVersN()) - plPlane.GetDist()) ;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
inline bool
|
||||
PointInPlaneEpsilon( const Point3d& ptP, const Plane3d& plPlane, double dToler)
|
||||
{
|
||||
return ( fabs( (( ptP - ORIG) * plPlane.vtN) - plPlane.dDist) < dToler) ;
|
||||
return ( fabs( (( ptP - ORIG) * plPlane.GetVersN()) - plPlane.GetDist()) < dToler) ;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
inline bool
|
||||
PointInPlaneApprox( const Point3d& ptP, const Plane3d& plPlane)
|
||||
{
|
||||
return ( fabs( (( ptP - ORIG) * plPlane.vtN) - plPlane.dDist) < EPS_SMALL) ;
|
||||
return ( fabs( (( ptP - ORIG) * plPlane.GetVersN()) - plPlane.GetDist()) < EPS_SMALL) ;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
inline bool
|
||||
PointInPlaneExact( const Point3d& ptP, const Plane3d& plPlane)
|
||||
{
|
||||
return ( fabs( (( ptP - ORIG) * plPlane.vtN) - plPlane.dDist) < EPS_ZERO) ;
|
||||
return ( fabs( (( ptP - ORIG) * plPlane.GetVersN()) - plPlane.GetDist()) < EPS_ZERO) ;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
//----------------------------------------------------------------------------
|
||||
// EgalTech 2015-2015
|
||||
//----------------------------------------------------------------------------
|
||||
// File : Polygon3d.h Data : 30.08.15 Versione : 1.6h5
|
||||
// Contenuto : Dichiarazione della classe Polygon3d (poligono nello spazio).
|
||||
//
|
||||
//
|
||||
//
|
||||
// Modifiche : 30.08.15 DS Creazione modulo.
|
||||
//
|
||||
//
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "/EgtDev/Include/EGkPlane3d.h"
|
||||
#include "/EgtDev/Include/EGkPolyLine.h"
|
||||
#include "/EgtDev/Include/EGkGeoCollection.h"
|
||||
|
||||
//----------------------- Macro per import/export ----------------------------
|
||||
#undef EGK_EXPORT
|
||||
#if defined( I_AM_EGK) // da definirsi solo nella DLL
|
||||
#define EGK_EXPORT __declspec( dllexport)
|
||||
#else
|
||||
#define EGK_EXPORT __declspec( dllimport)
|
||||
#endif
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
class Polygon3d
|
||||
{
|
||||
public :
|
||||
EGK_EXPORT bool FromRectangle( double dDimX, double dDimY) ;
|
||||
EGK_EXPORT bool FromPolyLine( const PolyLine& PL) ;
|
||||
EGK_EXPORT bool FromPlaneTrimmedWithBox( const Plane3d& plPlane, const Point3d& ptMin, const Point3d& ptMax) ;
|
||||
EGK_EXPORT bool FromPlaneTrimmedWithBox( const Point3d& ptOn, const Vector3d& vtN,
|
||||
const Point3d& ptMin, const Point3d& ptMax) ;
|
||||
EGK_EXPORT bool Trim( const Plane3d& plPlane, bool bInVsOut, bool bOnEq) ;
|
||||
EGK_EXPORT bool Trim( const Polygon3d& plyOther, bool bInVsOut, bool bOnEq) ;
|
||||
EGK_EXPORT bool IsValid( void) const
|
||||
{ return ! m_Plane.GetVersN().IsSmall() ; }
|
||||
EGK_EXPORT Vector3d GetVersN( void)
|
||||
{ return m_Plane.GetVersN() ; }
|
||||
EGK_EXPORT int GetSideCount( void) const
|
||||
{ return ( IsValid() ? int( m_vVert.size()) : 0) ; }
|
||||
EGK_EXPORT PolyLine GetPolyLine( void) const ;
|
||||
|
||||
public :
|
||||
EGK_EXPORT void Translate( const Vector3d& vtMove) ;
|
||||
EGK_EXPORT bool Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dAngDeg)
|
||||
{ double dAngRad = dAngDeg * DEGTORAD ;
|
||||
return Rotate( ptAx, vtAx, cos( dAngRad), sin( dAngRad)) ; }
|
||||
EGK_EXPORT bool Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, double dSinAng) ;
|
||||
EGK_EXPORT bool Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, double dCoeffZ) ;
|
||||
EGK_EXPORT bool Mirror( const Point3d& ptOn, const Vector3d& vtNorm) ;
|
||||
EGK_EXPORT bool Shear( const Point3d& ptOn, const Vector3d& vtNorm, const Vector3d& vtDir, double dCoeff) ;
|
||||
EGK_EXPORT bool ToGlob( const Frame3d& frRef) ;
|
||||
EGK_EXPORT bool ToLoc( const Frame3d& frRef) ;
|
||||
EGK_EXPORT bool LocToLoc( const Frame3d& frOri, const Frame3d& frDest) ;
|
||||
|
||||
private :
|
||||
Plane3d m_Plane ; // piano in cui giace il poligono
|
||||
PNTVECTOR m_vVert ; // elenco ordinato dei vertici del poligono (CCW da Z+ piano)
|
||||
} ;
|
||||
Reference in New Issue
Block a user