EgtGeomKernel 1.4a3 : Migliorata gestione gruppi, aggiunti GdbIterator, GeoFrame3d e IdManager.

This commit is contained in:
Dario Sassi
2013-12-05 07:33:42 +00:00
parent 19e382b435
commit 8e9bc9169c
25 changed files with 1095 additions and 144 deletions
+46
View File
@@ -266,3 +266,49 @@ Vector3d::ToLoc( const Frame3d& frRef)
return true ;
}
//----------------------------------------------------------------------------
// Calcolo angolo di rotazione per portare la componente perpendicolare del
// vettore sulla stessa direzione della componente perpendicolare di vtEnd
//----------------------------------------------------------------------------
bool
Vector3d::GetRotation( const Vector3d& vtEnd, const Vector3d& vtAx, double& dAngDeg, bool& bDet)
{
double dKcosA ;
double dKsinA ;
Vector3d vtDirAx ;
Vector3d vtPerp ;
Vector3d vtPerpE ;
Vector3d vtPerp2 ;
// ricavo versore asse di rotazione
vtDirAx = vtAx ;
if ( ! vtDirAx.Normalize())
return false ;
// ricavo le componenti perpendicolari all'asse di rotazione
vtPerp = *this - vtDirAx * ( *this * vtDirAx) ;
vtPerpE = vtEnd - vtDirAx * ( vtEnd * vtDirAx) ;
// se sono entrambe non nulle : angolo determinato
if ( ! vtPerp.IsZero() && ! vtPerpE.IsZero()) {
// secondo vettore perpendicolare ad asse e a componente perpendicolare
vtPerp2 = vtDirAx ^ vtPerp ;
// proporzionali a seno e coseno del perpendicolare E
dKcosA = vtPerpE * vtPerp ;
dKsinA = vtPerpE * vtPerp2 ;
// angolo di rotazione
dAngDeg = atan2( dKsinA, dKcosA) * RADTODEG ;
bDet = true ;
return true ;
}
// se comunque sono entrambe molto piccole : angolo indeterminato
else if ( vtPerp.IsSmall() && vtPerpE.IsSmall()) {
dAngDeg = 0 ;
bDet = false ;
return true ;
}
// altrimenti angolo impossibile
else
return false ;
}