EgtGeomKernel :

- miglioria alla bezier ruled guided.
This commit is contained in:
Daniele Bariletti
2026-02-20 14:54:50 +01:00
parent 9b933bd26d
commit ae8f80d6e9
+74 -12
View File
@@ -46,9 +46,9 @@
#define SAVEFAILEDTRIANGULATION 0
#define SAVEREBUILTISO 0
#define SAVERULEDISO 1
#define SAVERULEDISO 0
#define SAVERULEDGUIDEDISO 0
#define SAVEMATCHCURVES 1
#define SAVEMATCHCURVES 0
#if SAVEFAILEDTRIANGULATION || SAVEREBUILTISO || SAVERULEDISO || SAVERULEDGUIDEDISO || SAVEMATCHCURVES
#include "/EgtDev/Include/EGkGeoObjSave.h"
std::vector<IGeoObj*> vGeo ;
@@ -6263,23 +6263,85 @@ 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) ;
}
}
// scorro vIso per verificare che non ci siano curve che si intersecano
int c = 0 ;
dLastParam0 = vIso[c].dParam0 ;
@@ -6456,11 +6518,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