EgtGeomKernel :

- aggiunto il metodo IsPlanar per la SurfBezier.
This commit is contained in:
Daniele Bariletti
2024-04-17 16:00:30 +02:00
parent 4206a4822f
commit f5e5441469
2 changed files with 38 additions and 0 deletions
+37
View File
@@ -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 ;
}
+1
View File
@@ -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 ;