VTK
dox/Common/vtkVectorOperators.h
Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    vtkVectorOperators.h
00005 
00006   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
00007   All rights reserved.
00008   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
00009 
00010      This software is distributed WITHOUT ANY WARRANTY; without even
00011      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00012      PURPOSE.  See the above copyright notice for more information.
00013 
00014 =========================================================================*/
00015 
00016 #ifndef __vtkVectorOperators_h
00017 #define __vtkVectorOperators_h
00018 
00019 // This set of operators enhance the vtkVector classes, allowing various
00020 // operator overloads one might expect.
00021 #include "vtkVector.h"
00022 #include "vtkIOStream.h"
00023 
00024 // Description:
00025 // Output the contents of a vector, mainly useful for debugging.
00026 template<typename A, int Size>
00027 ostream& operator<<(ostream& out, const vtkVector<A, Size>& v)
00028 {
00029   out << "(";
00030   bool first = true;
00031   for (int i = 0; i < Size; ++i)
00032     {
00033     if (first)
00034       {
00035       first = false;
00036       }
00037     else
00038       {
00039       out << ", ";
00040       }
00041     out << v[i];
00042     }
00043   out << ")";
00044   return out;
00045 }
00046 
00047 // Description:
00048 // Equality operator performs an equality check on each component.
00049 template<typename A, int Size>
00050 bool operator==(const vtkVector<A, Size>& v1, const vtkVector<A, Size>& v2)
00051 {
00052   bool ret = true;
00053   for (int i = 0; i < Size; ++i)
00054     {
00055     if (v1[i] != v2[i])
00056       {
00057       ret = false;
00058       }
00059     }
00060   return ret;
00061 }
00062 
00063 // Description:
00064 // Inequality for vector type.
00065 template<typename A, int Size>
00066 bool operator!=(const vtkVector<A, Size>& v1, const vtkVector<A, Size>& v2)
00067 {
00068   return !(v1 == v2);
00069 }
00070 
00071 // Description:
00072 // Performs addition of vectors of the same basic type.
00073 template<typename A, int Size>
00074 vtkVector<A, Size> operator+(const vtkVector<A, Size>& v1,
00075                              const vtkVector<A, Size>& v2)
00076 {
00077   vtkVector<A, Size> ret;
00078   for (int i = 0; i < Size; ++i)
00079     {
00080     ret[i] = v1[i] + v2[i];
00081     }
00082   return ret;
00083 }
00084 
00085 // Description:
00086 // Performs subtraction of vectors of the same basic type.
00087 template<typename A, int Size>
00088 vtkVector<A, Size> operator-(const vtkVector<A, Size>& v1,
00089                              const vtkVector<A, Size>& v2)
00090 {
00091   vtkVector<A, Size> ret;
00092   for (int i = 0; i < Size; ++i)
00093     {
00094     ret[i] = v1[i] - v2[i];
00095     }
00096   return ret;
00097 }
00098 
00099 // Description:
00100 // Performs multiplication of vectors of the same basic type.
00101 template<typename A, int Size>
00102 vtkVector<A, Size> operator*(const vtkVector<A, Size>& v1,
00103                              const vtkVector<A, Size>& v2)
00104 {
00105   vtkVector<A, Size> ret;
00106   for (int i = 0; i < Size; ++i)
00107     {
00108     ret[i] = v1[i] * v2[i];
00109     }
00110   return ret;
00111 }
00112 
00113 // Description:
00114 // Performs multiplication of vectors by a scalar value.
00115 template<typename A, typename B, int Size>
00116 vtkVector<A, Size> operator*(const vtkVector<A, Size>& v1,
00117                              const B& scalar)
00118 {
00119   vtkVector<A, Size> ret;
00120   for (int i = 0; i < Size; ++i)
00121     {
00122     ret[i] = v1[i] * scalar;
00123     }
00124   return ret;
00125 }
00126 
00127 // Description:
00128 // Performs divisiom of vectors of the same type.
00129 template<typename A, int Size>
00130 vtkVector<A, Size> operator/(const vtkVector<A, Size>& v1,
00131                              const vtkVector<A, Size>& v2)
00132 {
00133   vtkVector<A, Size> ret;
00134   for (int i = 0; i < Size; ++i)
00135     {
00136     ret[i] = v1[i] / v2[i];
00137     }
00138   return ret;
00139 }
00140 
00141 // Description:
00142 // Several macros to define the various operator overloads for the vectors.
00143 #define vtkVectorOperatorPlus(vectorType, type, size) \
00144 inline vectorType operator+(const vectorType& v1, const vectorType& v2) \
00145 { \
00146   return vectorType((static_cast<vtkVector<type, size> >(v1) + \
00147     static_cast<vtkVector<type, size> >(v2)).GetData()); \
00148 }
00149 #define vtkVectorOperatorMinus(vectorType, type, size) \
00150 inline vectorType operator-(const vectorType& v1, const vectorType& v2) \
00151 { \
00152   return vectorType((static_cast<vtkVector<type, size> >(v1) - \
00153     static_cast<vtkVector<type, size> >(v2)).GetData()); \
00154 }
00155 #define vtkVectorOperatorMultiply(vectorType, type, size) \
00156 inline vectorType operator*(const vectorType& v1, const vectorType& v2) \
00157 { \
00158   return vectorType((static_cast<vtkVector<type, size> >(v1) * \
00159     static_cast<vtkVector<type, size> >(v2)).GetData()); \
00160 }
00161 #define vtkVectorOperatorMultiplyScalar(vectorType, type, size) \
00162 template<typename B> \
00163 inline vectorType operator*(const vectorType& v1, const B& scalar) \
00164 { \
00165   return vectorType((static_cast<vtkVector<type, size> >(v1) * scalar).GetData()); \
00166 }
00167 #define vtkVectorOperatorMultiplyScalarPre(vectorType, type, size) \
00168 template<typename B> \
00169 inline vectorType operator*(const B& scalar, const vectorType& v1) \
00170 { \
00171   return vectorType((static_cast<vtkVector<type, size> >(v1) * scalar).GetData()); \
00172 }
00173 #define vtkVectorOperatorDivide(vectorType, type, size) \
00174 inline vectorType operator/(const vectorType& v1, const vectorType& v2) \
00175 { \
00176   return vectorType((static_cast<vtkVector<type, size> >(v1) / \
00177     static_cast<vtkVector<type, size> >(v2)).GetData()); \
00178 }
00179 
00180 #define vtkVectorOperatorMacro(vectorType, type, size) \
00181 vtkVectorOperatorPlus(vectorType, type, size) \
00182 vtkVectorOperatorMinus(vectorType, type, size) \
00183 vtkVectorOperatorMultiply(vectorType, type, size) \
00184 vtkVectorOperatorMultiplyScalar(vectorType, type, size) \
00185 vtkVectorOperatorMultiplyScalarPre(vectorType, type, size) \
00186 vtkVectorOperatorDivide(vectorType, type, size)
00187 
00188 // Description:
00189 // Overload the operators for the common types.
00190 vtkVectorOperatorMacro(vtkVector2i, int,    2)
00191 vtkVectorOperatorMacro(vtkVector2f, float,  2)
00192 vtkVectorOperatorMacro(vtkVector2d, double, 2)
00193 vtkVectorOperatorMacro(vtkVector3i, int,    3)
00194 vtkVectorOperatorMacro(vtkVector3f, float,  3)
00195 vtkVectorOperatorMacro(vtkVector3d, double, 3)
00196 
00197 #endif