EgtGeomKernel :
- gestite superfici con trim molto piccoli rispetto al totale.
This commit is contained in:
+130
-1
@@ -41,6 +41,7 @@
|
||||
#include "/EgtDev/Include/EGkCurveArc.h"
|
||||
#include "/EgtDev/Include/EGkGeoPoint3d.h"
|
||||
#include "/EgtDev/Include/EGkIntervals.h"
|
||||
#include "/EgtDev/Include/EGkSurfAux.h"
|
||||
#define EIGEN_NO_IO
|
||||
#include "/EgtDev/Extern/Eigen/Dense"
|
||||
|
||||
@@ -50,7 +51,8 @@
|
||||
#define SAVERULEDGUIDEDISO 0
|
||||
#define SAVEMATCHCURVES 0
|
||||
#define SAVEFAILEDTREE 0
|
||||
#if SAVEFAILEDTRIANGULATION || SAVEREBUILTISO || SAVERULEDISO || SAVERULEDGUIDEDISO || SAVEMATCHCURVES || SAVEFAILEDTREE
|
||||
#define SAVELIMITSURF 0
|
||||
#if SAVEFAILEDTRIANGULATION || SAVEREBUILTISO || SAVERULEDISO || SAVERULEDGUIDEDISO || SAVEMATCHCURVES || SAVEFAILEDTREE || SAVELIMITSURF
|
||||
#include "/EgtDev/Include/EGkGeoObjSave.h"
|
||||
#endif
|
||||
|
||||
@@ -6566,3 +6568,130 @@ SurfBezier::SwapParameters( void)
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
SurfBezier::LimitSurfToTrimmedRegion( void)
|
||||
{
|
||||
if ( ! m_bTrimmed || m_pTrimReg == nullptr)
|
||||
return true ;
|
||||
|
||||
double dParamArea = m_nSpanU * m_nSpanV * SBZ_TREG_COEFF * SBZ_TREG_COEFF ;
|
||||
double dTrimmedArea = 0 ; m_pTrimReg->GetArea( dTrimmedArea) ;
|
||||
|
||||
// se la parte trimmata è molto inferiore alla superficie originale limito la superficie alla parte trimmata
|
||||
if ( dTrimmedArea / dParamArea < 0.01 || true) {
|
||||
BBox3d bboxTrim ; m_pTrimReg->GetLocalBBox( bboxTrim) ;
|
||||
// estraggo tutte le isocurve in U e le limito a poco più del box della regione trimmata
|
||||
double dMinU = bboxTrim.GetMin().x - 10 ; dMinU = Clamp( dMinU, 0., double(m_nSpanU * SBZ_TREG_COEFF)) ;
|
||||
double dMaxU = bboxTrim.GetMax().x + 10 ; dMaxU = Clamp( dMaxU, 0., double(m_nSpanU * SBZ_TREG_COEFF)) ;
|
||||
double dMinV = bboxTrim.GetMin().y - 10 ; dMinV = Clamp( dMinV, 0., double(m_nSpanV * SBZ_TREG_COEFF)) ;
|
||||
double dMaxV = bboxTrim.GetMax().y + 10 ; dMaxV = Clamp( dMaxV, 0., double(m_nSpanV * SBZ_TREG_COEFF)) ;
|
||||
int nV = m_nSpanV * m_nDegV + 1 ;
|
||||
int nU = m_nSpanU * m_nDegU + 1 ;
|
||||
vector<CurveComposite> vIsoU ; vIsoU.reserve( nV) ;
|
||||
for ( int i = 0 ; i < nV ; ++i) {
|
||||
vIsoU.emplace_back() ;
|
||||
bool bOk = false ;
|
||||
for ( int k = 0 ; k < m_nSpanU ; ++k) {
|
||||
CurveBezier cbIsoU ;
|
||||
cbIsoU.Init( m_nDegU, m_bRat) ;
|
||||
for ( int j = 0 ; j <= m_nDegU ; ++j) {
|
||||
if ( ! m_bRat)
|
||||
cbIsoU.SetControlPoint( j, GetControlPoint( k * m_nDegU + j, i, &bOk)) ;
|
||||
else {
|
||||
double dW = GetControlWeight( j, i, &bOk) ;
|
||||
cbIsoU.SetControlPoint( j, GetControlPoint( k * m_nDegU + j, i, &bOk), dW) ;
|
||||
}
|
||||
}
|
||||
vIsoU.back().AddCurve( cbIsoU) ;
|
||||
}
|
||||
vIsoU.back().TrimStartEndAtParam( dMinU / SBZ_TREG_COEFF, dMaxU / SBZ_TREG_COEFF) ;
|
||||
}
|
||||
// a partire dalle curve limitate in U recupero le curve in V e le limito
|
||||
int nSpanU = vIsoU.back().GetCurveCount() ;
|
||||
nU = nSpanU * m_nDegU + 1 ;
|
||||
vector<CurveComposite> vIsoV ; vIsoV.reserve( nU) ;
|
||||
for ( int i = 0 ; i < nU ; ++i) {
|
||||
int nSubU = i / m_nDegU ;
|
||||
int nPoint = i % m_nDegU ;
|
||||
if ( nSubU == nSpanU) {
|
||||
--nSubU ;
|
||||
nPoint = m_nDegU ;
|
||||
}
|
||||
vIsoV.emplace_back() ;
|
||||
for ( int k = 0 ; k < m_nSpanV ; ++k) {
|
||||
CurveBezier cbIsoV ;
|
||||
cbIsoV.Init( m_nDegV, m_bRat) ;
|
||||
for ( int j = 0 ; j <= m_nDegV ; ++j) {
|
||||
const CurveComposite& ccIsoU = vIsoU[k * m_nDegV + j] ;
|
||||
const ICurveBezier* cbSubCurveU = GetCurveBezier( ccIsoU.GetCurve( nSubU)) ;
|
||||
if ( ! m_bRat)
|
||||
cbIsoV.SetControlPoint( j, cbSubCurveU->GetControlPoint( nPoint)) ;
|
||||
else {
|
||||
double dW = cbSubCurveU->GetControlWeight( nPoint) ;
|
||||
cbIsoV.SetControlPoint( j, cbSubCurveU->GetControlPoint( nPoint), dW) ;
|
||||
}
|
||||
}
|
||||
vIsoV.back().AddCurve( cbIsoV) ;
|
||||
}
|
||||
vIsoV.back().TrimStartEndAtParam( dMinV / SBZ_TREG_COEFF, dMaxV / SBZ_TREG_COEFF) ;
|
||||
}
|
||||
int nSpanV = vIsoV.back().GetCurveCount() ;
|
||||
// ricostruisco la superficie a partire dalle nuove curve
|
||||
// salvo la regione di trim
|
||||
ISurfFlatRegion* pSaveTrim = m_pTrimReg ;
|
||||
m_pTrimReg = nullptr ;
|
||||
Init( m_nDegU, m_nDegV, nSpanU, nSpanV, m_bRat) ;
|
||||
// scorro le isocurve in V
|
||||
for ( int i = 0 ; i < nU ; ++i) {
|
||||
CurveComposite ccIsoV = vIsoV[i] ;
|
||||
for ( int k = 0 ; k < nSpanV ; ++k) {
|
||||
const ICurveBezier* cbSubCurveV = GetCurveBezier( ccIsoV.GetCurve( k)) ;
|
||||
for ( int j = k == 0 ? 0 : 1 ; j <= m_nDegV ; ++j) {
|
||||
if ( ! m_bRat)
|
||||
SetControlPoint( i, k * m_nDegV + j, cbSubCurveV->GetControlPoint( j)) ;
|
||||
else {
|
||||
double dW = cbSubCurveV->GetControlWeight( j) ;
|
||||
SetControlPoint( i, k * m_nDegV + j, cbSubCurveV->GetControlPoint( j), dW) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#if SAVELIMITSURF
|
||||
vector<IGeoObj*> vGeo ;
|
||||
vGeo.push_back( pSaveTrim->Clone()) ;
|
||||
#endif
|
||||
|
||||
// riscalo la superficie di trim
|
||||
double dDimX = dMaxU - dMinU ;
|
||||
double dDimY = dMaxV - dMinV ;
|
||||
Vector3d vtMove( dMinU, dMinV) ;
|
||||
pSaveTrim->Translate( -vtMove) ;
|
||||
bool bRescaled = false ;
|
||||
DBLVECTOR vU, vV ;
|
||||
vU.push_back( 0) ;
|
||||
int nFirst = int( ceil( dMinU / SBZ_TREG_COEFF)) ;
|
||||
nFirst = nFirst == 0 ? 1 : nFirst ;
|
||||
for ( int i = 0 ; i < nSpanU - 1 ; ++i)
|
||||
vU.push_back( nFirst + i - dMinU/ SBZ_TREG_COEFF) ;
|
||||
vU.push_back( (dMaxU - dMinU) / SBZ_TREG_COEFF) ;
|
||||
vV.push_back( 0) ;
|
||||
nFirst = int( ceil( dMinV / SBZ_TREG_COEFF)) ;
|
||||
nFirst = nFirst == 0 ? 1 : nFirst ;
|
||||
for ( int i = 0 ; i < nSpanV - 1 ; ++i)
|
||||
vV.push_back( nFirst + i - dMinV/ SBZ_TREG_COEFF) ;
|
||||
vV.push_back( (dMaxV - dMinV)/ SBZ_TREG_COEFF) ;
|
||||
MakeUniform( pSaveTrim, bRescaled, vU, vV, m_nDegU, m_nDegV, dDimX, dDimY, false) ;
|
||||
//m_pTrimReg->Scale( GLOB_FRM, nSpanU * SBZ_TREG_COEFF / dDimX, nSpanV * SBZ_TREG_COEFF / dDimY, 1) ;
|
||||
m_pTrimReg = GetBasicSurfFlatRegion( pSaveTrim) ;
|
||||
m_bTrimmed = true ;
|
||||
#if SAVELIMITSURF
|
||||
vGeo.push_back( m_pTrimReg->Clone()) ;
|
||||
SaveGeoObj( vGeo, "D:\\Temp\\bezier\\edit surf\\trim_reg_before_after.nge") ;
|
||||
vGeo.clear() ;
|
||||
#endif
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
@@ -153,6 +153,7 @@ class SurfBezier : public ISurfBezier, public IGeoObjRW
|
||||
bool CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, const BIPNTVECTOR& vCrv) ;
|
||||
bool RemoveCollapsedSpans( void) override ;
|
||||
bool SwapParameters( void) ;
|
||||
bool LimitSurfToTrimmedRegion( void) override ;
|
||||
|
||||
public : // IGeoObjRW
|
||||
int GetNgeId( void) const override ;
|
||||
|
||||
Reference in New Issue
Block a user