]> git.mxchange.org Git - simgear.git/blobdiff - simgear/math/SGVec4.hxx
Modified Files:
[simgear.git] / simgear / math / SGVec4.hxx
index 50b138c9eb0e5c0668f81dee9c2aed6e479951e5..f854274dd37bbae282d665665f8062897112ab48 100644 (file)
@@ -96,6 +96,8 @@ public:
   { data()[0] = d[0]; data()[1] = d[1]; data()[2] = d[2]; data()[3] = d[3]; }
   explicit SGVec4(const osg::Vec4d& d)
   { data()[0] = d[0]; data()[1] = d[1]; data()[2] = d[2]; data()[3] = d[3]; }
+  explicit SGVec4(const SGVec3<T>& v3, const T& v4 = 0)
+  { data()[0] = v3[0]; data()[1] = v3[1]; data()[2] = v3[2]; data()[3] = v4; }
 
 
   /// Access by index, the index is unchecked
@@ -221,6 +223,70 @@ SGVec4<T>
 operator*(const SGVec4<T>& v, S s)
 { return SGVec4<T>(s*v(0), s*v(1), s*v(2), s*v(3)); }
 
+/// component wise min
+template<typename T>
+inline
+SGVec4<T>
+min(const SGVec4<T>& v1, const SGVec4<T>& v2)
+{
+  return SGVec4<T>(SGMisc<T>::min(v1(0), v2(0)),
+                   SGMisc<T>::min(v1(1), v2(1)),
+                   SGMisc<T>::min(v1(2), v2(2)),
+                   SGMisc<T>::min(v1(3), v2(3)));
+}
+template<typename S, typename T>
+inline
+SGVec4<T>
+min(const SGVec4<T>& v, S s)
+{
+  return SGVec4<T>(SGMisc<T>::min(s, v(0)),
+                   SGMisc<T>::min(s, v(1)),
+                   SGMisc<T>::min(s, v(2)),
+                   SGMisc<T>::min(s, v(3)));
+}
+template<typename S, typename T>
+inline
+SGVec4<T>
+min(S s, const SGVec4<T>& v)
+{
+  return SGVec4<T>(SGMisc<T>::min(s, v(0)),
+                   SGMisc<T>::min(s, v(1)),
+                   SGMisc<T>::min(s, v(2)),
+                   SGMisc<T>::min(s, v(3)));
+}
+
+/// component wise max
+template<typename T>
+inline
+SGVec4<T>
+max(const SGVec4<T>& v1, const SGVec4<T>& v2)
+{
+  return SGVec4<T>(SGMisc<T>::max(v1(0), v2(0)),
+                   SGMisc<T>::max(v1(1), v2(1)),
+                   SGMisc<T>::max(v1(2), v2(2)),
+                   SGMisc<T>::max(v1(3), v2(3)));
+}
+template<typename S, typename T>
+inline
+SGVec4<T>
+max(const SGVec4<T>& v, S s)
+{
+  return SGVec4<T>(SGMisc<T>::max(s, v(0)),
+                   SGMisc<T>::max(s, v(1)),
+                   SGMisc<T>::max(s, v(2)),
+                   SGMisc<T>::max(s, v(3)));
+}
+template<typename S, typename T>
+inline
+SGVec4<T>
+max(S s, const SGVec4<T>& v)
+{
+  return SGVec4<T>(SGMisc<T>::max(s, v(0)),
+                   SGMisc<T>::max(s, v(1)),
+                   SGMisc<T>::max(s, v(2)),
+                   SGMisc<T>::max(s, v(3)));
+}
+
 /// Scalar dot product
 template<typename T>
 inline
@@ -250,6 +316,13 @@ T
 norm1(const SGVec4<T>& v)
 { return fabs(v(0)) + fabs(v(1)) + fabs(v(2)) + fabs(v(3)); }
 
+/// The inf-norm of the vector
+template<typename T>
+inline
+T
+normI(const SGVec4<T>& v)
+{ return SGMisc<T>::max(fabs(v(0)), fabs(v(1)), fabs(v(2)), fabs(v(2))); }
+
 /// The euclidean norm of the vector, that is what most people call length
 template<typename T>
 inline
@@ -271,6 +344,47 @@ bool
 operator!=(const SGVec4<T>& v1, const SGVec4<T>& v2)
 { return ! (v1 == v2); }
 
+/// Return true if smaller, good for putting that into a std::map
+template<typename T>
+inline
+bool
+operator<(const SGVec4<T>& v1, const SGVec4<T>& v2)
+{
+  if (v1(0) < v2(0)) return true;
+  else if (v2(0) < v1(0)) return false;
+  else if (v1(1) < v2(1)) return true;
+  else if (v2(1) < v1(1)) return false;
+  else if (v1(2) < v2(2)) return true;
+  else if (v2(2) < v1(2)) return false;
+  else return (v1(3) < v2(3));
+}
+
+template<typename T>
+inline
+bool
+operator<=(const SGVec4<T>& v1, const SGVec4<T>& v2)
+{
+  if (v1(0) < v2(0)) return true;
+  else if (v2(0) < v1(0)) return false;
+  else if (v1(1) < v2(1)) return true;
+  else if (v2(1) < v1(1)) return false;
+  else if (v1(2) < v2(2)) return true;
+  else if (v2(2) < v1(2)) return false;
+  else return (v1(3) <= v2(3));
+}
+
+template<typename T>
+inline
+bool
+operator>(const SGVec4<T>& v1, const SGVec4<T>& v2)
+{ return operator<(v2, v1); }
+
+template<typename T>
+inline
+bool
+operator>=(const SGVec4<T>& v1, const SGVec4<T>& v2)
+{ return operator<=(v2, v1); }
+
 /// Return true if equal to the relative tolerance tol
 template<typename T>
 inline