EgtGeomKernel :

- migliorata gestione della triangolazione per le bezier.
This commit is contained in:
Daniele Bariletti
2025-11-19 11:24:21 +01:00
parent 2a3f809e4e
commit 3640a17632
+17 -15
View File
@@ -455,10 +455,10 @@ Tree::Split( int nId, double dSplitValue)
{
Cell& cToSplit = m_mTree.at(nId) ;
// controllo che lo split non venga fatto sul lato della cella
if ( ( cToSplit.IsSplitVert() && dSplitValue > cToSplit.GetBottomLeft().x + EPS_SMALL &&
dSplitValue < cToSplit.GetTopRight().x - EPS_SMALL) ||
( ! cToSplit.IsSplitVert() && dSplitValue > cToSplit.GetBottomLeft().y + EPS_SMALL &&
dSplitValue < cToSplit.GetTopRight().y - EPS_SMALL)) {
if ( ( cToSplit.IsSplitVert() && dSplitValue > cToSplit.GetBottomLeft().x + 10 * EPS_SMALL &&
dSplitValue < cToSplit.GetTopRight().x - 10 * EPS_SMALL) ||
( ! cToSplit.IsSplitVert() && dSplitValue > cToSplit.GetBottomLeft().y + 10 * EPS_SMALL &&
dSplitValue < cToSplit.GetTopRight().y - 10 * EPS_SMALL)) {
// quando si implementerà lo split a parametro libero bisognerà impedire che si facciano split troppo vicini al bordo della cella!!!!!!!!!!!!!!!!!!!
cToSplit.m_dSplit = dSplitValue ;
Cell cChild1, cChild2 ;
@@ -746,10 +746,11 @@ Tree::BuildTree( double dLinTol, double dSideMin, double dSideMax)
if ( bSplit) {
pcToSplit->SetSplitDirVert( bVert) ;
// effettuo lo split
Split( nCToSplit) ;
// procedo con lo split del Child1
nCToSplit = pcToSplit->m_nChild1 ;
pcToSplit = &m_mTree[nCToSplit] ;
if ( Split( nCToSplit)) {
// procedo con lo split del Child1
nCToSplit = pcToSplit->m_nChild1 ;
pcToSplit = &m_mTree[nCToSplit] ;
}
}
else {
// sono arrivato ad una cella Leaf, quindi salvo la cella
@@ -858,22 +859,23 @@ Tree::BuildTree( double dLinTol, double dSideMin, double dSideMax)
if ( dSideMinVal / 2 >= dSideMin && dSideMaxVal < dSideMax && dErr > dLinTol) {
pcToSplit->SetSplitDirVert( bVert) ;
// effettuo lo split
Split( nCToSplit) ;
// procedo con lo split del Child1
nCToSplit = pcToSplit->m_nChild1 ;
pcToSplit = &m_mTree[nCToSplit] ;
if ( Split( nCToSplit)){
// procedo con lo split del Child1
nCToSplit = pcToSplit->m_nChild1 ;
pcToSplit = &m_mTree[nCToSplit] ;
}
}
else {
// sono arrivato ad una cella Leaf, quindi salvo la cella
m_vnLeaves.push_back( nCToSplit) ;
pcToSplit->SetProcessed() ;
if ( AreSamePointApprox( ptP00, ptP01) && AreSamePointApprox( ptP10, ptP11))
pcToSplit->m_nCollapsed = Cell::Collapsed::VERT_EDGES ;
else if ( AreSamePointApprox( ptP00, ptP10) && AreSamePointApprox( ptP01, ptP11))
pcToSplit->m_nCollapsed = Cell::Collapsed::HORIZ_EDGES ;
else
else {
pcToSplit->m_nCollapsed = Cell::Collapsed::NO_COLLAPSE ;
m_vnLeaves.push_back( nCToSplit) ;
}
// risalgo i parent finché non trovo il primo Child2 da processare
nCToSplit = pcToSplit->m_nParent ;