EgtGeomKernel :
- aggiunti commenti - aggiunte modifiche da implementare ulteriormente per la trinagolazione delle sup bilineari.
This commit is contained in:
@@ -21,6 +21,7 @@
|
||||
#include "SurfFlatRegion.h"
|
||||
#include "IntersLineLine.h"
|
||||
#include "AdjustLoops.h"
|
||||
#include "/EgtDev/Include/EGkDistLineLine.h"
|
||||
#include "/EgtDev/Include/EGkPolyLine.h"
|
||||
#include "/EgtDev/Include/EGkDistPointCurve.h"
|
||||
#include "/EgtDev/Include/EGkCurve.h"
|
||||
@@ -750,6 +751,24 @@ Tree::BuildTree( double dLinTol, double dSideMin, double dSideMax)
|
||||
Point3d ptU = ( 1 - dVLoc) * ptP10P11 + dVLoc * ptP01P00 ;
|
||||
dCurvV = Dist( ptV, ptPSrf) ;
|
||||
dCurvU = Dist( ptU, ptPSrf) ;
|
||||
|
||||
// devo calcolare anche il twist, in caso di bordi rettilinei ( superficie di grado maggiore di 1, ma che in realtà è una bilineare)
|
||||
// NON posso guardare la distanza tra il punto medio delle diagonali e il punto centrale della cella ( uLoc = 0.5, vLoc = 0.5)
|
||||
// posso guardare la distanza tra le due diagonali
|
||||
Point3d ptP00, ptP10, ptP11, ptP01 ;
|
||||
// distanza reale tra i vertici della cella
|
||||
ptP00 = m_mVert[nCToSplit][0] ;
|
||||
ptP10 = m_mVert[nCToSplit][1] ;
|
||||
ptP11 = m_mVert[nCToSplit][2] ;
|
||||
ptP01 = m_mVert[nCToSplit][3] ;
|
||||
|
||||
// da implementare!!!!! serve una valutazione più fine, sennò approssimo la superficie in modo troppo grossolano!!!!
|
||||
DistLineLine dll( ptP00, ptP11, ptP10, ptP01, true, true) ;
|
||||
double dDist = 0 ; dll.GetDist( dDist) ;
|
||||
if ( dDist > max(dCurvU, dCurvV) ) {
|
||||
// devo decidere in quale direzione splittare
|
||||
// dovrei capire in quale delle due direzioni è più torta la superficie
|
||||
}
|
||||
}
|
||||
// faccio un'analisi più fine della curvatura se almeno il grado di una curva di uno dei due parametri è alto e
|
||||
// se sto ancora guardando una cella abbastanza grande
|
||||
@@ -802,7 +821,7 @@ Tree::BuildTree( double dLinTol, double dSideMin, double dSideMax)
|
||||
bVert = true ;
|
||||
}
|
||||
m_mTree[nCToSplit].SetSplitDirVert( bVert) ;
|
||||
Point3d ptP00, ptP10, ptP11, ptP01 ;
|
||||
Point3d ptP00, ptP10, ptP11, ptP01 ;
|
||||
// distanza reale tra i vertici della cella
|
||||
ptP00 = m_mVert[nCToSplit][0] ;
|
||||
ptP10 = m_mVert[nCToSplit][1] ;
|
||||
@@ -953,7 +972,7 @@ Tree::BuildTree( double dLinTol, double dSideMin, double dSideMax)
|
||||
nCToSplit = m_mTree[nCToSplit].m_nChild1 ;
|
||||
}
|
||||
}
|
||||
Balance() ; // da implementare quando dividerò ad un parametro a scelta e non a metà
|
||||
Balance() ; // da implementare quando dividerò ad un parametro a scelta e non a metà // probabilmente mi servirà salvare nella cella il livello di profondità
|
||||
}
|
||||
// bilineare
|
||||
else {
|
||||
@@ -972,7 +991,7 @@ Tree::BuildTree( double dLinTol, double dSideMin, double dSideMax)
|
||||
double dLen3 = Dist( ptP00, ptP01) ;
|
||||
|
||||
bool bVert = false ;
|
||||
// calcolo in quale direzione è meglio dividere in base allo stretch
|
||||
// calcolo in quale direzione è meglio dividere in base allo stretch // in realtà visto che non parametro rispetto alla dimensione nel parametrico, così mi trovo a dividere con un quad-tree
|
||||
Point3d ptPSrfU, ptPSrfV ;
|
||||
double dU = 0, dV = 0 ;
|
||||
double dDistU = 0, dDistV = 0 ;
|
||||
@@ -1035,6 +1054,7 @@ Tree::BuildTree( double dLinTol, double dSideMin, double dSideMax)
|
||||
}
|
||||
else {
|
||||
dErr = 1. / 4. * ( ( ptP00 - ptP01) + ( ptP11 - ptP10)).Len() ;
|
||||
//int dErr2 = 1. / 4. * ( ( ptP10 - ptP01) + ( ptP11 - ptP00)).Len() ; //correzione che mi verrebbe intuitiva, ma che fa dividere la superficie molto di più ( probabilmente troppo)!! quindi probabilmente sbagliata
|
||||
}
|
||||
// se la cella è abbastanza grande da poter essere divisa ancora e devo approssimare meglio, la divido
|
||||
if ( dSideMinVal / 2 >= dSideMin && dSideMaxVal < dSideMax && dErr > dLinTol) {
|
||||
|
||||
Reference in New Issue
Block a user