VTK
|
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