Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[MANTA] r287 - branches/newPointVector/Core/Geometry


Chronological Thread 
  • From: sparker@sci.utah.edu
  • To: rtrt@sci.utah.edu
  • Subject: [MANTA] r287 - branches/newPointVector/Core/Geometry
  • Date: Wed, 11 May 2005 14:17:17 -0600 (MDT)

Author: sparker
Date: Wed May 11 14:17:17 2005
New Revision: 287

Added:
   branches/newPointVector/Core/Geometry/PointVector.cc
Modified:
   branches/newPointVector/Core/Geometry/AffineTransform.cc
   branches/newPointVector/Core/Geometry/PointVector.h
Log:
Improved generalizations of point/vector


Modified: branches/newPointVector/Core/Geometry/AffineTransform.cc
==============================================================================
--- branches/newPointVector/Core/Geometry/AffineTransform.cc    (original)
+++ branches/newPointVector/Core/Geometry/AffineTransform.cc    Wed May 11 
14:17:17 2005
@@ -4,6 +4,7 @@
 #include <Core/Math/Trig.h>
 #include <Core/Math/MinMax.h>
 #include <Core/Math/MiscMath.h>
+#include <iostream>
 
 // TODO: several of these could be faster if they become bottlenecks
 

Added: branches/newPointVector/Core/Geometry/PointVector.cc
==============================================================================
--- (empty file)
+++ branches/newPointVector/Core/Geometry/PointVector.cc        Wed May 11 
14:17:17 2005
@@ -0,0 +1,18 @@
+
+#include <Core/Geometry/PointVector.h>
+
+using namespace Manta;
+
+template<typename T, int Dim>
+inline std::ostream &operator<< (std::ostream &os, const VectorT<T,Dim> &v) {
+  for (int i=0;i<Dim;++i)
+    os << v[i] << " ";
+  return os;
+}
+
+template<typename T, int Dim>
+inline std::ostream &operator<< (std::ostream &os, const PointT<T,Dim> &v) {
+  for (int i=0;i<Dim;++i)
+    os << v[i] << " ";
+  return os;
+}

Modified: branches/newPointVector/Core/Geometry/PointVector.h
==============================================================================
--- branches/newPointVector/Core/Geometry/PointVector.h (original)
+++ branches/newPointVector/Core/Geometry/PointVector.h Wed May 11 14:17:17 
2005
@@ -2,28 +2,32 @@
 #ifndef Manta_Core_PointVector_h
 #define Manta_Core_PointVector_h
 
-#include <iostream> // for debugging.
-
 #include <MantaTypes.h>
+#include <Core/Math/Expon.h>
 #include <Core/Math/MinMax.h>
 #include <Core/Math/MiscMath.h>
+#include <iosfwd>
 #include <math.h>
 
-
 namespace Manta {
   template<typename T, int Dim> 
     class VectorT {
   public:
     VectorT() {
     }
+    VectorT(T x, T y) {
+      char unnamed[ Dim == 2 ? 1 : 0 ];
+      data[0] = x; data[1] = y;
+    }
     VectorT(T x, T y, T z) {
+      char unnamed[ Dim == 3 ? 1 : 0 ];
       data[0] = x; data[1] = y; data[2] = z;
     }
 
-        explicit VectorT( const PointT<T,Dim> &copy) {
-               for (int i=0;i<Dim;i++)
-                 data[i] = copy[i];
-        }
+    explicit VectorT( const PointT<T,Dim> &copy) {
+      for (int i=0;i<Dim;i++)
+        data[i] = copy[i];
+    }
 
     VectorT(const VectorT<T, Dim>& copy) {
       for(int i=0;i<Dim;i++)
@@ -43,9 +47,11 @@
       return data[0];
     }
     T y() const {
+      char unnamed[ Dim >=2 ? 1 : 0 ];
       return data[1];
     }
     T z() const {
+      char unnamed[ Dim >= 3 ? 1 : 0 ];
       return data[2];
     }
     const T &operator[](int i) const {
@@ -55,75 +61,113 @@
       return data[i];
     }
     VectorT<T, Dim> operator+(const VectorT<T, Dim>& v) const {
-      return VectorT<T, Dim>(data[0]+v.data[0], data[1]+v.data[1], 
data[2]+v.data[2]);
-    }
-    VectorT<T, Dim> operator-(const VectorT<T, Dim>& v) const {
-      return VectorT<T, Dim>(data[0]-v.data[0], data[1]-v.data[1], 
data[2]-v.data[2]);
-    }
-    VectorT<T, Dim> operator-() const {
-      return VectorT<T, Dim>(-data[0], -data[1], -data[2]);
+      VectorT<T, Dim> result;
+      for(int i=0;i<Dim;i++)
+        result.data[i] = data[i] + v.data[i];
+      return result;
     }
     VectorT<T, Dim>& operator+=(const VectorT<T, Dim>& v) {
-      data[0]+=v.data[0]; data[1]+=v.data[1]; data[2]+=v.data[2];
+      for(int i=0;i<Dim;i++)
+        data[i] += v.data[i];
       return *this;
     }
+    VectorT<T, Dim> operator-(const VectorT<T, Dim>& v) const {
+      VectorT<T, Dim> result;
+      for(int i=0;i<Dim;i++)
+        result.data[i] = data[i] - v.data[i];
+      return result;
+    }
     VectorT<T, Dim>& operator-=(const VectorT<T, Dim>& v) {
-      data[0]-=v.data[0]; data[1]-=v.data[1]; data[2]-=v.data[2];
+      for(int i=0;i<Dim;i++)
+        data[i] -= v.data[i];
       return *this;
     }
+    VectorT<T, Dim> operator-() const {
+      VectorT<T, Dim> result;
+      for(int i=0;i<Dim;i++)
+        result.data[i] = -data[i];
+      return result;
+    }
 
     VectorT<T, Dim> operator*(const VectorT<T, Dim>& v) const {
-      return VectorT<T, Dim>(data[0]*v.data[0], data[1]*v.data[1], 
data[2]*v.data[2]);
+      VectorT<T, Dim> result;
+      for(int i=0;i<Dim;i++)
+        result.data[i] = data[i] * v.data[i];
+      return result;
     }
-    VectorT<T, Dim> operator*(double s) const {
-      return VectorT<T, Dim>(data[0]*s, data[1]*s, data[2]*s);
+    VectorT<T, Dim> operator*(T s) const {
+      VectorT<T, Dim> result;
+      for(int i=0;i<Dim;i++)
+        result.data[i] = data[i] * s;
+      return result;
     }
     VectorT<T, Dim>& operator*=(const VectorT<T, Dim>& v) {
-      data[0]*=v.data[0]; data[1]*=v.data[1]; data[2]*=v.data[2];
+      for(int i=0;i<Dim;i++)
+        data[i] *= v.data[i];
       return *this;
     }
-    VectorT<T, Dim>& operator*=(double s) {
-      data[0]*=s; data[1]*=s; data[2]*=s;
+    VectorT<T, Dim>& operator*=(T s) {
+      for(int i=0;i<Dim;i++)
+        data[i] *= s;
       return *this;
     }
-    VectorT<T, Dim> operator/(double s) const {
-      double inv_s = 1./s;
-      return VectorT<T, Dim>(data[0]*inv_s, data[1]*inv_s, data[2]*inv_s);
-    }
-    VectorT<T, Dim>& operator/=(double s) {
-      double inv_s = 1./s;
-      data[0]*=inv_s; data[1]*=inv_s; data[2]*=inv_s;
+    VectorT<T, Dim> operator/(T s) const {
+      T inv_s = 1./s;
+      VectorT<T, Dim> result;
+      for(int i=0;i<Dim;i++)
+        result.data[i] = data[i] * inv_s;
+      return result;
+    }
+    VectorT<T, Dim>& operator/=(T s) {
+      for(int i=0;i<Dim;i++)
+        data[i] *= inv_s;
       return *this;
     }
     VectorT<T, Dim> operator/(const VectorT<T, Dim>& v) const {
-      return VectorT<T, Dim>(data[0]/v.data[0], data[1]/v.data[1], 
data[2]/v.data[2]);
+      T inv_s = 1./s;
+      VectorT<T, Dim> result;
+      for(int i=0;i<Dim;i++)
+        result.data[i] = data[i] * v.data[i];
+      return result;
     }
 
-    double length() const {
-      return sqrt(data[0]*data[0]+data[1]*data[1]+data[2]*data[2]);
+    T length() const {
+      T sum = 0;
+      for(int i=0;i<Dim;i++)
+        sum += data[i]*data[i];
+      return SCIRun::Sqrt(sum);
     }
-    double length2() const {
-      return data[0]*data[0]+data[1]*data[1]+data[2]*data[2];
+    T length2() const {
+      T sum = 0;
+      for(int i=0;i<Dim;i++)
+        sum += data[i]*data[i];
+      return sum;
     }
 
-    double normalize() {
-      double l = length();
-      double scale = 1./l;
+    T normalize() {
+      T l = length();
+      T scale = 1./l;
       *this *= scale;
       return l;
     }
     VectorT<T, Dim> normal() const {
-      double l = length();
-      double scale = 1./l;
+      T l = length();
+      T scale = 1./l;
       return *this * scale;
     }
-    double minComponent() const {
-      using SCIRun::Min;
-      return Min(data[0], data[1], data[2]);
+    T minComponent() const {
+      T min = data[0];
+      for(int i=1;i<Dim;i++)
+        if(data[i] < min)
+          min = data[i];
+      return min;
     }
-    double maxComponent() const {
-      using SCIRun::Max;
-      return Max(data[0], data[1], data[2]);
+    T maxComponent() const {
+      T max = data[0];
+      for(int i=1;i<Dim;i++)
+        if(data[i] < max)
+          max = data[i];
+      return max;
     }
     int indexOfMinComponent() const {
       int idx = 0;
@@ -141,18 +185,29 @@
     }
 
     VectorT<T, Dim> inverse() const {
-      return VectorT<T, Dim>(1./data[0], 1./data[1], 1./data[2]);
+      VectorT<T, Dim> result;
+      for(int i=0;i<Dim;i++)
+        result.data[i] = 1./data[i];
+      return result;
     }
     VectorT<T, Dim> absoluteValue() const {
-      using SCIRun::Abs;
-      return VectorT<T, Dim>(Abs(data[0]), Abs(data[1]), Abs(data[2]));
+      VectorT<T, Dim> result;
+      for(int i=0;i<Dim;i++)
+        result.data[i] = SCIRun::Abs(data[i]);
+      return result;
     }
 
     static VectorT<T, Dim> zero() {
-      return VectorT<T, Dim>(0,0,0);
+      VectorT<T, Dim> result;
+      for(int i=0;i<Dim;i++)
+        result.data[i] = 0;
+      return result;
     }
     static VectorT<T, Dim> one() {
-      return VectorT<T, Dim>(1,1,1);
+      VectorT<T, Dim> result;
+      for(int i=0;i<Dim;i++)
+        result.data[i] = 1;
+      return result;
     }
 
   private:
@@ -166,7 +221,12 @@
     PointT() {
     }
 
+    PointT(T x, T y) {
+      char unnamed[ Dim == 2 ? 1 : 0 ];
+      data[0] = x; data[1] = y;
+    }
     PointT(T x, T y, T z) {
+      char unnamed[ Dim == 3 ? 1 : 0 ];
       data[0] = x; data[1] = y; data[2] = z;
     }
     
@@ -196,6 +256,7 @@
       return data[1];
     }
     T z() const {
+      char unnamed[ Dim == 3 ? 1 : 0 ];
       return data[2];
     }
     T operator[](int i) const {
@@ -206,26 +267,33 @@
     }
 
     VectorT<T, Dim> operator-(const PointT<T, Dim>& p) const {
-      return VectorT<T, Dim>(data[0]-p.data[0], data[1]-p.data[1], 
data[2]-p.data[2]);
+      VectorT<T, Dim> result;
+      for(int i=0;i<Dim;i++)
+        result[i] = data[i] - p[i];
+      return result;
     }
     PointT<T, Dim> operator+(const VectorT<T, Dim>& v) const {
-      return PointT<T, Dim>(data[0]+v.x(), data[1]+v.y(), data[2]+v.z());
+      PointT<T, Dim> result;
+      for(int i=0;i<Dim;i++)
+        result.data[i] = data[i] + v[i];
+      return result;
     }
     PointT<T, Dim> operator-(const VectorT<T, Dim>& v) const {
-      return PointT<T, Dim>(data[0]-v.x(), data[1]-v.y(), data[2]-v.z());
+      PointT<T, Dim> result;
+      for(int i=0;i<Dim;i++)
+        result.data[i] = data[i] - v[i];
+      return result;
     }
 
     PointT<T, Dim>& operator+=(const VectorT<T, Dim>& v) {
-      data[0]+=v.x();
-      data[1]+=v.y();
-      data[2]+=v.z();
+      for(int i=0;i<Dim;i++)
+        data[i] += v[i];
       return *this;
     }
 
     PointT<T, Dim>& operator-=(const VectorT<T, Dim>& v) {
-      data[0]-=v.x();
-      data[1]-=v.y();
-      data[2]-=v.z();
+      for(int i=0;i<Dim;i++)
+        data[i] -= v[i];
       return *this;
     }
   private:
@@ -233,89 +301,111 @@
   };
 
   template<typename T, int Dim> 
-    inline VectorT<T, Dim> operator*(double s, const VectorT<T, Dim>& v)
+    inline VectorT<T, Dim> operator*(T s, const VectorT<T, Dim>& v)
     {
-      return VectorT<T, Dim>(s*v.x(), s*v.y(), s*v.z());
+      VectorT<T, Dim> result;
+      for(int i=0;i<Dim;i++)
+        result[i] = s * v[i];
+      return result;
     }
 
   template<typename T, int Dim> 
-    inline double Dot(const VectorT<T, Dim>& v1, const VectorT<T, Dim>& v2)
+    inline T Dot(const VectorT<T, Dim>& v1, const VectorT<T, Dim>& v2)
   {
-    return v1.x()*v2.x() + v1.y()*v2.y() + v1.z()*v2.z();
+    T result = 0;
+    for(int i=0;i<Dim;i++)
+      result += v1[i] * v2[i];
+    return result;
   }
 
   template<typename T, int Dim> 
-    inline double Dot(const VectorT<T, Dim>& v1, const PointT<T, Dim>& v2)
+    inline T Dot(const VectorT<T, Dim>& v1, const PointT<T, Dim>& v2)
   {
-    return v1.x()*v2.x() + v1.y()*v2.y() + v1.z()*v2.z();
+    T result = 0;
+    for(int i=0;i<Dim;i++)
+      result += v1[i] * v2[i];
+    return result;
   }
 
   template<typename T, int Dim> 
-    inline double Dot(const PointT<T, Dim>& v1, const VectorT<T, Dim>& v2)
+    inline T Dot(const PointT<T, Dim>& v1, const VectorT<T, Dim>& v2)
   {
-    return v1.x()*v2.x() + v1.y()*v2.y() + v1.z()*v2.z();
+    T result = 0;
+    for(int i=0;i<Dim;i++)
+      result += v1[i] * v2[i];
+    return result;
   }
 
 
-  template<typename T, int Dim> 
-    inline VectorT<T, Dim> Cross(const VectorT<T, Dim>& v1, const VectorT<T, 
Dim>& v2)
+  // Cross product is only defined for R3
+  template<typename T> 
+    inline VectorT<T, 3> Cross(const VectorT<T, 3>& v1, const VectorT<T, 3>& 
v2)
     {
-      return VectorT<T, Dim>(v1.y()*v2.z() - v1.z()*v2.y(),
-                             v1.z()*v2.x() - v1.x()*v2.z(),
-                             v1.x()*v2.y() - v1.y()*v2.x());
+      return VectorT<T, 3>(v1.y()*v2.z() - v1.z()*v2.y(),
+                           v1.z()*v2.x() - v1.x()*v2.z(),
+                           v1.x()*v2.y() - v1.y()*v2.x());
     }
 
   template<typename T, int Dim> 
-    inline VectorT<T, Dim> Min(const VectorT<T, Dim>& p1, const VectorT<T, 
Dim>& p2)
+    inline VectorT<T, Dim> Min(const VectorT<T, Dim>& v1, const VectorT<T, 
Dim>& v2)
     {
       using SCIRun::Min;
-      return VectorT<T, Dim>(Min(p1.x(), p2.x()), Min(p1.y(), p2.y()), 
Min(p1.z(), p2.z()));
+      VectorT<T, Dim> result;
+      for(int i=0;i<Dim;i++)
+        result[i] = Min(v1[i], v2[i]);
+      return result;
     }
 
   template<typename T, int Dim> 
-    inline VectorT<T, Dim> Max(const VectorT<T, Dim>& p1, const VectorT<T, 
Dim>& p2)
+    inline VectorT<T, Dim> Max(const VectorT<T, Dim>& v1, const VectorT<T, 
Dim>& v2)
     {
       using SCIRun::Max;
-      return VectorT<T, Dim>(Max(p1.x(), p2.x()), Max(p1.y(), p2.y()), 
Max(p1.z(), p2.z()));
+      VectorT<T, Dim> result;
+      for(int i=0;i<Dim;i++)
+        result[i] = Max(v1[i], v2[i]);
+      return result;
     }
 
   template<typename T, int Dim> 
     inline PointT<T, Dim> Min(const PointT<T, Dim>& p1, const PointT<T, 
Dim>& p2)
     {
       using SCIRun::Min;
-      return PointT<T, Dim>(Min(p1.x(), p2.x()), Min(p1.y(), p2.y()), 
Min(p1.z(), p2.z()));
+      PointT<T, Dim> result;
+      for(int i=0;i<Dim;i++)
+        result[i] = Min(p1[i], p2[i]);
+      return result;
     }
 
   template<typename T, int Dim> 
     inline PointT<T, Dim> Max(const PointT<T, Dim>& p1, const PointT<T, 
Dim>& p2)
     {
       using SCIRun::Max;
-      return PointT<T, Dim>(Max(p1.x(), p2.x()), Max(p1.y(), p2.y()), 
Max(p1.z(), p2.z()));
+      PointT<T, Dim> result;
+      for(int i=0;i<Dim;i++)
+        result[i] = Max(p1[i], p2[i]);
+      return result;
     }
 
   template<typename T, int Dim> 
-    inline PointT<T, Dim> Interpolate(const PointT<T, Dim>& p1, const 
PointT<T, Dim>& p2, double weight)
+    inline PointT<T, Dim> Interpolate(const PointT<T, Dim>& p1, const 
PointT<T, Dim>& p2, T weight)
     {
       using SCIRun::Interpolate;
-      return PointT<T, Dim>(Interpolate(p1.x(), p2.x(), weight),
-                            Interpolate(p1.y(), p2.y(), weight),
-                            Interpolate(p1.z(), p2.z(), weight));
-
+      PointT<T, Dim> result;
+      for(int i=0;i<Dim;i++)
+        result[i] = Interpolate(p1[i], p2[i], weight);
+      return result;
     }
 
   template<typename T, int Dim>
-    inline std::ostream &operator<< (std::ostream &os, const VectorT<T,Dim> 
&v) {
-        for (int i=0;i<Dim;++i)
-               os << v[i] << " ";
-        return os;
-  }
+    std::ostream &operator<< (std::ostream &os, const VectorT<T,Dim> &v);
 
   template<typename T, int Dim>
-    inline std::ostream &operator<< (std::ostream &os, const PointT<T,Dim> 
&v) {
-        for (int i=0;i<Dim;++i)
-               os << v[i] << " ";
-        return os;
-  }
+    std::ostream &operator<< (std::ostream &os, const PointT<T,Dim> &v);
+
 }
+
+#ifdef MANTA_TEMPLATE_DEFINITIONS_REQUIRED
+#include <Core/Geometry/PointVector.cc>
+#endif
 
 #endif




  • [MANTA] r287 - branches/newPointVector/Core/Geometry, sparker, 05/11/2005

Archive powered by MHonArc 2.6.16.

Top of page