ROOT logo
// @(#)root/base:$Id$
// Author: Matevz Tadel  7/4/2006

/*************************************************************************
 * Copyright (C) 1995-2006, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TAttBBox
#define ROOT_TAttBBox

#ifndef ROOT_Rtypes
#include "Rtypes.h"
#endif

class TAttBBox
{
protected:
   Float_t*  fBBox;   //! Dynamic Float_t[6] X(min,max), Y(min,max), Z(min,max)

   void BBoxInit(Float_t infinity=1e6);
   void BBoxZero(Float_t epsilon=0, Float_t x=0, Float_t y=0, Float_t z=0);
   void BBoxClear();

   void BBoxCheckPoint(Float_t x, Float_t y, Float_t z);
   void BBoxCheckPoint(const Float_t* p);

   void AssertBBoxExtents(Float_t epsilon=0.005);

   TAttBBox(const TAttBBox& tab) : fBBox(0) {
      BBoxInit(); if(tab.fBBox) for(Int_t i=0; i<6; i++) fBBox[i]=tab.fBBox[i];
   }
   
public:
   TAttBBox(): fBBox(0) { }
   virtual ~TAttBBox() { BBoxClear(); }

   TAttBBox& operator=(const TAttBBox& tab) 
     {if(this!=&tab) {BBoxInit(); if(tab.fBBox) for(Int_t i=0; i<6; i++) fBBox[i]=tab.fBBox[i];}
     return *this;}

   Bool_t   GetBBoxOK() const { return fBBox != 0; }
   Float_t* GetBBox()         { return fBBox; }
   Float_t* AssertBBox()      { if(fBBox == 0) ComputeBBox(); return fBBox; }
   void     ResetBBox()       { if(fBBox != 0) BBoxClear(); }

   virtual void ComputeBBox() = 0;

   ClassDef(TAttBBox,1); // Helper for management of bounding-box information
};


// Inline methods:

inline void TAttBBox::BBoxCheckPoint(Float_t x, Float_t y, Float_t z)
{
   if(x < fBBox[0]) fBBox[0] = x;   if(x > fBBox[1]) fBBox[1] = x;
   if(y < fBBox[2]) fBBox[2] = y;   if(y > fBBox[3]) fBBox[3] = y;
   if(z < fBBox[4]) fBBox[4] = z;   if(z > fBBox[5]) fBBox[5] = z;
}

inline void TAttBBox::BBoxCheckPoint(const Float_t* p)
{
   BBoxCheckPoint(p[0], p[1], p[2]);
}

#endif
 TAttBBox.h:1
 TAttBBox.h:2
 TAttBBox.h:3
 TAttBBox.h:4
 TAttBBox.h:5
 TAttBBox.h:6
 TAttBBox.h:7
 TAttBBox.h:8
 TAttBBox.h:9
 TAttBBox.h:10
 TAttBBox.h:11
 TAttBBox.h:12
 TAttBBox.h:13
 TAttBBox.h:14
 TAttBBox.h:15
 TAttBBox.h:16
 TAttBBox.h:17
 TAttBBox.h:18
 TAttBBox.h:19
 TAttBBox.h:20
 TAttBBox.h:21
 TAttBBox.h:22
 TAttBBox.h:23
 TAttBBox.h:24
 TAttBBox.h:25
 TAttBBox.h:26
 TAttBBox.h:27
 TAttBBox.h:28
 TAttBBox.h:29
 TAttBBox.h:30
 TAttBBox.h:31
 TAttBBox.h:32
 TAttBBox.h:33
 TAttBBox.h:34
 TAttBBox.h:35
 TAttBBox.h:36
 TAttBBox.h:37
 TAttBBox.h:38
 TAttBBox.h:39
 TAttBBox.h:40
 TAttBBox.h:41
 TAttBBox.h:42
 TAttBBox.h:43
 TAttBBox.h:44
 TAttBBox.h:45
 TAttBBox.h:46
 TAttBBox.h:47
 TAttBBox.h:48
 TAttBBox.h:49
 TAttBBox.h:50
 TAttBBox.h:51
 TAttBBox.h:52
 TAttBBox.h:53
 TAttBBox.h:54
 TAttBBox.h:55
 TAttBBox.h:56
 TAttBBox.h:57
 TAttBBox.h:58
 TAttBBox.h:59
 TAttBBox.h:60
 TAttBBox.h:61
 TAttBBox.h:62
 TAttBBox.h:63
 TAttBBox.h:64
 TAttBBox.h:65
 TAttBBox.h:66
 TAttBBox.h:67
 TAttBBox.h:68
 TAttBBox.h:69
 TAttBBox.h:70