Logo ROOT  
Reference Guide
TGLBoundingBox.h
Go to the documentation of this file.
1// @(#)root/gl:$Id$
2// Author: Richard Maunder 25/05/2005
3
4/*************************************************************************
5 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12#ifndef ROOT_TGLBoundingBox
13#define ROOT_TGLBoundingBox
14
15#include "TGLUtil.h"
16
17//////////////////////////////////////////////////////////////////////////
18// //
19// TGLBoundingBox //
20// //
21// Concrete class describing an orientated (free) or axis aligned box //
22// of 8 verticies. Supports methods for setting aligned or orientated //
23// boxes, find volume, axes, extents, centers, face planes etc. //
24// Also tests for overlap testing of planes and other bounding boxes, //
25// with fast sphere approximation. //
26//////////////////////////////////////////////////////////////////////////
27
28// TODO: Create more compact version + axis aligned version, both with lazy
29// sphere testing.
31{
32private:
33 // Fields
34
35 // Box vertices are indexed thus (OpenGL is left handed by default)
36 // y
37 // |
38 // |
39 // |________x
40 // / 3-------2
41 // / /| /|
42 // z 7-------6 |
43 // | 0-----|-1
44 // |/ |/
45 // 4-------5
46 //
47 // 0123 'far' face
48 // 4567 'near' face
49 //
50 // This could be more compact:
51 // For orientated box 3 vertices which form plane cutting box
52 // diagonally (e.g. 0,5,6 or 1,3,6 etc) would fix in space.
53 // For axis aligned 2 verticies would suffice.
54 // Rest could be calculated on demand - however speed more important
55 // than memory considerations
56 TGLVertex3 fVertex[8]; //! the 8 bounding box vertices
57 Double_t fVolume; //! box volume - cached for speed
58 Double_t fDiagonal; //! max box diagonal - cached for speed
59 TGLVector3 fAxes[3]; //! box axes in global frame - cached for speed
60 TGLVector3 fAxesNorm[3];//! normalised box axes in global frame - cached for speed
61
62 // Methods
63 void UpdateCache();
64 Bool_t ValidIndex(UInt_t index) const { return (index < 8); }
65 Double_t Min(UInt_t index) const;
66 Double_t Max(UInt_t index) const;
67
68public:
71 TGLBoundingBox(const Double_t vertex[8][3]);
72 TGLBoundingBox(const TGLVertex3 & lowVertex, const TGLVertex3 & highVertex);
73 TGLBoundingBox(const TGLBoundingBox & other);
74 virtual ~TGLBoundingBox(); // ClassDef introduces virtual fns
75
76 // Set orientated box
78 void Set(const TGLVertex3 vertex[8]);
79 void Set(const Double_t vertex[8][3]);
80 void Set(const TGLBoundingBox & other);
81 void SetEmpty();
82
83 // Set axis aligned box
84 void SetAligned(const TGLVertex3 & lowVertex, const TGLVertex3 & highVertex); // axis aligned
85 void SetAligned(UInt_t nbPnts, const Double_t * pnts); // axis aligned
86 void MergeAligned(const TGLBoundingBox & other);
87 void ExpandAligned(const TGLVertex3 & point);
88
89 // Manipulation
90 void Transform(const TGLMatrix & matrix);
91 void Scale(Double_t factor);
92 void Scale(Double_t xFactor, Double_t yFactor, Double_t zFactor);
93 void Translate(const TGLVector3 & offset);
94
95 // Single vertex accessors
96 const TGLVertex3 & operator [] (UInt_t index) const;
97 const TGLVertex3 & Vertex(UInt_t index) const;
98 Double_t XMin() const { return Min(0); }
99 Double_t XMax() const { return Max(0); }
100 Double_t YMin() const { return Min(1); }
101 Double_t YMax() const { return Max(1); }
102 Double_t ZMin() const { return Min(2); }
103 Double_t ZMax() const { return Max(2); }
104 TGLVertex3 MinAAVertex() const;
105 TGLVertex3 MaxAAVertex() const;
106
107 // Multiple vertices accessors
108 const TGLVertex3* Vertices() const; // All 8 box vertices
109 Int_t NumVertices() const { return 8; }
110
112 const std::vector<UInt_t> & FaceVertices(EFace face) const; // 4 box face vertices
113
114 // Other properties
115 TGLVertex3 Center() const;
116 TGLVector3 Extents() const;
117 const TGLVector3 & Axis(UInt_t i, Bool_t normalised = kTRUE) const;
118 Bool_t IsEmpty() const;
119 Double_t Volume() const { return fVolume; }
120 Double_t Diagonal() const { return fDiagonal; }
121 void PlaneSet(TGLPlaneSet_t & planeSet) const;
122 TGLPlane GetNearPlane() const;
123
124 // Overlap testing
125 Rgl::EOverlap Overlap(const TGLPlane & plane) const;
127
128 void Draw(Bool_t solid = kFALSE) const;
129 void Dump() const;
130
131 ClassDef(TGLBoundingBox,0); // a 3D orientated bounding box
132};
133
134//______________________________________________________________________________
136{
137 // Check for self-assignment
138 if (this != &other) {
139 Set(other);
140 }
141 return *this;
142}
143
144//______________________________________________________________________________
146{
147 return fVertex[index];
148}
149
150//______________________________________________________________________________
151inline const TGLVertex3 & TGLBoundingBox::Vertex(UInt_t index) const
152{
153 return fVertex[index];
154}
155
156//______________________________________________________________________________
158{
159 return fVertex;
160}
161
162//______________________________________________________________________________
164{
165 // Return the local axis entents of the box
166 return TGLVector3(Axis(0,kFALSE).Mag(),
167 Axis(1,kFALSE).Mag(),
168 Axis(2,kFALSE).Mag());
169}
170
171//______________________________________________________________________________
173{
174 // Return the center vertex of the box
175 return TGLVertex3((fVertex[0].X() + fVertex[6].X())/2.0,
176 (fVertex[0].Y() + fVertex[6].Y())/2.0,
177 (fVertex[0].Z() + fVertex[6].Z())/2.0);
178}
179
180//______________________________________________________________________________
181inline const TGLVector3 & TGLBoundingBox::Axis(UInt_t i, Bool_t normalised) const
182{
183 // Return a vector representing axis of index i (0:X, 1:Y, 2:Z).
184 // Vector can be as-is (edge, magnitude == extent) or normalised (default)
185 // y
186 // |
187 // |
188 // |________x
189 // / 3-------2
190 // / /| /|
191 // z 7-------6 |
192 // | 0-----|-1
193 // |/ |/
194 // 4-------5
195 //
196
197 if (normalised) {
198 return fAxesNorm[i];
199 } else {
200 return fAxes[i];
201 }
202}
203
204//______________________________________________________________________________
206{
207 // Return kTRUE if box has zero diagonal - kFALSE otherwise
208
209 // TODO: Round errors - should have epsilon test
210 return (Diagonal() == 0.0);
211}
212
213#endif // ROOT_TGLBoundingBox
int Int_t
Definition: RtypesCore.h:41
unsigned int UInt_t
Definition: RtypesCore.h:42
const Bool_t kFALSE
Definition: RtypesCore.h:88
bool Bool_t
Definition: RtypesCore.h:59
double Double_t
Definition: RtypesCore.h:55
const Bool_t kTRUE
Definition: RtypesCore.h:87
#define ClassDef(name, id)
Definition: Rtypes.h:326
std::vector< TGLPlane > TGLPlaneSet_t
Definition: TGLUtil.h:570
Concrete class describing an orientated (free) or axis aligned box of 8 vertices.
Double_t Volume() const
Double_t Min(UInt_t index) const
Find minimum vertex value for axis of index X(0), Y(1), Z(2)
Double_t fDiagonal
box volume - cached for speed
Double_t XMin() const
TGLPlane GetNearPlane() const
Return the near-plane.
TGLVector3 Extents() const
TGLVertex3 Center() const
void Set(const TGLVertex3 vertex[8])
Set a bounding box from provided 8 vertices.
Double_t Diagonal() const
void SetEmpty()
Set bounding box empty - all vertices at (0,0,0)
void PlaneSet(TGLPlaneSet_t &planeSet) const
Fill out supplied plane set vector with TGLPlane objects representing six faces of box.
TGLBoundingBox & operator=(const TGLBoundingBox &other)
const std::vector< UInt_t > & FaceVertices(EFace face) const
return a vector of face vertices y | | |________x / 3----—2 / /| /| z 7----—6 | | 0--—|-1 |/ |/ 4----...
TGLVertex3 fVertex[8]
Bool_t IsEmpty() const
void Transform(const TGLMatrix &matrix)
Transform all vertices with matrix.
TGLVector3 fAxesNorm[3]
box axes in global frame - cached for speed
void MergeAligned(const TGLBoundingBox &other)
Expand current bbox so that it includes other's bbox.
void Translate(const TGLVector3 &offset)
Translate all vertices by offset.
Double_t ZMax() const
const TGLVertex3 * Vertices() const
Double_t XMax() const
TGLVertex3 MinAAVertex() const
Find minimum vertex values.
Double_t YMin() const
TGLBoundingBox()
Construct an empty bounding box.
void Scale(Double_t factor)
Isotropically scale bounding box along it's LOCAL axes, preserving center.
TGLVector3 fAxes[3]
max box diagonal - cached for speed
const TGLVertex3 & Vertex(UInt_t index) const
void SetAligned(const TGLVertex3 &lowVertex, const TGLVertex3 &highVertex)
Set ALIGNED box from two low/high vertices.
TGLVertex3 MaxAAVertex() const
Find maximum vertex values.
Bool_t ValidIndex(UInt_t index) const
void UpdateCache()
normalised box axes in global frame - cached for speed
Double_t Max(UInt_t index) const
Find maximum vertex value for axis of index X(0), Y(1), Z(2)
const TGLVector3 & Axis(UInt_t i, Bool_t normalised=kTRUE) const
void ExpandAligned(const TGLVertex3 &point)
Expand current bbox so that it includes the point.
Double_t YMax() const
Double_t fVolume
the 8 bounding box vertices
virtual ~TGLBoundingBox()
Destroy bounding box.
void Dump() const
Output to std::cout the vertices, center and volume of box.
Int_t NumVertices() const
const TGLVertex3 & operator[](UInt_t index) const
Double_t ZMin() const
Rgl::EOverlap Overlap(const TGLPlane &plane) const
Find overlap (Inside, Outside, Partial) of plane c.f. bounding box.
void Draw(Bool_t solid=kFALSE) const
Draw the bounding box as either wireframe (default) of solid using current GL color.
16 component (4x4) transform matrix - column MAJOR as per GL.
Definition: TGLUtil.h:597
3D plane class - of format Ax + By + Cz + D = 0
Definition: TGLUtil.h:524
3 component (x/y/z) vector class.
Definition: TGLUtil.h:247
3 component (x/y/z) vertex class.
Definition: TGLUtil.h:83
void box(Int_t pat, Double_t x1, Double_t y1, Double_t x2, Double_t y2)
Definition: fillpatterns.C:1
T Mag(const SVector< T, D > &rhs)
Vector magnitude (Euclidian norm) Compute : .
Definition: Functions.h:252
EOverlap
Definition: TGLUtil.h:34
REAL * vertex
Definition: triangle.c:512