2c6ebdadca
- correzioni, migliorie e d estensioni alle superfici di Bezier - in Release cambiate opzioni di ottimizzazione da /Ox a /O2.
86 lines
2.7 KiB
C
86 lines
2.7 KiB
C
//----------------------------------------------------------------------------
|
|
// EgalTech 2020-2020
|
|
//----------------------------------------------------------------------------
|
|
// File : deCasteljau.h Data : 29.03.20 Versione : 2.2c3
|
|
// Contenuto : Applicazioni dell'algoritmo di de Casteljau.
|
|
//
|
|
//
|
|
//
|
|
// Modifiche : 29.03.20 DS Creazione modulo.
|
|
//
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
//--------------------------- Include ----------------------------------------
|
|
#include "/EgtDev/Include/EGkGeoCollection.h"
|
|
|
|
//----------------------------------------------------------------------------
|
|
inline bool
|
|
deCastTrimStart( double dPar, int nDeg, PNTVECTOR& vPtCtrl)
|
|
{
|
|
if ( dPar < EPS_PARAM)
|
|
return true ;
|
|
if ( dPar > 1 - EPS_PARAM)
|
|
return false ;
|
|
for ( int k = 1 ; k <= nDeg ; ++ k) {
|
|
for ( int i = 0 ; i <= nDeg - k ; ++ i) {
|
|
vPtCtrl[i] = ( 1 - dPar) * vPtCtrl[i] + dPar * vPtCtrl[i+1] ;
|
|
}
|
|
}
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
inline bool
|
|
deCastRatTrimStart( double dPar, int nDeg, PNTVECTOR& vPtCtrl, DBLVECTOR& vWeCtrl)
|
|
{
|
|
if ( dPar < EPS_PARAM)
|
|
return true ;
|
|
if ( dPar > 1 - EPS_PARAM)
|
|
return false ;
|
|
for ( int k = 1 ; k <= nDeg ; ++ k) {
|
|
for ( int i = 0 ; i <= nDeg - k ; ++ i) {
|
|
vPtCtrl[i] = ( 1 - dPar) * vWeCtrl[i] * vPtCtrl[i] + dPar * vWeCtrl[i+1] * vPtCtrl[i+1] ;
|
|
vWeCtrl[i] = ( 1 - dPar) * vWeCtrl[i] + dPar * vWeCtrl[i+1] ;
|
|
vPtCtrl[i] = vPtCtrl[i] * ( 1 / vWeCtrl[i]) ;
|
|
}
|
|
}
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
inline bool
|
|
deCastTrimEnd( double dPar, int nDeg, PNTVECTOR& vPtCtrl)
|
|
{
|
|
if ( dPar < EPS_PARAM)
|
|
return false ;
|
|
if ( dPar > 1 - EPS_PARAM)
|
|
return true ;
|
|
for ( int k = 1 ; k <= nDeg ; ++ k) {
|
|
for ( int i = nDeg ; i >= k ; -- i) {
|
|
vPtCtrl[i] = ( 1 - dPar) * vPtCtrl[i-1] + dPar * vPtCtrl[ i] ;
|
|
}
|
|
}
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
inline bool
|
|
deCastRatTrimEnd( double dPar, int nDeg, PNTVECTOR& vPtCtrl, DBLVECTOR& vWeCtrl)
|
|
{
|
|
if ( dPar < EPS_PARAM)
|
|
return false ;
|
|
if ( dPar > 1 - EPS_PARAM)
|
|
return true ;
|
|
for ( int k = 1 ; k <= nDeg ; ++ k) {
|
|
for ( int i = nDeg ; i >= k ; -- i) {
|
|
vPtCtrl[i] = ( 1 - dPar) * vWeCtrl[i-1] * vPtCtrl[i-1] + dPar * vWeCtrl[ i] * vPtCtrl[ i] ;
|
|
vWeCtrl[i] = ( 1 - dPar) * vWeCtrl[i-1] + dPar * vWeCtrl[ i] ;
|
|
vPtCtrl[i] = vPtCtrl[i] * ( 1 / vWeCtrl[i]) ;
|
|
}
|
|
}
|
|
return true ;
|
|
}
|