AGX Dynamics 2.41.3.2
Loading...
Searching...
No Matches
Vec3Template.h
Go to the documentation of this file.
1/*
2Copyright 2007-2025. Algoryx Simulation AB.
3
4All AGX source code, intellectual property, documentation, sample code,
5tutorials, scene files and technical white papers, are copyrighted, proprietary
6and confidential material of Algoryx Simulation AB. You may not download, read,
7store, distribute, publish, copy or otherwise disseminate, use or expose this
8material unless having a written signed agreement with Algoryx Simulation AB, or having been
9advised so by Algoryx Simulation AB for a time limited evaluation, or having purchased a
10valid commercial license from Algoryx Simulation AB.
11
12Algoryx Simulation AB disclaims all responsibilities for loss or damage caused
13from using this software, unless otherwise stated in written agreements with
14Algoryx Simulation AB.
15*/
16
17#ifndef AGX_VEC3_TEMPLATE_H
18#define AGX_VEC3_TEMPLATE_H
19
21#include <agx/macros.h>
22
23#include <agx/PushDisableWarnings.h> // Disabling warnings. Include agx/PopDisableWarnings.h below!
24#include <iosfwd>
25#include <agx/PopDisableWarnings.h> // End of disabled warnings.
26
27#include <agx/agx.h>
28#include <agx/Vec2.h>
29#include <agx/Math.h>
30
31
32namespace agx
33{
34
44 template <typename T >
45 class Vec3T
46 {
47 public:
48 typedef T Type;
49
51 Vec3T(const Vec3T& copy ) = default;
52
53 // Copy constructor with a new length
54 Vec3T(const Vec3T& copy, Real length);
55
56 // Copy constructor with one modified element, for x, y and z setters.
57 Vec3T(const Vec3T& copy, T value, size_t i);
58
60 template <typename T2>
61 explicit Vec3T(const Vec3T<T2>& copy );
62
63 static Vec3T random(T min = T(0), T max = T(1));
64
65 static Vec3T random(const Vec3T<T>& min, const Vec3T<T>& max);
66
71
72 explicit Vec3T( T r );
73
74 Vec3T( T x, T y, T z );
75
76 explicit Vec3T(const T v[3] );
77
78 Vec3T(const Vec2& v2, T zz);
79
83 bool operator == ( const Vec3T& v ) const;
84
88 bool operator != ( const Vec3T& v ) const;
89
93 static Vec3T componentMin(const Vec3T& v1, const Vec3T& v2);
94
98 static Vec3T componentMax(const Vec3T& v1, const Vec3T& v2);
99
103 T minComponent() const;
104
108 T maxComponent() const;
109
113 size_t minElement() const;
114
118 size_t maxElement() const;
119
123 void clamp(const Vec3T& min, const Vec3T& max);
124
128 bool equalsZero() const;
129
133 T* ptr();
134
138 const T* ptr() const;
139
140 void set( T x, T y, T z );
141
142 void set( T value );
143
144 void set( const Vec3T& rhs );
145
146 T& operator [] ( size_t i );
147
148 const T& operator [] ( size_t i ) const;
149
150 T& x();
151
152 T& y();
153
154 T& z();
155
156 T x() const;
157
158 T y() const;
159
160 T z() const;
161
162 bool isValid() const;
163
164 bool isNaN() const;
165
166 bool isFinite() const; // Non NAN, not infinite.
167
169 T operator * ( const Vec3T& rhs ) const;
170
172 const Vec3T operator ^ ( const Vec3T& rhs ) const;
173
175 const Vec3T cross(const Vec3T& rhs) const;
176
177
179 static Vec3T mul( const Vec3T& lhs, const Vec3T& rhs );
180
182 static Vec3T div( const Vec3T& lhs, const Vec3T& rhs );
183
185 const Vec3T operator * ( T rhs ) const;
186
189
191 const Vec3T operator / ( T rhs ) const;
192
195
197 const Vec3T operator + ( const Vec3T& rhs ) const;
198
202 Vec3T& operator += ( const Vec3T& rhs );
203
205 const Vec3T operator - ( const Vec3T& rhs ) const;
206
208 Vec3T& operator -= ( const Vec3T& rhs );
209
211 const Vec3T operator + ( const T& rhs ) const;
212
216 Vec3T& operator += ( const T& rhs );
217
219 const Vec3T operator - ( const T& rhs ) const;
220
222 Vec3T& operator -= ( const T& rhs );
223
225 const Vec3T operator - () const;
226
228 Real length() const;
229
231 Real length2() const;
232
234 Real distance2(const Vec3T& v2) const;
235
237 Real distance(const Vec3T& v2) const;
238
244
248 Real setLength(Real newLength);
249
251 Vec3T normal() const;
252
257
264
266 static Vec3T X_AXIS();
267
269 static Vec3T Y_AXIS();
270
272 static Vec3T Z_AXIS();
273
278 static Vec3T AXIS(size_t i);
279
281 void store3(T* storage) const;
282
283 protected:
284 T m_data[4];
285 }; // end of class Vec3T_template
286
287
288 // Implementation
289 template <typename T>
291 {
292 m_data[0] = copy.m_data[0];
293 m_data[1] = copy.m_data[1];
294 m_data[2] = copy.m_data[2];
295 m_data[3] = T(0);
296
297 setLength(length);
298 }
299
300 template <typename T>
301 AGX_FORCE_INLINE Vec3T<T>::Vec3T(const Vec3T<T>& copy, T value, size_t i)
302 {
303 m_data[0] = copy.m_data[0];
304 m_data[1] = copy.m_data[1];
305 m_data[2] = copy.m_data[2];
306 m_data[3] = T(0);
307
308 m_data[i] = value;
309 }
310
311 template <typename T>
312 template <typename T2>
314 {
315 m_data[ 0 ] = (T)copy[ 0 ];
316 m_data[ 1 ] = (T)copy[ 1 ];
317 m_data[ 2 ] = (T)copy[ 2 ];
318 m_data[ 3 ] = T(0);
319 }
320
321
322 template <typename T>
324 {
325 m_data[0] = T();
326 m_data[1] = T();
327 m_data[2] = T();
328 m_data[3] = T(0);
329 }
330
331 template <typename T>
333 {
334 m_data[0] = m_data[1] = m_data[2] = r;
335 m_data[3] = T(0);
336 }
337
338template <typename T>
340 {
341 m_data[0] = x;
342 m_data[1] = y;
343 m_data[2] = z;
344 m_data[3] = T(0);
345 }
346
347 template <typename T>
349 {
350 m_data[0] = v[0];
351 m_data[1] = v[1];
352 m_data[2] = v[2];
353 m_data[3] = T(0);
354 }
355
356 template <typename T>
358 {
359 m_data[0] = T(v2[0]);
360 m_data[1] = T(v2[1]);
361 m_data[2] = zz;
362 m_data[3] = T(0);
363 }
364
365 template <typename T>
367 {
368 return m_data[0] == v.m_data[0] && m_data[1] == v.m_data[1] && m_data[2] == v.m_data[2];
369 }
370
371 template <typename T>
373 {
374 return m_data[0] != v.m_data[0] || m_data[1] != v.m_data[1] || m_data[2] != v.m_data[2];
375 }
376
377
378 template <typename T>
380 {
381 return Vec3T<T>( std::min( v1[0], v2[0] ), std::min( v1[1], v2[1] ), std::min( v1[2], v2[2] ) );
382 }
383
384 template <typename T>
386 {
387 return Vec3T<T>( std::max( v1[0], v2[0] ), std::max( v1[1], v2[1] ), std::max( v1[2], v2[2] ) );
388 }
389
390 template <typename T>
392 {
393 return std::min(std::min(m_data[0], m_data[1]), m_data[2]);
394 }
395
396 template <typename T>
398 {
399 return std::max(std::max(m_data[0], m_data[1]), m_data[2]);
400 }
401
402 template <typename T>
404 {
405 T m = std::numeric_limits<T>::infinity();
406 size_t idx = 0;
407 for(size_t i = 0; i < 3; i++) {
408 T a = agx::absolute(m_data[i]);
409 if ( a < m) {
410 idx = i;
411 m = a;
412 }
413 }
414 return idx;
415 }
416
417 template <typename T>
419 {
420 T m = 0;
421 size_t idx = 0;
422 for(size_t i = 0; i < 3; i++) {
423 T a = agx::absolute(m_data[i]);
424 if ( a > m) {
425 idx = i;
426 m = a;
427 }
428 }
429 return idx;
430 }
431
432 template <typename T>
434 {
435 m_data[0] = agx::clamp( m_data[0], min.m_data[0], max.m_data[0] );
436 m_data[1] = agx::clamp( m_data[1], min.m_data[1], max.m_data[1] );
437 m_data[2] = agx::clamp( m_data[2], min.m_data[2], max.m_data[2] );
438 }
439
440 template <typename T>
442 {
443 return (agx::equalsZero(m_data[0]) && agx::equalsZero(m_data[1]) && agx::equalsZero(m_data[2]));
444 }
445
446 template <typename T>
448 {
449 return m_data;
450 }
451
452 template <typename T>
454 {
455 return m_data;
456 }
457
458 template <typename T>
459 AGX_FORCE_INLINE void Vec3T<T>::set( T x, T y, T z )
460 {
461 m_data[0] = x;
462 m_data[1] = y;
463 m_data[2] = z;
464 }
465
466 template <typename T>
468 {
469 m_data[0] = m_data[1] = m_data[2] = value;
470 }
471
472 template <typename T>
474 {
475 m_data[0] = rhs.m_data[0];
476 m_data[1] = rhs.m_data[1];
477 m_data[2] = rhs.m_data[2];
478 }
479
480 template <typename T>
482 {
483 return m_data[i];
484 }
485
486 template <typename T>
487 AGX_FORCE_INLINE const T& Vec3T<T>::operator [] ( size_t i ) const
488 {
489 return m_data[i];
490 }
491
492 template <typename T>
494 {
495 return m_data[0];
496 }
497
498 template <typename T>
500 {
501 return m_data[1];
502 }
503
504 template <typename T>
506 {
507 return m_data[2];
508 }
509
510 template <typename T>
512 {
513 return m_data[0];
514 }
515
516 template <typename T>
518 {
519 return m_data[1];
520 }
521
522 template <typename T>
524 {
525 return m_data[2];
526 }
527
528 template <typename T>
530 {
531 return !isNaN();
532 }
533
534 template <typename T>
536 {
537 return agx::isNaN( m_data[0] ) || agx::isNaN( m_data[1] ) || agx::isNaN( m_data[2] );
538 }
539
540 template <typename T>
542 {
543 return agx::isFinite( m_data[0] ) && agx::isFinite( m_data[1] ) && agx::isFinite( m_data[2] );
544 }
545
546 template <typename T>
548 {
549 return T(m_data[0] * rhs.m_data[0] + m_data[1] * rhs.m_data[1] + m_data[2] * rhs.m_data[2]);
550 }
551
552 template <typename T>
554 {
555 return Vec3T<T>( m_data[1] * rhs.m_data[2] - m_data[2] * rhs.m_data[1],
556 m_data[2] * rhs.m_data[0] - m_data[0] * rhs.m_data[2] ,
557 m_data[0] * rhs.m_data[1] - m_data[1] * rhs.m_data[0] );
558 }
559
560 template <typename T>
562 {
563 return Vec3T<T>(m_data[1] * rhs.m_data[2] - m_data[2] * rhs.m_data[1],
564 m_data[2] * rhs.m_data[0] - m_data[0] * rhs.m_data[2],
565 m_data[0] * rhs.m_data[1] - m_data[1] * rhs.m_data[0]);
566 }
567
568 template <typename T>
570 { return Vec3T<T>( lhs[0] * rhs[0],
571 lhs[1] * rhs[1],
572 lhs[2] * rhs[2] );
573 }
574
575 template <typename T>
577 {
578 return Vec3T<T>( lhs[0] / rhs[0],
579 lhs[1] / rhs[1],
580 lhs[2] / rhs[2] );
581 }
582
583
584 template <typename T>
586 {
587 return Vec3T<T>( T(m_data[0] * rhs), T(m_data[1] * rhs), T(m_data[2] * rhs) );
588 }
589
590
591 template <typename T>
593 {
594 m_data[0] = T(m_data[0] * rhs);
595 m_data[1] = T(m_data[1] * rhs);
596 m_data[2] = T(m_data[2] * rhs);
597 return *this;
598 }
599
600 template <typename T>
602 {
603 return Vec3T( T(m_data[0] / rhs), T(m_data[1] / rhs), T(m_data[2] / rhs) );
604 }
605
606 template <typename T>
608 {
609 m_data[0] = T(m_data[0] / rhs);
610 m_data[1] = T(m_data[1] / rhs);
611 m_data[2] = T(m_data[2] / rhs);
612 return *this;
613 }
614
615
616 template <typename T>
618 {
619 return Vec3T( m_data[0] + rhs[0], m_data[1] + rhs[1], m_data[2] + rhs[2] );
620 }
621
622 template <typename T>
624 {
625 m_data[0] += rhs.m_data[0];
626 m_data[1] += rhs.m_data[1];
627 m_data[2] += rhs.m_data[2];
628 return *this;
629 }
630
631 template <typename T>
633 {
634 return Vec3T( m_data[0] - rhs[0], m_data[1] - rhs[1], m_data[2] - rhs[2] );
635 }
636
637 template <typename T>
639 {
640 m_data[0] -= rhs.m_data[0];
641 m_data[1] -= rhs.m_data[1];
642 m_data[2] -= rhs.m_data[2];
643 return *this;
644 }
645
646 template <typename T>
648 {
649 return Vec3T( m_data[0] + rhs, m_data[1] + rhs, m_data[2] + rhs );
650 }
651
652 template <typename T>
654 {
655 m_data[0] += rhs;
656 m_data[1] += rhs;
657 m_data[2] += rhs;
658 return *this;
659 }
660
661 template <typename T>
663 {
664 return Vec3T( m_data[0] - rhs, m_data[1] - rhs, m_data[2] - rhs );
665 }
666
667 template <typename T>
669 {
670 m_data[0] -= rhs;
671 m_data[1] -= rhs;
672 m_data[2] -= rhs;
673 return *this;
674 }
675
676 template <typename T>
678 {
679 return Vec3T ( -m_data[0], -m_data[1], -m_data[2] );
680 }
681
682 template <typename T>
684 {
685 return std::sqrt( agx::Real(m_data[0] * m_data[0] + m_data[1] * m_data[1] + m_data[2] * m_data[2]) );
686 }
687
688 template <typename T>
690 {
691 return Real(m_data[0] * m_data[0] + m_data[1] * m_data[1] + m_data[2] * m_data[2]);
692 }
693
694 template <typename T>
696 {
697 return std::sqrt(distance2(v2));
698 }
699
700 template <typename T>
702 {
703 return setLength((Real) 1.0);
704 }
705
706 template<typename T>
708 {
709 Real norm = Vec3T<T>::length();
710
711 if (norm > 0.0) {
712 Real inv = Real(newLength) / norm;
713 m_data[0] = T(m_data[0] * inv);
714 m_data[1] = T(m_data[1] * inv);
715 m_data[2] = T(m_data[2] * inv);
716
717 }
718 return(norm);
719 }
720
721 template <typename T>
723 {
724 Vec3T normal = *this;
725 normal.normalize();
726 return normal;
727 }
728
729
730
731 template<typename T>
733 {
734 // Create a temporary vector that's not parallel to this vector
735 Vec3T<T> tmp;
736 if (agx::absolute(m_data[0]) < agx::absolute(m_data[1])) {
737 if (agx::absolute(m_data[0]) < agx::absolute(m_data[2]))
738 tmp.set(T(1), T(0), T(0)); // use x axis.
739 else
740 tmp.set(T(0), T(0), T(1));
741 }
742 else if (agx::absolute(m_data[1]) < agx::absolute(m_data[2])) {
743 tmp.set(T(0), T(1), T(0));
744 }
745 else {
746 tmp.set(T(0), T(0), T(1));
747 }
748
749 // Create and return a vector perpendicular to this and the temporary one
750 Vec3T<T> vPerp = (*this) ^ tmp;
751 vPerp.normalize();
752
753 return vPerp;
754 }
755
756
757
758 template<typename T>
760 {
761 Vec3T<T> vPerp = (*this) ^ v2;
762 if (vPerp.equalsZero())
763 return getPerpendicularUnitVector();
764 vPerp.normalize();
765 return vPerp;
766 }
767
768
769
770 template <typename T>
772 {
773 return Vec3T<T>(1, 0, 0);
774 }
775
776 template <typename T>
778 {
779 return Vec3T<T>(0, 1, 0);
780 }
781
782 template <typename T>
784 {
785 return Vec3T<T>(0, 0, 1);
786 }
787
788 template <typename T>
790 {
791 Vec3T<T> tmp;
792 tmp[i] = T(1);
793 return tmp;
794 }
795
796 template <typename T>
798 {
800 }
801
802 template <typename T>
804 {
805 return Vec3T(agx::random(min[0], max[0]), agx::random(min[1], max[1]), agx::random(min[2], max[2]));
806 }
807
808
809 template<typename T>
810 void Vec3T<T>::store3(T* storage) const
811 {
812 ::memcpy(storage, this->ptr(), size_t(3)*sizeof(T));
813 }
814
815
816 template<typename T>
818 {
819 return agx::equivalent(a[0], b[0], epsilon) &&
820 agx::equivalent(a[1], b[1], epsilon) &&
821 agx::equivalent(a[2], b[2], epsilon);
822 }
823
824 template<typename T>
826 {
827 return Vec3T<T>(std::abs(a[0]),
828 std::abs(a[1]),
829 std::abs(a[2]));
830 }
831
832 template<typename T>
834 {
835 return Vec3T<T>(std::asin(a[0]),
836 std::asin(a[1]),
837 std::asin(a[2]));
838 }
839
840 template<typename T>
842 {
843 return Vec3T<T>(agx::sinc(a[0]),
844 agx::sinc(a[1]),
845 agx::sinc(a[2]));
846 }
847
848 template <typename T>
850 {
851 return vec * val;
852 }
853
854 template<typename T>
856 {
857 return Vec3T<T>::componentMax(lhs, rhs);
858 }
859
860 template<typename T>
862 {
863 return Vec3T<T>::componentMin(lhs, rhs);
864 }
865
866
867 template<typename T>
868 AGX_FORCE_INLINE std::ostream& operator << ( std::ostream& output, const Vec3T<T>& v )
869 {
870 output << v[0] << " " << v[1] << " " << v[2];
871 return output;
872 }
873
874
875 template<typename T>
877 {
878 Vec3T diff(m_data[0] - v2.m_data[0], m_data[1] - v2.m_data[1], m_data[2] - v2.m_data[2]);
879 return diff.length2();
880 }
881
882 template<>
884 {
885 // Template specialization to avoid underflow in unsigned types.
886 Vec3T diff( (UInt8) (std::max( m_data[0], v2.m_data[0] ) - std::min( m_data[0], v2.m_data[0] )),
887 (UInt8) (std::max( m_data[1], v2.m_data[1] ) - std::min( m_data[1], v2.m_data[1] )),
888 (UInt8) (std::max( m_data[2], v2.m_data[2] ) - std::min( m_data[2], v2.m_data[2] )) );
889 return diff.length2();
890 }
891
892 template<>
894 {
895 // Template specialization to avoid underflow in unsigned types.
896 Vec3T diff( (UInt16) (std::max( m_data[0], v2.m_data[0] ) - std::min( m_data[0], v2.m_data[0] )),
897 (UInt16) (std::max( m_data[1], v2.m_data[1] ) - std::min( m_data[1], v2.m_data[1] )),
898 (UInt16) (std::max( m_data[2], v2.m_data[2] ) - std::min( m_data[2], v2.m_data[2] )) );
899 return diff.length2();
900 }
901
902 template<>
904 {
905 // Template specialization to avoid underflow in unsigned types.
906 Vec3T diff( std::max( m_data[0], v2.m_data[0] ) - std::min( m_data[0], v2.m_data[0] ),
907 std::max( m_data[1], v2.m_data[1] ) - std::min( m_data[1], v2.m_data[1] ),
908 std::max( m_data[2], v2.m_data[2] ) - std::min( m_data[2], v2.m_data[2] ) );
909 return diff.length2();
910 }
911
912 template<>
914 {
915 // Template specialization to avoid underflow in unsigned types.
916 Vec3T diff( std::max( m_data[0], v2.m_data[0] ) - std::min( m_data[0], v2.m_data[0] ),
917 std::max( m_data[1], v2.m_data[1] ) - std::min( m_data[1], v2.m_data[1] ),
918 std::max( m_data[2], v2.m_data[2] ) - std::min( m_data[2], v2.m_data[2] ) );
919 return diff.length2();
920 }
921
922 template <typename T>
923 AGX_FORCE_INLINE Vec3T<T> clamp( const Vec3T<T>& vec, const Vec3T<T>& minimum, const Vec3T<T>& maximum )
924 {
925 Vec3T<T> result = vec;
926 result.clamp(minimum, maximum);
927 return result;
928 }
929
930
931} // end of namespace agx
932
933
934#endif
A class holding 3 dimensional vectors and providing basic arithmetic.
Definition: Vec3Template.h:46
static Vec3T Y_AXIS()
Definition: Vec3Template.h:777
Vec3T(const Vec3T &copy, T value, size_t i)
Definition: Vec3Template.h:301
Real normalize()
Normalize the vector so that it has length unity.
Definition: Vec3Template.h:701
Vec3T(const Vec2 &v2, T zz)
Definition: Vec3Template.h:357
bool isNaN() const
Definition: Vec3Template.h:535
bool isFinite() const
Definition: Vec3Template.h:541
Vec3T & operator-=(const Vec3T &rhs)
Unary vector subtract.
Definition: Vec3Template.h:638
Real setLength(Real newLength)
Scale the vector so that is has the specified length.
Definition: Vec3Template.h:707
const Vec3T operator-() const
Negation operator.
Definition: Vec3Template.h:677
const Vec3T operator+(const Vec3T &rhs) const
Binary vector add.
Definition: Vec3Template.h:617
static Vec3T div(const Vec3T &lhs, const Vec3T &rhs)
Element-wise-division.
Definition: Vec3Template.h:576
T & operator[](size_t i)
Definition: Vec3Template.h:481
static Vec3T Z_AXIS()
Definition: Vec3Template.h:783
static Vec3T random(const Vec3T< T > &min, const Vec3T< T > &max)
Definition: Vec3Template.h:803
static Vec3T random(T min=T(0), T max=T(1))
Definition: Vec3Template.h:797
bool operator==(const Vec3T &v) const
Equality test.
Definition: Vec3Template.h:366
T maxComponent() const
Definition: Vec3Template.h:397
Real length() const
Length of the vector = sqrt( vec .
Definition: Vec3Template.h:683
Vec3T(const Vec3T &copy, Real length)
Definition: Vec3Template.h:290
Vec3T getPerpendicularUnitVector(const Vec3T &v2) const
Return a unit vector perpendicular to this and another vector.
Definition: Vec3Template.h:759
void store3(T *storage) const
Store the tree components to the given memory area.
Definition: Vec3Template.h:810
Vec3T normal() const
Definition: Vec3Template.h:722
bool operator!=(const Vec3T &v) const
In-equality test.
Definition: Vec3Template.h:372
const Vec3T operator/(T rhs) const
Divide by scalar.
Definition: Vec3Template.h:601
size_t minElement() const
Definition: Vec3Template.h:403
Real distance2(const Vec3T &v2) const
Squared distance to another vector.
Definition: Vec3Template.h:876
void set(const Vec3T &rhs)
Definition: Vec3Template.h:473
static Vec3T mul(const Vec3T &lhs, const Vec3T &rhs)
Element-wise-multiplication.
Definition: Vec3Template.h:569
const T * ptr() const
Definition: Vec3Template.h:453
Vec3T getPerpendicularUnitVector() const
Definition: Vec3Template.h:732
size_t maxElement() const
Definition: Vec3Template.h:418
const Vec3T cross(const Vec3T &rhs) const
Cross product method.
Definition: Vec3Template.h:561
Real distance(const Vec3T &v2) const
Distance to another vector.
Definition: Vec3Template.h:695
Vec3T(T x, T y, T z)
Definition: Vec3Template.h:339
static Vec3T AXIS(size_t i)
Definition: Vec3Template.h:789
bool equalsZero() const
Definition: Vec3Template.h:441
void set(T x, T y, T z)
Definition: Vec3Template.h:459
Vec3T & operator/=(T rhs)
Unary divide by scalar.
Definition: Vec3Template.h:607
void clamp(const Vec3T &min, const Vec3T &max)
Clamp a vector between a lower and upper bound (per component).
Definition: Vec3Template.h:433
bool isValid() const
Definition: Vec3Template.h:529
Real length2() const
Length squared of the vector = vec .
Definition: Vec3Template.h:689
void set(T value)
Definition: Vec3Template.h:467
Vec3T & operator*=(T rhs)
Unary multiply by scalar.
Definition: Vec3Template.h:592
T z() const
Definition: Vec3Template.h:523
static Vec3T componentMax(const Vec3T &v1, const Vec3T &v2)
Creates a new vector where each component is the maximum of this and the other vector.
Definition: Vec3Template.h:385
static Vec3T X_AXIS()
Definition: Vec3Template.h:771
Vec3T(const T v[3])
Definition: Vec3Template.h:348
T x() const
Definition: Vec3Template.h:511
const Vec3T operator^(const Vec3T &rhs) const
Cross product operator.
Definition: Vec3Template.h:553
Vec3T & operator+=(const Vec3T &rhs)
Unary vector add.
Definition: Vec3Template.h:623
Vec3T()
Default constructor.
Definition: Vec3Template.h:323
Vec3T(const Vec3T< T2 > &copy)
Copy constructor for other types.
Definition: Vec3Template.h:313
static Vec3T componentMin(const Vec3T &v1, const Vec3T &v2)
Creates a new vector where each component is the minimum of this and the other vector.
Definition: Vec3Template.h:379
T y() const
Definition: Vec3Template.h:517
Vec3T(const Vec3T &copy)=default
Copy constructor.
T operator*(const Vec3T &rhs) const
Dot product.
Definition: Vec3Template.h:547
T minComponent() const
Definition: Vec3Template.h:391
#define AGX_FORCE_INLINE
Definition: macros.h:58
The agx namespace contains the dynamics/math part of the AGX Dynamics API.
uint16_t UInt16
Definition: Integer.h:31
T absolute(T v)
return the absolute value.
Definition: Math.h:291
Vec3T< T > operator*(const Vec3T< T > &v, const AffineMatrix4x4T< T > &m)
bool isNaN(T v)
Definition: Math.h:303
T1 clamp(T1 v, T2 minimum, T3 maximum)
Definition: Math.h:318
Real sinc(Real x, Real nearZero=Real(1E-4))
Sinc function.
Definition: Math.h:93
Vec3T< T > min(const Vec3T< T > &lhs, const Vec3T< T > &rhs)
Definition: Vec3Template.h:861
AGXPHYSICS_EXPORT agx::Bool equalsZero(const agx::AddedMassInteraction::Matrix6x6 &matrix, agx::Real eps=agx::RealEpsilon)
std::ostream & operator<<(std::ostream &os, const agx::AddedMassInteraction::Matrix6x6 &m)
Vec3T< T > max(const Vec3T< T > &lhs, const Vec3T< T > &rhs)
Definition: Vec3Template.h:855
T random(T min, T max)
Definition: Math.h:555
double Real
Definition: Real.h:42
uint8_t UInt8
Definition: Integer.h:30
static constexpr Real AGX_EQUIVALENT_EPSILON
Definition: Math.h:57
Vec3T< T > asin(const agx::Vec3T< T > &a)
Definition: Vec3Template.h:833
bool isFinite(T v)
Definition: Math.h:309
AGXPHYSICS_EXPORT agx::Bool equivalent(const agx::AddedMassInteraction::Matrix6x6 &lhs, const agx::AddedMassInteraction::Matrix6x6 &rhs, agx::Real eps=agx::RealEpsilon)