EgtGeomKernel 1.6b7 :
- aggiunto calcolo baricentro di Curve - migliorata gestione richiesta nuovo Id - aggiunta intersezione linea-piano e linea-triangolo - corretto errore in PointGrid3d con 1 solo punto (non faceva alcunchè) - aggiunte funzioni di accesso a dati di SurfTM.
This commit is contained in:
+70
-8
@@ -1,13 +1,13 @@
|
||||
//----------------------------------------------------------------------------
|
||||
// EgalTech 2014-2014
|
||||
// EgalTech 2014-2015
|
||||
//----------------------------------------------------------------------------
|
||||
// File : PolygonPlane.cpp Data : 12.08.14 Versione : 1.5h3
|
||||
// File : PolygonPlane.cpp Data : 23.02.15 Versione : 1.6b7
|
||||
// Contenuto : Implementazione della classe PolygonPlane.
|
||||
// Calcolo della normale e delle aree con il metodo di Newell.
|
||||
//
|
||||
//
|
||||
// Modifiche : 12.08.14 DS Creazione modulo.
|
||||
//
|
||||
// 23.02.15 DS Aggiunta gestione centro geometrico (centroid).
|
||||
//
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
@@ -15,14 +15,22 @@
|
||||
#include "stdafx.h"
|
||||
#include "PolygonPlane.h"
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void
|
||||
PolygonPlane::AddPoint( const Point3d& ptP)
|
||||
{
|
||||
// se è il primo punto (parto da -1 perchè verrà contato alla chiusura)
|
||||
if ( m_nPntNbr == -1)
|
||||
if ( m_nPntNbr == -1) {
|
||||
// inizializzazioni
|
||||
m_dLenN = 0 ;
|
||||
m_vtN = V_NULL ;
|
||||
m_ptMid = ORIG ;
|
||||
m_dSXy = 0 ; m_dSXz = 0 ;
|
||||
m_dSYz = 0 ; m_dSYx = 0 ;
|
||||
m_dSZx = 0 ; m_dSZy = 0 ;
|
||||
// salvo il punto come primo (per verificare chiusura alla fine)
|
||||
m_ptFirst = ptP ;
|
||||
}
|
||||
// dal secondo punto posso cominciare ad eseguire le somme parziali
|
||||
else {
|
||||
// Compute normal as being proportional to projected areas of polygon onto the yz,
|
||||
@@ -30,7 +38,18 @@ PolygonPlane::AddPoint( const Point3d& ptP)
|
||||
m_vtN.x += ( m_ptLast.y - ptP.y) * ( m_ptLast.z + ptP.z) ; // projection on yz
|
||||
m_vtN.y += ( m_ptLast.z - ptP.z) * ( m_ptLast.x + ptP.x) ; // projection on xz
|
||||
m_vtN.z += ( m_ptLast.x - ptP.x) * ( m_ptLast.y + ptP.y) ; // projection on xy
|
||||
m_ptCen += ptP ;
|
||||
// Very approximate center
|
||||
m_ptMid += ptP ;
|
||||
// First moment of Area (momento statico)
|
||||
double dTmpX = ( m_ptLast.y * ptP.z - ptP.y * m_ptLast.z) ;
|
||||
m_dSXy += ( m_ptLast.y + ptP.y) * dTmpX ;
|
||||
m_dSXz += ( m_ptLast.z + ptP.z) * dTmpX ;
|
||||
double dTmpY = ( m_ptLast.z * ptP.x - ptP.z * m_ptLast.x) ;
|
||||
m_dSYz += ( m_ptLast.z + ptP.z) * dTmpY ;
|
||||
m_dSYx += ( m_ptLast.x + ptP.x) * dTmpY ;
|
||||
double dTmpZ = ( m_ptLast.x * ptP.y - ptP.x * m_ptLast.y) ;
|
||||
m_dSZx += ( m_ptLast.x + ptP.x) * dTmpZ ;
|
||||
m_dSZy += ( m_ptLast.y + ptP.y) * dTmpZ ;
|
||||
}
|
||||
// salvo punto e incremento numero di punti
|
||||
m_ptLast = ptP ;
|
||||
@@ -58,11 +77,54 @@ PolygonPlane::Finalize( void)
|
||||
// normalizzo
|
||||
m_vtN /= m_dLenN ;
|
||||
// sistemo baricentro
|
||||
m_ptCen /= m_nPntNbr ;
|
||||
m_ptMid /= m_nPntNbr ;
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
PolygonPlane::GetCentroid( Point3d& ptCen)
|
||||
{
|
||||
// verifico completamento conti
|
||||
if ( ! Finalize())
|
||||
return false ;
|
||||
// assegno i dati del centro geometrico
|
||||
if ( fabs( m_vtN.z) > fabs( m_vtN.x) &&
|
||||
fabs( m_vtN.z) > fabs( m_vtN.y)) {
|
||||
// calcoli nel piano xy perpendicolare a Z
|
||||
ptCen.x = m_dSZx / ( 3 * m_vtN.z * m_dLenN) ;
|
||||
ptCen.y = m_dSZy / ( 3 * m_vtN.z * m_dLenN) ;
|
||||
ptCen.z = (( m_ptMid.x - ptCen.x) * m_vtN.x + ( m_ptMid.y - ptCen.y) * m_vtN.y + m_ptMid.z * m_vtN.z) / m_vtN.z ;
|
||||
}
|
||||
else if ( fabs( m_vtN.x) > fabs( m_vtN.y)) {
|
||||
// calcoli nel piano yz perpendicolare a X
|
||||
ptCen.y = m_dSXy / ( 3 * m_vtN.x * m_dLenN) ;
|
||||
ptCen.z = m_dSXz / ( 3 * m_vtN.x * m_dLenN) ;
|
||||
ptCen.x = ( m_ptMid.x * m_vtN.x + ( m_ptMid.y - ptCen.y) * m_vtN.y + ( m_ptMid.z - ptCen.z) * m_vtN.z) / m_vtN.x ;
|
||||
}
|
||||
else {
|
||||
// calcoli nel piano zx perpendicolare a Y
|
||||
ptCen.z = m_dSYz / ( 3 * m_vtN.y * m_dLenN) ;
|
||||
ptCen.x = m_dSYx / ( 3 * m_vtN.y * m_dLenN) ;
|
||||
ptCen.y = (( m_ptMid.x - ptCen.x) * m_vtN.x + m_ptMid.y * m_vtN.y + ( m_ptMid.z - ptCen.z) * m_vtN.z) / m_vtN.y ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
PolygonPlane::GetNormal( Vector3d& vtN)
|
||||
{
|
||||
// verifico completamento conti
|
||||
if ( ! Finalize())
|
||||
return false ;
|
||||
// assegno i dati del centro
|
||||
vtN = m_vtN ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
PolygonPlane::GetPlane( Plane3d& plPlane)
|
||||
@@ -72,7 +134,7 @@ PolygonPlane::GetPlane( Plane3d& plPlane)
|
||||
return false ;
|
||||
// assegno i dati al piano
|
||||
plPlane.vtN = m_vtN ;
|
||||
plPlane.dDist = ( ( m_ptCen - ORIG) * plPlane.vtN) ;
|
||||
plPlane.dDist = ( ( m_ptMid - ORIG) * plPlane.vtN) ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user