EgtGeomKernel :
- aggiunto il metodo IsPlanar per la SurfBezier.
This commit is contained in:
@@ -3205,3 +3205,40 @@ SurfBezier::GetSingleEdge3D( bool bLineOrBezier, int nEdge) const
|
||||
}
|
||||
return pCrvCompo ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
SurfBezier::IsPlanar( void) const
|
||||
{
|
||||
// costruisco il contorno della superficie unendo gli edge e chiedo se la polyline è piana.
|
||||
PtrOwner<ICurveComposite> pCCEdge( GetSingleEdge3D( true, 0)) ;
|
||||
pCCEdge->AddCurve( GetSingleEdge3D( true, 1)) ;
|
||||
pCCEdge->AddCurve( GetSingleEdge3D( true, 2)) ;
|
||||
pCCEdge->AddCurve( GetSingleEdge3D( true, 3)) ;
|
||||
PolyLine plApprox ;
|
||||
pCCEdge->ApproxWithLines( 0.01, 15, 0, plApprox) ;
|
||||
Plane3d plPlane ;
|
||||
if ( ! plApprox.IsFlat( plPlane, EPS_SMALL))
|
||||
return false ;
|
||||
// in questo caso se è grado 1 in U e V e ho un unica Patch allora sono sicuro sia piana
|
||||
if ( m_nDegU == 1 && m_nSpanU == 1 && m_nDegV == 1 && m_nSpanV == 1) // questa condizione da sola non è sufficiente ( posso avere superfici torte anche se i lati sono segmenti)
|
||||
return true ;
|
||||
|
||||
int nCount = int(plApprox.GetUPointList().size()) ;
|
||||
// altrimenti devo verificare anche all'interno della superficie, prendendo dei punti campione
|
||||
DBLVECTOR vSampling { 0.2, 0.4, 0.6, 0.8} ;
|
||||
for ( double i : vSampling) {
|
||||
for ( double j : vSampling) {
|
||||
Point3d ptBez ;
|
||||
GetPointD1D2( i * m_nSpanU, j * m_nSpanV, ISurfBezier::FROM_MINUS, ISurfBezier::FROM_PLUS, ptBez) ;
|
||||
if ( plApprox.AddUPoint( nCount, ptBez))
|
||||
++ nCount ;
|
||||
}
|
||||
}
|
||||
plPlane.Reset() ;
|
||||
if ( plApprox.IsFlat( plPlane, EPS_SMALL))
|
||||
return true ;
|
||||
|
||||
// nel dubbio restituisco false
|
||||
return false ;
|
||||
}
|
||||
|
||||
@@ -136,6 +136,7 @@ class SurfBezier : public ISurfBezier, public IGeoObjRW
|
||||
// funzione che restituisce gli edge della superficie o in forma di linea spezzata o in forma di curva di Bezier
|
||||
// se la superficie è trimmata restituisce i loop dello spazio parametrico in forma di linee spezzate
|
||||
bool GetLoops( ICRVCOMPOPOVECTOR& vCC, bool bLineOrBezier, int nEdge = -1) const override ;
|
||||
bool IsPlanar( void) const override ;
|
||||
|
||||
public : // IGeoObjRW
|
||||
int GetNgeId( void) const override ;
|
||||
|
||||
Reference in New Issue
Block a user