123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656 |
- ///////////////////////////////////////////////////////////////////////////
- //
- // Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas
- // Digital Ltd. LLC
- //
- // All rights reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Industrial Light & Magic nor the names of
- // its contributors may be used to endorse or promote products derived
- // from this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- //
- ///////////////////////////////////////////////////////////////////////////
- #ifndef INCLUDED_IMATHSHEAR_H
- #define INCLUDED_IMATHSHEAR_H
- //----------------------------------------------------
- //
- // Shear6 class template.
- //
- //----------------------------------------------------
- #include "ImathExc.h"
- #include "ImathLimits.h"
- #include "ImathMath.h"
- #include "ImathVec.h"
- #include "ImathNamespace.h"
- #include <iostream>
- IMATH_INTERNAL_NAMESPACE_HEADER_ENTER
- template <class T> class Shear6
- {
- public:
- //-------------------
- // Access to elements
- //-------------------
- T xy, xz, yz, yx, zx, zy;
- T & operator [] (int i);
- const T & operator [] (int i) const;
- //-------------
- // Constructors
- //-------------
- Shear6 (); // (0 0 0 0 0 0)
- Shear6 (T XY, T XZ, T YZ); // (XY XZ YZ 0 0 0)
- Shear6 (const Vec3<T> &v); // (v.x v.y v.z 0 0 0)
- template <class S> // (v.x v.y v.z 0 0 0)
- Shear6 (const Vec3<S> &v);
- Shear6 (T XY, T XZ, T YZ, // (XY XZ YZ YX ZX ZY)
- T YX, T ZX, T ZY);
- //---------------------------------
- // Copy constructors and assignment
- //---------------------------------
- Shear6 (const Shear6 &h);
- template <class S> Shear6 (const Shear6<S> &h);
- const Shear6 & operator = (const Shear6 &h);
- template <class S>
- const Shear6 & operator = (const Vec3<S> &v);
- //----------------------
- // Compatibility with Sb
- //----------------------
- template <class S>
- void setValue (S XY, S XZ, S YZ, S YX, S ZX, S ZY);
- template <class S>
- void setValue (const Shear6<S> &h);
- template <class S>
- void getValue (S &XY, S &XZ, S &YZ,
- S &YX, S &ZX, S &ZY) const;
- template <class S>
- void getValue (Shear6<S> &h) const;
- T * getValue();
- const T * getValue() const;
- //---------
- // Equality
- //---------
- template <class S>
- bool operator == (const Shear6<S> &h) const;
- template <class S>
- bool operator != (const Shear6<S> &h) const;
- //-----------------------------------------------------------------------
- // Compare two shears and test if they are "approximately equal":
- //
- // equalWithAbsError (h, e)
- //
- // Returns true if the coefficients of this and h are the same with
- // an absolute error of no more than e, i.e., for all i
- //
- // abs (this[i] - h[i]) <= e
- //
- // equalWithRelError (h, e)
- //
- // Returns true if the coefficients of this and h are the same with
- // a relative error of no more than e, i.e., for all i
- //
- // abs (this[i] - h[i]) <= e * abs (this[i])
- //-----------------------------------------------------------------------
- bool equalWithAbsError (const Shear6<T> &h, T e) const;
- bool equalWithRelError (const Shear6<T> &h, T e) const;
- //------------------------
- // Component-wise addition
- //------------------------
- const Shear6 & operator += (const Shear6 &h);
- Shear6 operator + (const Shear6 &h) const;
- //---------------------------
- // Component-wise subtraction
- //---------------------------
- const Shear6 & operator -= (const Shear6 &h);
- Shear6 operator - (const Shear6 &h) const;
- //------------------------------------
- // Component-wise multiplication by -1
- //------------------------------------
- Shear6 operator - () const;
- const Shear6 & negate ();
- //------------------------------
- // Component-wise multiplication
- //------------------------------
- const Shear6 & operator *= (const Shear6 &h);
- const Shear6 & operator *= (T a);
- Shear6 operator * (const Shear6 &h) const;
- Shear6 operator * (T a) const;
- //------------------------
- // Component-wise division
- //------------------------
- const Shear6 & operator /= (const Shear6 &h);
- const Shear6 & operator /= (T a);
- Shear6 operator / (const Shear6 &h) const;
- Shear6 operator / (T a) const;
- //----------------------------------------------------------
- // Number of dimensions, i.e. number of elements in a Shear6
- //----------------------------------------------------------
- static unsigned int dimensions() {return 6;}
- //-------------------------------------------------
- // Limitations of type T (see also class limits<T>)
- //-------------------------------------------------
- static T baseTypeMin() {return limits<T>::min();}
- static T baseTypeMax() {return limits<T>::max();}
- static T baseTypeSmallest() {return limits<T>::smallest();}
- static T baseTypeEpsilon() {return limits<T>::epsilon();}
- //--------------------------------------------------------------
- // Base type -- in templates, which accept a parameter, V, which
- // could be either a Vec2<T> or a Shear6<T>, you can refer to T as
- // V::BaseType
- //--------------------------------------------------------------
- typedef T BaseType;
- };
- //--------------
- // Stream output
- //--------------
- template <class T>
- std::ostream & operator << (std::ostream &s, const Shear6<T> &h);
- //----------------------------------------------------
- // Reverse multiplication: scalar * Shear6<T>
- //----------------------------------------------------
- template <class S, class T> Shear6<T> operator * (S a, const Shear6<T> &h);
- //-------------------------
- // Typedefs for convenience
- //-------------------------
- typedef Vec3 <float> Shear3f;
- typedef Vec3 <double> Shear3d;
- typedef Shear6 <float> Shear6f;
- typedef Shear6 <double> Shear6d;
- //-----------------------
- // Implementation of Shear6
- //-----------------------
- template <class T>
- inline T &
- Shear6<T>::operator [] (int i)
- {
- return (&xy)[i];
- }
- template <class T>
- inline const T &
- Shear6<T>::operator [] (int i) const
- {
- return (&xy)[i];
- }
- template <class T>
- inline
- Shear6<T>::Shear6 ()
- {
- xy = xz = yz = yx = zx = zy = 0;
- }
- template <class T>
- inline
- Shear6<T>::Shear6 (T XY, T XZ, T YZ)
- {
- xy = XY;
- xz = XZ;
- yz = YZ;
- yx = 0;
- zx = 0;
- zy = 0;
- }
- template <class T>
- inline
- Shear6<T>::Shear6 (const Vec3<T> &v)
- {
- xy = v.x;
- xz = v.y;
- yz = v.z;
- yx = 0;
- zx = 0;
- zy = 0;
- }
- template <class T>
- template <class S>
- inline
- Shear6<T>::Shear6 (const Vec3<S> &v)
- {
- xy = T (v.x);
- xz = T (v.y);
- yz = T (v.z);
- yx = 0;
- zx = 0;
- zy = 0;
- }
- template <class T>
- inline
- Shear6<T>::Shear6 (T XY, T XZ, T YZ, T YX, T ZX, T ZY)
- {
- xy = XY;
- xz = XZ;
- yz = YZ;
- yx = YX;
- zx = ZX;
- zy = ZY;
- }
- template <class T>
- inline
- Shear6<T>::Shear6 (const Shear6 &h)
- {
- xy = h.xy;
- xz = h.xz;
- yz = h.yz;
- yx = h.yx;
- zx = h.zx;
- zy = h.zy;
- }
- template <class T>
- template <class S>
- inline
- Shear6<T>::Shear6 (const Shear6<S> &h)
- {
- xy = T (h.xy);
- xz = T (h.xz);
- yz = T (h.yz);
- yx = T (h.yx);
- zx = T (h.zx);
- zy = T (h.zy);
- }
- template <class T>
- inline const Shear6<T> &
- Shear6<T>::operator = (const Shear6 &h)
- {
- xy = h.xy;
- xz = h.xz;
- yz = h.yz;
- yx = h.yx;
- zx = h.zx;
- zy = h.zy;
- return *this;
- }
- template <class T>
- template <class S>
- inline const Shear6<T> &
- Shear6<T>::operator = (const Vec3<S> &v)
- {
- xy = T (v.x);
- xz = T (v.y);
- yz = T (v.z);
- yx = 0;
- zx = 0;
- zy = 0;
- return *this;
- }
- template <class T>
- template <class S>
- inline void
- Shear6<T>::setValue (S XY, S XZ, S YZ, S YX, S ZX, S ZY)
- {
- xy = T (XY);
- xz = T (XZ);
- yz = T (YZ);
- yx = T (YX);
- zx = T (ZX);
- zy = T (ZY);
- }
- template <class T>
- template <class S>
- inline void
- Shear6<T>::setValue (const Shear6<S> &h)
- {
- xy = T (h.xy);
- xz = T (h.xz);
- yz = T (h.yz);
- yx = T (h.yx);
- zx = T (h.zx);
- zy = T (h.zy);
- }
- template <class T>
- template <class S>
- inline void
- Shear6<T>::getValue (S &XY, S &XZ, S &YZ, S &YX, S &ZX, S &ZY) const
- {
- XY = S (xy);
- XZ = S (xz);
- YZ = S (yz);
- YX = S (yx);
- ZX = S (zx);
- ZY = S (zy);
- }
- template <class T>
- template <class S>
- inline void
- Shear6<T>::getValue (Shear6<S> &h) const
- {
- h.xy = S (xy);
- h.xz = S (xz);
- h.yz = S (yz);
- h.yx = S (yx);
- h.zx = S (zx);
- h.zy = S (zy);
- }
- template <class T>
- inline T *
- Shear6<T>::getValue()
- {
- return (T *) &xy;
- }
- template <class T>
- inline const T *
- Shear6<T>::getValue() const
- {
- return (const T *) &xy;
- }
- template <class T>
- template <class S>
- inline bool
- Shear6<T>::operator == (const Shear6<S> &h) const
- {
- return xy == h.xy && xz == h.xz && yz == h.yz &&
- yx == h.yx && zx == h.zx && zy == h.zy;
- }
- template <class T>
- template <class S>
- inline bool
- Shear6<T>::operator != (const Shear6<S> &h) const
- {
- return xy != h.xy || xz != h.xz || yz != h.yz ||
- yx != h.yx || zx != h.zx || zy != h.zy;
- }
- template <class T>
- bool
- Shear6<T>::equalWithAbsError (const Shear6<T> &h, T e) const
- {
- for (int i = 0; i < 6; i++)
- if (!IMATH_INTERNAL_NAMESPACE::equalWithAbsError ((*this)[i], h[i], e))
- return false;
- return true;
- }
- template <class T>
- bool
- Shear6<T>::equalWithRelError (const Shear6<T> &h, T e) const
- {
- for (int i = 0; i < 6; i++)
- if (!IMATH_INTERNAL_NAMESPACE::equalWithRelError ((*this)[i], h[i], e))
- return false;
- return true;
- }
- template <class T>
- inline const Shear6<T> &
- Shear6<T>::operator += (const Shear6 &h)
- {
- xy += h.xy;
- xz += h.xz;
- yz += h.yz;
- yx += h.yx;
- zx += h.zx;
- zy += h.zy;
- return *this;
- }
- template <class T>
- inline Shear6<T>
- Shear6<T>::operator + (const Shear6 &h) const
- {
- return Shear6 (xy + h.xy, xz + h.xz, yz + h.yz,
- yx + h.yx, zx + h.zx, zy + h.zy);
- }
- template <class T>
- inline const Shear6<T> &
- Shear6<T>::operator -= (const Shear6 &h)
- {
- xy -= h.xy;
- xz -= h.xz;
- yz -= h.yz;
- yx -= h.yx;
- zx -= h.zx;
- zy -= h.zy;
- return *this;
- }
- template <class T>
- inline Shear6<T>
- Shear6<T>::operator - (const Shear6 &h) const
- {
- return Shear6 (xy - h.xy, xz - h.xz, yz - h.yz,
- yx - h.yx, zx - h.zx, zy - h.zy);
- }
- template <class T>
- inline Shear6<T>
- Shear6<T>::operator - () const
- {
- return Shear6 (-xy, -xz, -yz, -yx, -zx, -zy);
- }
- template <class T>
- inline const Shear6<T> &
- Shear6<T>::negate ()
- {
- xy = -xy;
- xz = -xz;
- yz = -yz;
- yx = -yx;
- zx = -zx;
- zy = -zy;
- return *this;
- }
- template <class T>
- inline const Shear6<T> &
- Shear6<T>::operator *= (const Shear6 &h)
- {
- xy *= h.xy;
- xz *= h.xz;
- yz *= h.yz;
- yx *= h.yx;
- zx *= h.zx;
- zy *= h.zy;
- return *this;
- }
- template <class T>
- inline const Shear6<T> &
- Shear6<T>::operator *= (T a)
- {
- xy *= a;
- xz *= a;
- yz *= a;
- yx *= a;
- zx *= a;
- zy *= a;
- return *this;
- }
- template <class T>
- inline Shear6<T>
- Shear6<T>::operator * (const Shear6 &h) const
- {
- return Shear6 (xy * h.xy, xz * h.xz, yz * h.yz,
- yx * h.yx, zx * h.zx, zy * h.zy);
- }
- template <class T>
- inline Shear6<T>
- Shear6<T>::operator * (T a) const
- {
- return Shear6 (xy * a, xz * a, yz * a,
- yx * a, zx * a, zy * a);
- }
- template <class T>
- inline const Shear6<T> &
- Shear6<T>::operator /= (const Shear6 &h)
- {
- xy /= h.xy;
- xz /= h.xz;
- yz /= h.yz;
- yx /= h.yx;
- zx /= h.zx;
- zy /= h.zy;
- return *this;
- }
- template <class T>
- inline const Shear6<T> &
- Shear6<T>::operator /= (T a)
- {
- xy /= a;
- xz /= a;
- yz /= a;
- yx /= a;
- zx /= a;
- zy /= a;
- return *this;
- }
- template <class T>
- inline Shear6<T>
- Shear6<T>::operator / (const Shear6 &h) const
- {
- return Shear6 (xy / h.xy, xz / h.xz, yz / h.yz,
- yx / h.yx, zx / h.zx, zy / h.zy);
- }
- template <class T>
- inline Shear6<T>
- Shear6<T>::operator / (T a) const
- {
- return Shear6 (xy / a, xz / a, yz / a,
- yx / a, zx / a, zy / a);
- }
- //-----------------------------
- // Stream output implementation
- //-----------------------------
- template <class T>
- std::ostream &
- operator << (std::ostream &s, const Shear6<T> &h)
- {
- return s << '('
- << h.xy << ' ' << h.xz << ' ' << h.yz
- << h.yx << ' ' << h.zx << ' ' << h.zy
- << ')';
- }
- //-----------------------------------------
- // Implementation of reverse multiplication
- //-----------------------------------------
- template <class S, class T>
- inline Shear6<T>
- operator * (S a, const Shear6<T> &h)
- {
- return Shear6<T> (a * h.xy, a * h.xz, a * h.yz,
- a * h.yx, a * h.zx, a * h.zy);
- }
- IMATH_INTERNAL_NAMESPACE_HEADER_EXIT
- #endif // INCLUDED_IMATHSHEAR_H
|