EgtGeomKernel 1.4l3 : Modifiche a ApproxWithLines anche per CurveComposite.
Aggiunta classe PolyLine.
This commit is contained in:
+93
-72
@@ -276,6 +276,35 @@ OutScl::CircleCR( const Point3d& ptCen, double dRad)
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
OutScl::ArcCurvOrTgOrNone( const Point3d& ptFin, const Vector3d& vtT, const Vector3d& vtN, double dCurv)
|
||||
{
|
||||
bool bCCW ;
|
||||
double dAngCenDeg ;
|
||||
Point3d ptCen ;
|
||||
|
||||
|
||||
// curvatura
|
||||
if ( fabs( 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) ;
|
||||
// raggio
|
||||
Line2P( ptFin, ptCen) ;
|
||||
}
|
||||
// altrimenti, tangente
|
||||
else if ( ! vtT.IsSmall())
|
||||
Line2P( ptFin - vtT, ptFin + vtT) ;
|
||||
// altrimenti cerchietto
|
||||
else
|
||||
CircleCR( ptFin, 1) ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
OutScl::PutCurve( const IGeoObj* pCurve, int nFlag)
|
||||
@@ -312,34 +341,31 @@ OutScl::PutCurveLine( const ICurveLine& CrvLine)
|
||||
bool
|
||||
OutScl::PutCurveArc( const ICurveArc& CrvArc, int nFlag)
|
||||
{
|
||||
int i ;
|
||||
double dU ;
|
||||
double dCurv ;
|
||||
Point3d ptFin ;
|
||||
Vector3d vtT ;
|
||||
Vector3d vtN ;
|
||||
UPNTVECTOR vUPoints ;
|
||||
bool bFound ;
|
||||
double dU ;
|
||||
double dCurv ;
|
||||
Point3d ptIni ;
|
||||
Point3d ptFin ;
|
||||
Vector3d vtT ;
|
||||
Vector3d vtN ;
|
||||
PolyLine PL ;
|
||||
|
||||
|
||||
// ciclo sui segmenti
|
||||
Remark( "CurveArc") ;
|
||||
CrvArc.ApproxWithLines( 0.1, 5, vUPoints) ;
|
||||
for ( i = 1 ; i < (int) vUPoints.size() ; ++ i) {
|
||||
Line2P( vUPoints[i-1].second, vUPoints[i].second) ;
|
||||
CrvArc.ApproxWithLines( 0.1, 5, PL) ;
|
||||
for ( bFound = PL.GetFirstLine( ptIni, ptFin) ; bFound ; bFound = PL.GetNextLine( ptIni, ptFin)) {
|
||||
Line2P( ptIni, ptFin) ;
|
||||
}
|
||||
// se richieste derivate e curvature
|
||||
if ( ( nFlag & 1) != 0) {
|
||||
// ciclo per disegnare le derivate
|
||||
Remark( "ArcTangents+Der2") ;
|
||||
for ( i = 0 ; i < (int) vUPoints.size() ; ++ i) {
|
||||
// ricavo il punto
|
||||
dU = vUPoints[i].first ;
|
||||
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) ;
|
||||
// tangente
|
||||
Line2P( ptFin - vtT, ptFin + vtT) ;
|
||||
// curvatura
|
||||
if ( fabs( dCurv) > EPS_ZERO)
|
||||
Line2P( ptFin, ptFin + vtN / dCurv) ;
|
||||
// curvatura o tangente o niente
|
||||
ArcCurvOrTgOrNone( ptFin, vtT, vtN, dCurv) ;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -350,16 +376,14 @@ OutScl::PutCurveArc( const ICurveArc& CrvArc, int nFlag)
|
||||
bool
|
||||
OutScl::PutCurveBez( const ICurveBezier& CrvBez, int nFlag)
|
||||
{
|
||||
bool bCCW ;
|
||||
int i ;
|
||||
double dU ;
|
||||
double dCurv ;
|
||||
double dAngCenDeg ;
|
||||
Point3d ptFin ;
|
||||
Point3d ptCen ;
|
||||
Vector3d vtT ;
|
||||
Vector3d vtN ;
|
||||
UPNTVECTOR vUPoints ;
|
||||
bool bFound ;
|
||||
double dU ;
|
||||
double dCurv ;
|
||||
Point3d ptIni ;
|
||||
Point3d ptFin ;
|
||||
Vector3d vtT ;
|
||||
Vector3d vtN ;
|
||||
PolyLine PL ;
|
||||
|
||||
|
||||
// se richiesto anche il poligono di controllo
|
||||
@@ -368,34 +392,19 @@ OutScl::PutCurveBez( const ICurveBezier& CrvBez, int nFlag)
|
||||
|
||||
// ciclo per disegnare i segmenti
|
||||
Remark( "BezierCurve") ;
|
||||
CrvBez.ApproxWithLines( 0.1, 5, vUPoints) ;
|
||||
for ( i = 1 ; i < (int) vUPoints.size() ; ++ i) {
|
||||
Line2P( vUPoints[i-1].second, vUPoints[i].second) ;
|
||||
CrvBez.ApproxWithLines( 0.1, 5, PL) ;
|
||||
for ( bFound = PL.GetFirstLine( ptIni, ptFin) ; bFound ; bFound = PL.GetNextLine( ptIni, ptFin)) {
|
||||
Line2P( ptIni, ptFin) ;
|
||||
}
|
||||
// se richieste derivate e curvature
|
||||
if ( ( nFlag & 1) != 0) {
|
||||
// ciclo per disegnare le derivate e le curvature
|
||||
Remark( "BezierTangents+Der2") ;
|
||||
for ( i = 0 ; i < (int) vUPoints.size() ; ++ i) {
|
||||
// ricavo il punto
|
||||
dU = vUPoints[i].first ;
|
||||
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) ;
|
||||
// curvatura
|
||||
if ( fabs( 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) ;
|
||||
// raggio
|
||||
Line2P( ptFin, ptCen) ;
|
||||
}
|
||||
// altrimenti, tangente
|
||||
else if ( ! vtT.IsSmall())
|
||||
Line2P( ptFin - vtT, ptFin + vtT) ;
|
||||
// altrimenti cerchietto
|
||||
else
|
||||
CircleCR( ptFin, 1) ;
|
||||
// curvatura o tangente o niente
|
||||
ArcCurvOrTgOrNone( ptFin, vtT, vtN, dCurv) ;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -413,11 +422,11 @@ OutScl::PutPolygBez( const ICurveBezier& CrvBez)
|
||||
|
||||
// ciclo per disegnare il poligono di controllo
|
||||
Remark( "BezierPolygon") ;
|
||||
for ( i = 0 ; i <= CrvBez.GetDegree() ; ++ i) {
|
||||
ptIni = CrvBez.GetControlPoint( 0) ;
|
||||
for ( i = 1 ; i <= CrvBez.GetDegree() ; ++ i) {
|
||||
ptFin = CrvBez.GetControlPoint( i) ;
|
||||
// dopo il primo, disegno
|
||||
if ( i > 0)
|
||||
Line2P( ptIni, ptFin) ;
|
||||
// disegno
|
||||
Line2P( ptIni, ptFin) ;
|
||||
// nuovo iniziale prende i valori del finale
|
||||
ptIni = ptFin ;
|
||||
}
|
||||
@@ -429,27 +438,39 @@ OutScl::PutPolygBez( const ICurveBezier& CrvBez)
|
||||
bool
|
||||
OutScl::PutCurveCompo( const ICurveComposite& CrvCompo, int nFlag)
|
||||
{
|
||||
const ICurve* pCrvSmpl ;
|
||||
bool bFound ;
|
||||
double dU ;
|
||||
double dCurv ;
|
||||
Point3d ptIni ;
|
||||
Point3d ptFin ;
|
||||
Vector3d vtT ;
|
||||
Vector3d vtN ;
|
||||
PolyLine PL ;
|
||||
|
||||
|
||||
pCrvSmpl = CrvCompo.GetFirstCurve() ;
|
||||
while ( pCrvSmpl != nullptr) {
|
||||
// scrittura comandi SCL
|
||||
Remark( "CurveComposite") ;
|
||||
// secondo il tipo
|
||||
switch ( pCrvSmpl->GetType()) {
|
||||
case CRV_LINE :
|
||||
PutCurveLine( *::GetCurveLine( pCrvSmpl)) ;
|
||||
break ;
|
||||
case CRV_ARC :
|
||||
PutCurveArc( *::GetCurveArc( pCrvSmpl), nFlag) ;
|
||||
break ;
|
||||
case CRV_BEZ :
|
||||
PutCurveBez( *::GetCurveBezier( pCrvSmpl), nFlag) ;
|
||||
break ;
|
||||
// ciclo per disegnare i segmenti
|
||||
Remark( "CurveComposite") ;
|
||||
CrvCompo.ApproxWithLines( 0.1, 5, PL) ;
|
||||
for ( bFound = PL.GetFirstLine( ptIni, ptFin) ; bFound ; bFound = PL.GetNextLine( ptIni, ptFin)) {
|
||||
Line2P( ptIni, ptFin) ;
|
||||
}
|
||||
// se richieste derivate e curvature
|
||||
if ( ( nFlag & 1) != 0) {
|
||||
// ciclo per disegnare le derivate e le curvature
|
||||
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) ;
|
||||
}
|
||||
}
|
||||
// passo alla successiva
|
||||
pCrvSmpl = CrvCompo.GetNextCurve() ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
|
||||
Reference in New Issue
Block a user