2361225321
- 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).
114 lines
3.6 KiB
C++
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) ;
|
|
//}
|