diff --git a/SurfBezier.cpp b/SurfBezier.cpp index f60617d..0e5cd91 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -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 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 ; +} diff --git a/SurfBezier.h b/SurfBezier.h index 27f5f9c..758bb05 100644 --- a/SurfBezier.h +++ b/SurfBezier.h @@ -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 ;