From dc082d495efe554fc8ba3a6623c350b4b8c42763 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Fri, 24 May 2024 11:30:04 +0200 Subject: [PATCH] EgtGeomKernel : - aggiunta limitazione alla creazione di una surf bezier tramite revolve nel caso in cui la curva attraversi l'asse di rivoluzione. --- SbzFromCurves.cpp | 2 +- SurfBezier.cpp | 26 +++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/SbzFromCurves.cpp b/SbzFromCurves.cpp index 1459484..9e0bab1 100644 --- a/SbzFromCurves.cpp +++ b/SbzFromCurves.cpp @@ -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) diff --git a/SurfBezier.cpp b/SurfBezier.cpp index a6f1eab..2372437 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -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 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 pCrvU ( CreateCurveComposite()) ; pCrvU->AddCurve( CurveToBezierCurve( pCurve)) ;