Merge remote-tracking branch 'origin/HEAD' into MoreBezier

This commit is contained in:
Daniele Bariletti
2024-10-04 15:20:46 +02:00
7 changed files with 3278 additions and 1985 deletions
+3203 -1957
View File
File diff suppressed because it is too large Load Diff
+32
View File
@@ -1940,6 +1940,22 @@ CalcCurveVoronoiDiagram( const ICurve& crvC, ICURVEPOVECTOR& vCrvs, int nBound)
return pVoronoiObj->CalcVoronoiDiagram( vCrvs, nBound) ;
}
//----------------------------------------------------------------------------
bool
CalcCurvesVoronoiDiagram( const CICURVEPVECTOR& vCrvC, ICURVEPOVECTOR& vCrvs, int nBound)
{
// creo oggetto Voronoi con le curve passate
PtrOwner<Voronoi> pVoronoiObj( new( std::nothrow) Voronoi()) ;
if ( pVoronoiObj == nullptr)
return false ;
for ( int i = 0 ; i < int( vCrvC.size()) ; i ++) {
if ( ! pVoronoiObj->AddCurve( vCrvC[i]))
return false ;
}
return pVoronoiObj->CalcVoronoiDiagram( vCrvs, nBound) ;
}
//----------------------------------------------------------------------------
bool
CalcCurveMedialAxis( const ICurve& crvC, ICURVEPOVECTOR& vCrvs, int nSide)
@@ -1951,6 +1967,22 @@ CalcCurveMedialAxis( const ICurve& crvC, ICURVEPOVECTOR& vCrvs, int nSide)
return pVoronoiObj->CalcMedialAxis( vCrvs, nSide) ;
}
//----------------------------------------------------------------------------
bool
CalcCurvesMedialAxis( const CICURVEPVECTOR& vCrvC, ICURVEPOVECTOR& vCrvs, int nSide)
{
// creo oggetto Voronoi con le curve passate
PtrOwner<Voronoi> pVoronoiObj( new( std::nothrow) Voronoi()) ;
if ( pVoronoiObj == nullptr)
return false ;
for ( int i = 0 ; i < int( vCrvC.size()) ; i ++) {
if ( ! pVoronoiObj->AddCurve( vCrvC[i]))
return false ;
}
return pVoronoiObj->CalcMedialAxis( vCrvs, nSide) ;
}
//----------------------------------------------------------------------------
bool
CalcCurveFatCurve( const ICurve& crvC, ICURVEPOVECTOR& vCrvs, double dRadius, bool bSquareEnds, bool bSquareMids)
BIN
View File
Binary file not shown.
+25 -23
View File
@@ -1987,7 +1987,7 @@ SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR&
Point3d pt3DEnd ; pCrv0->GetEndPoint( pt3DEnd) ;
bool bThroughEdge = false ;
BOOLVECTOR vbThroughEdge ;
if ( ! UnprojectPoint(pt3D, pt2D, pt3DEnd, &bThroughEdge, pPlCut))
if ( ! UnprojectPoint( pt3D, pt2D, pt3DEnd, &bThroughEdge, pPlCut))
return false ;
vbThroughEdge.push_back( bThroughEdge) ;
@@ -2034,7 +2034,7 @@ SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR&
return false ;
// se il precedente era passato attraverso l'edge ed era un edge di polo allora devo sistemare le coordinate
if( bPrevIsPole){
if ( bPrevIsPole) {
// se il punto precedente era di polo allora devo correggere le sue coordinate 2D
if ( bHorizontalPole)
pt2DPrev.x = pt2D.x ;
@@ -2045,12 +2045,12 @@ SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR&
vtDir.Normalize() ;
// se mi accorgo che sto per tracciare un taglio lungo un bordo posso semplicemente evitarlo
double dDelta = 10 * EPS_SMALL ;
if ( (1 - abs(vtDir.x) < SQ_EPS_SMALL && (pt2D.y < dDelta || m_nSpanV * SBZ_TREG_COEFF - pt2D.y < dDelta)) || // parallelo agli edge 0 e 2 e su uno di questi
(1 - abs(vtDir.y) < SQ_EPS_SMALL && (pt2D.x < dDelta || m_nSpanU * SBZ_TREG_COEFF - pt2D.x < dDelta))) { // parallello agli edge 1 e 3 e su uno di questi
if ( ( 1 - abs( vtDir.x) < SQ_EPS_SMALL && ( pt2D.y < dDelta || m_nSpanV * SBZ_TREG_COEFF - pt2D.y < dDelta)) || // parallelo agli edge 0 e 2 e su uno di questi
( 1 - abs( vtDir.y) < SQ_EPS_SMALL && ( pt2D.x < dDelta || m_nSpanU * SBZ_TREG_COEFF - pt2D.x < dDelta))) { // parallello agli edge 1 e 3 e su uno di questi
++ nRejected ;
continue ;
}
if ( bThroughEdge && vbThroughEdge.back()) {
if ( bThroughEdge && vbThroughEdge.back()) {
double dParamH, dParamL ;
dParamH = m_nSpanV * SBZ_TREG_COEFF ;
dParamL = m_nSpanU * SBZ_TREG_COEFF ;
@@ -2058,8 +2058,8 @@ SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR&
// ( i punti per periodicità hanno coordinate diverse anche se dovrebbero averle uguali, quindi il segmento attraversa tutto lo spazio parametrico, anche se in realtà è lungo il bordo di chiusura)
// potrei star tracciando un taglio sul bordo di chiusura
// controllo se sto tracciando una linea che unisce due lati di chiusura, allora in realtà sdtarei tracciando un taglio sull'edge e quindi posso non tracciarlo
if ( (abs( vtDir.x) > abs( vtDir.y) && Dist( pt2D, pt2DPrev) > dParamL * 0.5) ||
(abs( vtDir.y) > abs( vtDir.x) && Dist( pt2D, pt2DPrev) > dParamH * 0.5)) {
if ( ( abs( vtDir.x) > abs( vtDir.y) && Dist( pt2D, pt2DPrev) > dParamL * 0.5) ||
( abs( vtDir.y) > abs( vtDir.x) && Dist( pt2D, pt2DPrev) > dParamH * 0.5)) {
++ nRejected ;
continue ;
}
@@ -2073,12 +2073,14 @@ SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR&
Point3d ptNear ; pCrv0->GetStartPoint( ptNear) ;
INTVECTOR vId ;
bool bAdded = true ;
while( chainC.GetChainFromNear( pt3D, false, vId)) {
while ( chainC.GetChainFromNear( pt3D, false, vId)) {
PtrOwner<ICurveComposite> pCC2D ( CreateCurveComposite()) ;
if ( IsNull( pCC2D))
return false ;
for ( int i = 0 ; i < int( vId.size()) ; ++ i) {
// creo un segmento di retta
ICurveLine* pLine( CreateCurveLine()) ;
if ( pLine == nullptr)
PtrOwner<ICurveLine> pLine( CreateCurveLine()) ;
if ( IsNull( pLine))
return false ;
// recupero gli estremi (non vanno mai invertiti per opzione di concatenamento)
int nInd = abs( vId[i]) - 1 ;
@@ -2086,12 +2088,12 @@ SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR&
Point3d ptEnd = vBPnt[nInd].second ;
// provo ad accodarlo alla composita
bAdded = ( Dist( ptStart, ptEnd) > dToler / 2 &&
pLine->Set( ptStart, ptEnd)) ;
bAdded = bAdded && pCC2D->AddCurve( pLine, true, dToler) ;
pLine->Set( ptStart, ptEnd)) ;
bAdded = bAdded && pCC2D->AddCurve( Release( pLine), true, dToler) ;
ptNear = ( bAdded ? ptEnd : ptStart) ;
}
if ( pCC2D->IsValid())
vpCC.emplace_back( Release(pCC2D)) ;
vpCC.emplace_back( Release( pCC2D)) ;
}
return true ;
}
@@ -2100,31 +2102,31 @@ SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR&
bool
SurfBezier::AddCurveCompoToCuts( ICurveComposite* pCrvCompo, ICRVCOMPOPOVECTOR& vpCCOpen, ICRVCOMPOPOVECTOR& vpCCClosed, double dToler, const Plane3d* pPlCut) const
{
// se lunghezza curva inferiore a 5 volte la tolleranza, la ignoro e sposto il punto finale nel punto di fine della curva che sto ignorando
// se lunghezza curva inferiore a 5 volte la tolleranza, la ignoro e sposto il punto finale nel punto di fine della curva che sto ignorando
double dCrvLen ;
if ( ! pCrvCompo->GetLength( dCrvLen) || dCrvLen < 5. * dToler)
return true ;
// se curva chiusa entro 5 volte la tolleranza ma considerata aperta, la chiudo bene
// se curva chiusa entro 5 volte la tolleranza ma considerata aperta, la chiudo bene
Point3d ptStart, ptEnd ;
if ( pCrvCompo->GetStartPoint( ptStart) &&
pCrvCompo->GetEndPoint( ptEnd) &&
AreSamePointEpsilon( ptStart, ptEnd, 5. * dToler) &&
! AreSamePointApprox( ptStart, ptEnd)) {
// porto il punto finale a coincidere esattamente con l'inizio
pCrvCompo->GetEndPoint( ptEnd) &&
AreSamePointEpsilon( ptStart, ptEnd, 5 * dToler) &&
! AreSamePointApprox( ptStart, ptEnd)) {
// porto il punto finale a coincidere esattamente con l'inizio
pCrvCompo->ModifyEnd( ptStart) ;
}
// unisco segmenti allineati
// unisco segmenti allineati
pCrvCompo->MergeCurves( 0.5 * dToler, ANG_TOL_STD_DEG) ;
// porto la curva nello spazio parametrico
// porto la curva nello spazio parametrico
ICRVCOMPOPVECTOR vCC ;
if ( ! UnprojectCurveFromStm( pCrvCompo, vCC, pPlCut))
return false ;
for ( int i = 0 ; i < int( vCC.size()); ++i) {
// le curve aperte le tengo da parte per giuntarle alla fine col bordo
// le curve aperte le tengo da parte per giuntarle alla fine col bordo
if ( ! vCC[i]->IsClosed() )
vpCCOpen.emplace_back( vCC[i]) ;
// le curve chiuse le metto tutte insieme subito
// le curve chiuse le metto tutte insieme subito
else
vpCCClosed.emplace_back( vCC[i]) ;
}
+13
View File
@@ -1166,6 +1166,19 @@ SurfFlatRegion::GetLoop( int nChunk, int nLoop) const
return pCrv ;
}
//----------------------------------------------------------------------------
int
SurfFlatRegion::GetLoopCurveCount( int nChunk, int nLoop) const
{
// recupero il loop nel riferimento intrinseco
const ICurve* pMyCrv = GetMyLoop( nChunk, nLoop) ;
if ( pMyCrv == nullptr)
return 0 ;
// restituisco il numero di curve di cui è composto
const ICurveComposite* pMyCompo = GetCurveComposite( pMyCrv) ;
return ( pMyCompo == nullptr ? 1 : pMyCompo->GetCurveCount()) ;
}
//----------------------------------------------------------------------------
bool
SurfFlatRegion::ApproxLoopWithLines( int nChunk, int nLoop, double dLinTol, double dAngTolDeg, int nType, PolyLine& PL) const
+1
View File
@@ -109,6 +109,7 @@ class SurfFlatRegion : public ISurfFlatRegion, public IGeoObjRW
int GetChunkSimpleClassification( int nChunk, const ISurfFlatRegion& Other, int nOthChunk) const override ; // compare only outsides
bool GetChunkMaxOffset( int nChunk, double& dOffs) const override ;
int GetLoopCount( int nChunk) const override ;
int GetLoopCurveCount( int nChunk, int nLoop) const override ;
ICurve* GetLoop( int nChunk, int nLoop) const override ; // nChunk 0-based, nLoop 0-based (1°esterno, successivi interni)
bool ApproxLoopWithLines( int nChunk, int nLoop, double dLinTol, double dAngTolDeg, int nType, PolyLine& PL) const override ;
bool SetCurveTempProp( int nChunk, int nLoop, int nCrv, int nProp, int nPropInd = 0) override ;
+4 -5
View File
@@ -734,14 +734,13 @@ Voronoi::CalcVroniOffset( ICRVCOMPOPLIST& OffsList, double dOffs)
if ( j == 0)
pCrvOffs->AddPoint( ptS) ;
// se estremi coincidenti passo alla curva successiva ( da vroni non possono arrivare circonferenze)
if ( AreSamePointApprox( ptS, ptE))
continue ;
bool bOk = false ;
if ( nType == t_site::SEG)
bOk = pCrvOffs->AddLine( ptE) ;
else {
else {
// se estremi coincidenti passo alla curva successiva ( da vroni non possono arrivare circonferenze)
if ( AreSamePointApprox( ptS, ptE))
continue ;
PtrOwner<CurveArc> pArc( CreateBasicCurveArc()) ;
pArc->Set2PRS( ptS, ptE, Dist( ptC, ptS), nType == CCW) ;
bOk = pCrvOffs->AddCurve( Release( pArc)) ;