Merge branch 'master' into NewMakeUniform

This commit is contained in:
Daniele Bariletti
2026-02-23 10:59:22 +01:00
2 changed files with 105 additions and 18 deletions
+104 -17
View File
@@ -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
View File
@@ -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 ;