//---------------------------------------------------------------------------- // EgalTech 2015-2015 //---------------------------------------------------------------------------- // File : StmStandard.cpp Data : 31.03.15 Versione : 1.6c7 // Contenuto : Implementazione di funzioni per creazione di superfici Stm // standard : Box, Pyramid, Cylinder, Sphere, Cone. // // // Modifiche : 31.03.15 DS Creazione modulo. // // //---------------------------------------------------------------------------- //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "CurveArc.h" #include "/EgtDev/Include/EGkStmStandard.h" #include "/EgtDev/Include/EGkStmFromCurves.h" #include "/EgtDev/Include/EgtPointerOwner.h" using namespace std ; //------------------------------------------------------------------------------- ISurfTriMesh* GetSurfTriMeshBox( double dDimX, double dDimY, double dHeight) { // le dimensioni devono essere significative if ( dDimX < EPS_SMALL || dDimY < EPS_SMALL || fabs( dHeight) < EPS_SMALL) return nullptr ; // creo la polilinea del contorno della base PolyLine PL ; PL.AddUPoint( 0, ORIG) ; PL.AddUPoint( 1, Point3d( dDimX, 0, 0)) ; PL.AddUPoint( 2, Point3d( dDimX, dDimY, 0)) ; PL.AddUPoint( 3, Point3d( 0, dDimY, 0)) ; PL.AddUPoint( 4, ORIG) ; if ( dHeight < 0) PL.Invert() ; // vettore altezza (estrusione) Vector3d vtExtr( 0, 0, dHeight) ; // creo e setto la superficie trimesh laterale PtrOwner pSTM( CreateSurfTriMesh()) ; if ( IsNull( pSTM) || ! pSTM->CreateByExtrusion( PL, vtExtr)) return nullptr ; // creo la prima superficie di estremità PtrOwner pSTM1( CreateSurfTriMesh()) ; if ( IsNull( pSTM1) || ! pSTM1->CreateByFlatContour( PL)) return nullptr ; // la copio PtrOwner pSTM2( GetSurfTriMesh( pSTM1->Clone())) ; if ( IsNull( pSTM2)) return nullptr ; // inverto la prima superficie pSTM1->Invert() ; // traslo la seconda pSTM2->Translate( vtExtr) ; // le unisco alla superficie del fianco if ( ! pSTM->DoSewing( *pSTM1) || ! pSTM->DoSewing( *pSTM2)) return nullptr ; // restituisco la superficie return Release( pSTM) ; } //------------------------------------------------------------------------------- ISurfTriMesh* GetSurfTriMeshPyramid( double dDimX, double dDimY, double dHeight) { // le dimensioni devono essere significative if ( dDimX < EPS_SMALL || dDimY < EPS_SMALL || fabs( dHeight) < EPS_SMALL) return nullptr ; // creo la polilinea del contorno della base PolyLine PL ; PL.AddUPoint( 0, ORIG) ; PL.AddUPoint( 1, Point3d( dDimX, 0, 0)) ; PL.AddUPoint( 2, Point3d( dDimX, dDimY, 0)) ; PL.AddUPoint( 3, Point3d( 0, dDimY, 0)) ; PL.AddUPoint( 4, ORIG) ; if ( dHeight < 0) PL.Invert() ; // punto di vertice Point3d ptTip( 0.5 * dDimX, 0.5 * dDimY, dHeight) ; // creo e setto la superficie trimesh laterale PtrOwner pSTM( CreateSurfTriMesh()) ; if ( IsNull( pSTM) || ! pSTM->CreateByPointCurve( ptTip, PL)) return nullptr ; // creo la superficie di base PtrOwner pSTM1( CreateSurfTriMesh()) ; if ( IsNull( pSTM1) || ! pSTM1->CreateByFlatContour( PL)) return nullptr ; // la unisco alla superficie del fianco if ( ! pSTM->DoSewing( *pSTM1)) return nullptr ; // restituisco la superficie return Release( pSTM) ; } //------------------------------------------------------------------------------- ISurfTriMesh* GetSurfTriMeshCylinder( double dRadius, double dHeight, double dLinTol) { // le dimensioni devono essere significative if ( dRadius < EPS_SMALL || fabs( dHeight) < EPS_SMALL) return nullptr ; // creo la circonferenza di base CurveArc cArc ; cArc.Set( ORIG, Z_AX, dRadius) ; // vettore altezza (estrusione) Vector3d vtExtr( 0, 0, dHeight) ; // creo il cilindro return GetSurfTriMeshByExtrusion( &cArc, vtExtr, true, dLinTol) ; } //------------------------------------------------------------------------------- ISurfTriMesh* GetSurfTriMeshCone( double dRadius, double dHeight, double dLinTol) { // le dimensioni devono essere significative if ( dRadius < EPS_SMALL || fabs( dHeight) < EPS_SMALL) return nullptr ; // creo la circonferenza di base CurveArc cArc ; cArc.Set( ORIG, Z_AX, dRadius) ; if ( dHeight < 0) cArc.Invert() ; // punto di vertice Point3d ptTip( 0, 0, dHeight) ; // creo la superficie laterale del cono PtrOwner pSTM( GetSurfTriMeshRuled( ptTip, &cArc, dLinTol)) ; if ( IsNull( pSTM)) return nullptr ; // creo la superficie di base e la inverto PtrOwner pSTM1( GetSurfTriMeshByFlatContour( &cArc, dLinTol)) ; if ( IsNull( pSTM1)) return nullptr ; pSTM1->Invert() ; // la unisco alla superficie del fianco if ( ! pSTM->DoSewing( *pSTM1)) return nullptr ; // restituisco la superficie return Release( pSTM) ; } //------------------------------------------------------------------------------- ISurfTriMesh* GetSurfTriMeshSphere( double dRadius, double dLinTol) { // le dimensioni devono essere significative if ( dRadius < EPS_SMALL) return nullptr ; // creo la semicirconferenza di riferimento CurveArc cArc ; cArc.Set( ORIG, Y_AX, dRadius, Z_AX, ANG_STRAIGHT, 0) ; // creo la sfera return GetSurfTriMeshByRevolve( &cArc, ORIG, Z_AX, true, dLinTol) ; }