diff --git a/Vector3d.cpp b/Vector3d.cpp index cb8143f..927768b 100644 --- a/Vector3d.cpp +++ b/Vector3d.cpp @@ -470,18 +470,20 @@ Vector3d::GetAngleXY( const Vector3d& vtEnd, double& dAngDeg) const // all'asse di rotazione sulla stessa direzione della componente perpendicolare di vtEnd //---------------------------------------------------------------------------- bool -Vector3d::GetRotation( const Vector3d& vtEnd, const Vector3d& vtAx, double& dAngDeg, bool& bDet) const +Vector3d::GetRotation( const Vector3d& vtEnd, const Vector3d& vtAx, double dEpsZero, double& dAngDeg, bool& bDet) const { // ricavo versore asse di rotazione Vector3d vtDirAx = vtAx ; if ( ! vtDirAx.Normalize()) return false ; + // verifico epsilon per vettore nullo + dEpsZero = std::min( EPS_SMALL, abs( dEpsZero)) ; // ricavo le componenti perpendicolari all'asse di rotazione Vector3d vtPerp = *this - vtDirAx * ( *this * vtDirAx) ; Vector3d vtPerpE = vtEnd - vtDirAx * ( vtEnd * vtDirAx) ; // se sono entrambe non nulle : angolo determinato - if ( ! vtPerp.IsZero() && ! vtPerpE.IsZero()) { + if ( vtPerp.SqLen() > dEpsZero * dEpsZero && vtPerpE.SqLen() > dEpsZero * dEpsZero) { // secondo vettore perpendicolare ad asse e a componente perpendicolare Vector3d vtPerp2 = vtDirAx ^ vtPerp ; // proporzionali a seno e coseno del perpendicolare E