Files
EgtGeomKernel/SbzStandard.cpp
Daniele Bariletti 2361225321 EgtGeomKernel :
- aggiunte le chiamate per la creazione di una rigata come superficie di Bezier
- aggiunta la funzione per la creazione del cono come Bezier ( ancora da implementare).
2024-05-28 16:29:10 +02:00

114 lines
3.6 KiB
C++

//----------------------------------------------------------------------------
// EgalTech 2024
//----------------------------------------------------------------------------
// File : SbzSphere.cpp Data : 14.02.2024 Versione : 2.6b2
// Contenuto : Implementazione di funzioni per creazione di superfici Sbz
// standard : Box, Pyramid, Cylinder, Sphere, Cone.
//
//
// Modifiche : 14.02.2024 DB Creazione modulo.
//
//
//----------------------------------------------------------------------------
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "CurveArc.h"
#include "SurfTriMesh.h"
#include "SurfBezier.h"
#include "/EgtDev/Include/EGkSbzStandard.h"
#include "/EgtDev/Include/EGkSbzFromCurves.h"
using namespace std ;
//-------------------------------------------------------------------------------
ISurfBezier*
GetSurfBezierSphere( const Point3d& ptCenter, double dR)
{
// creo una superficie di Bezier di grado 2 con 45 punti di controllo
PtrOwner<ISurfBezier> pSrfBez( CreateSurfBezier()) ;
int nDegU = 2 ;
int nDegV = 2 ;
int nSpanU = 4 ; // i poli della sfera sono a coordinate ( 0,0,-R) e ( 0,0,R)
int nSpanV = 2 ;
bool bRat = true ;
double dW = SQRT2 ;
pSrfBez->Init(nDegU, nDegV, nSpanU, nSpanV, bRat) ;
// polo inferiore // dW = 1, dW = SQRT2 / 2
for ( int i = 0 ; i < 9; ++i) {
if ( i % 2 == 0)
dW = 1 ;
else
dW = SQRT2 / 2 ;
pSrfBez->SetControlPoint( i, 0, ptCenter + Point3d( 0, 0, -dR), dW) ;
}
// definisco la gabbia esterna // dW = SQRT2 / 2, dW = 1 / 2
// parto dal punto ( 0,-dR, -dR) e completo riga per riga
double dH = -dR ;
for ( int j = 1 ; j < 4 ; ++j ) {
Vector3d vtDir ( 0, -dR, 0) ;
Point3d pt(-dR,-dR,dH) ;
for ( int i = 0; i < 9 ; ++i ) {
// ogni due punti ruoto di 90 gradi a sinistra
if ( i%2 == 0) {
vtDir.Rotate( Z_AX, 90) ;
if ( j%2 == 1)
dW = SQRT2 / 2 ;
else
dW = 1 ;
}
else {
if ( j%2 == 1)
dW = 1. / 2. ;
else
dW = SQRT2 / 2 ;
}
pt += vtDir ;
pSrfBez->SetControlPoint( i, j, ptCenter + pt, dW) ;
}
dH += dR ;
}
// polo superiore // dW = 1, dW = SQRT2 / 2
for ( int i = 0 ; i < 9; ++i) {
if ( i % 2 == 0)
dW = 1 ;
else
dW = SQRT2 / 2 ;
pSrfBez->SetControlPoint( i, 4, ptCenter + Point3d( 0, 0, dR), dW) ;
}
return Release( pSrfBez) ;
}
////-------------------------------------------------------------------------------
//ISurfBezier*
//GetSurfBezierCone( const Point3d& ptCenter, double dRadius, const Vector3d& dHeight)
//{
// // le dimensioni devono essere significative
// if ( dRadius < EPS_SMALL || abs( 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<ISurfBezier> pSbz( GetSurfBezierRuled( ptTip, &cArc)) ;
// if ( IsNull( pSbz))
// return nullptr ;
//
// //// creo la superficie di base e la inverto
// //PtrOwner<ISurfTriMesh> 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( pSbz) ;
//}