From 238c0ae490c239f791c307b7ece150e7644db979 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Thu, 3 Aug 2023 17:32:05 +0200 Subject: [PATCH] =?UTF-8?q?EgtGeomKernel=20:=20-=20corretto=20GetBBox=20di?= =?UTF-8?q?=20SurfFlatRegion=20con=20pi=C3=B9=20parti=20-=20in=20OffsetCur?= =?UTF-8?q?ve=20migliorato=20Migliorato=20angoli=20esterni=20di=20valore?= =?UTF-8?q?=20circa=20180deg.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OffsetCurve.cpp | 29 ++++++++++++++++++++++------- SurfFlatRegion.cpp | 2 +- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/OffsetCurve.cpp b/OffsetCurve.cpp index 9ec0978..466bacb 100644 --- a/OffsetCurve.cpp +++ b/OffsetCurve.cpp @@ -1,7 +1,7 @@ //---------------------------------------------------------------------------- -// EgalTech 2015-2020 +// EgalTech 2015-2023 //---------------------------------------------------------------------------- -// File : OffsetCurve.cpp Data : 10.10.20 Versione : 2.2j2 +// File : OffsetCurve.cpp Data : 03.08.23 Versione : 2.5h1 // Contenuto : Classe per offset avanzato di Curve. // // @@ -9,6 +9,7 @@ // Modifiche : 23.09.15 DS Creazione modulo. // 24.06.19 DS Agg. GetShorterCurve. // 10.10.20 DS Migliorata gestione angoli interni. +// 03.08.23 DS Migliorato riconoscimento angoli esterni di valore circa 180deg. // //---------------------------------------------------------------------------- @@ -865,16 +866,30 @@ CalcAngle( const ICurve* pCrv1, const ICurve* pCrv2, double& dAngDeg) if ( ! vtDir1.GetAngleXY( vtDir2, dAngDeg)) return false ; // se vicino all'angolo piatto, si devono ricalcolare spostandosi un poco - if ( abs( dAngDeg) > ( ANG_STRAIGHT - EPS_ANG_SMALL)) { - // eseguo calcolo spostato + const double MAX_ANG_DELTA = 2 ; + double dAngDelta = abs( abs( dAngDeg) - ANG_STRAIGHT) ; + if ( dAngDelta < MAX_ANG_DELTA) { + // angolo al centro delle curve + double dAngCen1 = 0 ; + if ( pCrv1->GetType() == CRV_ARC) + dAngCen1 = abs( GetBasicCurveArc( pCrv1)->GetAngCenter()) ; + double dAngCen2 = 0 ; + if ( pCrv2->GetType() == CRV_ARC) + dAngCen2 = abs( GetBasicCurveArc( pCrv2)->GetAngCenter()) ; + // determino posizioni spostate double dU1 = 1 ; + if ( dAngCen1 > EPS_ANG_SMALL) { + dU1 = 1 - min( 1.1 * dAngDelta / ( dAngCen1 + dAngCen2), 0.5) ; + } double dU2 = 0 ; + if ( dAngCen2 > EPS_ANG_SMALL) { + dU2 = 0 + min( 1.1 * dAngDelta / ( dAngCen1 + dAngCen2), 0.5) ; + } + // eseguo calcolo spostato Point3d ptDummy ; Vector3d vtDir1b ; Vector3d vtDir2b ; - if ( ! MoveParamToAvoidTg( dU1, ICurve::FROM_MINUS, *pCrv1) || - ! pCrv1->GetPointTang( dU1, ICurve::FROM_MINUS, ptDummy, vtDir1b) || - ! MoveParamToAvoidTg( dU2, ICurve::FROM_PLUS, *pCrv2) || + if ( ! pCrv1->GetPointTang( dU1, ICurve::FROM_MINUS, ptDummy, vtDir1b) || ! pCrv2->GetPointTang( dU2, ICurve::FROM_PLUS, ptDummy, vtDir2b)) return false ; if ( ! vtDir1b.GetAngleXY( vtDir2b, dAngDeg)) diff --git a/SurfFlatRegion.cpp b/SurfFlatRegion.cpp index 69a2942..da62396 100644 --- a/SurfFlatRegion.cpp +++ b/SurfFlatRegion.cpp @@ -597,7 +597,7 @@ SurfFlatRegion::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const // è il bounding box dei loop esterni for ( auto i : m_vExtInd) { BBox3d b3Tmp ; - if ( m_vpLoop[i]->GetBBox( frCompo, b3Ref, nFlag)) + if ( m_vpLoop[i]->GetBBox( frCompo, b3Tmp, nFlag)) b3Ref.Add( b3Tmp) ; } return ( ! b3Ref.IsEmpty()) ;