EgtGeomKernel :
- miglioria alla bezier ruled guided.
This commit is contained in:
+74
-12
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user