From d1790d8f071bf62d154be4cde5c67762692e54b8 Mon Sep 17 00:00:00 2001 From: DarioS Date: Mon, 17 Apr 2023 09:28:25 +0200 Subject: [PATCH] EgtGeomKernel : - in Vector3d creata variante di GetRotation con parametro dEpsZero per stabilire soglia una sola soluzione invece di due. --- Vector3d.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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