EgtGeomKernel 1.6h3 :

- migliorata approssimazione curve per riconoscimento di tratti rettilinei
- aggiunta CopyMaterial a GeomDB
- correzioni a IntersCurveCurve per le curve approssimate
- aggiunte a Intervals Union, Intersection e Difference
- correzioni a SelfIntersCurve per curve approssimate
- aggiunte funzioni di creazione Regioni (Rectangle, Stadium, Disk e da zuppa di curve)
- migliorie varie a Regioni e introduzione dei componenti connessi (chunk).
This commit is contained in:
Dario Sassi
2015-08-18 07:30:08 +00:00
parent f4b88af3e1
commit bab45eb4f3
28 changed files with 1049 additions and 346 deletions
+88
View File
@@ -259,6 +259,33 @@ GetPointDiffGeom( const ICurve& crvC, double dU, ICurve::Side nS, CrvPointDiffGe
return true ;
}
//----------------------------------------------------------------------------
bool
ImproveCurveParamAtPoint( double& dU, const Point3d& ptP, const ICurve* pCrv)
{
// Da usare quando il parametro è già molto vicino a quello esatto
// calcolo il punto della curva in corrispondenza al parametro
Point3d ptQ ;
Vector3d vtD ;
if ( ! pCrv->GetPointD1D2( dU, ICurve::FROM_MINUS, ptQ, &vtD))
return false ;
// se sono uguali, è già tutto ok
if ( AreSamePointExact( ptP, ptQ))
return true ;
// se derivata nulla, non posso migliorare
if ( vtD.IsZero())
return false ;
// incremento parametro su linea tangente (uso la derivata)
double dDeltaU = ( ptP - ptQ) * vtD / vtD.SqLen() ;
// se migliorato, tengo nuovo valore
Point3d ptR ;
if ( pCrv->GetPointD1D2( dU + dDeltaU, ICurve::FROM_MINUS, ptR) &&
( ptP - ptR).SqLen() < ( ptP - ptQ).SqLen())
dU += dDeltaU ;
return true ;
}
//----------------------------------------------------------------------------
bool
CurveGetAreaXY( const ICurve& crvC, double& dArea)
@@ -278,6 +305,29 @@ CurveGetAreaXY( const ICurve& crvC, double& dArea)
return true ;
}
//----------------------------------------------------------------------------
bool
CurveGetArea( const ICurve& crvC, Plane3d& plPlane, double& dArea)
{
// verifico sia chiusa
if ( ! crvC.IsClosed())
return false ;
// approssimo la curva con una polilinea
PolyLine PL ;
crvC.ApproxWithLines( LIN_TOL_STD, ANG_TOL_STD_DEG, ICurve::APL_STD, PL) ;
// calcolo l'area
Plane3d plMyPlane ;
double dMyArea = 0 ;
if ( ! PL.IsClosedAndFlat( plMyPlane, dMyArea, 50 * EPS_SMALL))
return false ;
// restituisco i valori
if ( &plPlane != nullptr)
plPlane = plMyPlane ;
if ( &dArea != nullptr)
dArea = dMyArea ;
return true ;
}
//----------------------------------------------------------------------------
bool
CurveDump( const ICurve& crvC, string& sOut, bool bMM, const char* szNewLine)
@@ -646,4 +696,42 @@ NurbsToBezierCurve( const CNurbsData& cnData)
// restituisco la curva composita
return Release( pCrvCompo) ;
}
//----------------------------------------------------------------------------
ICurve*
ProjectCurveOnPlane( const ICurve& crCrv, const Plane3d& plPlane)
{
// determino se curva piana e suo eventuale piano
Plane3d plCrv ;
if ( crCrv.IsFlat( plCrv)) {
// se il piano della curva è parallelo a quello di proiezione
if ( AreSameOrOppositeVectorApprox( plCrv.vtN, plPlane.vtN)) {
// copio la curva
PtrOwner<ICurve> pCrv( crCrv.Clone()) ;
if ( IsNull( pCrv))
return nullptr ;
// se non coincidenti, basta eseguire una traslazione
Point3d ptOC = ORIG + plCrv.dDist * plCrv.vtN ;
Point3d ptOP = ORIG + plPlane.dDist * plPlane.vtN ;
if ( ! AreSamePointApprox( ptOC, ptOP))
pCrv->Translate( ptOP - ptOC) ;
// restituisco la nuova curva
return Release( pCrv) ;
}
}
// mi assicuro che la curva non contenga archi
PtrOwner<ICurve> pCrv( CurveToNoArcsCurve( &crCrv)) ;
if ( IsNull( pCrv))
return nullptr ;
// calcolo un riferimento con piano XY coincidente con il piano di proiezione
Frame3d frRef ;
if ( ! frRef.Set( ORIG + plPlane.dDist * plPlane.vtN, plPlane.vtN))
return nullptr ;
// eseguo scalatura con fattori X e Y unitari e fattore Z nullo
if ( ! pCrv->Scale( frRef, 1, 1, 0))
return nullptr ;
// restituisco la nuova curva
return Release( pCrv) ;
}