Merge remote-tracking branch 'origin/HEAD' into MoreBezier
This commit is contained in:
+3203
-1957
File diff suppressed because it is too large
Load Diff
@@ -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)
|
||||
|
||||
Binary file not shown.
+25
-23
@@ -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]) ;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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)) ;
|
||||
|
||||
Reference in New Issue
Block a user