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