Merge branch 'master' into NewMakeUniform
This commit is contained in:
+104
-17
@@ -45,10 +45,11 @@
|
||||
#include "/EgtDev/Extern/Eigen/Dense"
|
||||
|
||||
#define SAVEFAILEDTRIANGULATION 0
|
||||
#define SAVEISO 0
|
||||
#define SAVEREBUILTISO 0
|
||||
#define SAVERULEDISO 0
|
||||
#define SAVERULEDGUIDEDISO 0
|
||||
#if SAVEFAILEDTRIANGULATION || SAVEISO || SAVERULEDISO || SAVERULEDGUIDEDISO
|
||||
#define SAVEMATCHCURVES 0
|
||||
#if SAVEFAILEDTRIANGULATION || SAVEREBUILTISO || SAVERULEDISO || SAVERULEDGUIDEDISO || SAVEMATCHCURVES
|
||||
#include "/EgtDev/Include/EGkGeoObjSave.h"
|
||||
#endif
|
||||
|
||||
@@ -2175,7 +2176,7 @@ SurfBezier::ReorderPntEnhancedVector( const POLYLINEVECTOR& vPL, bool bTriangula
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
SurfBezier::GetLeaves( vector<tuple<int, Point3d, Point3d>>& vLeaves) const
|
||||
SurfBezier::GetLeaves( vector<tuple<int, Point3d, Point3d>>& vLeaves, bool bRefined) const
|
||||
{
|
||||
Tree Tree ;
|
||||
if ( ! Tree.SetSurf( this))
|
||||
@@ -2186,7 +2187,10 @@ SurfBezier::GetLeaves( vector<tuple<int, Point3d, Point3d>>& vLeaves) const
|
||||
Point3d ptMin = get<0>( vTrees[i]) ;
|
||||
Point3d ptMax = get<1>( vTrees[i]) ;
|
||||
Tree.SetSurf( this, ptMin, ptMax) ;
|
||||
Tree.BuildTree( s_dAuxSurfTol, 100 * EPS_SMALL) ;
|
||||
if ( ! bRefined)
|
||||
Tree.BuildTree( s_dAuxSurfTol, 10 * EPS_SMALL) ;
|
||||
else
|
||||
Tree.BuildTree( s_dAuxSurfRefinedTol, 10 * EPS_SMALL) ;
|
||||
vector<Cell> vCells ;
|
||||
Tree.GetLeaves( vCells) ;
|
||||
for ( int k = 0 ; k < int( vCells.size()) ; ++ k) {
|
||||
@@ -5934,23 +5938,93 @@ SurfBezier::CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, c
|
||||
Point3d ptU1 = vCrv[i].second ;
|
||||
double dParam0 ; CrvU0.GetParamAtPoint( ptU0, dParam0) ;
|
||||
double dParam1 ; CrvU1.GetParamAtPoint( ptU1, dParam1) ;
|
||||
if ( bClosed && ( dParam0 < EPS_SMALL || nSpanU0 - dParam0 < EPS_SMALL) &&
|
||||
if ( bClosed) {
|
||||
// curve di sync che sono esattamente sugli start/end di churve chiuse
|
||||
if ( ( dParam0 < EPS_SMALL || nSpanU0 - dParam0 < EPS_SMALL) &&
|
||||
( dParam1 < EPS_SMALL || nSpanU1 - dParam1 < EPS_SMALL)) {
|
||||
if ( ! bFirstAdded) {
|
||||
dParam0 = 0 ;
|
||||
dParam1 = 0 ;
|
||||
bFirstAdded = true ;
|
||||
if ( ! bFirstAdded) {
|
||||
dParam0 = 0 ;
|
||||
dParam1 = 0 ;
|
||||
bFirstAdded = true ;
|
||||
}
|
||||
else {
|
||||
dParam0 = nSpanU0 ;
|
||||
dParam1 = nSpanU1 ;
|
||||
}
|
||||
}
|
||||
else {
|
||||
dParam0 = nSpanU0 ;
|
||||
dParam1 = nSpanU1 ;
|
||||
// curve si sync che hanno solo uno dei due punti su un punto di start/end, ma NON sono a cavallo dello start
|
||||
else if ( ( dParam0 < EPS_SMALL || nSpanU0 - dParam0 < EPS_SMALL)) {
|
||||
if ( ( nSpanU1 - dParam1) > dParam1)
|
||||
dParam0 = 0 ;
|
||||
else
|
||||
dParam0 = nSpanU0 ;
|
||||
}
|
||||
else if (( dParam1 < EPS_SMALL || nSpanU1 - dParam1 < EPS_SMALL)) {
|
||||
if ( ( nSpanU0 - dParam0) > dParam0)
|
||||
dParam1 = 0 ;
|
||||
else
|
||||
dParam1 = nSpanU1 ;
|
||||
}
|
||||
//else if ( abs(( nSpanU0 - dParam0) / nSpanU0 - ( nSpanU1 - dParam1) / nSpanU1) > 0.1) {
|
||||
// // gestisco il cambio di start se ho una sync a cavallo di start e end
|
||||
// // quella sync diventa il nuovo start
|
||||
|
||||
//}
|
||||
}
|
||||
vIso.emplace_back( i, dParam0, dParam1) ;
|
||||
}
|
||||
|
||||
sort( vIso.begin(), vIso.end()) ;
|
||||
|
||||
// sposto lo start sulla prima curva di sync che trovo
|
||||
if ( bClosed) {
|
||||
double dNewStart0 = vIso[0].dParam0 ;
|
||||
double dNewStart1 = vIso[0].dParam1 ;
|
||||
CrvU0.ChangeStartPoint( dNewStart0) ;
|
||||
CrvU1.ChangeStartPoint( dNewStart1) ;
|
||||
vIso[0].dParam0 = 0 ;
|
||||
vIso[0].dParam1 = 0 ;
|
||||
double dCeil0 = ceil( dNewStart0) ;
|
||||
double dFloor0 = floor( dNewStart0) ;
|
||||
double dCeil1 = ceil( dNewStart1) ;
|
||||
double dFloor1 = floor( dNewStart1) ;
|
||||
rotate( vPnt0.begin(), vPnt0.begin() + int( dCeil0), vPnt0.end()) ;
|
||||
rotate( vPnt1.begin(), vPnt1.begin() + int( dCeil1), vPnt1.end()) ;
|
||||
if ( abs( dNewStart0 - round( dNewStart0)) > EPS_SMALL) {
|
||||
Point3d ptNewStart ; CrvU0.GetStartPoint( ptNewStart) ;
|
||||
vPnt0.insert( vPnt0.begin(), ptNewStart) ;
|
||||
++nSpanU0 ;
|
||||
}
|
||||
if ( abs( dNewStart1 - round( dNewStart1)) > EPS_SMALL) {
|
||||
Point3d ptNewStart ; CrvU1.GetStartPoint( ptNewStart) ;
|
||||
vPnt1.insert( vPnt1.begin(), ptNewStart) ;
|
||||
++nSpanU1 ;
|
||||
}
|
||||
for ( int i = 1 ; i < ssize( vIso) ; ++i) {
|
||||
if ( vIso[i].dParam0 >= dCeil0)
|
||||
vIso[i].dParam0 -= dFloor0 ;
|
||||
else if ( vIso[i].dParam0 <= dFloor0)
|
||||
vIso[i].dParam0 += nSpanU0 - dCeil0 ;
|
||||
else
|
||||
CrvU0.GetParamAtPoint( vCrv[vIso[i].nCrv].first, vIso[i].dParam0) ;
|
||||
|
||||
if ( vIso[i].dParam1 >= dCeil1)
|
||||
vIso[i].dParam1 -= dFloor1 ;
|
||||
else if ( vIso[i].dParam1 <= dFloor1)
|
||||
vIso[i].dParam1 += nSpanU1 - dCeil1 ;
|
||||
else
|
||||
CrvU1.GetParamAtPoint( vCrv[vIso[i].nCrv].second, vIso[i].dParam1) ;
|
||||
}
|
||||
}
|
||||
else {
|
||||
vIso.emplace_back( -1, 0, 0) ;
|
||||
rotate( vIso.begin(), vIso.begin() + ssize(vIso) - 1, vIso.end()) ;
|
||||
}
|
||||
|
||||
// se manca aggiungo la coppia finale
|
||||
if ( vIso.back().dParam0 != nSpanU0 || vIso.back().dParam1 != nSpanU1)
|
||||
vIso.emplace_back( -1, nSpanU0, nSpanU1) ;
|
||||
|
||||
// scorro vIso per verificare che non ci siano curve che si intersecano
|
||||
int c = 0 ;
|
||||
dLastParam0 = vIso[c].dParam0 ;
|
||||
@@ -5969,9 +6043,22 @@ SurfBezier::CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, c
|
||||
if ( vIso[0].dParam0 > 0 || vIso[0].dParam1 > 0)
|
||||
vPairs.emplace_back( 0, 0) ;
|
||||
for ( int i = 0 ; i < ssize( vIso) ; ++i) {
|
||||
const BIPOINT& pCrv = vCrv[vIso[i].nCrv] ;
|
||||
Point3d ptU0 = pCrv.first ;
|
||||
Point3d ptU1 = pCrv.second ;
|
||||
Point3d ptU0, ptU1 ;
|
||||
if ( vIso[i].nCrv != -1) {
|
||||
const BIPOINT& pCrv = vCrv[vIso[i].nCrv] ;
|
||||
ptU0 = pCrv.first ;
|
||||
ptU1 = pCrv.second ;
|
||||
}
|
||||
else {
|
||||
if ( vIso[i].dParam0 == 0 && vIso[i].dParam1 == 0) {
|
||||
CrvU0.GetStartPoint( ptU0) ;
|
||||
CrvU1.GetStartPoint( ptU1) ;
|
||||
}
|
||||
else {
|
||||
CrvU0.GetEndPoint( ptU0) ;
|
||||
CrvU1.GetEndPoint( ptU1) ;
|
||||
}
|
||||
}
|
||||
double& dParam0 = vIso[i].dParam0 ;
|
||||
double& dParam1 = vIso[i].dParam1 ;
|
||||
// se sono vicino ad un'intero allora considero il parametro intero ( uno split già esistente)
|
||||
@@ -6127,11 +6214,11 @@ SurfBezier::CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, c
|
||||
nSpanU0 = CrvU0.GetCurveCount() ;
|
||||
nSpanU1 = CrvU1.GetCurveCount() ;
|
||||
// aggiungo l'ultima coppia se necessario
|
||||
if ( vPairs.back().first != nSpanU0 && vPairs.back().second != nSpanU1)
|
||||
if ( vPairs.back().first != nSpanU0 || vPairs.back().second != nSpanU1)
|
||||
vPairs.emplace_back( nSpanU0, nSpanU1) ;
|
||||
|
||||
// trovo il numero di span che dovrà avere la superficie
|
||||
int nSpanU = int(vPairs.size()) - 1 ;
|
||||
int nSpanU = int( vPairs.size()) - 1 ;
|
||||
|
||||
int nSecondRowInd = nDegU * nSpanU + 1 ;
|
||||
// inizializzo la superficie
|
||||
|
||||
+1
-1
@@ -118,7 +118,7 @@ class SurfBezier : public ISurfBezier, public IGeoObjRW
|
||||
const SurfTriMesh* GetAuxSurfRefined( void) const override ;
|
||||
SurfTriMesh* GetApproxSurf( double dTol, double dSideMin = 10 * EPS_SMALL, bool bUpdateEdges = false) const override ;
|
||||
// funzione per ottenere la suddivisione dello spazio parametrico nelle celle utilizzate per la triangolazione.
|
||||
bool GetLeaves( std::vector<std::tuple<int, Point3d, Point3d>>& vLeaves) const override ;
|
||||
bool GetLeaves( std::vector<std::tuple<int, Point3d, Point3d>>& vLeaves, bool bRefined = false) const override ;
|
||||
bool GetTriangles2D( std::vector<std::tuple<int,Point3d, Point3d, Point3d>>& vTria2D) const override ;
|
||||
// funzioni che servono per ricavare l'immagine nel parametrico di un punto appartenente alla trimesh ausiliaria della superficie di Bezier
|
||||
bool UnprojectPointFromStm( int nT, const Point3d& ptI, Point3d& ptSP, int nIL = IntLineTriaType::ILTT_IN) const override ;
|
||||
|
||||
Reference in New Issue
Block a user