EgtGeomKernel 1.4a3 : Migliorata gestione gruppi, aggiunti GdbIterator, GeoFrame3d e IdManager.
This commit is contained in:
@@ -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 ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user