EgtGeomKernel 1.4l2 : Aggiunte ApproxWithLines su Curve Semplici.

This commit is contained in:
Dario Sassi
2013-12-21 16:18:29 +00:00
parent 6287c113b4
commit 30f8c71894
21 changed files with 548 additions and 105 deletions
+55 -49
View File
@@ -200,12 +200,16 @@ OutScl::SetPartLayRef( string sPart, string sLay, const Frame3d& frFrame)
//----------------------------------------------------------------------------
bool
OutScl::Line2P( Point3d ptP1, Point3d ptP2)
OutScl::Line2P( const Point3d& ptP1, const Point3d& ptP2)
{
// verifico sia aperto
if ( ! m_ofFile.is_open())
return false ;
// verifico non sia praticamente nulla
if ( AreSamePointNear( ptP1, ptP2))
return true ;
// emetto linea
m_ofFile << "Line3D( \"" << m_sPartLay << "\", \"" << m_sMaterial << "\", " ;
m_ofFile << ToString( ptP1) << ", " << ToString( ptP2) ;
@@ -216,7 +220,7 @@ OutScl::Line2P( Point3d ptP1, Point3d ptP2)
//----------------------------------------------------------------------------
bool
OutScl::Arc3P( Point3d ptP1, Point3d ptP2, Point3d ptP3)
OutScl::Arc3P( const Point3d& ptP1, const Point3d& ptP2, const Point3d& ptP3)
{
// verifico sia aperto
if ( ! m_ofFile.is_open())
@@ -232,7 +236,7 @@ OutScl::Arc3P( Point3d ptP1, Point3d ptP2, Point3d ptP3)
//----------------------------------------------------------------------------
bool
OutScl::ArcCPA( Point3d ptCen, Point3d ptMed, double dAngCenDeg)
OutScl::ArcCPA( const Point3d& ptCen, const Point3d& ptMed, double dAngCenDeg)
{
Point3d ptP1 ;
Point3d ptP3 ;
@@ -256,6 +260,22 @@ OutScl::ArcCPA( Point3d ptCen, Point3d ptMed, double dAngCenDeg)
return true ;
}
//----------------------------------------------------------------------------
bool
OutScl::CircleCR( const Point3d& ptCen, double dRad)
{
// verifico sia aperto
if ( ! m_ofFile.is_open())
return false ;
// emetto arco
m_ofFile << "CircCR( \"" << m_sPartLay << "\", \"" << m_sMaterial << "\", " ;
m_ofFile << ToString( ptCen.x) << "," << ToString( ptCen.y) << ", " << ToString( dRad) ;
m_ofFile << ") ;" << endl ;
return true ;
}
//----------------------------------------------------------------------------
bool
OutScl::PutCurve( const IGeoObj* pCurve, int nFlag)
@@ -292,44 +312,34 @@ OutScl::PutCurveLine( const ICurveLine& CrvLine)
bool
OutScl::PutCurveArc( const ICurveArc& CrvArc, int nFlag)
{
const double DELTA_ANG = 15 ;
int nNumSeg ;
int i ;
double dU ;
double dCurv ;
Point3d ptIni ;
Point3d ptFin ;
Vector3d vtT ;
Vector3d vtN ;
int i ;
double dU ;
double dCurv ;
Point3d ptFin ;
Vector3d vtT ;
Vector3d vtN ;
UPNTVECTOR vUPoints ;
// numero segmenti con cui approssimare
nNumSeg = (int) ( fabs( CrvArc.GetAngCenter()) / DELTA_ANG) + 1 ;
// ciclo sui segmenti
Remark( "CurveArc") ;
for ( i = 0 ; i <= nNumSeg ; ++ i) {
// ricavo il punto
dU = i / (double) nNumSeg ;
CrvArc.GetPoint( dU, ptFin) ;
// dopo il primo, disegno
if ( i > 0)
Line2P( ptIni, ptFin) ;
// nuovo iniziale prende i valori del finale
ptIni = ptFin ;
CrvArc.ApproxWithLines( 0.1, 5, vUPoints) ;
for ( i = 1 ; i < (int) vUPoints.size() ; ++ i) {
Line2P( vUPoints[i-1].second, vUPoints[i].second) ;
}
// se richieste derivate e curvature
if ( ( nFlag & 1) != 0) {
// ciclo per disegnare le derivate
Remark( "ArcTangents+Der2") ;
for ( i = 0 ; i <= nNumSeg ; ++ i) {
for ( i = 0 ; i < (int) vUPoints.size() ; ++ i) {
// ricavo il punto
dU = i / (double) nNumSeg ;
dU = vUPoints[i].first ;
CrvArc.GetPointTangNormCurv( dU, ptFin, vtT, vtN, dCurv) ;
// tangente
Line2P( ptFin - vtT, ptFin + vtT) ;
// curvatura
if ( fabs( dCurv) > EPS_ZERO)
Line2P( ptFin, ptFin + vtN * ( 1 / dCurv)) ;
Line2P( ptFin, ptFin + vtN / dCurv) ;
}
}
@@ -340,17 +350,16 @@ OutScl::PutCurveArc( const ICurveArc& CrvArc, int nFlag)
bool
OutScl::PutCurveBez( const ICurveBezier& CrvBez, int nFlag)
{
const int NUM_SEG = 20 ;
bool bCCW ;
int i ;
double dU ;
double dCurv ;
double dAngCenDeg ;
Point3d ptIni ;
Point3d ptFin ;
Point3d ptCen ;
Vector3d vtT ;
Vector3d vtN ;
bool bCCW ;
int i ;
double dU ;
double dCurv ;
double dAngCenDeg ;
Point3d ptFin ;
Point3d ptCen ;
Vector3d vtT ;
Vector3d vtN ;
UPNTVECTOR vUPoints ;
// se richiesto anche il poligono di controllo
@@ -359,28 +368,22 @@ OutScl::PutCurveBez( const ICurveBezier& CrvBez, int nFlag)
// ciclo per disegnare i segmenti
Remark( "BezierCurve") ;
for ( i = 0 ; i <= NUM_SEG ; ++ i) {
// ricavo il punto
dU = i / (double) NUM_SEG ;
CrvBez.GetPoint( dU, ptFin) ;
// dopo il primo, disegno
if ( i > 0)
Line2P( ptIni, ptFin) ;
// nuovo iniziale prende i valori del finale
ptIni = ptFin ;
CrvBez.ApproxWithLines( 0.1, 5, vUPoints) ;
for ( i = 1 ; i < (int) vUPoints.size() ; ++ i) {
Line2P( vUPoints[i-1].second, vUPoints[i].second) ;
}
// se richieste derivate e curvature
if ( ( nFlag & 1) != 0) {
// ciclo per disegnare le derivate e le curvature
Remark( "BezierTangents+Der2") ;
for ( i = 0 ; i <= NUM_SEG ; ++ i) {
for ( i = 0 ; i < (int) vUPoints.size() ; ++ i) {
// ricavo il punto
dU = i / (double) NUM_SEG ;
dU = vUPoints[i].first ;
CrvBez.GetPointTangNormCurv( dU, ptFin, vtT, vtN, dCurv) ;
// curvatura
if ( fabs( dCurv) > EPS_ZERO) {
// tratto di arco
ptCen = ptFin + vtN * ( 1 / dCurv) ;
ptCen = ptFin + vtN / dCurv ;
bCCW = ( vtT ^ vtN).z > 0 ;
dAngCenDeg = ( bCCW ? 1 : -1) * 4 * dCurv * RADTODEG ;
ArcCPA( ptCen, ptFin, dAngCenDeg) ;
@@ -390,6 +393,9 @@ OutScl::PutCurveBez( const ICurveBezier& CrvBez, int nFlag)
// altrimenti, tangente
else if ( ! vtT.IsSmall())
Line2P( ptFin - vtT, ptFin + vtT) ;
// altrimenti cerchietto
else
CircleCR( ptFin, 1) ;
}
}