EgtGeomKernel 1.4l4 : Utilizzo classe CrvPointDiffGeom (geometria differenziale nell'intorno di un punto di una curva).

This commit is contained in:
Dario Sassi
2013-12-28 18:53:32 +00:00
parent 2cd7dcee57
commit 1161fa5d33
16 changed files with 164 additions and 202 deletions
+29 -32
View File
@@ -278,7 +278,7 @@ OutScl::CircleCR( const Point3d& ptCen, double dRad)
//----------------------------------------------------------------------------
bool
OutScl::ArcCurvOrTgOrNone( const Point3d& ptFin, const Vector3d& vtT, const Vector3d& vtN, double dCurv)
OutScl::ArcCurvOrTgOrNone( const CrvPointDiffGeom& oDiffG)
{
bool bCCW ;
double dAngCenDeg ;
@@ -286,21 +286,21 @@ OutScl::ArcCurvOrTgOrNone( const Point3d& ptFin, const Vector3d& vtT, const Vect
// curvatura
if ( fabs( dCurv) > EPS_ZERO) {
if ( oDiffG.nStatus == CrvPointDiffGeom::NCRV && fabs( oDiffG.dCurv) > EPS_ZERO) {
// tratto di arco
ptCen = ptFin + vtN / dCurv ;
bCCW = ( vtT ^ vtN).z > 0 ;
dAngCenDeg = ( bCCW ? 1 : -1) * 4 * dCurv * RADTODEG ;
ArcCPA( ptCen, ptFin, dAngCenDeg) ;
ptCen = oDiffG.ptP + oDiffG.vtN / oDiffG.dCurv ;
bCCW = ( oDiffG.vtT ^ oDiffG.vtN).z > 0 ;
dAngCenDeg = ( bCCW ? 1 : -1) * 4 * oDiffG.dCurv * RADTODEG ;
ArcCPA( ptCen, oDiffG.ptP, dAngCenDeg) ;
// raggio
Line2P( ptFin, ptCen) ;
Line2P( oDiffG.ptP, ptCen) ;
}
// altrimenti, tangente
else if ( ! vtT.IsSmall())
Line2P( ptFin - vtT, ptFin + vtT) ;
else if ( oDiffG.nStatus == CrvPointDiffGeom::TANG && ! oDiffG.vtT.IsSmall())
Line2P( oDiffG.ptP - oDiffG.vtT, oDiffG.ptP + oDiffG.vtT) ;
// altrimenti cerchietto
else
CircleCR( ptFin, 1) ;
CircleCR( oDiffG.ptP, 1) ;
return true ;
}
@@ -343,12 +343,10 @@ OutScl::PutCurveArc( const ICurveArc& CrvArc, int nFlag)
{
bool bFound ;
double dU ;
double dCurv ;
Point3d ptIni ;
Point3d ptFin ;
Vector3d vtT ;
Vector3d vtN ;
PolyLine PL ;
CrvPointDiffGeom oDiffG ;
// ciclo sui segmenti
@@ -363,9 +361,9 @@ OutScl::PutCurveArc( const ICurveArc& CrvArc, int nFlag)
Remark( "ArcTangents+Der2") ;
for ( bFound = PL.GetFirstU( dU) ; bFound ; bFound = PL.GetNextU( dU)) {
// ricavo il punto, la tangente, la normale e la curvatura
CrvArc.GetPointTangNormCurv( dU, ptFin, vtT, vtN, dCurv) ;
CrvArc.GetPointDiffGeom( dU, ICurve::FROM_MINUS, oDiffG) ;
// curvatura o tangente o niente
ArcCurvOrTgOrNone( ptFin, vtT, vtN, dCurv) ;
ArcCurvOrTgOrNone( oDiffG) ;
}
}
@@ -378,12 +376,10 @@ OutScl::PutCurveBez( const ICurveBezier& CrvBez, int nFlag)
{
bool bFound ;
double dU ;
double dCurv ;
Point3d ptIni ;
Point3d ptFin ;
Vector3d vtT ;
Vector3d vtN ;
PolyLine PL ;
CrvPointDiffGeom oDiffG ;
// se richiesto anche il poligono di controllo
@@ -402,9 +398,9 @@ OutScl::PutCurveBez( const ICurveBezier& CrvBez, int nFlag)
Remark( "BezierTangents+Der2") ;
for ( bFound = PL.GetFirstU( dU) ; bFound ; bFound = PL.GetNextU( dU)) {
// ricavo il punto, la tangente, la normale e la curvatura
CrvBez.GetPointTangNormCurv( dU, ptFin, vtT, vtN, dCurv) ;
CrvBez.GetPointDiffGeom( dU, ICurve::FROM_MINUS, oDiffG) ;
// curvatura o tangente o niente
ArcCurvOrTgOrNone( ptFin, vtT, vtN, dCurv) ;
ArcCurvOrTgOrNone( oDiffG) ;
}
}
@@ -440,12 +436,11 @@ OutScl::PutCurveCompo( const ICurveComposite& CrvCompo, int nFlag)
{
bool bFound ;
double dU ;
double dCurv ;
Point3d ptIni ;
Point3d ptFin ;
Vector3d vtT ;
Vector3d vtN ;
PolyLine PL ;
CrvPointDiffGeom oDiffG ;
CrvPointDiffGeom oDiffGs ;
// ciclo per disegnare i segmenti
@@ -460,15 +455,17 @@ OutScl::PutCurveCompo( const ICurveComposite& CrvCompo, int nFlag)
Remark( "CompositeTangents+Der2") ;
for ( bFound = PL.GetFirstU( dU) ; bFound ; bFound = PL.GetNextU( dU)) {
// ricavo il punto, la tangente, la normale e la curvatura
CrvCompo.GetPointTangNormCurv( dU, ptFin, vtT, vtN, dCurv) ;
// curvatura o tangente o niente
ArcCurvOrTgOrNone( ptFin, vtT, vtN, dCurv) ;
// se alla giunzione tra due curve semplici, calcolo anche appena dopo
if ( CrvCompo.IsParamAtJoint( dU)) {
// ricavo il punto, la tangente, la normale e la curvatura
CrvCompo.GetPointTangNormCurv( dU + EPS_ZERO, ptFin, vtT, vtN, dCurv) ;
// curvatura o tangente o niente
ArcCurvOrTgOrNone( ptFin, vtT, vtN, dCurv) ;
CrvCompo.GetPointDiffGeom( dU, ICurve::FROM_MINUS, oDiffG) ;
// emetto curvatura o tangente o niente
ArcCurvOrTgOrNone( oDiffG) ;
// se punto con possibili discontinuità
if ( oDiffG.nFlag == CrvPointDiffGeom::TO_VERIFY) {
// ricavo il punto, la tangente, la normale e la curvatura dall'intorno superiore
CrvCompo.GetPointDiffGeom( dU, ICurve::FROM_PLUS, oDiffGs) ;
// se ci sono delle discontinuità
if ( ThereIsDiscontinuity( oDiffG, oDiffGs))
// emetto curvatura o tangente o niente
ArcCurvOrTgOrNone( oDiffGs) ;
}
}
}