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:
Daniele Bariletti
2024-05-24 11:30:04 +02:00
parent e8e57ff793
commit dc082d495e
2 changed files with 26 additions and 2 deletions
+1 -1
View File
@@ -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
View File
@@ -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)) ;