diff --git a/EGkGeoConst.h b/EGkGeoConst.h index 1691212..f142724 100644 --- a/EGkGeoConst.h +++ b/EGkGeoConst.h @@ -33,6 +33,9 @@ const double SQ_EPS_ZERO = EPS_ZERO * EPS_ZERO ; const double INFINITO = 1e10 ; const double SQ_INFINITO = INFINITO * INFINITO ; +// coefficiente componente di vettore largamente predominante +const double KV_BIG = 1e5 ; + // conversione da gradi a radianti e viceversa const double PIGRECO = 3.14159265358979323846 ; const double DEGTORAD = PIGRECO / 180. ; diff --git a/EGkVector3d.h b/EGkVector3d.h index 8014aaa..f51f0f1 100644 --- a/EGkVector3d.h +++ b/EGkVector3d.h @@ -14,6 +14,7 @@ #pragma once #include "/EgtDev/Include/EGkGeoConst.h" +#include #include //----------------------- Macro per import/export ----------------------------- @@ -70,36 +71,43 @@ class EGK_EXPORT Vector3d { return ( abs( 1.0 - (x * x + y * y + z * z)) < ( 2 * EPS_ZERO)) ; } //! Verifica se il vettore è parallelo ed equiverso con X+ bool IsXplus( void) const - { return ( x > EPS_ZERO && abs( y) < EPS_ZERO && abs( z) < EPS_ZERO) ; } + { double dMO = std::max( abs( y), abs( z)) ; + return ( x > EPS_ZERO && dMO < 10 * EPS_ZERO && x > KV_BIG * dMO) ; } //! Verifica se il vettore è parallelo ed equiverso con X- bool IsXminus( void) const - { return ( x < - EPS_ZERO && abs( y) < EPS_ZERO && abs( z) < EPS_ZERO) ; } + { double dMO = std::max( abs( y), abs( z)) ; + return ( x < -EPS_ZERO && dMO < 10 * EPS_ZERO && x < -KV_BIG * dMO) ; } //! Verifica se il vettore è parallelo a X bool IsX( void) const - { return ( abs( x) > EPS_ZERO && abs( y) < EPS_ZERO && abs( z) < EPS_ZERO) ; } + { double dMO = std::max( abs( y), abs( z)) ; + return ( abs( x) > EPS_ZERO && dMO < 10 * EPS_ZERO && abs( x) > KV_BIG * dMO) ; } //! Verifica se il vettore è parallelo ed equiverso con Y+ bool IsYplus( void) const - { return ( abs( x) < EPS_ZERO && y > EPS_ZERO && abs( z) < EPS_ZERO) ; } + { double dMO = std::max( abs( z), abs( x)) ; + return ( y > EPS_ZERO && dMO < 10 * EPS_ZERO && y > KV_BIG * dMO) ; } //! Verifica se il vettore è parallelo ed equiverso con Y- bool IsYminus( void) const - { return ( abs( x) < EPS_ZERO && y < - EPS_ZERO && abs( z) < EPS_ZERO) ; } + { double dMO = std::max( abs( z), abs( x)) ; + return ( y < -EPS_ZERO && dMO < 10 * EPS_ZERO && y < -KV_BIG * dMO) ; } //! Verifica se il vettore è parallelo a Y bool IsY( void) const - { return ( abs( x) < EPS_ZERO && abs( y) > EPS_ZERO && abs( z) < EPS_ZERO) ; } + { double dMO = std::max( abs( z), abs( x)) ; + return ( abs( y) > EPS_ZERO && dMO < 10 * EPS_ZERO && abs( y) > KV_BIG * dMO) ; } //! Verifica se il vettore è parallelo ed equiverso con Z+ bool IsZplus( void) const - { return ( abs( x) < EPS_ZERO && abs( y) < EPS_ZERO && z > EPS_ZERO) ; } + { double dMO = std::max( abs( x), abs( y)) ; + return ( z > EPS_ZERO && dMO < 10 * EPS_ZERO && z > KV_BIG * dMO) ; } //! Verifica se il vettore è parallelo ed equiverso con Z- bool IsZminus( void) const - { return ( abs( x) < EPS_ZERO && abs( y) < EPS_ZERO && z < - EPS_ZERO) ; } + { double dMO = std::max( abs( x), abs( y)) ; + return ( z < -EPS_ZERO && dMO < 10 * EPS_ZERO && z < -KV_BIG * dMO) ; } //! Verifica se il vettore è parallelo a Z bool IsZ( void) const - { return ( abs( x) < EPS_ZERO && abs( y) < EPS_ZERO && abs( z) > EPS_ZERO) ; } + { double dMO = std::max( abs( x), abs( y)) ; + return ( abs( z) > EPS_ZERO && dMO < 10 * EPS_ZERO && abs( z) > KV_BIG * dMO) ; } //! Verifica se il vettore è generico bool IsGeneric( void) const - { return (( abs( x) > EPS_ZERO && abs( y) > EPS_ZERO) || - ( abs( y) > EPS_ZERO && abs( z) > EPS_ZERO) || - ( abs( z) > EPS_ZERO && abs( x) > EPS_ZERO)) ; } + { return ( ! IsX() && ! IsY() && ! IsZ()) ; } //! Somma sul posto con altro vettore Vector3d& operator +=( const Vector3d& vtV) { this->x += vtV.x ; this->y += vtV.y ; this->z += vtV.z ; return *this ; }