1/////////////////////////////////////////////////////////////////////////// 2// 3// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas 4// Digital Ltd. LLC 5// 6// All rights reserved. 7// 8// Redistribution and use in source and binary forms, with or without 9// modification, are permitted provided that the following conditions are 10// met: 11// * Redistributions of source code must retain the above copyright 12// notice, this list of conditions and the following disclaimer. 13// * Redistributions in binary form must reproduce the above 14// copyright notice, this list of conditions and the following disclaimer 15// in the documentation and/or other materials provided with the 16// distribution. 17// * Neither the name of Industrial Light & Magic nor the names of 18// its contributors may be used to endorse or promote products derived 19// from this software without specific prior written permission. 20// 21// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32// 33/////////////////////////////////////////////////////////////////////////// 34 35 36 37#ifndef INCLUDED_IMATHINTERVAL_H 38#define INCLUDED_IMATHINTERVAL_H 39 40 41//------------------------------------------------------------------- 42// 43// class Imath::Interval<class T> 44// -------------------------------- 45// 46// An Interval has a min and a max and some miscellaneous 47// functions. It is basically a Box<T> that allows T to be 48// a scalar. 49// 50//------------------------------------------------------------------- 51 52#include "ImathVec.h" 53 54namespace Imath { 55 56 57template <class T> 58class Interval 59{ 60 public: 61 62 //------------------------- 63 // Data Members are public 64 //------------------------- 65 66 T min; 67 T max; 68 69 //----------------------------------------------------- 70 // Constructors - an "empty" Interval is created by default 71 //----------------------------------------------------- 72 73 Interval(); 74 Interval(const T& point); 75 Interval(const T& minT, const T& maxT); 76 77 //-------------------------------- 78 // Operators: we get != from STL 79 //-------------------------------- 80 81 bool operator == (const Interval<T> &src) const; 82 83 //------------------ 84 // Interval manipulation 85 //------------------ 86 87 void makeEmpty(); 88 void extendBy(const T& point); 89 void extendBy(const Interval<T>& interval); 90 91 //--------------------------------------------------- 92 // Query functions - these compute results each time 93 //--------------------------------------------------- 94 95 T size() const; 96 T center() const; 97 bool intersects(const T &point) const; 98 bool intersects(const Interval<T> &interval) const; 99 100 //---------------- 101 // Classification 102 //---------------- 103 104 bool hasVolume() const; 105 bool isEmpty() const; 106}; 107 108 109//-------------------- 110// Convenient typedefs 111//-------------------- 112 113 114typedef Interval <float> Intervalf; 115typedef Interval <double> Intervald; 116typedef Interval <short> Intervals; 117typedef Interval <int> Intervali; 118 119//---------------- 120// Implementation 121//---------------- 122 123 124template <class T> 125inline Interval<T>::Interval() 126{ 127 makeEmpty(); 128} 129 130template <class T> 131inline Interval<T>::Interval(const T& point) 132{ 133 min = point; 134 max = point; 135} 136 137template <class T> 138inline Interval<T>::Interval(const T& minV, const T& maxV) 139{ 140 min = minV; 141 max = maxV; 142} 143 144template <class T> 145inline bool 146Interval<T>::operator == (const Interval<T> &src) const 147{ 148 return (min == src.min && max == src.max); 149} 150 151template <class T> 152inline void 153Interval<T>::makeEmpty() 154{ 155 min = limits<T>::max(); 156 max = limits<T>::min(); 157} 158 159template <class T> 160inline void 161Interval<T>::extendBy(const T& point) 162{ 163 if ( point < min ) 164 min = point; 165 166 if ( point > max ) 167 max = point; 168} 169 170template <class T> 171inline void 172Interval<T>::extendBy(const Interval<T>& interval) 173{ 174 if ( interval.min < min ) 175 min = interval.min; 176 177 if ( interval.max > max ) 178 max = interval.max; 179} 180 181template <class T> 182inline bool 183Interval<T>::intersects(const T& point) const 184{ 185 return point >= min && point <= max; 186} 187 188template <class T> 189inline bool 190Interval<T>::intersects(const Interval<T>& interval) const 191{ 192 return interval.max >= min && interval.min <= max; 193} 194 195template <class T> 196inline T 197Interval<T>::size() const 198{ 199 return max-min; 200} 201 202template <class T> 203inline T 204Interval<T>::center() const 205{ 206 return (max+min)/2; 207} 208 209template <class T> 210inline bool 211Interval<T>::isEmpty() const 212{ 213 return max < min; 214} 215 216template <class T> 217inline bool Interval<T>::hasVolume() const 218{ 219 return max > min; 220} 221 222} // namespace Imath 223 224#endif 225