EgtGeomKernel :
- aggiunta funzione per rimozione spikes da curve - utilizzo rimozione spikes in creazione regioni - migliorata gestione linee quasi parallele in intersezione.
This commit is contained in:
@@ -325,6 +325,7 @@ copy $(TargetPath) \EgtProg\Dll64</Command>
|
||||
<ClCompile Include="FontOs.cpp" />
|
||||
<ClCompile Include="OffsetCurveOnX.cpp" />
|
||||
<ClCompile Include="RemoveCurveOverlaps.cpp" />
|
||||
<ClCompile Include="RemoveCurveSpikes.cpp" />
|
||||
<ClCompile Include="SelfIntersCurve.cpp" />
|
||||
<ClCompile Include="SfrCreate.cpp" />
|
||||
<ClCompile Include="SurfFlatRegion.cpp" />
|
||||
@@ -490,6 +491,7 @@ copy $(TargetPath) \EgtProg\Dll64</Command>
|
||||
<ClInclude Include="ObjGraphicsMgr.h" />
|
||||
<ClInclude Include="FontOs.h" />
|
||||
<ClInclude Include="RemoveCurveOverlaps.h" />
|
||||
<ClInclude Include="RemoveCurveSpikes.h" />
|
||||
<ClInclude Include="SurfFlatRegion.h" />
|
||||
<ClInclude Include="TextureData.h" />
|
||||
<ClInclude Include="UserObjDefault.h" />
|
||||
|
||||
@@ -354,6 +354,9 @@
|
||||
<ClCompile Include="VolTriZmapVolume.cpp">
|
||||
<Filter>File di origine\Geo</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="RemoveCurveSpikes.cpp">
|
||||
<Filter>File di origine\GeoInters</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="stdafx.h">
|
||||
@@ -776,6 +779,9 @@
|
||||
<ClInclude Include="IntersLineSurfTm.h">
|
||||
<Filter>File di intestazione</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="RemoveCurveSpikes.h">
|
||||
<Filter>File di intestazione</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="EgtGeomKernel.rc">
|
||||
|
||||
+1
-1
@@ -149,7 +149,7 @@ IntersLineLine::IntersFiniteLines( const ICurveLine& Line1, const ICurveLine& Li
|
||||
// flag per linee parallele
|
||||
bool bParallel = ( fabs( dCrossXY) < SIN_EPS_ANG_ZERO * ( dLen1XY * dLen2XY)) ;
|
||||
// flag per segmenti che si allontanano significativamente
|
||||
bool bFarEnds = ( ( fabs( dCrossXY) > sin( 1 * DEGTORAD) * ( dLen1XY * dLen2XY)) ||
|
||||
bool bFarEnds = ( ( fabs( dCrossXY) > SIN_EPS_ANG_SMALL * ( dLen1XY * dLen2XY)) ||
|
||||
IsPointOutFatSegment( ptS1, ptS2, vtDir2, dLen2XY, EPS_SMALL) ||
|
||||
IsPointOutFatSegment( ptE1, ptS2, vtDir2, dLen2XY, EPS_SMALL) ||
|
||||
IsPointOutFatSegment( ptS2, ptS1, vtDir1, dLen1XY, EPS_SMALL) ||
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
//----------------------------------------------------------------------------
|
||||
// EgalTech 2017-2017
|
||||
//----------------------------------------------------------------------------
|
||||
// File : RemoveCurveSpikes.cpp Data : 02.10.17 Versione : 1.8j1
|
||||
// Contenuto : Implementazione rimozione spikes di curva.
|
||||
//
|
||||
//
|
||||
//
|
||||
// Modifiche : 02.10.17 DS Creazione modulo.
|
||||
//
|
||||
//
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
//--------------------------- Include ----------------------------------------
|
||||
#include "stdafx.h"
|
||||
#include "GeoConst.h"
|
||||
#include "CurveComposite.h"
|
||||
#include "DistPointLine.h"
|
||||
#include "RemoveCurveSpikes.h"
|
||||
#include <algorithm>
|
||||
|
||||
using namespace std ;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
RemoveCurveSpikes( ICurveComposite* pCurve)
|
||||
{
|
||||
// verifico validità curva
|
||||
if ( pCurve == nullptr)
|
||||
return false ;
|
||||
// recupero il numero di curve semplici componenti la composta
|
||||
int nCrvCount = pCurve->GetCurveCount() ;
|
||||
if ( nCrvCount < 2 || ( nCrvCount < 3 && pCurve->IsClosed()))
|
||||
return true ;
|
||||
// ciclo sulle curve elementari della composita
|
||||
int nStart = pCurve->IsClosed() ? 0 : 1 ;
|
||||
for ( int i = nStart ; i < nCrvCount ; ++ i) {
|
||||
// recupero due curve consecutive
|
||||
const ICurve* pPrevCrv = pCurve->GetCurve( ( i > 0 ? i - 1 : nCrvCount - 1)) ;
|
||||
const ICurve* pNextCrv = pCurve->GetCurve( i) ;
|
||||
// se sono entrambe rette
|
||||
if ( pPrevCrv->GetType() == CRV_LINE && pNextCrv->GetType() == CRV_LINE) {
|
||||
// recupero i punti estremi
|
||||
Point3d ptStart ; pPrevCrv->GetStartPoint( ptStart) ;
|
||||
Point3d ptMid ; pPrevCrv->GetEndPoint( ptMid) ;
|
||||
Point3d ptEnd ; pNextCrv->GetEndPoint( ptEnd) ;
|
||||
// recupero le direzioni negli estremi
|
||||
Vector3d vtPrev ; pPrevCrv->GetStartDir( vtPrev) ;
|
||||
Vector3d vtNext ; pNextCrv->GetStartDir( vtNext) ;
|
||||
// verifico se spike
|
||||
double dPrevDist, dNextDist ;
|
||||
if ( vtPrev * vtNext < cos( 175 * DEGTORAD) &&
|
||||
(( DistPointLine( ptStart, ptMid, ptEnd).GetDist( dPrevDist) && dPrevDist < EPS_SMALL) ||
|
||||
( DistPointLine( ptEnd, ptStart, ptMid).GetDist( dNextDist) && dNextDist < EPS_SMALL))) {
|
||||
// se spike ha base abbastanza larga, basta togliere uno dei due lati
|
||||
if ( SqDist( ptStart, ptEnd) > SQ_EPS_SMALL) {
|
||||
pCurve->RemoveJoint( i) ;
|
||||
-- nCrvCount ;
|
||||
-- i ;
|
||||
}
|
||||
// altrimenti bisogna togliere entrambi
|
||||
else {
|
||||
pCurve->RemoveJoint( i - 1) ;
|
||||
pCurve->RemoveJoint( i) ;
|
||||
nCrvCount -= 2 ;
|
||||
i = max( i - 2, nStart - 1) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
// !!! Aggiungere la gestione degli altri tipi di curve !!!
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
//----------------------------------------------------------------------------
|
||||
// EgalTech 2017-2017
|
||||
//----------------------------------------------------------------------------
|
||||
// File : RemoveCurveSpikes.h Data : 02.10.17 Versione : 1.8j1
|
||||
// Contenuto : Dichiarazione funzione rimozione spikes curve.
|
||||
//
|
||||
//
|
||||
//
|
||||
// Modifiche : 02.10.17 DS Creazione modulo.
|
||||
//
|
||||
//
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "/EgtDev/Include/EGkCurveComposite.h"
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool RemoveCurveSpikes( ICurveComposite* pCurve) ;
|
||||
+13
-4
@@ -20,6 +20,7 @@
|
||||
#include "CurveAux.h"
|
||||
#include "CurveComposite.h"
|
||||
#include "RemoveCurveOverlaps.h"
|
||||
#include "RemoveCurveSpikes.h"
|
||||
#include "GeoConst.h"
|
||||
#include "/EgtDev/Include/EGkStringUtils3d.h"
|
||||
#include "/EgtDev/Include/EGkUiUnits.h"
|
||||
@@ -97,10 +98,14 @@ SurfFlatRegion::AddExtLoop( ICurve* pCrv)
|
||||
// aggiungo le singole curve
|
||||
bool bOk = true ;
|
||||
for ( auto& pCrv : CrvLst) {
|
||||
// se curva composita, unisco eventuali tratti allineati
|
||||
// se curva composita
|
||||
CurveComposite* pCrvCo = GetBasicCurveComposite( pCrv) ;
|
||||
if ( pCrvCo != nullptr)
|
||||
if ( pCrvCo != nullptr) {
|
||||
// unisco eventuali tratti allineati
|
||||
pCrvCo->MergeCurves( LIN_TOL_MIN, ANG_TOL_STD_DEG) ;
|
||||
// elimino eventuali spikes
|
||||
RemoveCurveSpikes( pCrvCo) ;
|
||||
}
|
||||
// aggiungo il loop
|
||||
if ( ! AddSimpleExtLoop( pCrv))
|
||||
bOk = false ;
|
||||
@@ -239,10 +244,14 @@ SurfFlatRegion::AddIntLoop( ICurve* pCrv)
|
||||
// aggiungo le singole curve
|
||||
bool bOk = true ;
|
||||
for ( auto& pCrv : CrvLst) {
|
||||
// se curva composita, unisco eventuali tratti allineati
|
||||
// se curva composita
|
||||
CurveComposite* pCrvCo = GetBasicCurveComposite( pCrv) ;
|
||||
if ( pCrvCo != nullptr)
|
||||
if ( pCrvCo != nullptr) {
|
||||
// unisco eventuali tratti allineati
|
||||
pCrvCo->MergeCurves( LIN_TOL_MIN, ANG_TOL_STD_DEG) ;
|
||||
// elimino eventuali spikes
|
||||
RemoveCurveSpikes( pCrvCo) ;
|
||||
}
|
||||
// aggiungo il loop
|
||||
if ( ! AddSimpleIntLoop( pCrv))
|
||||
bOk = false ;
|
||||
|
||||
Reference in New Issue
Block a user