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