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