EgtGeomKernel 1.4l4 : Utilizzo classe CrvPointDiffGeom (geometria differenziale nell'intorno di un punto di una curva).
This commit is contained in:
+29
-32
@@ -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) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user