LCOV - code coverage report
Current view: top level - util - CubitBox.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 131 320 40.9 %
Date: 2020-06-30 00:58:45 Functions: 33 56 58.9 %
Branches: 88 414 21.3 %

           Branch data     Line data    Source code
       1                 :            : //- Class: CubitBox
       2                 :            : //- Description: This file defines the CubitBox class.
       3                 :            : //- Owner: Greg Sjaardema
       4                 :            : //- Checked by:
       5                 :            : 
       6                 :            : #include <cstdio>
       7                 :            : #include <cstdlib>
       8                 :            : #include <cassert>
       9                 :            : 
      10                 :            : #include "CubitBox.hpp"
      11                 :            : #include "CubitVector.hpp"
      12                 :            : #include "CubitDefines.h"
      13                 :            : 
      14                 :     200897 : CubitBox::~CubitBox()
      15                 :     200897 : {}
      16                 :            : 
      17                 :      12915 : CubitBox::CubitBox() :
      18                 :            :     minimum_(0.0, 0.0, 0.0),
      19                 :      12915 :     maximum_(0.0, 0.0, 0.0)
      20                 :      12915 : {}
      21                 :            : 
      22                 :       9050 : CubitBox::CubitBox(const CubitVector &min, const CubitVector &max)
      23                 :            : {
      24                 :       4525 :   minimum_.set (CUBIT_MIN (min.x(), max.x()),
      25                 :       4525 :                 CUBIT_MIN (min.y(), max.y()),
      26 [ +  + ][ +  + ]:      13575 :                 CUBIT_MIN (min.z(), max.z()));
                 [ +  + ]
      27                 :       4525 :   maximum_.set (CUBIT_MAX (min.x(), max.x()),
      28                 :       4525 :                 CUBIT_MAX (min.y(), max.y()),
      29 [ -  + ][ -  + ]:      13575 :                 CUBIT_MAX (min.z(), max.z()));
                 [ -  + ]
      30                 :       4525 : }
      31                 :            : 
      32                 :       1464 : CubitBox::CubitBox(const CubitVector &min_max) :
      33                 :            :     minimum_(min_max),
      34                 :       1464 :     maximum_(min_max)
      35                 :       1464 : {}
      36                 :            : 
      37                 :     152672 : CubitBox::CubitBox(const CubitBox& copy_from):
      38                 :            :     minimum_(copy_from.minimum_),
      39                 :     152672 :     maximum_(copy_from.maximum_)
      40                 :     152672 : {}
      41                 :            : 
      42                 :          0 : CubitBox::CubitBox(const std::vector<CubitVector> & pts)
      43                 :            : {
      44                 :          0 :   minimum_.set(0.0, 0.0, 0.0);
      45                 :          0 :   maximum_.set(0.0, 0.0, 0.0);
      46         [ #  # ]:          0 :   for ( size_t i=0; i<pts.size(); i++ )
      47                 :            :   {
      48                 :          0 :     double x = pts[i].x();
      49                 :          0 :     double y = pts[i].y();
      50                 :          0 :     double z = pts[i].z();
      51                 :          0 :     minimum_.set(CUBIT_MIN(minimum_.x(), x),
      52                 :          0 :                  CUBIT_MIN(minimum_.y(), y),
      53 [ #  # ][ #  # ]:          0 :                  CUBIT_MIN(minimum_.z(), z));
                 [ #  # ]
      54                 :          0 :     maximum_.set(CUBIT_MAX(maximum_.x(), x),
      55                 :          0 :                  CUBIT_MAX(maximum_.y(), y),
      56 [ #  # ][ #  # ]:          0 :                  CUBIT_MAX(maximum_.z(), z));
                 [ #  # ]
      57                 :            :   }
      58                 :          0 : }
      59                 :            : 
      60                 :          0 : void CubitBox::reset(const CubitVector& vector)
      61                 :            : {
      62                 :          0 :   minimum_ = vector;
      63                 :          0 :   maximum_ = vector;
      64                 :          0 : }
      65                 :            : 
      66                 :       2112 : void CubitBox::reset(const CubitVector &min, const CubitVector &max)
      67                 :            : {
      68                 :       2112 :   minimum_.set (CUBIT_MIN (min.x(), max.x()),
      69                 :       2112 :                 CUBIT_MIN (min.y(), max.y()),
      70 [ +  + ][ +  + ]:       6336 :                 CUBIT_MIN (min.z(), max.z()));
                 [ +  + ]
      71                 :       2112 :   maximum_.set (CUBIT_MAX (min.x(), max.x()),
      72                 :       2112 :                 CUBIT_MAX (min.y(), max.y()),
      73 [ -  + ][ -  + ]:       6336 :                 CUBIT_MAX (min.z(), max.z()));
                 [ -  + ]
      74                 :       2112 : }
      75                 :            : 
      76                 :          0 : void CubitBox::reset(const CubitBox &box)
      77                 :            : {
      78                 :          0 :   minimum_ = box.minimum_;
      79                 :          0 :   maximum_ = box.maximum_;
      80                 :          0 : }
      81                 :            : 
      82                 :      21620 : CubitVector CubitBox::minimum() const
      83                 :            : {
      84                 :      21620 :   return CubitVector(minimum_);
      85                 :            : }
      86                 :            : 
      87                 :      21686 : CubitVector CubitBox::maximum() const
      88                 :            : {
      89                 :      21686 :   return CubitVector(maximum_);
      90                 :            : }
      91                 :            : 
      92                 :       8922 : double CubitBox::max_x() const
      93                 :            : {
      94                 :       8922 :   return maximum_.x();
      95                 :            : }
      96                 :            : 
      97                 :       5864 : double CubitBox::max_y() const
      98                 :            : {
      99                 :       5864 :   return maximum_.y();
     100                 :            : }
     101                 :            : 
     102                 :       4511 : double CubitBox::max_z() const
     103                 :            : {
     104                 :       4511 :   return maximum_.z();
     105                 :            : }
     106                 :            : 
     107                 :      14917 : double CubitBox::min_x() const
     108                 :            : {
     109                 :      14917 :   return minimum_.x();
     110                 :            : }
     111                 :            : 
     112                 :       7690 : double CubitBox::min_y() const
     113                 :            : {
     114                 :       7690 :   return minimum_.y();
     115                 :            : }
     116                 :            : 
     117                 :       5094 : double CubitBox::min_z() const
     118                 :            : {
     119                 :       5094 :   return minimum_.z();
     120                 :            : }
     121                 :            : 
     122                 :       2741 : CubitVector CubitBox::center() const
     123                 :            : {
     124         [ +  - ]:       2741 :   return CubitVector(minimum_ + maximum_) / 2.0;
     125                 :            : }
     126                 :            : 
     127                 :         33 : CubitVector CubitBox::diagonal() const
     128                 :            : {
     129                 :         33 :   return CubitVector(maximum_ - minimum_);
     130                 :            : }
     131                 :            : 
     132                 :          0 : double CubitBox::minimum_range( void)
     133                 :            : {
     134 [ #  # ][ #  # ]:          0 :   return CUBIT_MIN(CUBIT_MIN( x_range(), y_range()), z_range());
                 [ #  # ]
     135                 :            : }
     136                 :            : 
     137                 :            : 
     138                 :          0 : double CubitBox::maximum_range( void)
     139                 :            : {
     140 [ #  # ][ #  # ]:          0 :   return CUBIT_MAX( CUBIT_MAX( x_range(), y_range()), z_range());
                 [ #  # ]
     141                 :            : }
     142                 :            : 
     143                 :     136901 : double CubitBox::x_range() const
     144                 :     136901 : { return (maximum_.x() - minimum_.x()); }
     145                 :            : 
     146                 :     136901 : double CubitBox::y_range() const
     147                 :     136901 : { return (maximum_.y() - minimum_.y()); }
     148                 :            : 
     149                 :     136945 : double CubitBox::z_range() const
     150                 :     136945 : { return (maximum_.z() - minimum_.z()); }
     151                 :            : 
     152                 :      60701 : CubitBox& CubitBox::operator=(const CubitBox &box)
     153                 :            : {
     154         [ +  - ]:      60701 :   if (this != &box)
     155                 :            :     {
     156                 :      60701 :       minimum_ = box.minimum_;
     157                 :      60701 :       maximum_ = box.maximum_;
     158                 :            :     }
     159                 :      60701 :   return *this;
     160                 :            : }
     161                 :            : 
     162                 :      71407 : bool CubitBox::overlap( double tolerance , const CubitBox& box ) const
     163                 :            : {
     164                 :            :   //     | - note the '!'.  This condition checks that the boxes
     165                 :            :   //     |   do NOT intersect and negates the result. 
     166         [ +  + ]:     132884 :   return ! ( (box.minimum_.x() - maximum_.x() > tolerance) ||
     167         [ +  + ]:     115404 :              (box.minimum_.y() - maximum_.y() > tolerance) ||
     168         [ +  + ]:     104593 :              (box.minimum_.z() - maximum_.z() > tolerance) ||
     169         [ +  + ]:      93359 :              (minimum_.x() - box.maximum_.x() > tolerance) ||
     170                 :      42693 :              (minimum_.y() - box.maximum_.y() > tolerance) ||
     171 [ +  + ][ +  + ]:     132884 :              (minimum_.z() - box.maximum_.z() > tolerance) );
     172                 :            : }
     173                 :            :              
     174                 :            :   
     175                 :            :   
     176                 :            : 
     177                 :            : // Union of this and box
     178                 :      69928 : CubitBox& CubitBox::operator|=(const CubitBox& box)
     179                 :            : {
     180         [ +  + ]:      69928 :   minimum_.x(CUBIT_MIN(minimum_.x(), box.minimum_.x()));
     181         [ +  + ]:      69928 :   minimum_.y(CUBIT_MIN(minimum_.y(), box.minimum_.y()));
     182         [ +  + ]:      69928 :   minimum_.z(CUBIT_MIN(minimum_.z(), box.minimum_.z()));
     183                 :            : 
     184         [ +  + ]:      69928 :   maximum_.x(CUBIT_MAX(maximum_.x(), box.maximum_.x()));
     185         [ +  + ]:      69928 :   maximum_.y(CUBIT_MAX(maximum_.y(), box.maximum_.y()));
     186         [ +  + ]:      69928 :   maximum_.z(CUBIT_MAX(maximum_.z(), box.maximum_.z()));
     187                 :      69928 :   return *this;
     188                 :            : }
     189                 :            : 
     190                 :            : // Union of this and vector
     191                 :        748 : CubitBox& CubitBox::operator|=(const CubitVector& vector)
     192                 :            : {
     193         [ +  + ]:        748 :   minimum_.x(CUBIT_MIN(minimum_.x(), vector.x()));
     194         [ +  + ]:        748 :   minimum_.y(CUBIT_MIN(minimum_.y(), vector.y()));
     195         [ +  + ]:        748 :   minimum_.z(CUBIT_MIN(minimum_.z(), vector.z()));
     196                 :            : 
     197         [ +  + ]:        748 :   maximum_.x(CUBIT_MAX(maximum_.x(), vector.x()));
     198         [ +  + ]:        748 :   maximum_.y(CUBIT_MAX(maximum_.y(), vector.y()));
     199         [ +  + ]:        748 :   maximum_.z(CUBIT_MAX(maximum_.z(), vector.z()));
     200                 :        748 :   return *this;
     201                 :            : }
     202                 :            : 
     203                 :            : // Intersection of this and box
     204                 :          0 : CubitBox& CubitBox::operator&=(const CubitBox& box)
     205                 :            : {
     206         [ #  # ]:          0 :   minimum_.x(CUBIT_MAX(minimum_.x(), box.minimum_.x()));
     207         [ #  # ]:          0 :   minimum_.y(CUBIT_MAX(minimum_.y(), box.minimum_.y()));
     208         [ #  # ]:          0 :   minimum_.z(CUBIT_MAX(minimum_.z(), box.minimum_.z()));
     209                 :            : 
     210         [ #  # ]:          0 :   maximum_.x(CUBIT_MIN(maximum_.x(), box.maximum_.x()));
     211         [ #  # ]:          0 :   maximum_.y(CUBIT_MIN(maximum_.y(), box.maximum_.y()));
     212         [ #  # ]:          0 :   maximum_.z(CUBIT_MIN(maximum_.z(), box.maximum_.z()));
     213                 :            : 
     214 [ #  # ][ #  # ]:          0 :   if (minimum_.x() > maximum_.x() ||
     215 [ #  # ][ #  # ]:          0 :       minimum_.y() > maximum_.y() ||
     216                 :          0 :       minimum_.z() > maximum_.z())
     217                 :            :   {
     218                 :          0 :     minimum_.set(0.0, 0.0, 0.0);
     219                 :          0 :     maximum_.set(0.0, 0.0, 0.0);
     220                 :            :   }
     221                 :          0 :   return *this;
     222                 :            : }
     223                 :            : 
     224                 :         44 : CubitBox& CubitBox::operator*=(double scale)
     225                 :            : {
     226         [ +  - ]:         44 :   CubitVector center_vec = center();
     227         [ +  - ]:         44 :   *this -= center_vec;
     228         [ +  - ]:         44 :   minimum_ *= scale;
     229         [ +  - ]:         44 :   maximum_ *= scale;
     230         [ +  - ]:         44 :   *this += center_vec;
     231                 :         44 :   return *this;
     232                 :            : }
     233                 :            : 
     234                 :          0 : CubitBox& CubitBox::operator/=(double scale)
     235                 :            : {
     236         [ #  # ]:          0 :   if(scale == 0.0)
     237                 :          0 :     throw ("Cannot Divide by Zero");
     238                 :            :   //assert(scale != 0.0);
     239                 :          0 :   *this *= 1/scale;
     240                 :          0 :   return *this;
     241                 :            : }
     242                 :            : 
     243                 :         44 : CubitBox& CubitBox::operator+=(const CubitVector& offset)
     244                 :            : {
     245                 :         44 :   minimum_ += offset;
     246                 :         44 :   maximum_ += offset;
     247                 :         44 :   return *this;
     248                 :            : }
     249                 :            : 
     250                 :         44 : CubitBox& CubitBox::operator-=(const CubitVector& offset)
     251                 :            : {
     252                 :         44 :   minimum_ -= offset;
     253                 :         44 :   maximum_ -= offset;
     254                 :         44 :   return *this;
     255                 :            : }
     256                 :            : 
     257                 :         33 : int CubitBox::operator<(const CubitBox& box) const
     258                 :            : {
     259         [ #  # ]:         33 :   return (box.minimum_.x() < minimum_.x() &&
     260         [ #  # ]:          0 :           box.minimum_.y() < minimum_.y() &&
     261         [ #  # ]:          0 :           box.minimum_.z() < minimum_.z() &&
     262         [ #  # ]:          0 :           box.maximum_.x() > maximum_.x() &&
     263 [ -  + ][ #  # ]:         33 :           box.maximum_.y() > maximum_.y() &&
     264                 :         33 :           box.maximum_.z() > maximum_.z());
     265                 :            : }
     266                 :            : 
     267                 :         66 : int CubitBox::operator<=(const CubitBox& box) const
     268                 :            : {
     269         [ +  + ]:        132 :   return (box.minimum_.x() <= minimum_.x() &&
     270         [ +  + ]:        110 :           box.minimum_.y() <= minimum_.y() &&
     271         [ +  - ]:         77 :           box.minimum_.z() <= minimum_.z() &&
     272         [ +  + ]:         66 :           box.maximum_.x() >= maximum_.x() &&
     273 [ +  - ][ -  + ]:        165 :           box.maximum_.y() >= maximum_.y() &&
     274                 :         77 :           box.maximum_.z() >= maximum_.z());
     275                 :            : }
     276                 :            : 
     277                 :         33 : int CubitBox::operator>(const CubitBox& box) const
     278                 :            : {
     279         [ #  # ]:         33 :   return (box.minimum_.x() > minimum_.x() &&
     280         [ #  # ]:          0 :           box.minimum_.y() > minimum_.y() &&
     281         [ #  # ]:          0 :           box.minimum_.z() > minimum_.z() &&
     282         [ #  # ]:          0 :           box.maximum_.x() < maximum_.x() &&
     283 [ -  + ][ #  # ]:         33 :           box.maximum_.y() < maximum_.y() &&
     284                 :         33 :           box.maximum_.z() < maximum_.z());
     285                 :            : }
     286                 :            : 
     287                 :          0 : int CubitBox::operator>=(const CubitBox& box) const
     288                 :            : {
     289         [ #  # ]:          0 :   return (box.minimum_.x() >= minimum_.x() &&
     290         [ #  # ]:          0 :           box.minimum_.y() >= minimum_.y() &&
     291         [ #  # ]:          0 :           box.minimum_.z() >= minimum_.z() &&
     292         [ #  # ]:          0 :           box.maximum_.x() <= maximum_.x() &&
     293 [ #  # ][ #  # ]:          0 :           box.maximum_.y() <= maximum_.y() &&
     294                 :          0 :           box.maximum_.z() <= maximum_.z());
     295                 :            : }
     296                 :            : 
     297                 :          0 : int CubitBox::operator>(const CubitVector& vect) const
     298                 :            : {
     299   [ #  #  #  # ]:          0 :   return (vect.x() > minimum_.x() && vect.x() < maximum_.x() &&
     300   [ #  #  #  # ]:          0 :           vect.y() > minimum_.y() && vect.y() < maximum_.y() &&
     301 [ #  # ][ #  # ]:          0 :           vect.z() > minimum_.z() && vect.z() < maximum_.z() );
     302                 :            : }
     303                 :            : 
     304                 :          0 : int CubitBox::operator>=(const CubitVector& vect) const
     305                 :            : {
     306         [ #  # ]:          0 :   return (vect.x() >= minimum_.x() && 
     307         [ #  # ]:          0 :           vect.x() <= maximum_.x() &&
     308         [ #  # ]:          0 :           vect.y() >= minimum_.y() && 
     309         [ #  # ]:          0 :           vect.y() <= maximum_.y() &&
     310 [ #  # ][ #  # ]:          0 :           vect.z() >= minimum_.z() && 
     311                 :          0 :           vect.z() <= maximum_.z() );
     312                 :            : }
     313                 :            : 
     314                 :          0 : CubitBox operator|(const CubitBox& lhs, const CubitBox& rhs)
     315                 :            : {
     316 [ #  # ][ #  # ]:          0 :   return CubitBox(lhs) |= rhs;
     317                 :            : }
     318                 :            : 
     319                 :          0 : CubitBox operator&(const CubitBox& lhs, const CubitBox& rhs)
     320                 :            : {
     321 [ #  # ][ #  # ]:          0 :   return CubitBox(lhs) &= rhs;
     322                 :            : }
     323                 :            : 
     324                 :         11 : CubitBox operator*(double lhs, const CubitBox& rhs)
     325                 :            : {
     326 [ +  - ][ +  - ]:         11 :   return CubitBox(rhs) *= lhs;
     327                 :            : }
     328                 :            : 
     329                 :         33 : CubitBox operator*(const CubitBox& lhs, double rhs)
     330                 :            : {
     331 [ +  - ][ +  - ]:         33 :   return CubitBox(lhs) *= rhs;
     332                 :            : }
     333                 :            : 
     334                 :          0 : CubitBox operator/(const CubitBox& lhs, double rhs)
     335                 :            : {
     336 [ #  # ][ #  # ]:          0 :   return CubitBox(lhs) /= rhs;
     337                 :            : }
     338                 :            : 
     339                 :          0 : CubitBox operator+(const CubitBox& lhs, const CubitVector& rhs)
     340                 :            : {
     341 [ #  # ][ #  # ]:          0 :   return CubitBox(lhs) += rhs;
     342                 :            : }
     343                 :            : 
     344                 :          0 : CubitBox operator-(const CubitBox& lhs, const CubitVector& rhs)
     345                 :            : {
     346 [ #  # ][ #  # ]:          0 :   return CubitBox(lhs) -= rhs;
     347                 :            : }
     348                 :            : 
     349                 :          0 : double CubitBox::distance_squared( const CubitVector& point ) const
     350                 :            : {
     351 [ #  # ][ #  # ]:          0 :   return (point - closest_point(point)).length_squared();
     352                 :            : }
     353                 :            : 
     354                 :            : 
     355                 :            : 
     356                 :            : //-------------------------------------------------------------------------
     357                 :            : // Purpose       : Find the closest point on the CubitBox
     358                 :            : //
     359                 :            : // Special Notes : 
     360                 :            : //
     361                 :            : // Creator       : Jason Kraftcheck
     362                 :            : //
     363                 :            : // Creation Date : 03/12/98
     364                 :            : //-------------------------------------------------------------------------
     365                 :          0 : CubitVector CubitBox::closest_point( const CubitVector& point ) const
     366                 :            : {
     367                 :          0 :   CubitVector result;
     368                 :            :   
     369         [ #  # ]:          0 :   if( point.x() < minimum_.x() )
     370                 :          0 :     result.x( minimum_.x() );
     371         [ #  # ]:          0 :   else if( point.x() > maximum_.x() )
     372                 :          0 :     result.x( maximum_.x() );
     373                 :            :   else
     374                 :          0 :     result.x( point.x() );
     375                 :            :   
     376         [ #  # ]:          0 :   if( point.y() < minimum_.y() )
     377                 :          0 :     result.y( minimum_.y() );
     378         [ #  # ]:          0 :   else if( point.y() > maximum_.y() )
     379                 :          0 :     result.y( maximum_.y() );
     380                 :            :   else
     381                 :          0 :     result.y( point.y() );
     382                 :            :   
     383         [ #  # ]:          0 :   if( point.z() < minimum_.z() )
     384                 :          0 :     result.z( minimum_.z() );
     385         [ #  # ]:          0 :   else if( point.z() > maximum_.z() )
     386                 :          0 :     result.z( maximum_.z() );
     387                 :            :   else
     388                 :          0 :     result.z( point.z() );
     389                 :            :   
     390                 :          0 :   return result;
     391                 :            : }
     392                 :            : 
     393                 :      66674 : CubitBox::CubitBox(const double min[3], const double max[3])
     394                 :            : {
     395                 :      33337 :   minimum_.set (CUBIT_MIN (min[0], max[0]),
     396                 :      33337 :                 CUBIT_MIN (min[1], max[1]),
     397 [ +  - ][ +  - ]:      33337 :                 CUBIT_MIN (min[2], max[2]));
                 [ +  - ]
     398                 :      33337 :   maximum_.set (CUBIT_MAX (min[0], max[0]),
     399                 :      33337 :                 CUBIT_MAX (min[1], max[1]),
     400 [ -  + ][ -  + ]:      33337 :                 CUBIT_MAX (min[2], max[2]));
                 [ -  + ]
     401                 :      33337 : }
     402                 :            : 
     403                 :       4138 : void CubitBox::reset(const double min[3], const double max[3])
     404                 :            : {
     405                 :       4138 :   minimum_.set (CUBIT_MIN (min[0], max[0]),
     406                 :       4138 :                 CUBIT_MIN (min[1], max[1]),
     407 [ +  - ][ +  - ]:       4138 :                 CUBIT_MIN (min[2], max[2]));
                 [ +  - ]
     408                 :       4138 :   maximum_.set (CUBIT_MAX (min[0], max[0]),
     409                 :       4138 :                 CUBIT_MAX (min[1], max[1]),
     410 [ -  + ][ -  + ]:       4138 :                 CUBIT_MAX (min[2], max[2]));
                 [ -  + ]
     411                 :       4138 : }
     412                 :            : 
     413                 :          0 : void CubitBox::get_corners( CubitVector vectors[8] ) const
     414                 :            : {
     415                 :          0 :   vectors[0] = minimum_;
     416         [ #  # ]:          0 :   vectors[1] = CubitVector (maximum_.x(), minimum_.y(), minimum_.z());
     417         [ #  # ]:          0 :   vectors[2] = CubitVector (maximum_.x(), maximum_.y(), minimum_.z());
     418         [ #  # ]:          0 :   vectors[3] = CubitVector (minimum_.x(), maximum_.y(), minimum_.z());
     419                 :            :   
     420         [ #  # ]:          0 :   vectors[4] = CubitVector (minimum_.x(), minimum_.y(), maximum_.z());
     421         [ #  # ]:          0 :   vectors[5] = CubitVector (maximum_.x(), minimum_.y(), maximum_.z());
     422                 :          0 :   vectors[6] = maximum_;
     423         [ #  # ]:          0 :   vectors[7] = CubitVector (minimum_.x(), maximum_.y(), maximum_.z());
     424                 :          0 : }
     425                 :            : 
     426                 :          0 : int CubitBox::operator&&(const CubitBox& box) const 
     427                 :            : {
     428                 :            :     // Return false if there is no overlap
     429                 :            :     // along at least one of the 3 axes.
     430 [ #  # ][ #  # ]:          0 :   if (minimum_.x() > box.maximum_.x() ||
     431         [ #  # ]:          0 :       maximum_.x() < box.minimum_.x() ||
     432         [ #  # ]:          0 :       minimum_.y() > box.maximum_.y() ||
     433         [ #  # ]:          0 :       maximum_.y() < box.minimum_.y() ||
     434 [ #  # ][ #  # ]:          0 :       minimum_.z() > box.maximum_.z() ||
     435                 :          0 :       maximum_.z() < box.minimum_.z() )
     436                 :          0 :     return CUBIT_FALSE;
     437                 :            :   
     438                 :            :     // If you didn't return false...
     439                 :          0 :   return CUBIT_TRUE;
     440                 :            : }
     441                 :            : 
     442                 :          0 : int CubitBox::operator||(const CubitBox& box) const 
     443                 :            : {
     444                 :            :     // Return false if there is no overlap
     445                 :            :     // along at least one of the 3 axes.
     446 [ #  # ][ #  # ]:          0 :   if (minimum_.x() >= box.maximum_.x() ||
     447         [ #  # ]:          0 :       maximum_.x() <= box.minimum_.x() ||
     448         [ #  # ]:          0 :       minimum_.y() >= box.maximum_.y() ||
     449         [ #  # ]:          0 :       maximum_.y() <= box.minimum_.y() ||
     450 [ #  # ][ #  # ]:          0 :       minimum_.z() >= box.maximum_.z() ||
     451                 :          0 :       maximum_.z() <= box.minimum_.z() )
     452                 :          0 :     return CUBIT_FALSE;
     453                 :            :   
     454                 :            :     // If you didn't return false...
     455                 :          0 :   return CUBIT_TRUE;
     456                 :            : }
     457                 :            : 
     458                 :          0 : int CubitBox::operator<=(const CubitVector& vect) const
     459                 :            : {
     460         [ #  # ]:          0 :   return (vect.x() <= minimum_.x() ||
     461         [ #  # ]:          0 :           vect.x() >= maximum_.x() ||
     462         [ #  # ]:          0 :           vect.y() <= minimum_.y() ||
     463         [ #  # ]:          0 :           vect.y() >= maximum_.y() ||
     464 [ #  # ][ #  # ]:          0 :           vect.z() <= minimum_.z() ||
     465                 :          0 :           vect.z() >= maximum_.z() );
     466                 :            : }
     467                 :            : 
     468                 :            : /*
     469                 :            : Ray-axis Aligned box intersection by
     470                 :            : KAY, T. L., AND KAJIYA, J. T.
     471                 :            : In Computer Graphics (SIGGRAPH '86 Proceedings) (Aug. 1986), D. C. Evans and R. J. Athay, Eds., vol. 20, pp. 269-278. 
     472                 :            : 
     473                 :            : Determines if there is an intersection between a ray and box but doesn't calculate the intersection.
     474                 :            : 
     475                 :            : */
     476                 :          0 : bool CubitBox::intersect(const CubitVector& ray_origin, const CubitVector& ray_direction)
     477                 :            : {
     478                 :          0 :     double tNear=CUBIT_DBL_MIN;
     479                 :          0 :     double tFar=CUBIT_DBL_MAX;
     480                 :            : 
     481         [ #  # ]:          0 :     for(int i=0;i<3;i++)
     482                 :            :     {
     483                 :            :         //X plane
     484         [ #  # ]:          0 :         if(fabs(ray_direction[i])<=CUBIT_DBL_MIN)
     485                 :            :         {
     486                 :            :             //Ray parallel to x plane
     487 [ #  # ][ #  # ]:          0 :             if(ray_origin[i]<this->minimum_[i] || ray_origin[i]>this->maximum_[i])
                 [ #  # ]
     488                 :            :             {
     489                 :            :                 //Not between
     490                 :          0 :                 return false;
     491                 :            :             }
     492                 :            :             else
     493                 :            :             {
     494                 :          0 :                 return true;
     495                 :            :             }
     496                 :            :         }
     497                 :            : 
     498                 :          0 :         double t1 = (this->minimum_[i] - ray_origin[i]) / ray_direction[i];
     499                 :          0 :         double t2 = (this->maximum_[i] - ray_origin[i]) / ray_direction[i];
     500                 :            : 
     501         [ #  # ]:          0 :         if(t1>t2)
     502                 :            :         {
     503                 :          0 :             double temp=t1;
     504                 :          0 :             t1=t2;
     505                 :          0 :             t2=temp;
     506                 :            :         }
     507         [ #  # ]:          0 :         if(t1>tNear)
     508                 :            :         {
     509                 :          0 :             tNear=t1;
     510                 :            :         }
     511                 :            : 
     512         [ #  # ]:          0 :         if(t2<tFar)
     513                 :            :         {
     514                 :          0 :             tFar=t2;
     515                 :            :         }
     516                 :            : 
     517         [ #  # ]:          0 :         if(tNear>tFar)
     518                 :            :         {
     519                 :          0 :             return false;
     520                 :            :         }
     521                 :            : 
     522         [ #  # ]:          0 :         if(tFar<0)
     523                 :            :         {
     524                 :          0 :             return false;
     525                 :            :         }
     526                 :            : 
     527                 :            :     }
     528                 :            : 
     529                 :          0 :     return true;
     530                 :            : }
     531                 :            : 
     532                 :            : /* 
     533                 :            : Fast Ray-Box Intersection
     534                 :            : by Andrew Woo
     535                 :            : from "Graphics Gems", Academic Press, 1990
     536                 :            : */
     537                 :            : 
     538                 :            : #define NUMDIM  3
     539                 :            : #define RIGHT   0
     540                 :            : #define LEFT    1
     541                 :            : #define MIDDLE  2
     542                 :            : 
     543                 :            : //char HitBoundingBox(minB,maxB, origin, dir,coord)
     544                 :            : //double minB[NUMDIM], maxB[NUMDIM];            /*box */
     545                 :            : //double origin[NUMDIM], dir[NUMDIM];           /*ray */
     546                 :            : //double coord[NUMDIM];                         /* hit point */
     547                 :          0 : bool CubitBox::intersect
     548                 :            : (const CubitVector& ray_origin,
     549                 :            :   const CubitVector& ray_direction,
     550                 :            :   CubitVector& intersection_pt)
     551                 :            : {
     552                 :          0 :   bool inside = true;
     553                 :            :   int quadrant[NUMDIM];
     554                 :            :   register int i;
     555                 :            :   int whichPlane;
     556                 :            :   double maxT[NUMDIM];
     557                 :            :   double candidatePlane[NUMDIM];
     558                 :            : 
     559                 :            :   /* Find candidate planes; this loop can be avoided if
     560                 :            :   rays cast all from the eye(assume perpsective view) */
     561         [ #  # ]:          0 :   for (i=0; i<NUMDIM; i++)
     562                 :            :   {
     563 [ #  # ][ #  # ]:          0 :     if((ray_origin)[i] < (this->minimum())[i])
         [ #  # ][ #  # ]
     564                 :            :     {
     565                 :          0 :       quadrant[i] = LEFT;
     566 [ #  # ][ #  # ]:          0 :       candidatePlane[i] = (this->minimum())[i];
     567                 :          0 :       inside = false;
     568                 :            :     }
     569 [ #  # ][ #  # ]:          0 :     else if ( (ray_origin)[i] > (this->maximum())[i])
         [ #  # ][ #  # ]
     570                 :            :     {
     571                 :          0 :       quadrant[i] = RIGHT;
     572 [ #  # ][ #  # ]:          0 :       candidatePlane[i] = (this->maximum())[i];
     573                 :          0 :       inside = false;
     574                 :            :     }
     575                 :            :     else        
     576                 :            :     {
     577                 :          0 :       quadrant[i] = MIDDLE;
     578                 :            :     }
     579                 :            :   }
     580                 :            : 
     581                 :            :   /* Ray origin inside bounding box */
     582         [ #  # ]:          0 :   if(inside)
     583                 :            :   {
     584         [ #  # ]:          0 :     intersection_pt = ray_origin;
     585                 :          0 :     return true;
     586                 :            :   }
     587                 :            : 
     588                 :            :   /* Calculate T distances to candidate planes */
     589         [ #  # ]:          0 :   for (i = 0; i < NUMDIM; i++)
     590                 :            :   {
     591 [ #  # ][ #  # ]:          0 :     if (quadrant[i] != MIDDLE && (ray_direction)[i] !=0.)
         [ #  # ][ #  # ]
     592 [ #  # ][ #  # ]:          0 :       maxT[i] = ( candidatePlane[i]-(ray_origin)[i]) / ((ray_direction)[i]);
     593                 :            :     else
     594                 :          0 :       maxT[i] = -1.;
     595                 :            :   }
     596                 :            : 
     597                 :            :   /* Get largest of the maxT's for final choice of intersection */
     598                 :          0 :   whichPlane = 0;
     599         [ #  # ]:          0 :   for (i = 1; i < NUMDIM; i++)
     600                 :            :   {
     601         [ #  # ]:          0 :     if (maxT[whichPlane] < maxT[i])
     602                 :          0 :       whichPlane = i;
     603                 :            :   }
     604                 :            : 
     605                 :            :   /* Check final candidate actually inside box */
     606                 :            :   double intersection_coords[3];
     607                 :            : 
     608         [ #  # ]:          0 :   if (maxT[whichPlane] < 0.)
     609                 :          0 :     return false;
     610                 :            : 
     611         [ #  # ]:          0 :   for (i = 0; i < NUMDIM; i++)
     612                 :            :   {
     613         [ #  # ]:          0 :     if (whichPlane != i)
     614                 :            :     {
     615 [ #  # ][ #  # ]:          0 :       intersection_coords[i] = (ray_origin)[i] + maxT[whichPlane] * (ray_direction)[i];
     616 [ #  # ][ #  # ]:          0 :       if (intersection_coords[i] < (this->minimum())[i] ||
         [ #  # ][ #  # ]
                 [ #  # ]
           [ #  #  #  # ]
     617 [ #  # ][ #  # ]:          0 :           intersection_coords[i] > (this->maximum())[i])
         [ #  # ][ #  # ]
     618                 :          0 :         return false;
     619                 :            :     }
     620                 :            :     else
     621                 :            :     {
     622                 :          0 :       intersection_coords[i] = candidatePlane[i];
     623                 :            :     }
     624                 :            :   }
     625                 :            : 
     626                 :          0 :   return true;  /* ray hits box */
     627                 :            : }

Generated by: LCOV version 1.11