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