VTK
/Users/kitware/Dashboards/MyTests/VTK_BLD_Release_docs/Utilities/Doxygen/dox/Common/DataModel/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 
00023 // Description:
00024 // Unary minus / negation of vector.
00025 template<typename A, int Size>
00026 vtkVector<A, Size> operator-(const vtkVector<A, Size>& v)
00027 {
00028   vtkVector<A, Size> ret;
00029   for (int i = 0; i < Size; ++i)
00030     {
00031     ret[i] = -v[i];
00032     }
00033   return ret;
00034 }
00035 
00036 // Description:
00037 // Performs addition of vectors of the same basic type.
00038 template<typename A, int Size>
00039 vtkVector<A, Size> operator+(const vtkVector<A, Size>& v1,
00040                              const vtkVector<A, Size>& v2)
00041 {
00042   vtkVector<A, Size> ret;
00043   for (int i = 0; i < Size; ++i)
00044     {
00045     ret[i] = v1[i] + v2[i];
00046     }
00047   return ret;
00048 }
00049 
00050 // Description:
00051 // Performs subtraction of vectors of the same basic type.
00052 template<typename A, int Size>
00053 vtkVector<A, Size> operator-(const vtkVector<A, Size>& v1,
00054                              const vtkVector<A, Size>& v2)
00055 {
00056   vtkVector<A, Size> ret;
00057   for (int i = 0; i < Size; ++i)
00058     {
00059     ret[i] = v1[i] - v2[i];
00060     }
00061   return ret;
00062 }
00063 
00064 // Description:
00065 // Performs multiplication of vectors of the same basic type.
00066 template<typename A, int Size>
00067 vtkVector<A, Size> operator*(const vtkVector<A, Size>& v1,
00068                              const vtkVector<A, Size>& v2)
00069 {
00070   vtkVector<A, Size> ret;
00071   for (int i = 0; i < Size; ++i)
00072     {
00073     ret[i] = v1[i] * v2[i];
00074     }
00075   return ret;
00076 }
00077 
00078 // Description:
00079 // Performs multiplication of vectors by a scalar value.
00080 template<typename A, typename B, int Size>
00081 vtkVector<A, Size> operator*(const vtkVector<A, Size>& v1,
00082                              const B& scalar)
00083 {
00084   vtkVector<A, Size> ret;
00085   for (int i = 0; i < Size; ++i)
00086     {
00087     ret[i] = v1[i] * scalar;
00088     }
00089   return ret;
00090 }
00091 
00092 // Description:
00093 // Performs divisiom of vectors of the same type.
00094 template<typename A, int Size>
00095 vtkVector<A, Size> operator/(const vtkVector<A, Size>& v1,
00096                              const vtkVector<A, Size>& v2)
00097 {
00098   vtkVector<A, Size> ret;
00099   for (int i = 0; i < Size; ++i)
00100     {
00101     ret[i] = v1[i] / v2[i];
00102     }
00103   return ret;
00104 }
00105 
00106 // Description:
00107 // Several macros to define the various operator overloads for the vectors.
00108 #define vtkVectorOperatorNegate(vectorType, type, size) \
00109 inline vectorType operator-(const vectorType& v) \
00110 { \
00111   return vectorType((-static_cast<vtkVector<type, size> >(v)).GetData()); \
00112 }
00113 #define vtkVectorOperatorPlus(vectorType, type, size) \
00114 inline vectorType operator+(const vectorType& v1, const vectorType& v2) \
00115 { \
00116   return vectorType((static_cast<vtkVector<type, size> >(v1) + \
00117     static_cast<vtkVector<type, size> >(v2)).GetData()); \
00118 }
00119 #define vtkVectorOperatorMinus(vectorType, type, size) \
00120 inline vectorType operator-(const vectorType& v1, const vectorType& v2) \
00121 { \
00122   return vectorType((static_cast<vtkVector<type, size> >(v1) - \
00123     static_cast<vtkVector<type, size> >(v2)).GetData()); \
00124 }
00125 #define vtkVectorOperatorMultiply(vectorType, type, size) \
00126 inline vectorType operator*(const vectorType& v1, const vectorType& v2) \
00127 { \
00128   return vectorType((static_cast<vtkVector<type, size> >(v1) * \
00129     static_cast<vtkVector<type, size> >(v2)).GetData()); \
00130 }
00131 #define vtkVectorOperatorMultiplyScalar(vectorType, type, size) \
00132 template<typename B> \
00133 inline vectorType operator*(const vectorType& v1, const B& scalar) \
00134 { \
00135   return vectorType((static_cast<vtkVector<type, size> >(v1) * scalar).GetData()); \
00136 }
00137 #define vtkVectorOperatorMultiplyScalarPre(vectorType, type, size) \
00138 template<typename B> \
00139 inline vectorType operator*(const B& scalar, const vectorType& v1) \
00140 { \
00141   return vectorType((static_cast<vtkVector<type, size> >(v1) * scalar).GetData()); \
00142 }
00143 #define vtkVectorOperatorDivide(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 
00150 #define vtkVectorOperatorMacro(vectorType, type, size) \
00151 vtkVectorOperatorNegate(vectorType, type, size) \
00152 vtkVectorOperatorPlus(vectorType, type, size) \
00153 vtkVectorOperatorMinus(vectorType, type, size) \
00154 vtkVectorOperatorMultiply(vectorType, type, size) \
00155 vtkVectorOperatorMultiplyScalar(vectorType, type, size) \
00156 vtkVectorOperatorMultiplyScalarPre(vectorType, type, size) \
00157 vtkVectorOperatorDivide(vectorType, type, size)
00158 
00159 // Description:
00160 // Overload the operators for the common types.
00161 vtkVectorOperatorMacro(vtkVector2i, int,    2)
00162 vtkVectorOperatorMacro(vtkVector2f, float,  2)
00163 vtkVectorOperatorMacro(vtkVector2d, double, 2)
00164 vtkVectorOperatorMacro(vtkVector3i, int,    3)
00165 vtkVectorOperatorMacro(vtkVector3f, float,  3)
00166 vtkVectorOperatorMacro(vtkVector3d, double, 3)
00167 
00168 #endif
00169 // VTK-HeaderTest-Exclude: vtkVectorOperators.h