Rumba C++ SDK
ImathShear.h
Go to the documentation of this file.
1 //
3 // Copyright (c) 2004, 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 //
34 
35 
36 
37 #ifndef INCLUDED_IMATHSHEAR_H
38 #define INCLUDED_IMATHSHEAR_H
39 
40 //----------------------------------------------------
41 //
42 // Shear6 class template.
43 //
44 //----------------------------------------------------
45 
46 #include "ImathExc.h"
47 #include "ImathLimits.h"
48 #include "ImathMath.h"
49 #include "ImathVec.h"
50 
51 #include <iostream>
52 
53 
54 namespace Imath {
55 
56 
57 
58 
59 template <class T> class Shear6
60 {
61  public:
62 
63  //-------------------
64  // Access to elements
65  //-------------------
66 
67  T xy, xz, yz, yx, zx, zy;
68 
69  T & operator [] (int i);
70  const T & operator [] (int i) const;
71 
72 
73  //-------------
74  // Constructors
75  //-------------
76 
77  Shear6 (); // (0 0 0 0 0 0)
78  Shear6 (T XY, T XZ, T YZ); // (XY XZ YZ 0 0 0)
79  Shear6 (const Vec3<T> &v); // (v.x v.y v.z 0 0 0)
80  template <class S> // (v.x v.y v.z 0 0 0)
81  Shear6 (const Vec3<S> &v);
82  Shear6 (T XY, T XZ, T YZ, // (XY XZ YZ YX ZX ZY)
83  T YX, T ZX, T ZY);
84 
85 
86  //---------------------------------
87  // Copy constructors and assignment
88  //---------------------------------
89 
90  Shear6 (const Shear6 &h);
91  template <class S> Shear6 (const Shear6<S> &h);
92 
93  const Shear6 & operator = (const Shear6 &h);
94  template <class S>
95  const Shear6 & operator = (const Vec3<S> &v);
96 
97 
98  //----------------------
99  // Compatibility with Sb
100  //----------------------
101 
102  template <class S>
103  void setValue (S XY, S XZ, S YZ, S YX, S ZX, S ZY);
104 
105  template <class S>
106  void setValue (const Shear6<S> &h);
107 
108  template <class S>
109  void getValue (S &XY, S &XZ, S &YZ,
110  S &YX, S &ZX, S &ZY) const;
111 
112  template <class S>
113  void getValue (Shear6<S> &h) const;
114 
115  T * getValue();
116  const T * getValue() const;
117 
118 
119  //---------
120  // Equality
121  //---------
122 
123  template <class S>
124  bool operator == (const Shear6<S> &h) const;
125 
126  template <class S>
127  bool operator != (const Shear6<S> &h) const;
128 
129  //-----------------------------------------------------------------------
130  // Compare two shears and test if they are "approximately equal":
131  //
132  // equalWithAbsError (h, e)
133  //
134  // Returns true if the coefficients of this and h are the same with
135  // an absolute error of no more than e, i.e., for all i
136  //
137  // abs (this[i] - h[i]) <= e
138  //
139  // equalWithRelError (h, e)
140  //
141  // Returns true if the coefficients of this and h are the same with
142  // a relative error of no more than e, i.e., for all i
143  //
144  // abs (this[i] - h[i]) <= e * abs (this[i])
145  //-----------------------------------------------------------------------
146 
147  bool equalWithAbsError (const Shear6<T> &h, T e) const;
148  bool equalWithRelError (const Shear6<T> &h, T e) const;
149 
150 
151  //------------------------
152  // Component-wise addition
153  //------------------------
154 
155  const Shear6 & operator += (const Shear6 &h);
156  Shear6 operator + (const Shear6 &h) const;
157 
158 
159  //---------------------------
160  // Component-wise subtraction
161  //---------------------------
162 
163  const Shear6 & operator -= (const Shear6 &h);
164  Shear6 operator - (const Shear6 &h) const;
165 
166 
167  //------------------------------------
168  // Component-wise multiplication by -1
169  //------------------------------------
170 
171  Shear6 operator - () const;
172  const Shear6 & negate ();
173 
174 
175  //------------------------------
176  // Component-wise multiplication
177  //------------------------------
178 
179  const Shear6 & operator *= (const Shear6 &h);
180  const Shear6 & operator *= (T a);
181  Shear6 operator * (const Shear6 &h) const;
182  Shear6 operator * (T a) const;
183 
184 
185  //------------------------
186  // Component-wise division
187  //------------------------
188 
189  const Shear6 & operator /= (const Shear6 &h);
190  const Shear6 & operator /= (T a);
191  Shear6 operator / (const Shear6 &h) const;
192  Shear6 operator / (T a) const;
193 
194 
195  //----------------------------------------------------------
196  // Number of dimensions, i.e. number of elements in a Shear6
197  //----------------------------------------------------------
198 
199  static unsigned int dimensions() {return 6;}
200 
201 
202  //-------------------------------------------------
203  // Limitations of type T (see also class limits<T>)
204  //-------------------------------------------------
205 
206  static T baseTypeMin() {return limits<T>::min();}
207  static T baseTypeMax() {return limits<T>::max();}
208  static T baseTypeSmallest() {return limits<T>::smallest();}
209  static T baseTypeEpsilon() {return limits<T>::epsilon();}
210 
211 
212  //--------------------------------------------------------------
213  // Base type -- in templates, which accept a parameter, V, which
214  // could be either a Vec2<T> or a Shear6<T>, you can refer to T as
215  // V::BaseType
216  //--------------------------------------------------------------
217 
218  typedef T BaseType;
219 };
220 
221 
222 //--------------
223 // Stream output
224 //--------------
225 
226 template <class T>
227 std::ostream & operator << (std::ostream &s, const Shear6<T> &h);
228 
229 
230 //----------------------------------------------------
231 // Reverse multiplication: scalar * Shear6<T>
232 //----------------------------------------------------
233 
234 template <class S, class T> Shear6<T> operator * (S a, const Shear6<T> &h);
235 
236 
237 //-------------------------
238 // Typedefs for convenience
239 //-------------------------
240 
245 
246 
247 
248 
249 //-----------------------
250 // Implementation of Shear6
251 //-----------------------
252 
253 template <class T>
254 inline T &
256 {
257  return (&xy)[i];
258 }
259 
260 template <class T>
261 inline const T &
263 {
264  return (&xy)[i];
265 }
266 
267 template <class T>
268 inline
270 {
271  xy = xz = yz = yx = zx = zy = 0;
272 }
273 
274 template <class T>
275 inline
276 Shear6<T>::Shear6 (T XY, T XZ, T YZ)
277 {
278  xy = XY;
279  xz = XZ;
280  yz = YZ;
281  yx = 0;
282  zx = 0;
283  zy = 0;
284 }
285 
286 template <class T>
287 inline
289 {
290  xy = v.x;
291  xz = v.y;
292  yz = v.z;
293  yx = 0;
294  zx = 0;
295  zy = 0;
296 }
297 
298 template <class T>
299 template <class S>
300 inline
302 {
303  xy = T (v.x);
304  xz = T (v.y);
305  yz = T (v.z);
306  yx = 0;
307  zx = 0;
308  zy = 0;
309 }
310 
311 template <class T>
312 inline
313 Shear6<T>::Shear6 (T XY, T XZ, T YZ, T YX, T ZX, T ZY)
314 {
315  xy = XY;
316  xz = XZ;
317  yz = YZ;
318  yx = YX;
319  zx = ZX;
320  zy = ZY;
321 }
322 
323 template <class T>
324 inline
326 {
327  xy = h.xy;
328  xz = h.xz;
329  yz = h.yz;
330  yx = h.yx;
331  zx = h.zx;
332  zy = h.zy;
333 }
334 
335 template <class T>
336 template <class S>
337 inline
339 {
340  xy = T (h.xy);
341  xz = T (h.xz);
342  yz = T (h.yz);
343  yx = T (h.yx);
344  zx = T (h.zx);
345  zy = T (h.zy);
346 }
347 
348 template <class T>
349 inline const Shear6<T> &
351 {
352  xy = h.xy;
353  xz = h.xz;
354  yz = h.yz;
355  yx = h.yx;
356  zx = h.zx;
357  zy = h.zy;
358  return *this;
359 }
360 
361 template <class T>
362 template <class S>
363 inline const Shear6<T> &
365 {
366  xy = T (v.x);
367  xz = T (v.y);
368  yz = T (v.z);
369  yx = 0;
370  zx = 0;
371  zy = 0;
372  return *this;
373 }
374 
375 template <class T>
376 template <class S>
377 inline void
378 Shear6<T>::setValue (S XY, S XZ, S YZ, S YX, S ZX, S ZY)
379 {
380  xy = T (XY);
381  xz = T (XZ);
382  yz = T (YZ);
383  yx = T (YX);
384  zx = T (ZX);
385  zy = T (ZY);
386 }
387 
388 template <class T>
389 template <class S>
390 inline void
392 {
393  xy = T (h.xy);
394  xz = T (h.xz);
395  yz = T (h.yz);
396  yx = T (h.yx);
397  zx = T (h.zx);
398  zy = T (h.zy);
399 }
400 
401 template <class T>
402 template <class S>
403 inline void
404 Shear6<T>::getValue (S &XY, S &XZ, S &YZ, S &YX, S &ZX, S &ZY) const
405 {
406  XY = S (xy);
407  XZ = S (xz);
408  YZ = S (yz);
409  YX = S (yx);
410  ZX = S (zx);
411  ZY = S (zy);
412 }
413 
414 template <class T>
415 template <class S>
416 inline void
418 {
419  h.xy = S (xy);
420  h.xz = S (xz);
421  h.yz = S (yz);
422  h.yx = S (yx);
423  h.zx = S (zx);
424  h.zy = S (zy);
425 }
426 
427 template <class T>
428 inline T *
430 {
431  return (T *) &xy;
432 }
433 
434 template <class T>
435 inline const T *
437 {
438  return (const T *) &xy;
439 }
440 
441 template <class T>
442 template <class S>
443 inline bool
445 {
446  return xy == h.xy && xz == h.xz && yz == h.yz &&
447  yx == h.yx && zx == h.zx && zy == h.zy;
448 }
449 
450 template <class T>
451 template <class S>
452 inline bool
454 {
455  return xy != h.xy || xz != h.xz || yz != h.yz ||
456  yx != h.yx || zx != h.zx || zy != h.zy;
457 }
458 
459 template <class T>
460 bool
462 {
463  for (int i = 0; i < 6; i++)
464  if (!Imath::equalWithAbsError ((*this)[i], h[i], e))
465  return false;
466 
467  return true;
468 }
469 
470 template <class T>
471 bool
473 {
474  for (int i = 0; i < 6; i++)
475  if (!Imath::equalWithRelError ((*this)[i], h[i], e))
476  return false;
477 
478  return true;
479 }
480 
481 
482 template <class T>
483 inline const Shear6<T> &
485 {
486  xy += h.xy;
487  xz += h.xz;
488  yz += h.yz;
489  yx += h.yx;
490  zx += h.zx;
491  zy += h.zy;
492  return *this;
493 }
494 
495 template <class T>
496 inline Shear6<T>
498 {
499  return Shear6 (xy + h.xy, xz + h.xz, yz + h.yz,
500  yx + h.yx, zx + h.zx, zy + h.zy);
501 }
502 
503 template <class T>
504 inline const Shear6<T> &
506 {
507  xy -= h.xy;
508  xz -= h.xz;
509  yz -= h.yz;
510  yx -= h.yx;
511  zx -= h.zx;
512  zy -= h.zy;
513  return *this;
514 }
515 
516 template <class T>
517 inline Shear6<T>
519 {
520  return Shear6 (xy - h.xy, xz - h.xz, yz - h.yz,
521  yx - h.yx, zx - h.zx, zy - h.zy);
522 }
523 
524 template <class T>
525 inline Shear6<T>
527 {
528  return Shear6 (-xy, -xz, -yz, -yx, -zx, -zy);
529 }
530 
531 template <class T>
532 inline const Shear6<T> &
534 {
535  xy = -xy;
536  xz = -xz;
537  yz = -yz;
538  yx = -yx;
539  zx = -zx;
540  zy = -zy;
541  return *this;
542 }
543 
544 template <class T>
545 inline const Shear6<T> &
547 {
548  xy *= h.xy;
549  xz *= h.xz;
550  yz *= h.yz;
551  yx *= h.yx;
552  zx *= h.zx;
553  zy *= h.zy;
554  return *this;
555 }
556 
557 template <class T>
558 inline const Shear6<T> &
560 {
561  xy *= a;
562  xz *= a;
563  yz *= a;
564  yx *= a;
565  zx *= a;
566  zy *= a;
567  return *this;
568 }
569 
570 template <class T>
571 inline Shear6<T>
573 {
574  return Shear6 (xy * h.xy, xz * h.xz, yz * h.yz,
575  yx * h.yx, zx * h.zx, zy * h.zy);
576 }
577 
578 template <class T>
579 inline Shear6<T>
581 {
582  return Shear6 (xy * a, xz * a, yz * a,
583  yx * a, zx * a, zy * a);
584 }
585 
586 template <class T>
587 inline const Shear6<T> &
589 {
590  xy /= h.xy;
591  xz /= h.xz;
592  yz /= h.yz;
593  yx /= h.yx;
594  zx /= h.zx;
595  zy /= h.zy;
596  return *this;
597 }
598 
599 template <class T>
600 inline const Shear6<T> &
602 {
603  xy /= a;
604  xz /= a;
605  yz /= a;
606  yx /= a;
607  zx /= a;
608  zy /= a;
609  return *this;
610 }
611 
612 template <class T>
613 inline Shear6<T>
615 {
616  return Shear6 (xy / h.xy, xz / h.xz, yz / h.yz,
617  yx / h.yx, zx / h.zx, zy / h.zy);
618 }
619 
620 template <class T>
621 inline Shear6<T>
623 {
624  return Shear6 (xy / a, xz / a, yz / a,
625  yx / a, zx / a, zy / a);
626 }
627 
628 
629 //-----------------------------
630 // Stream output implementation
631 //-----------------------------
632 
633 template <class T>
634 std::ostream &
635 operator << (std::ostream &s, const Shear6<T> &h)
636 {
637  return s << '('
638  << h.xy << ' ' << h.xz << ' ' << h.yz
639  << h.yx << ' ' << h.zx << ' ' << h.zy
640  << ')';
641 }
642 
643 
644 //-----------------------------------------
645 // Implementation of reverse multiplication
646 //-----------------------------------------
647 
648 template <class S, class T>
649 inline Shear6<T>
650 operator * (S a, const Shear6<T> &h)
651 {
652  return Shear6<T> (a * h.xy, a * h.xz, a * h.yz,
653  a * h.yx, a * h.zx, a * h.zy);
654 }
655 
656 
657 } // namespace Imath
658 
659 #endif
Definition: ImathShear.h:59
T & operator[](int i)
Definition: ImathShear.h:255
T * getValue()
Definition: ImathShear.h:429
Shear6 operator+(const Shear6 &h) const
Definition: ImathShear.h:497
const Shear6 & operator+=(const Shear6 &h)
Definition: ImathShear.h:484
Definition: ImathFrame.h:42
bool operator!=(const Shear6< S > &h) const
Definition: ImathShear.h:453
Shear6< double > Shear6d
Definition: ImathShear.h:244
static T baseTypeEpsilon()
Definition: ImathShear.h:209
T xy
Definition: ImathShear.h:67
const Shear6 & operator*=(const Shear6 &h)
Definition: ImathShear.h:546
void setValue(S XY, S XZ, S YZ, S YX, S ZX, S ZY)
Definition: ImathShear.h:378
Shear6< float > Shear6f
Definition: ImathShear.h:243
Shear6()
Definition: ImathShear.h:269
static T min()
const Shear6 & operator/=(const Shear6 &h)
Definition: ImathShear.h:588
Shear6 operator*(const Shear6 &h) const
Definition: ImathShear.h:572
Vec3< double > Shear3d
Definition: ImathShear.h:242
const Shear6 & operator-=(const Shear6 &h)
Definition: ImathShear.h:505
static unsigned int dimensions()
Definition: ImathShear.h:199
T xz
Definition: ImathShear.h:67
bool equalWithAbsError(const Shear6< T > &h, T e) const
Definition: ImathShear.h:461
T x
Definition: ImathVec.h:274
bool equalWithAbsError(T x1, T x2, T e)
Definition: ImathMath.h:191
T y
Definition: ImathVec.h:274
const Shear6 & negate()
Definition: ImathShear.h:533
bool equalWithRelError(const Shear6< T > &h, T e) const
Definition: ImathShear.h:472
T z
Definition: ImathVec.h:274
Vec3< float > Shear3f
Definition: ImathShear.h:241
static T smallest()
bool equalWithRelError(T x1, T x2, T e)
Definition: ImathMath.h:199
Shear6 operator/(const Shear6 &h) const
Definition: ImathShear.h:614
const Shear6 & operator=(const Shear6 &h)
Definition: ImathShear.h:350
T zx
Definition: ImathShear.h:67
static T baseTypeSmallest()
Definition: ImathShear.h:208
static T baseTypeMin()
Definition: ImathShear.h:206
static T max()
T yz
Definition: ImathShear.h:67
Definition: ImathBox.h:67
static T epsilon()
T zy
Definition: ImathShear.h:67
Color4< T > operator*(S a, const Color4< T > &v)
Definition: ImathColor.h:727
Shear6 operator-() const
Definition: ImathShear.h:526
bool operator==(const Shear6< S > &h) const
Definition: ImathShear.h:444
T BaseType
Definition: ImathShear.h:218
static T baseTypeMax()
Definition: ImathShear.h:207
T yx
Definition: ImathShear.h:67