EgtGeomKernel :
- aggiustamenti alla Bezier By Contour.
This commit is contained in:
+22
-6
@@ -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
@@ -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 ;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user