EgtGeomKernel :
- aggiunta limitazione alla creazione di una surf bezier tramite revolve nel caso in cui la curva attraversi l'asse di rivoluzione.
This commit is contained in:
+1
-1
@@ -261,7 +261,7 @@ GetSurfBezierByRevolve( const ICurve* pCurve, const Point3d& ptAx, const Vector3
|
||||
//-------------------------------------------------------------------------------
|
||||
ISurfBezier*
|
||||
GetSurfBezierByScrewing( const ICurve* pCurve, const Point3d& ptAx, const Vector3d& vtAx,
|
||||
double dAngRotDeg, double dMove, bool bCapEnds, double dLinTol) //// ANCORA DA SISTEMARE////
|
||||
double dAngRotDeg, double dMove, bool bCapEnds, double dLinTol)
|
||||
{
|
||||
// verifica parametri
|
||||
if ( pCurve == nullptr || &ptAx == nullptr || &vtAx == nullptr)
|
||||
|
||||
+25
-1
@@ -23,7 +23,6 @@
|
||||
#include "Tree.h"
|
||||
#include "Triangulate.h"
|
||||
#include "SurfTriMesh.h"
|
||||
#include "DistPointLine.h"
|
||||
#include "/EgtDev/Include/EGkSfrCreate.h"
|
||||
#include "/EgtDev/Include/EGkStmFromTriangleSoup.h"
|
||||
#include "/EgtDev/Include/EGkStringUtils3d.h"
|
||||
@@ -34,6 +33,7 @@
|
||||
#include "/EgtDev/Include/EGkChainCurves.h"
|
||||
#include "/EgtDev/Include/EGkIntersLineSurfBez.h"
|
||||
#include "/EgtDev/Include/EGkDistPointSurfTm.h"
|
||||
#include "/EgtDev/Include/EGkDistPointLine.h"
|
||||
#include "/EgtDev/Include/EGkCurveComposite.h"
|
||||
#include "/EgtDev/Include/EGkCurveArc.h"
|
||||
#include "/EgtDev/Include/EGkGeoPoint3d.h"
|
||||
@@ -3454,6 +3454,30 @@ SurfBezier::CreateByScrewing( const ICurve* pCurve, const Point3d& ptAx, const V
|
||||
if ( bOnlyRev && abs( dAngRotDeg) > ANG_FULL)
|
||||
dAngRotDeg = _copysign( ANG_FULL, dAngRotDeg) ;
|
||||
|
||||
// se sto facendo una rivoluzione e la curva è piana faccio un controllo
|
||||
// se la curva attraversa l'asse allora mi fermo
|
||||
if ( dMove < EPS_SMALL ) {
|
||||
Plane3d plPlane ;
|
||||
if ( pCurve->IsFlat(plPlane, false, EPS_SMALL) ) {
|
||||
PtrOwner<ICurveLine> pAx( CreateCurveLine()) ;
|
||||
pAx->Set( ptAx - vtAx * 5e5, ptAx + vtAx * 5e5) ;
|
||||
IntersCurveCurve icc( *pCurve, *pAx) ;
|
||||
Point3d ptStart ; pCurve->GetStartPoint( ptStart) ;
|
||||
Point3d ptEnd ; pCurve->GetStartPoint( ptEnd) ;
|
||||
int nPrevType = 0 ;
|
||||
for ( int i = 0 ; i < int(icc.GetIntersCount()) ; ++i) {
|
||||
IntCrvCrvInfo iccInfo ;
|
||||
icc.GetIntCrvCrvInfo( i, iccInfo) ;
|
||||
// se è il punto di inizio o di fine va bene e procedo
|
||||
if ( AreSamePointApprox( ptStart, iccInfo.IciA[0].ptI) || AreSamePointApprox( ptEnd, iccInfo.IciA[0].ptI))
|
||||
continue ;
|
||||
// se la curva oltrepassa l'asse allora mi fermo, se tocca l'asse, ma resta dallo stesso lato, allora vado avanti
|
||||
if ( iccInfo.IciA->nPrevTy != iccInfo.IciA->nNextTy)
|
||||
return nullptr ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// converto in bezier la curva iniziale
|
||||
PtrOwner<ICurveComposite> pCrvU ( CreateCurveComposite()) ;
|
||||
pCrvU->AddCurve( CurveToBezierCurve( pCurve)) ;
|
||||
|
||||
Reference in New Issue
Block a user