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:
@@ -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) ;
|
||||
}
|
||||
Reference in New Issue
Block a user