EgtGeomKernel 1.4l2 : Aggiunte ApproxWithLines su Curve Semplici.
This commit is contained in:
+55
-49
@@ -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) ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user