6c14e51ef6
- aggiunte funzioni per circonferenze e archi tangenti.
134 lines
4.8 KiB
C++
134 lines
4.8 KiB
C++
//----------------------------------------------------------------------------
|
|
// EgalTech 2014-2015
|
|
//----------------------------------------------------------------------------
|
|
// File : ArcSpecial.cpp Data : 15.03.15 Versione : 1.6c2
|
|
// Contenuto : Implementazione funzioni per calcoli speciali archi.
|
|
//
|
|
//
|
|
//
|
|
// Modifiche : 12.06.14 DS Creazione modulo.
|
|
//
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
//--------------------------- Include ----------------------------------------
|
|
#include "stdafx.h"
|
|
#include "CreateCurveAux.h"
|
|
#include "/EgtDev/Include/EgkCurveLine.h"
|
|
#include "/EgtDev/Include/EgkArcSpecial.h"
|
|
#include "/EgtDev/Include/EgtPointerOwner.h"
|
|
|
|
using namespace std ;
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Come la CurveArc::Set2PD, ma se raggio infinito restituisce una retta
|
|
//----------------------------------------------------------------------------
|
|
ICurve*
|
|
GetArc2PD( const Point3d& ptStart, const Point3d& ptEnd, double dDirStartDeg)
|
|
{
|
|
// creo l'oggetto arco
|
|
ICurveArc* pArc = CreateCurveArc() ;
|
|
if ( pArc == nullptr)
|
|
return nullptr ;
|
|
// inizializzo il puntatore a curva con l'arco
|
|
PtrOwner<ICurve> pCrv( pArc) ;
|
|
|
|
// calcolo l'arco, se ok lo restituisco ed esco
|
|
if ( pArc->Set2PD( ptStart, ptEnd, dDirStartDeg))
|
|
return Release( pCrv) ;
|
|
|
|
// calcolo arco non riuscito, verifico se retta va bene
|
|
Vector3d vtDiff = ptEnd - ptStart ;
|
|
vtDiff.z = 0 ;
|
|
Vector3d vtDir = FromPolar( 1, dDirStartDeg) ;
|
|
// verifico se i punti sono allineati con la direzione e nel giusto verso
|
|
if ( fabs( CrossXY( vtDiff, vtDir)) < EPS_SMALL && ScalarXY( vtDiff, vtDir) > EPS_SMALL) {
|
|
// creo l'oggetto retta
|
|
ICurveLine* pLine = CreateCurveLine() ;
|
|
if ( pLine == nullptr)
|
|
return nullptr ;
|
|
// inizializzo il puntatore a curva con la retta
|
|
pCrv.Set( pLine) ;
|
|
// calcolo retta, se ok la restituisco ed esco
|
|
if ( pLine->Set( ptStart, ptEnd))
|
|
return Release( pCrv) ;
|
|
}
|
|
|
|
return nullptr ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Come la CurveArc::Set2PVN, ma se raggio infinito restituisce una retta
|
|
//----------------------------------------------------------------------------
|
|
ICurve*
|
|
GetArc2PVN( const Point3d& ptStart, const Point3d& ptEnd, const Vector3d& vtDirS, const Vector3d& vtN)
|
|
{
|
|
// creo l'oggetto arco
|
|
ICurveArc* pArc = CreateCurveArc() ;
|
|
if ( pArc == nullptr)
|
|
return nullptr ;
|
|
// inizializzo il puntatore a curva con l'arco
|
|
PtrOwner<ICurve> pCrv( pArc) ;
|
|
|
|
// calcolo l'arco, se ok lo restituisco ed esco
|
|
if ( pArc->Set2PVN( ptStart, ptEnd, vtDirS, vtN))
|
|
return Release( pCrv) ;
|
|
|
|
// calcolo arco non riuscito, verifico se retta va bene
|
|
Vector3d vtDiff = ptEnd - ptStart ;
|
|
vtDiff.z = 0 ;
|
|
// verifico se i punti sono allineati con la direzione e nel giusto verso
|
|
if ( fabs( CrossXY( vtDiff, vtDirS)) < EPS_SMALL && ScalarXY( vtDiff, vtDirS) > EPS_SMALL) {
|
|
// creo l'oggetto retta
|
|
ICurveLine* pLine = CreateCurveLine() ;
|
|
if ( pLine == nullptr)
|
|
return nullptr ;
|
|
// inizializzo il puntatore a curva con la retta
|
|
pCrv.Set( pLine) ;
|
|
// calcolo retta, se ok la restituisco ed esco
|
|
if ( pLine->Set( ptStart, ptEnd))
|
|
return Release( pCrv) ;
|
|
}
|
|
|
|
return nullptr ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Come la CurveArc::Set3P, ma se raggio infinito restituisce una retta
|
|
//----------------------------------------------------------------------------
|
|
ICurve*
|
|
GetArc3P( const Point3d& ptStart, const Point3d& ptOther, const Point3d& ptEnd, bool bCirc)
|
|
{
|
|
// creo l'oggetto arco
|
|
ICurveArc* pArc = CreateCurveArc() ;
|
|
if ( pArc == nullptr)
|
|
return nullptr ;
|
|
// inizializzo il puntatore a curva con l'arco
|
|
PtrOwner<ICurve> pCrv( pArc) ;
|
|
|
|
// calcolo l'arco, se ok lo restituisco ed esco
|
|
if ( pArc->Set3P( ptStart, ptOther, ptEnd, bCirc))
|
|
return Release( pCrv) ;
|
|
|
|
// se era richiesta una circonferenza, errore
|
|
if ( bCirc)
|
|
return nullptr ;
|
|
|
|
// calcolo arco non riuscito, se i punti sono allineati nel giusto verso per essere una retta
|
|
// verifico se i punti sono allineati nel giusto verso
|
|
if ( ( ptOther - ptStart) * ( ptEnd - ptOther) > EPS_ZERO) {
|
|
// creo l'oggetto retta
|
|
ICurveLine* pLine = CreateCurveLine() ;
|
|
if ( pLine == nullptr)
|
|
return nullptr ;
|
|
// inizializzo il puntatore a curva con la retta
|
|
pCrv.Set( pLine) ;
|
|
// calcolo retta, se ok la restituisco ed esco
|
|
if ( pLine->Set( ptStart, ptEnd))
|
|
return Release( pCrv) ;
|
|
}
|
|
|
|
return nullptr ;
|
|
}
|