EgtGeomKernel :

- aggiustamenti alla Bezier By Contour.
This commit is contained in:
Daniele Bariletti
2024-07-17 16:18:18 +02:00
parent d6dc5b8428
commit 7c45c1e287
2 changed files with 24 additions and 8 deletions
+22 -6
View File
@@ -1760,6 +1760,10 @@ SurfBezier::IncreaseUV( double& dUV, double dxy, bool bUOrV, double* dUVCopy, bo
bool
SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR& vpCC, const Plane3d* pPlCut) const
{
// se necessario calcolo i poli
if ( m_vbPole.empty())
CalcPoles() ;
// do per scontato che la compo sia una spezzata, visto che arriva dall'intersezione tra un piano e una trimesh
// creo la chain dei punti che sto riportando nel parametrico
ChainCurves chainC ;
@@ -2649,6 +2653,10 @@ SurfBezier::UnprojectPointFromStm( int nT, const Point3d& ptI, Point3d& ptSP, in
bool
SurfBezier::UnprojectPoint( const Point3d& pt3D, Point3d& ptParam, const Point3d& ptIPrev, bool* bThroughEdge, const Plane3d* pPlCut) const
{
// se necessario calcolo i poli
if ( m_vbPole.empty())
CalcPoles() ;
// dato il punto pt3D sulla superficie di Bezier si cercano le coordinate parametriche ( ptParam) , iterativamente con Newton
// trovato un primo candidato ptParam, ne calcolo l'immagine sulla superficie ( ptBez) e ne calcolo la distanza con il punto pt3D
// ripeto cercando di avvicinarmi il più possibile
@@ -2762,7 +2770,7 @@ SurfBezier::UnprojectPoint( const Point3d& pt3D, Point3d& ptParam, const Point3d
//----------------------------------------------------------------------------
bool
SurfBezier::CalcPoles( void)
SurfBezier::CalcPoles( void) const
{
if ( m_vbPole.size() != 0)
return true ;
@@ -2809,6 +2817,10 @@ SurfBezier::CalcPoles( void)
bool
SurfBezier::GetLoops( ICRVCOMPOPOVECTOR& vCC, bool bLineOrBezier, int nEdge) const
{
// se necessario calcolo i poli
if ( m_vbPole.empty())
CalcPoles() ;
// se nEdge non è definito ( == -1) allora restituisco tutti gli edge in ordine
// se bOpenOrAll è true allora restituisco solo gli edge aperti e che non sono di polo
if ( m_pSTM == nullptr)
@@ -3307,25 +3319,29 @@ SurfBezier::CreateByFlatContour( const PolyLine& PL)
int nDegU = 1, nDegV = 1, nSpanU = 1, nSpanV = 1 ;
bool bRat = false ;
Init( nDegU, nDegV, nSpanU, nSpanV, bRat) ;
// i punti di controllo sono i quattro vertici della bbox ( che è piana)
Point3d ptBL = bboxContour.GetMin() ;
Point3d ptTR = bboxContour.GetMax() ;
// i punti di controllo sono i quattro vertici della bbox proiettata sul piano della polyline
double dPlus = 1 ;
bboxContour.Expand( dPlus) ;
Point3d ptBL = ProjectPointOnPlane(bboxContour.GetMin(), plPlane) ;
Point3d ptTR = ProjectPointOnPlane(bboxContour.GetMax(), plPlane) ;
SetControlPoint( 0, ptBL) ;
SetControlPoint( 1, Point3d( ptTR.x, ptBL.y)) ;
SetControlPoint( 2, Point3d( ptBL.x, ptTR.y)) ;
SetControlPoint( 3, ptTR) ;
// calcolo il corrispondente parametrico del contorno
PtrOwner<ICurveComposite> pCCContour( CreateCurveComposite()) ;
if ( IsNull( pCCContour))
return false ;
pCCContour->FromPolyLine( PL) ;
ICRVCOMPOPVECTOR vpCCParam ;
UnprojectCurveFromStm( pCCContour, vpCCParam, &plPlane) ;
// calcolo gli eventuali poli, necessari per poter chiamare le funzioni di unproject
CalcPoles() ;
ICRVCOMPOPOVECTOR vCCOpen ;
ICRVCOMPOPOVECTOR vCCClosed ;
AddCurveCompoToCuts( pCCContour, vCCOpen, vCCClosed) ;
for( int i = 0 ; i < int( vpCCParam.size()) ; ++i )
AddCurveCompoToCuts( vpCCParam[i], vCCOpen, vCCClosed) ;
// creo la regione di trim dai loop di trim
PtrOwner<ISurfFlatRegion> pSfrTrim( CreateTrimRegionFromCuts( vCCOpen, vCCClosed)) ;
if ( IsNull( pSfrTrim) || ! pSfrTrim->IsValid())
+2 -2
View File
@@ -135,7 +135,7 @@ class SurfBezier : public ISurfBezier, public IGeoObjRW
bool IncreaseUV( Point3d& ptUV, Vector3d vtH , Point3d* ptUVCopy, bool bModifyOrig) const override ;
// 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 GetLoops( ICRVCOMPOPOVECTOR& vCC, bool bLineOrBezier, int nEdge = -1) const override ; // se la superficie non è trimmata restituisce un vettore di 4 elementi. Se la superficie è chiusa lungo un parametro i lati algi estremi di quel parametro saranno null.
bool IsPlanar( void) const override ;
bool CreateByFlatContour( const PolyLine& PL) override ;
bool CreateByRegion( const POLYLINEVECTOR& vPL) override ;
@@ -200,7 +200,7 @@ class SurfBezier : public ISurfBezier, public IGeoObjRW
ICurveComposite* GetSingleEdge3D( bool bLineOrBezier, int nEdge) const ;
bool UpdateEdgesFromTree( Tree& tr) const ;
// funzione che calcola se gli edge sono collassati in poli
bool CalcPoles( void) ;
bool CalcPoles( void) const ;
bool FindMatchByParam( const PolyLine& pl0, const PolyLine& pl1, INTVECTOR& vMatch, int& nLong) const ;
bool ParametrizeByLen( const ICurveComposite* pCurve0, const ICurveComposite* pCurve1, DBLVECTOR& vParam0, DBLVECTOR& vParam1) const ;