ruby-eigen 0.0.9 → 0.0.10.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (293) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +22 -0
  3. data/README.md +21 -0
  4. data/ext/eigen/eigen3/COPYING.BSD +26 -0
  5. data/ext/eigen/eigen3/COPYING.MPL2 +373 -0
  6. data/ext/eigen/eigen3/COPYING.README +18 -0
  7. data/ext/eigen/eigen3/Eigen/Array +11 -0
  8. data/ext/eigen/eigen3/Eigen/Cholesky +32 -0
  9. data/ext/eigen/eigen3/Eigen/CholmodSupport +45 -0
  10. data/ext/eigen/eigen3/Eigen/Core +376 -0
  11. data/ext/eigen/eigen3/Eigen/Dense +7 -0
  12. data/ext/eigen/eigen3/Eigen/Eigen +2 -0
  13. data/ext/eigen/eigen3/Eigen/Eigen2Support +95 -0
  14. data/ext/eigen/eigen3/Eigen/Eigenvalues +48 -0
  15. data/ext/eigen/eigen3/Eigen/Geometry +63 -0
  16. data/ext/eigen/eigen3/Eigen/Householder +23 -0
  17. data/ext/eigen/eigen3/Eigen/IterativeLinearSolvers +40 -0
  18. data/ext/eigen/eigen3/Eigen/Jacobi +26 -0
  19. data/ext/eigen/eigen3/Eigen/LU +41 -0
  20. data/ext/eigen/eigen3/Eigen/LeastSquares +32 -0
  21. data/ext/eigen/eigen3/Eigen/MetisSupport +28 -0
  22. data/ext/eigen/eigen3/Eigen/PaStiXSupport +46 -0
  23. data/ext/eigen/eigen3/Eigen/PardisoSupport +30 -0
  24. data/ext/eigen/eigen3/Eigen/QR +45 -0
  25. data/ext/eigen/eigen3/Eigen/QtAlignedMalloc +34 -0
  26. data/ext/eigen/eigen3/Eigen/SPQRSupport +29 -0
  27. data/ext/eigen/eigen3/Eigen/SVD +37 -0
  28. data/ext/eigen/eigen3/Eigen/Sparse +27 -0
  29. data/ext/eigen/eigen3/Eigen/SparseCore +64 -0
  30. data/ext/eigen/eigen3/Eigen/SparseLU +49 -0
  31. data/ext/eigen/eigen3/Eigen/SparseQR +33 -0
  32. data/ext/eigen/eigen3/Eigen/StdDeque +27 -0
  33. data/ext/eigen/eigen3/Eigen/StdList +26 -0
  34. data/ext/eigen/eigen3/Eigen/StdVector +27 -0
  35. data/ext/eigen/eigen3/Eigen/SuperLUSupport +59 -0
  36. data/ext/eigen/eigen3/Eigen/UmfPackSupport +36 -0
  37. data/ext/eigen/eigen3/Eigen/src/Cholesky/LDLT.h +611 -0
  38. data/ext/eigen/eigen3/Eigen/src/Cholesky/LLT.h +498 -0
  39. data/ext/eigen/eigen3/Eigen/src/Cholesky/LLT_MKL.h +102 -0
  40. data/ext/eigen/eigen3/Eigen/src/CholmodSupport/CholmodSupport.h +607 -0
  41. data/ext/eigen/eigen3/Eigen/src/Core/Array.h +323 -0
  42. data/ext/eigen/eigen3/Eigen/src/Core/ArrayBase.h +226 -0
  43. data/ext/eigen/eigen3/Eigen/src/Core/ArrayWrapper.h +264 -0
  44. data/ext/eigen/eigen3/Eigen/src/Core/Assign.h +590 -0
  45. data/ext/eigen/eigen3/Eigen/src/Core/Assign_MKL.h +224 -0
  46. data/ext/eigen/eigen3/Eigen/src/Core/BandMatrix.h +334 -0
  47. data/ext/eigen/eigen3/Eigen/src/Core/Block.h +406 -0
  48. data/ext/eigen/eigen3/Eigen/src/Core/BooleanRedux.h +154 -0
  49. data/ext/eigen/eigen3/Eigen/src/Core/CommaInitializer.h +154 -0
  50. data/ext/eigen/eigen3/Eigen/src/Core/CoreIterators.h +61 -0
  51. data/ext/eigen/eigen3/Eigen/src/Core/CwiseBinaryOp.h +230 -0
  52. data/ext/eigen/eigen3/Eigen/src/Core/CwiseNullaryOp.h +864 -0
  53. data/ext/eigen/eigen3/Eigen/src/Core/CwiseUnaryOp.h +126 -0
  54. data/ext/eigen/eigen3/Eigen/src/Core/CwiseUnaryView.h +139 -0
  55. data/ext/eigen/eigen3/Eigen/src/Core/DenseBase.h +521 -0
  56. data/ext/eigen/eigen3/Eigen/src/Core/DenseCoeffsBase.h +754 -0
  57. data/ext/eigen/eigen3/Eigen/src/Core/DenseStorage.h +434 -0
  58. data/ext/eigen/eigen3/Eigen/src/Core/Diagonal.h +237 -0
  59. data/ext/eigen/eigen3/Eigen/src/Core/DiagonalMatrix.h +313 -0
  60. data/ext/eigen/eigen3/Eigen/src/Core/DiagonalProduct.h +131 -0
  61. data/ext/eigen/eigen3/Eigen/src/Core/Dot.h +263 -0
  62. data/ext/eigen/eigen3/Eigen/src/Core/EigenBase.h +131 -0
  63. data/ext/eigen/eigen3/Eigen/src/Core/Flagged.h +140 -0
  64. data/ext/eigen/eigen3/Eigen/src/Core/ForceAlignedAccess.h +146 -0
  65. data/ext/eigen/eigen3/Eigen/src/Core/Functors.h +1026 -0
  66. data/ext/eigen/eigen3/Eigen/src/Core/Fuzzy.h +150 -0
  67. data/ext/eigen/eigen3/Eigen/src/Core/GeneralProduct.h +635 -0
  68. data/ext/eigen/eigen3/Eigen/src/Core/GenericPacketMath.h +350 -0
  69. data/ext/eigen/eigen3/Eigen/src/Core/GlobalFunctions.h +92 -0
  70. data/ext/eigen/eigen3/Eigen/src/Core/IO.h +250 -0
  71. data/ext/eigen/eigen3/Eigen/src/Core/Map.h +192 -0
  72. data/ext/eigen/eigen3/Eigen/src/Core/MapBase.h +247 -0
  73. data/ext/eigen/eigen3/Eigen/src/Core/MathFunctions.h +768 -0
  74. data/ext/eigen/eigen3/Eigen/src/Core/Matrix.h +420 -0
  75. data/ext/eigen/eigen3/Eigen/src/Core/MatrixBase.h +563 -0
  76. data/ext/eigen/eigen3/Eigen/src/Core/NestByValue.h +111 -0
  77. data/ext/eigen/eigen3/Eigen/src/Core/NoAlias.h +134 -0
  78. data/ext/eigen/eigen3/Eigen/src/Core/NumTraits.h +150 -0
  79. data/ext/eigen/eigen3/Eigen/src/Core/PermutationMatrix.h +721 -0
  80. data/ext/eigen/eigen3/Eigen/src/Core/PlainObjectBase.h +822 -0
  81. data/ext/eigen/eigen3/Eigen/src/Core/ProductBase.h +290 -0
  82. data/ext/eigen/eigen3/Eigen/src/Core/Random.h +152 -0
  83. data/ext/eigen/eigen3/Eigen/src/Core/Redux.h +409 -0
  84. data/ext/eigen/eigen3/Eigen/src/Core/Ref.h +278 -0
  85. data/ext/eigen/eigen3/Eigen/src/Core/Replicate.h +177 -0
  86. data/ext/eigen/eigen3/Eigen/src/Core/ReturnByValue.h +99 -0
  87. data/ext/eigen/eigen3/Eigen/src/Core/Reverse.h +224 -0
  88. data/ext/eigen/eigen3/Eigen/src/Core/Select.h +162 -0
  89. data/ext/eigen/eigen3/Eigen/src/Core/SelfAdjointView.h +314 -0
  90. data/ext/eigen/eigen3/Eigen/src/Core/SelfCwiseBinaryOp.h +191 -0
  91. data/ext/eigen/eigen3/Eigen/src/Core/SolveTriangular.h +260 -0
  92. data/ext/eigen/eigen3/Eigen/src/Core/StableNorm.h +203 -0
  93. data/ext/eigen/eigen3/Eigen/src/Core/Stride.h +108 -0
  94. data/ext/eigen/eigen3/Eigen/src/Core/Swap.h +126 -0
  95. data/ext/eigen/eigen3/Eigen/src/Core/Transpose.h +419 -0
  96. data/ext/eigen/eigen3/Eigen/src/Core/Transpositions.h +436 -0
  97. data/ext/eigen/eigen3/Eigen/src/Core/TriangularMatrix.h +839 -0
  98. data/ext/eigen/eigen3/Eigen/src/Core/VectorBlock.h +95 -0
  99. data/ext/eigen/eigen3/Eigen/src/Core/VectorwiseOp.h +642 -0
  100. data/ext/eigen/eigen3/Eigen/src/Core/Visitor.h +237 -0
  101. data/ext/eigen/eigen3/Eigen/src/Core/arch/AltiVec/Complex.h +217 -0
  102. data/ext/eigen/eigen3/Eigen/src/Core/arch/AltiVec/PacketMath.h +501 -0
  103. data/ext/eigen/eigen3/Eigen/src/Core/arch/Default/Settings.h +49 -0
  104. data/ext/eigen/eigen3/Eigen/src/Core/arch/NEON/Complex.h +253 -0
  105. data/ext/eigen/eigen3/Eigen/src/Core/arch/NEON/PacketMath.h +420 -0
  106. data/ext/eigen/eigen3/Eigen/src/Core/arch/SSE/Complex.h +442 -0
  107. data/ext/eigen/eigen3/Eigen/src/Core/arch/SSE/MathFunctions.h +475 -0
  108. data/ext/eigen/eigen3/Eigen/src/Core/arch/SSE/PacketMath.h +649 -0
  109. data/ext/eigen/eigen3/Eigen/src/Core/products/CoeffBasedProduct.h +476 -0
  110. data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1341 -0
  111. data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixMatrix.h +427 -0
  112. data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +278 -0
  113. data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_MKL.h +146 -0
  114. data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixMatrix_MKL.h +118 -0
  115. data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixVector.h +566 -0
  116. data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixVector_MKL.h +131 -0
  117. data/ext/eigen/eigen3/Eigen/src/Core/products/Parallelizer.h +162 -0
  118. data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +436 -0
  119. data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointMatrixMatrix_MKL.h +295 -0
  120. data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector.h +281 -0
  121. data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector_MKL.h +114 -0
  122. data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointProduct.h +123 -0
  123. data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointRank2Update.h +93 -0
  124. data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularMatrixMatrix.h +427 -0
  125. data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularMatrixMatrix_MKL.h +309 -0
  126. data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularMatrixVector.h +348 -0
  127. data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularMatrixVector_MKL.h +247 -0
  128. data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularSolverMatrix.h +332 -0
  129. data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularSolverMatrix_MKL.h +155 -0
  130. data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularSolverVector.h +139 -0
  131. data/ext/eigen/eigen3/Eigen/src/Core/util/BlasUtil.h +264 -0
  132. data/ext/eigen/eigen3/Eigen/src/Core/util/Constants.h +451 -0
  133. data/ext/eigen/eigen3/Eigen/src/Core/util/DisableStupidWarnings.h +40 -0
  134. data/ext/eigen/eigen3/Eigen/src/Core/util/ForwardDeclarations.h +302 -0
  135. data/ext/eigen/eigen3/Eigen/src/Core/util/MKL_support.h +158 -0
  136. data/ext/eigen/eigen3/Eigen/src/Core/util/Macros.h +451 -0
  137. data/ext/eigen/eigen3/Eigen/src/Core/util/Memory.h +977 -0
  138. data/ext/eigen/eigen3/Eigen/src/Core/util/Meta.h +243 -0
  139. data/ext/eigen/eigen3/Eigen/src/Core/util/NonMPL2.h +3 -0
  140. data/ext/eigen/eigen3/Eigen/src/Core/util/ReenableStupidWarnings.h +14 -0
  141. data/ext/eigen/eigen3/Eigen/src/Core/util/StaticAssert.h +208 -0
  142. data/ext/eigen/eigen3/Eigen/src/Core/util/XprHelper.h +469 -0
  143. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Block.h +126 -0
  144. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Cwise.h +192 -0
  145. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/CwiseOperators.h +298 -0
  146. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/AlignedBox.h +159 -0
  147. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/All.h +115 -0
  148. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/AngleAxis.h +214 -0
  149. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Hyperplane.h +254 -0
  150. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/ParametrizedLine.h +141 -0
  151. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Quaternion.h +495 -0
  152. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Rotation2D.h +145 -0
  153. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/RotationBase.h +123 -0
  154. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Scaling.h +167 -0
  155. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Transform.h +786 -0
  156. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Translation.h +184 -0
  157. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/LU.h +120 -0
  158. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Lazy.h +71 -0
  159. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/LeastSquares.h +169 -0
  160. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Macros.h +20 -0
  161. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/MathFunctions.h +57 -0
  162. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Memory.h +45 -0
  163. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Meta.h +75 -0
  164. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Minor.h +117 -0
  165. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/QR.h +67 -0
  166. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/SVD.h +637 -0
  167. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/TriangularSolver.h +42 -0
  168. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/VectorBlock.h +94 -0
  169. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/ComplexEigenSolver.h +341 -0
  170. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/ComplexSchur.h +456 -0
  171. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/ComplexSchur_MKL.h +94 -0
  172. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/EigenSolver.h +607 -0
  173. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +350 -0
  174. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +227 -0
  175. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/HessenbergDecomposition.h +373 -0
  176. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +160 -0
  177. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/RealQZ.h +624 -0
  178. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/RealSchur.h +525 -0
  179. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/RealSchur_MKL.h +83 -0
  180. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +801 -0
  181. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_MKL.h +92 -0
  182. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/Tridiagonalization.h +557 -0
  183. data/ext/eigen/eigen3/Eigen/src/Geometry/AlignedBox.h +392 -0
  184. data/ext/eigen/eigen3/Eigen/src/Geometry/AngleAxis.h +233 -0
  185. data/ext/eigen/eigen3/Eigen/src/Geometry/EulerAngles.h +104 -0
  186. data/ext/eigen/eigen3/Eigen/src/Geometry/Homogeneous.h +307 -0
  187. data/ext/eigen/eigen3/Eigen/src/Geometry/Hyperplane.h +280 -0
  188. data/ext/eigen/eigen3/Eigen/src/Geometry/OrthoMethods.h +218 -0
  189. data/ext/eigen/eigen3/Eigen/src/Geometry/ParametrizedLine.h +195 -0
  190. data/ext/eigen/eigen3/Eigen/src/Geometry/Quaternion.h +776 -0
  191. data/ext/eigen/eigen3/Eigen/src/Geometry/Rotation2D.h +160 -0
  192. data/ext/eigen/eigen3/Eigen/src/Geometry/RotationBase.h +206 -0
  193. data/ext/eigen/eigen3/Eigen/src/Geometry/Scaling.h +166 -0
  194. data/ext/eigen/eigen3/Eigen/src/Geometry/Transform.h +1455 -0
  195. data/ext/eigen/eigen3/Eigen/src/Geometry/Translation.h +206 -0
  196. data/ext/eigen/eigen3/Eigen/src/Geometry/Umeyama.h +177 -0
  197. data/ext/eigen/eigen3/Eigen/src/Geometry/arch/Geometry_SSE.h +115 -0
  198. data/ext/eigen/eigen3/Eigen/src/Householder/BlockHouseholder.h +68 -0
  199. data/ext/eigen/eigen3/Eigen/src/Householder/Householder.h +171 -0
  200. data/ext/eigen/eigen3/Eigen/src/Householder/HouseholderSequence.h +441 -0
  201. data/ext/eigen/eigen3/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +149 -0
  202. data/ext/eigen/eigen3/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +263 -0
  203. data/ext/eigen/eigen3/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +256 -0
  204. data/ext/eigen/eigen3/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +282 -0
  205. data/ext/eigen/eigen3/Eigen/src/Jacobi/Jacobi.h +433 -0
  206. data/ext/eigen/eigen3/Eigen/src/LU/Determinant.h +101 -0
  207. data/ext/eigen/eigen3/Eigen/src/LU/FullPivLU.h +751 -0
  208. data/ext/eigen/eigen3/Eigen/src/LU/Inverse.h +400 -0
  209. data/ext/eigen/eigen3/Eigen/src/LU/PartialPivLU.h +509 -0
  210. data/ext/eigen/eigen3/Eigen/src/LU/PartialPivLU_MKL.h +85 -0
  211. data/ext/eigen/eigen3/Eigen/src/LU/arch/Inverse_SSE.h +329 -0
  212. data/ext/eigen/eigen3/Eigen/src/MetisSupport/MetisSupport.h +137 -0
  213. data/ext/eigen/eigen3/Eigen/src/OrderingMethods/Amd.h +444 -0
  214. data/ext/eigen/eigen3/Eigen/src/OrderingMethods/Eigen_Colamd.h +1850 -0
  215. data/ext/eigen/eigen3/Eigen/src/PaStiXSupport/PaStiXSupport.h +721 -0
  216. data/ext/eigen/eigen3/Eigen/src/PardisoSupport/PardisoSupport.h +592 -0
  217. data/ext/eigen/eigen3/Eigen/src/QR/ColPivHouseholderQR.h +580 -0
  218. data/ext/eigen/eigen3/Eigen/src/QR/ColPivHouseholderQR_MKL.h +99 -0
  219. data/ext/eigen/eigen3/Eigen/src/QR/FullPivHouseholderQR.h +622 -0
  220. data/ext/eigen/eigen3/Eigen/src/QR/HouseholderQR.h +388 -0
  221. data/ext/eigen/eigen3/Eigen/src/QR/HouseholderQR_MKL.h +71 -0
  222. data/ext/eigen/eigen3/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +338 -0
  223. data/ext/eigen/eigen3/Eigen/src/SVD/JacobiSVD.h +976 -0
  224. data/ext/eigen/eigen3/Eigen/src/SVD/JacobiSVD_MKL.h +92 -0
  225. data/ext/eigen/eigen3/Eigen/src/SVD/UpperBidiagonalization.h +148 -0
  226. data/ext/eigen/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h +671 -0
  227. data/ext/eigen/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +199 -0
  228. data/ext/eigen/eigen3/Eigen/src/SparseCore/AmbiVector.h +373 -0
  229. data/ext/eigen/eigen3/Eigen/src/SparseCore/CompressedStorage.h +233 -0
  230. data/ext/eigen/eigen3/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +245 -0
  231. data/ext/eigen/eigen3/Eigen/src/SparseCore/MappedSparseMatrix.h +181 -0
  232. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseBlock.h +537 -0
  233. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseColEtree.h +206 -0
  234. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +325 -0
  235. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +163 -0
  236. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseDenseProduct.h +311 -0
  237. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseDiagonalProduct.h +196 -0
  238. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseDot.h +101 -0
  239. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseFuzzy.h +26 -0
  240. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseMatrix.h +1262 -0
  241. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseMatrixBase.h +461 -0
  242. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparsePermutation.h +148 -0
  243. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseProduct.h +188 -0
  244. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseRedux.h +45 -0
  245. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseSelfAdjointView.h +507 -0
  246. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +150 -0
  247. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseTranspose.h +63 -0
  248. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseTriangularView.h +179 -0
  249. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseUtil.h +172 -0
  250. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseVector.h +448 -0
  251. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseView.h +99 -0
  252. data/ext/eigen/eigen3/Eigen/src/SparseCore/TriangularSolver.h +334 -0
  253. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU.h +806 -0
  254. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLUImpl.h +66 -0
  255. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_Memory.h +227 -0
  256. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_Structs.h +111 -0
  257. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +298 -0
  258. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_Utils.h +80 -0
  259. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_column_bmod.h +180 -0
  260. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_column_dfs.h +177 -0
  261. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +106 -0
  262. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +279 -0
  263. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +127 -0
  264. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +130 -0
  265. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_panel_bmod.h +223 -0
  266. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_panel_dfs.h +258 -0
  267. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_pivotL.h +137 -0
  268. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_pruneL.h +135 -0
  269. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_relax_snode.h +83 -0
  270. data/ext/eigen/eigen3/Eigen/src/SparseQR/SparseQR.h +714 -0
  271. data/ext/eigen/eigen3/Eigen/src/StlSupport/StdDeque.h +134 -0
  272. data/ext/eigen/eigen3/Eigen/src/StlSupport/StdList.h +114 -0
  273. data/ext/eigen/eigen3/Eigen/src/StlSupport/StdVector.h +126 -0
  274. data/ext/eigen/eigen3/Eigen/src/StlSupport/details.h +84 -0
  275. data/ext/eigen/eigen3/Eigen/src/SuperLUSupport/SuperLUSupport.h +1026 -0
  276. data/ext/eigen/eigen3/Eigen/src/UmfPackSupport/UmfPackSupport.h +474 -0
  277. data/ext/eigen/eigen3/Eigen/src/misc/Image.h +84 -0
  278. data/ext/eigen/eigen3/Eigen/src/misc/Kernel.h +81 -0
  279. data/ext/eigen/eigen3/Eigen/src/misc/Solve.h +76 -0
  280. data/ext/eigen/eigen3/Eigen/src/misc/SparseSolve.h +128 -0
  281. data/ext/eigen/eigen3/Eigen/src/misc/blas.h +658 -0
  282. data/ext/eigen/eigen3/Eigen/src/plugins/ArrayCwiseBinaryOps.h +253 -0
  283. data/ext/eigen/eigen3/Eigen/src/plugins/ArrayCwiseUnaryOps.h +187 -0
  284. data/ext/eigen/eigen3/Eigen/src/plugins/BlockMethods.h +935 -0
  285. data/ext/eigen/eigen3/Eigen/src/plugins/CommonCwiseBinaryOps.h +46 -0
  286. data/ext/eigen/eigen3/Eigen/src/plugins/CommonCwiseUnaryOps.h +172 -0
  287. data/ext/eigen/eigen3/Eigen/src/plugins/MatrixCwiseBinaryOps.h +143 -0
  288. data/ext/eigen/eigen3/Eigen/src/plugins/MatrixCwiseUnaryOps.h +52 -0
  289. data/ext/eigen/eigen3/signature_of_eigen3_matrix_library +1 -0
  290. data/ext/eigen/eigen_wrap.cxx +19420 -10396
  291. data/ext/eigen/extconf.rb +37 -2
  292. data/lib/eigen.rb +146 -3
  293. metadata +294 -7
@@ -0,0 +1,145 @@
1
+ // This file is part of Eigen, a lightweight C++ template library
2
+ // for linear algebra.
3
+ //
4
+ // Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>
5
+ //
6
+ // This Source Code Form is subject to the terms of the Mozilla
7
+ // Public License v. 2.0. If a copy of the MPL was not distributed
8
+ // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
+
10
+ // no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway
11
+
12
+ namespace Eigen {
13
+
14
+ /** \geometry_module \ingroup Geometry_Module
15
+ *
16
+ * \class Rotation2D
17
+ *
18
+ * \brief Represents a rotation/orientation in a 2 dimensional space.
19
+ *
20
+ * \param _Scalar the scalar type, i.e., the type of the coefficients
21
+ *
22
+ * This class is equivalent to a single scalar representing a counter clock wise rotation
23
+ * as a single angle in radian. It provides some additional features such as the automatic
24
+ * conversion from/to a 2x2 rotation matrix. Moreover this class aims to provide a similar
25
+ * interface to Quaternion in order to facilitate the writing of generic algorithms
26
+ * dealing with rotations.
27
+ *
28
+ * \sa class Quaternion, class Transform
29
+ */
30
+ template<typename _Scalar> struct ei_traits<Rotation2D<_Scalar> >
31
+ {
32
+ typedef _Scalar Scalar;
33
+ };
34
+
35
+ template<typename _Scalar>
36
+ class Rotation2D : public RotationBase<Rotation2D<_Scalar>,2>
37
+ {
38
+ typedef RotationBase<Rotation2D<_Scalar>,2> Base;
39
+
40
+ public:
41
+
42
+ using Base::operator*;
43
+
44
+ enum { Dim = 2 };
45
+ /** the scalar type of the coefficients */
46
+ typedef _Scalar Scalar;
47
+ typedef Matrix<Scalar,2,1> Vector2;
48
+ typedef Matrix<Scalar,2,2> Matrix2;
49
+
50
+ protected:
51
+
52
+ Scalar m_angle;
53
+
54
+ public:
55
+
56
+ /** Construct a 2D counter clock wise rotation from the angle \a a in radian. */
57
+ inline Rotation2D(Scalar a) : m_angle(a) {}
58
+
59
+ /** \returns the rotation angle */
60
+ inline Scalar angle() const { return m_angle; }
61
+
62
+ /** \returns a read-write reference to the rotation angle */
63
+ inline Scalar& angle() { return m_angle; }
64
+
65
+ /** \returns the inverse rotation */
66
+ inline Rotation2D inverse() const { return -m_angle; }
67
+
68
+ /** Concatenates two rotations */
69
+ inline Rotation2D operator*(const Rotation2D& other) const
70
+ { return m_angle + other.m_angle; }
71
+
72
+ /** Concatenates two rotations */
73
+ inline Rotation2D& operator*=(const Rotation2D& other)
74
+ { return m_angle += other.m_angle; return *this; }
75
+
76
+ /** Applies the rotation to a 2D vector */
77
+ Vector2 operator* (const Vector2& vec) const
78
+ { return toRotationMatrix() * vec; }
79
+
80
+ template<typename Derived>
81
+ Rotation2D& fromRotationMatrix(const MatrixBase<Derived>& m);
82
+ Matrix2 toRotationMatrix(void) const;
83
+
84
+ /** \returns the spherical interpolation between \c *this and \a other using
85
+ * parameter \a t. It is in fact equivalent to a linear interpolation.
86
+ */
87
+ inline Rotation2D slerp(Scalar t, const Rotation2D& other) const
88
+ { return m_angle * (1-t) + other.angle() * t; }
89
+
90
+ /** \returns \c *this with scalar type casted to \a NewScalarType
91
+ *
92
+ * Note that if \a NewScalarType is equal to the current scalar type of \c *this
93
+ * then this function smartly returns a const reference to \c *this.
94
+ */
95
+ template<typename NewScalarType>
96
+ inline typename internal::cast_return_type<Rotation2D,Rotation2D<NewScalarType> >::type cast() const
97
+ { return typename internal::cast_return_type<Rotation2D,Rotation2D<NewScalarType> >::type(*this); }
98
+
99
+ /** Copy constructor with scalar type conversion */
100
+ template<typename OtherScalarType>
101
+ inline explicit Rotation2D(const Rotation2D<OtherScalarType>& other)
102
+ {
103
+ m_angle = Scalar(other.angle());
104
+ }
105
+
106
+ /** \returns \c true if \c *this is approximately equal to \a other, within the precision
107
+ * determined by \a prec.
108
+ *
109
+ * \sa MatrixBase::isApprox() */
110
+ bool isApprox(const Rotation2D& other, typename NumTraits<Scalar>::Real prec = precision<Scalar>()) const
111
+ { return ei_isApprox(m_angle,other.m_angle, prec); }
112
+ };
113
+
114
+ /** \ingroup Geometry_Module
115
+ * single precision 2D rotation type */
116
+ typedef Rotation2D<float> Rotation2Df;
117
+ /** \ingroup Geometry_Module
118
+ * double precision 2D rotation type */
119
+ typedef Rotation2D<double> Rotation2Dd;
120
+
121
+ /** Set \c *this from a 2x2 rotation matrix \a mat.
122
+ * In other words, this function extract the rotation angle
123
+ * from the rotation matrix.
124
+ */
125
+ template<typename Scalar>
126
+ template<typename Derived>
127
+ Rotation2D<Scalar>& Rotation2D<Scalar>::fromRotationMatrix(const MatrixBase<Derived>& mat)
128
+ {
129
+ EIGEN_STATIC_ASSERT(Derived::RowsAtCompileTime==2 && Derived::ColsAtCompileTime==2,YOU_MADE_A_PROGRAMMING_MISTAKE)
130
+ m_angle = ei_atan2(mat.coeff(1,0), mat.coeff(0,0));
131
+ return *this;
132
+ }
133
+
134
+ /** Constructs and \returns an equivalent 2x2 rotation matrix.
135
+ */
136
+ template<typename Scalar>
137
+ typename Rotation2D<Scalar>::Matrix2
138
+ Rotation2D<Scalar>::toRotationMatrix(void) const
139
+ {
140
+ Scalar sinA = ei_sin(m_angle);
141
+ Scalar cosA = ei_cos(m_angle);
142
+ return (Matrix2() << cosA, -sinA, sinA, cosA).finished();
143
+ }
144
+
145
+ } // end namespace Eigen
@@ -0,0 +1,123 @@
1
+ // This file is part of Eigen, a lightweight C++ template library
2
+ // for linear algebra.
3
+ //
4
+ // Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>
5
+ //
6
+ // This Source Code Form is subject to the terms of the Mozilla
7
+ // Public License v. 2.0. If a copy of the MPL was not distributed
8
+ // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
+
10
+ // no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway
11
+
12
+ namespace Eigen {
13
+
14
+ // this file aims to contains the various representations of rotation/orientation
15
+ // in 2D and 3D space excepted Matrix and Quaternion.
16
+
17
+ /** \class RotationBase
18
+ *
19
+ * \brief Common base class for compact rotation representations
20
+ *
21
+ * \param Derived is the derived type, i.e., a rotation type
22
+ * \param _Dim the dimension of the space
23
+ */
24
+ template<typename Derived, int _Dim>
25
+ class RotationBase
26
+ {
27
+ public:
28
+ enum { Dim = _Dim };
29
+ /** the scalar type of the coefficients */
30
+ typedef typename ei_traits<Derived>::Scalar Scalar;
31
+
32
+ /** corresponding linear transformation matrix type */
33
+ typedef Matrix<Scalar,Dim,Dim> RotationMatrixType;
34
+
35
+ inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
36
+ inline Derived& derived() { return *static_cast<Derived*>(this); }
37
+
38
+ /** \returns an equivalent rotation matrix */
39
+ inline RotationMatrixType toRotationMatrix() const { return derived().toRotationMatrix(); }
40
+
41
+ /** \returns the inverse rotation */
42
+ inline Derived inverse() const { return derived().inverse(); }
43
+
44
+ /** \returns the concatenation of the rotation \c *this with a translation \a t */
45
+ inline Transform<Scalar,Dim> operator*(const Translation<Scalar,Dim>& t) const
46
+ { return toRotationMatrix() * t; }
47
+
48
+ /** \returns the concatenation of the rotation \c *this with a scaling \a s */
49
+ inline RotationMatrixType operator*(const Scaling<Scalar,Dim>& s) const
50
+ { return toRotationMatrix() * s; }
51
+
52
+ /** \returns the concatenation of the rotation \c *this with an affine transformation \a t */
53
+ inline Transform<Scalar,Dim> operator*(const Transform<Scalar,Dim>& t) const
54
+ { return toRotationMatrix() * t; }
55
+ };
56
+
57
+ /** \geometry_module
58
+ *
59
+ * Constructs a Dim x Dim rotation matrix from the rotation \a r
60
+ */
61
+ template<typename _Scalar, int _Rows, int _Cols, int _Storage, int _MaxRows, int _MaxCols>
62
+ template<typename OtherDerived>
63
+ Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>
64
+ ::Matrix(const RotationBase<OtherDerived,ColsAtCompileTime>& r)
65
+ {
66
+ EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,int(OtherDerived::Dim),int(OtherDerived::Dim))
67
+ *this = r.toRotationMatrix();
68
+ }
69
+
70
+ /** \geometry_module
71
+ *
72
+ * Set a Dim x Dim rotation matrix from the rotation \a r
73
+ */
74
+ template<typename _Scalar, int _Rows, int _Cols, int _Storage, int _MaxRows, int _MaxCols>
75
+ template<typename OtherDerived>
76
+ Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>&
77
+ Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>
78
+ ::operator=(const RotationBase<OtherDerived,ColsAtCompileTime>& r)
79
+ {
80
+ EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,int(OtherDerived::Dim),int(OtherDerived::Dim))
81
+ return *this = r.toRotationMatrix();
82
+ }
83
+
84
+ /** \internal
85
+ *
86
+ * Helper function to return an arbitrary rotation object to a rotation matrix.
87
+ *
88
+ * \param Scalar the numeric type of the matrix coefficients
89
+ * \param Dim the dimension of the current space
90
+ *
91
+ * It returns a Dim x Dim fixed size matrix.
92
+ *
93
+ * Default specializations are provided for:
94
+ * - any scalar type (2D),
95
+ * - any matrix expression,
96
+ * - any type based on RotationBase (e.g., Quaternion, AngleAxis, Rotation2D)
97
+ *
98
+ * Currently ei_toRotationMatrix is only used by Transform.
99
+ *
100
+ * \sa class Transform, class Rotation2D, class Quaternion, class AngleAxis
101
+ */
102
+ template<typename Scalar, int Dim>
103
+ static inline Matrix<Scalar,2,2> ei_toRotationMatrix(const Scalar& s)
104
+ {
105
+ EIGEN_STATIC_ASSERT(Dim==2,YOU_MADE_A_PROGRAMMING_MISTAKE)
106
+ return Rotation2D<Scalar>(s).toRotationMatrix();
107
+ }
108
+
109
+ template<typename Scalar, int Dim, typename OtherDerived>
110
+ static inline Matrix<Scalar,Dim,Dim> ei_toRotationMatrix(const RotationBase<OtherDerived,Dim>& r)
111
+ {
112
+ return r.toRotationMatrix();
113
+ }
114
+
115
+ template<typename Scalar, int Dim, typename OtherDerived>
116
+ static inline const MatrixBase<OtherDerived>& ei_toRotationMatrix(const MatrixBase<OtherDerived>& mat)
117
+ {
118
+ EIGEN_STATIC_ASSERT(OtherDerived::RowsAtCompileTime==Dim && OtherDerived::ColsAtCompileTime==Dim,
119
+ YOU_MADE_A_PROGRAMMING_MISTAKE)
120
+ return mat;
121
+ }
122
+
123
+ } // end namespace Eigen
@@ -0,0 +1,167 @@
1
+ // This file is part of Eigen, a lightweight C++ template library
2
+ // for linear algebra.
3
+ //
4
+ // Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>
5
+ //
6
+ // This Source Code Form is subject to the terms of the Mozilla
7
+ // Public License v. 2.0. If a copy of the MPL was not distributed
8
+ // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
+
10
+ // no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway
11
+
12
+ namespace Eigen {
13
+
14
+ /** \geometry_module \ingroup Geometry_Module
15
+ *
16
+ * \class Scaling
17
+ *
18
+ * \brief Represents a possibly non uniform scaling transformation
19
+ *
20
+ * \param _Scalar the scalar type, i.e., the type of the coefficients.
21
+ * \param _Dim the dimension of the space, can be a compile time value or Dynamic
22
+ *
23
+ * \note This class is not aimed to be used to store a scaling transformation,
24
+ * but rather to make easier the constructions and updates of Transform objects.
25
+ *
26
+ * \sa class Translation, class Transform
27
+ */
28
+ template<typename _Scalar, int _Dim>
29
+ class Scaling
30
+ {
31
+ public:
32
+ EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_Dim)
33
+ /** dimension of the space */
34
+ enum { Dim = _Dim };
35
+ /** the scalar type of the coefficients */
36
+ typedef _Scalar Scalar;
37
+ /** corresponding vector type */
38
+ typedef Matrix<Scalar,Dim,1> VectorType;
39
+ /** corresponding linear transformation matrix type */
40
+ typedef Matrix<Scalar,Dim,Dim> LinearMatrixType;
41
+ /** corresponding translation type */
42
+ typedef Translation<Scalar,Dim> TranslationType;
43
+ /** corresponding affine transformation type */
44
+ typedef Transform<Scalar,Dim> TransformType;
45
+
46
+ protected:
47
+
48
+ VectorType m_coeffs;
49
+
50
+ public:
51
+
52
+ /** Default constructor without initialization. */
53
+ Scaling() {}
54
+ /** Constructs and initialize a uniform scaling transformation */
55
+ explicit inline Scaling(const Scalar& s) { m_coeffs.setConstant(s); }
56
+ /** 2D only */
57
+ inline Scaling(const Scalar& sx, const Scalar& sy)
58
+ {
59
+ ei_assert(Dim==2);
60
+ m_coeffs.x() = sx;
61
+ m_coeffs.y() = sy;
62
+ }
63
+ /** 3D only */
64
+ inline Scaling(const Scalar& sx, const Scalar& sy, const Scalar& sz)
65
+ {
66
+ ei_assert(Dim==3);
67
+ m_coeffs.x() = sx;
68
+ m_coeffs.y() = sy;
69
+ m_coeffs.z() = sz;
70
+ }
71
+ /** Constructs and initialize the scaling transformation from a vector of scaling coefficients */
72
+ explicit inline Scaling(const VectorType& coeffs) : m_coeffs(coeffs) {}
73
+
74
+ const VectorType& coeffs() const { return m_coeffs; }
75
+ VectorType& coeffs() { return m_coeffs; }
76
+
77
+ /** Concatenates two scaling */
78
+ inline Scaling operator* (const Scaling& other) const
79
+ { return Scaling(coeffs().cwise() * other.coeffs()); }
80
+
81
+ /** Concatenates a scaling and a translation */
82
+ inline TransformType operator* (const TranslationType& t) const;
83
+
84
+ /** Concatenates a scaling and an affine transformation */
85
+ inline TransformType operator* (const TransformType& t) const;
86
+
87
+ /** Concatenates a scaling and a linear transformation matrix */
88
+ // TODO returns an expression
89
+ inline LinearMatrixType operator* (const LinearMatrixType& other) const
90
+ { return coeffs().asDiagonal() * other; }
91
+
92
+ /** Concatenates a linear transformation matrix and a scaling */
93
+ // TODO returns an expression
94
+ friend inline LinearMatrixType operator* (const LinearMatrixType& other, const Scaling& s)
95
+ { return other * s.coeffs().asDiagonal(); }
96
+
97
+ template<typename Derived>
98
+ inline LinearMatrixType operator*(const RotationBase<Derived,Dim>& r) const
99
+ { return *this * r.toRotationMatrix(); }
100
+
101
+ /** Applies scaling to vector */
102
+ inline VectorType operator* (const VectorType& other) const
103
+ { return coeffs().asDiagonal() * other; }
104
+
105
+ /** \returns the inverse scaling */
106
+ inline Scaling inverse() const
107
+ { return Scaling(coeffs().cwise().inverse()); }
108
+
109
+ inline Scaling& operator=(const Scaling& other)
110
+ {
111
+ m_coeffs = other.m_coeffs;
112
+ return *this;
113
+ }
114
+
115
+ /** \returns \c *this with scalar type casted to \a NewScalarType
116
+ *
117
+ * Note that if \a NewScalarType is equal to the current scalar type of \c *this
118
+ * then this function smartly returns a const reference to \c *this.
119
+ */
120
+ template<typename NewScalarType>
121
+ inline typename internal::cast_return_type<Scaling,Scaling<NewScalarType,Dim> >::type cast() const
122
+ { return typename internal::cast_return_type<Scaling,Scaling<NewScalarType,Dim> >::type(*this); }
123
+
124
+ /** Copy constructor with scalar type conversion */
125
+ template<typename OtherScalarType>
126
+ inline explicit Scaling(const Scaling<OtherScalarType,Dim>& other)
127
+ { m_coeffs = other.coeffs().template cast<Scalar>(); }
128
+
129
+ /** \returns \c true if \c *this is approximately equal to \a other, within the precision
130
+ * determined by \a prec.
131
+ *
132
+ * \sa MatrixBase::isApprox() */
133
+ bool isApprox(const Scaling& other, typename NumTraits<Scalar>::Real prec = precision<Scalar>()) const
134
+ { return m_coeffs.isApprox(other.m_coeffs, prec); }
135
+
136
+ };
137
+
138
+ /** \addtogroup Geometry_Module */
139
+ //@{
140
+ typedef Scaling<float, 2> Scaling2f;
141
+ typedef Scaling<double,2> Scaling2d;
142
+ typedef Scaling<float, 3> Scaling3f;
143
+ typedef Scaling<double,3> Scaling3d;
144
+ //@}
145
+
146
+ template<typename Scalar, int Dim>
147
+ inline typename Scaling<Scalar,Dim>::TransformType
148
+ Scaling<Scalar,Dim>::operator* (const TranslationType& t) const
149
+ {
150
+ TransformType res;
151
+ res.matrix().setZero();
152
+ res.linear().diagonal() = coeffs();
153
+ res.translation() = m_coeffs.cwise() * t.vector();
154
+ res(Dim,Dim) = Scalar(1);
155
+ return res;
156
+ }
157
+
158
+ template<typename Scalar, int Dim>
159
+ inline typename Scaling<Scalar,Dim>::TransformType
160
+ Scaling<Scalar,Dim>::operator* (const TransformType& t) const
161
+ {
162
+ TransformType res = t;
163
+ res.prescale(m_coeffs);
164
+ return res;
165
+ }
166
+
167
+ } // end namespace Eigen
@@ -0,0 +1,786 @@
1
+ // This file is part of Eigen, a lightweight C++ template library
2
+ // for linear algebra.
3
+ //
4
+ // Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>
5
+ // Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>
6
+ //
7
+ // This Source Code Form is subject to the terms of the Mozilla
8
+ // Public License v. 2.0. If a copy of the MPL was not distributed
9
+ // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10
+
11
+ // no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway
12
+
13
+ namespace Eigen {
14
+
15
+ // Note that we have to pass Dim and HDim because it is not allowed to use a template
16
+ // parameter to define a template specialization. To be more precise, in the following
17
+ // specializations, it is not allowed to use Dim+1 instead of HDim.
18
+ template< typename Other,
19
+ int Dim,
20
+ int HDim,
21
+ int OtherRows=Other::RowsAtCompileTime,
22
+ int OtherCols=Other::ColsAtCompileTime>
23
+ struct ei_transform_product_impl;
24
+
25
+ /** \geometry_module \ingroup Geometry_Module
26
+ *
27
+ * \class Transform
28
+ *
29
+ * \brief Represents an homogeneous transformation in a N dimensional space
30
+ *
31
+ * \param _Scalar the scalar type, i.e., the type of the coefficients
32
+ * \param _Dim the dimension of the space
33
+ *
34
+ * The homography is internally represented and stored as a (Dim+1)^2 matrix which
35
+ * is available through the matrix() method.
36
+ *
37
+ * Conversion methods from/to Qt's QMatrix and QTransform are available if the
38
+ * preprocessor token EIGEN_QT_SUPPORT is defined.
39
+ *
40
+ * \sa class Matrix, class Quaternion
41
+ */
42
+ template<typename _Scalar, int _Dim>
43
+ class Transform
44
+ {
45
+ public:
46
+ EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_Dim==Dynamic ? Dynamic : (_Dim+1)*(_Dim+1))
47
+ enum {
48
+ Dim = _Dim, ///< space dimension in which the transformation holds
49
+ HDim = _Dim+1 ///< size of a respective homogeneous vector
50
+ };
51
+ /** the scalar type of the coefficients */
52
+ typedef _Scalar Scalar;
53
+ /** type of the matrix used to represent the transformation */
54
+ typedef Matrix<Scalar,HDim,HDim> MatrixType;
55
+ /** type of the matrix used to represent the linear part of the transformation */
56
+ typedef Matrix<Scalar,Dim,Dim> LinearMatrixType;
57
+ /** type of read/write reference to the linear part of the transformation */
58
+ typedef Block<MatrixType,Dim,Dim> LinearPart;
59
+ /** type of read/write reference to the linear part of the transformation */
60
+ typedef const Block<const MatrixType,Dim,Dim> ConstLinearPart;
61
+ /** type of a vector */
62
+ typedef Matrix<Scalar,Dim,1> VectorType;
63
+ /** type of a read/write reference to the translation part of the rotation */
64
+ typedef Block<MatrixType,Dim,1> TranslationPart;
65
+ /** type of a read/write reference to the translation part of the rotation */
66
+ typedef const Block<const MatrixType,Dim,1> ConstTranslationPart;
67
+ /** corresponding translation type */
68
+ typedef Translation<Scalar,Dim> TranslationType;
69
+ /** corresponding scaling transformation type */
70
+ typedef Scaling<Scalar,Dim> ScalingType;
71
+
72
+ protected:
73
+
74
+ MatrixType m_matrix;
75
+
76
+ public:
77
+
78
+ /** Default constructor without initialization of the coefficients. */
79
+ inline Transform() { }
80
+
81
+ inline Transform(const Transform& other)
82
+ {
83
+ m_matrix = other.m_matrix;
84
+ }
85
+
86
+ inline explicit Transform(const TranslationType& t) { *this = t; }
87
+ inline explicit Transform(const ScalingType& s) { *this = s; }
88
+ template<typename Derived>
89
+ inline explicit Transform(const RotationBase<Derived, Dim>& r) { *this = r; }
90
+
91
+ inline Transform& operator=(const Transform& other)
92
+ { m_matrix = other.m_matrix; return *this; }
93
+
94
+ template<typename OtherDerived, bool BigMatrix> // MSVC 2005 will commit suicide if BigMatrix has a default value
95
+ struct construct_from_matrix
96
+ {
97
+ static inline void run(Transform *transform, const MatrixBase<OtherDerived>& other)
98
+ {
99
+ transform->matrix() = other;
100
+ }
101
+ };
102
+
103
+ template<typename OtherDerived> struct construct_from_matrix<OtherDerived, true>
104
+ {
105
+ static inline void run(Transform *transform, const MatrixBase<OtherDerived>& other)
106
+ {
107
+ transform->linear() = other;
108
+ transform->translation().setZero();
109
+ transform->matrix()(Dim,Dim) = Scalar(1);
110
+ transform->matrix().template block<1,Dim>(Dim,0).setZero();
111
+ }
112
+ };
113
+
114
+ /** Constructs and initializes a transformation from a Dim^2 or a (Dim+1)^2 matrix. */
115
+ template<typename OtherDerived>
116
+ inline explicit Transform(const MatrixBase<OtherDerived>& other)
117
+ {
118
+ construct_from_matrix<OtherDerived, int(OtherDerived::RowsAtCompileTime) == Dim>::run(this, other);
119
+ }
120
+
121
+ /** Set \c *this from a (Dim+1)^2 matrix. */
122
+ template<typename OtherDerived>
123
+ inline Transform& operator=(const MatrixBase<OtherDerived>& other)
124
+ { m_matrix = other; return *this; }
125
+
126
+ #ifdef EIGEN_QT_SUPPORT
127
+ inline Transform(const QMatrix& other);
128
+ inline Transform& operator=(const QMatrix& other);
129
+ inline QMatrix toQMatrix(void) const;
130
+ inline Transform(const QTransform& other);
131
+ inline Transform& operator=(const QTransform& other);
132
+ inline QTransform toQTransform(void) const;
133
+ #endif
134
+
135
+ /** shortcut for m_matrix(row,col);
136
+ * \sa MatrixBase::operaror(int,int) const */
137
+ inline Scalar operator() (int row, int col) const { return m_matrix(row,col); }
138
+ /** shortcut for m_matrix(row,col);
139
+ * \sa MatrixBase::operaror(int,int) */
140
+ inline Scalar& operator() (int row, int col) { return m_matrix(row,col); }
141
+
142
+ /** \returns a read-only expression of the transformation matrix */
143
+ inline const MatrixType& matrix() const { return m_matrix; }
144
+ /** \returns a writable expression of the transformation matrix */
145
+ inline MatrixType& matrix() { return m_matrix; }
146
+
147
+ /** \returns a read-only expression of the linear (linear) part of the transformation */
148
+ inline ConstLinearPart linear() const { return m_matrix.template block<Dim,Dim>(0,0); }
149
+ /** \returns a writable expression of the linear (linear) part of the transformation */
150
+ inline LinearPart linear() { return m_matrix.template block<Dim,Dim>(0,0); }
151
+
152
+ /** \returns a read-only expression of the translation vector of the transformation */
153
+ inline ConstTranslationPart translation() const { return m_matrix.template block<Dim,1>(0,Dim); }
154
+ /** \returns a writable expression of the translation vector of the transformation */
155
+ inline TranslationPart translation() { return m_matrix.template block<Dim,1>(0,Dim); }
156
+
157
+ /** \returns an expression of the product between the transform \c *this and a matrix expression \a other
158
+ *
159
+ * The right hand side \a other might be either:
160
+ * \li a vector of size Dim,
161
+ * \li an homogeneous vector of size Dim+1,
162
+ * \li a transformation matrix of size Dim+1 x Dim+1.
163
+ */
164
+ // note: this function is defined here because some compilers cannot find the respective declaration
165
+ template<typename OtherDerived>
166
+ inline const typename ei_transform_product_impl<OtherDerived,_Dim,_Dim+1>::ResultType
167
+ operator * (const MatrixBase<OtherDerived> &other) const
168
+ { return ei_transform_product_impl<OtherDerived,Dim,HDim>::run(*this,other.derived()); }
169
+
170
+ /** \returns the product expression of a transformation matrix \a a times a transform \a b
171
+ * The transformation matrix \a a must have a Dim+1 x Dim+1 sizes. */
172
+ template<typename OtherDerived>
173
+ friend inline const typename ProductReturnType<OtherDerived,MatrixType>::Type
174
+ operator * (const MatrixBase<OtherDerived> &a, const Transform &b)
175
+ { return a.derived() * b.matrix(); }
176
+
177
+ /** Contatenates two transformations */
178
+ inline const Transform
179
+ operator * (const Transform& other) const
180
+ { return Transform(m_matrix * other.matrix()); }
181
+
182
+ /** \sa MatrixBase::setIdentity() */
183
+ void setIdentity() { m_matrix.setIdentity(); }
184
+ static const typename MatrixType::IdentityReturnType Identity()
185
+ {
186
+ return MatrixType::Identity();
187
+ }
188
+
189
+ template<typename OtherDerived>
190
+ inline Transform& scale(const MatrixBase<OtherDerived> &other);
191
+
192
+ template<typename OtherDerived>
193
+ inline Transform& prescale(const MatrixBase<OtherDerived> &other);
194
+
195
+ inline Transform& scale(Scalar s);
196
+ inline Transform& prescale(Scalar s);
197
+
198
+ template<typename OtherDerived>
199
+ inline Transform& translate(const MatrixBase<OtherDerived> &other);
200
+
201
+ template<typename OtherDerived>
202
+ inline Transform& pretranslate(const MatrixBase<OtherDerived> &other);
203
+
204
+ template<typename RotationType>
205
+ inline Transform& rotate(const RotationType& rotation);
206
+
207
+ template<typename RotationType>
208
+ inline Transform& prerotate(const RotationType& rotation);
209
+
210
+ Transform& shear(Scalar sx, Scalar sy);
211
+ Transform& preshear(Scalar sx, Scalar sy);
212
+
213
+ inline Transform& operator=(const TranslationType& t);
214
+ inline Transform& operator*=(const TranslationType& t) { return translate(t.vector()); }
215
+ inline Transform operator*(const TranslationType& t) const;
216
+
217
+ inline Transform& operator=(const ScalingType& t);
218
+ inline Transform& operator*=(const ScalingType& s) { return scale(s.coeffs()); }
219
+ inline Transform operator*(const ScalingType& s) const;
220
+ friend inline Transform operator*(const LinearMatrixType& mat, const Transform& t)
221
+ {
222
+ Transform res = t;
223
+ res.matrix().row(Dim) = t.matrix().row(Dim);
224
+ res.matrix().template block<Dim,HDim>(0,0) = (mat * t.matrix().template block<Dim,HDim>(0,0)).lazy();
225
+ return res;
226
+ }
227
+
228
+ template<typename Derived>
229
+ inline Transform& operator=(const RotationBase<Derived,Dim>& r);
230
+ template<typename Derived>
231
+ inline Transform& operator*=(const RotationBase<Derived,Dim>& r) { return rotate(r.toRotationMatrix()); }
232
+ template<typename Derived>
233
+ inline Transform operator*(const RotationBase<Derived,Dim>& r) const;
234
+
235
+ LinearMatrixType rotation() const;
236
+ template<typename RotationMatrixType, typename ScalingMatrixType>
237
+ void computeRotationScaling(RotationMatrixType *rotation, ScalingMatrixType *scaling) const;
238
+ template<typename ScalingMatrixType, typename RotationMatrixType>
239
+ void computeScalingRotation(ScalingMatrixType *scaling, RotationMatrixType *rotation) const;
240
+
241
+ template<typename PositionDerived, typename OrientationType, typename ScaleDerived>
242
+ Transform& fromPositionOrientationScale(const MatrixBase<PositionDerived> &position,
243
+ const OrientationType& orientation, const MatrixBase<ScaleDerived> &scale);
244
+
245
+ inline const MatrixType inverse(TransformTraits traits = Affine) const;
246
+
247
+ /** \returns a const pointer to the column major internal matrix */
248
+ const Scalar* data() const { return m_matrix.data(); }
249
+ /** \returns a non-const pointer to the column major internal matrix */
250
+ Scalar* data() { return m_matrix.data(); }
251
+
252
+ /** \returns \c *this with scalar type casted to \a NewScalarType
253
+ *
254
+ * Note that if \a NewScalarType is equal to the current scalar type of \c *this
255
+ * then this function smartly returns a const reference to \c *this.
256
+ */
257
+ template<typename NewScalarType>
258
+ inline typename internal::cast_return_type<Transform,Transform<NewScalarType,Dim> >::type cast() const
259
+ { return typename internal::cast_return_type<Transform,Transform<NewScalarType,Dim> >::type(*this); }
260
+
261
+ /** Copy constructor with scalar type conversion */
262
+ template<typename OtherScalarType>
263
+ inline explicit Transform(const Transform<OtherScalarType,Dim>& other)
264
+ { m_matrix = other.matrix().template cast<Scalar>(); }
265
+
266
+ /** \returns \c true if \c *this is approximately equal to \a other, within the precision
267
+ * determined by \a prec.
268
+ *
269
+ * \sa MatrixBase::isApprox() */
270
+ bool isApprox(const Transform& other, typename NumTraits<Scalar>::Real prec = precision<Scalar>()) const
271
+ { return m_matrix.isApprox(other.m_matrix, prec); }
272
+
273
+ #ifdef EIGEN_TRANSFORM_PLUGIN
274
+ #include EIGEN_TRANSFORM_PLUGIN
275
+ #endif
276
+
277
+ protected:
278
+
279
+ };
280
+
281
+ /** \ingroup Geometry_Module */
282
+ typedef Transform<float,2> Transform2f;
283
+ /** \ingroup Geometry_Module */
284
+ typedef Transform<float,3> Transform3f;
285
+ /** \ingroup Geometry_Module */
286
+ typedef Transform<double,2> Transform2d;
287
+ /** \ingroup Geometry_Module */
288
+ typedef Transform<double,3> Transform3d;
289
+
290
+ /**************************
291
+ *** Optional QT support ***
292
+ **************************/
293
+
294
+ #ifdef EIGEN_QT_SUPPORT
295
+ /** Initialises \c *this from a QMatrix assuming the dimension is 2.
296
+ *
297
+ * This function is available only if the token EIGEN_QT_SUPPORT is defined.
298
+ */
299
+ template<typename Scalar, int Dim>
300
+ Transform<Scalar,Dim>::Transform(const QMatrix& other)
301
+ {
302
+ *this = other;
303
+ }
304
+
305
+ /** Set \c *this from a QMatrix assuming the dimension is 2.
306
+ *
307
+ * This function is available only if the token EIGEN_QT_SUPPORT is defined.
308
+ */
309
+ template<typename Scalar, int Dim>
310
+ Transform<Scalar,Dim>& Transform<Scalar,Dim>::operator=(const QMatrix& other)
311
+ {
312
+ EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
313
+ m_matrix << other.m11(), other.m21(), other.dx(),
314
+ other.m12(), other.m22(), other.dy(),
315
+ 0, 0, 1;
316
+ return *this;
317
+ }
318
+
319
+ /** \returns a QMatrix from \c *this assuming the dimension is 2.
320
+ *
321
+ * \warning this convertion might loss data if \c *this is not affine
322
+ *
323
+ * This function is available only if the token EIGEN_QT_SUPPORT is defined.
324
+ */
325
+ template<typename Scalar, int Dim>
326
+ QMatrix Transform<Scalar,Dim>::toQMatrix(void) const
327
+ {
328
+ EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
329
+ return QMatrix(m_matrix.coeff(0,0), m_matrix.coeff(1,0),
330
+ m_matrix.coeff(0,1), m_matrix.coeff(1,1),
331
+ m_matrix.coeff(0,2), m_matrix.coeff(1,2));
332
+ }
333
+
334
+ /** Initialises \c *this from a QTransform assuming the dimension is 2.
335
+ *
336
+ * This function is available only if the token EIGEN_QT_SUPPORT is defined.
337
+ */
338
+ template<typename Scalar, int Dim>
339
+ Transform<Scalar,Dim>::Transform(const QTransform& other)
340
+ {
341
+ *this = other;
342
+ }
343
+
344
+ /** Set \c *this from a QTransform assuming the dimension is 2.
345
+ *
346
+ * This function is available only if the token EIGEN_QT_SUPPORT is defined.
347
+ */
348
+ template<typename Scalar, int Dim>
349
+ Transform<Scalar,Dim>& Transform<Scalar,Dim>::operator=(const QTransform& other)
350
+ {
351
+ EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
352
+ m_matrix << other.m11(), other.m21(), other.dx(),
353
+ other.m12(), other.m22(), other.dy(),
354
+ other.m13(), other.m23(), other.m33();
355
+ return *this;
356
+ }
357
+
358
+ /** \returns a QTransform from \c *this assuming the dimension is 2.
359
+ *
360
+ * This function is available only if the token EIGEN_QT_SUPPORT is defined.
361
+ */
362
+ template<typename Scalar, int Dim>
363
+ QTransform Transform<Scalar,Dim>::toQTransform(void) const
364
+ {
365
+ EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
366
+ return QTransform(m_matrix.coeff(0,0), m_matrix.coeff(1,0), m_matrix.coeff(2,0),
367
+ m_matrix.coeff(0,1), m_matrix.coeff(1,1), m_matrix.coeff(2,1),
368
+ m_matrix.coeff(0,2), m_matrix.coeff(1,2), m_matrix.coeff(2,2));
369
+ }
370
+ #endif
371
+
372
+ /*********************
373
+ *** Procedural API ***
374
+ *********************/
375
+
376
+ /** Applies on the right the non uniform scale transformation represented
377
+ * by the vector \a other to \c *this and returns a reference to \c *this.
378
+ * \sa prescale()
379
+ */
380
+ template<typename Scalar, int Dim>
381
+ template<typename OtherDerived>
382
+ Transform<Scalar,Dim>&
383
+ Transform<Scalar,Dim>::scale(const MatrixBase<OtherDerived> &other)
384
+ {
385
+ EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))
386
+ linear() = (linear() * other.asDiagonal()).lazy();
387
+ return *this;
388
+ }
389
+
390
+ /** Applies on the right a uniform scale of a factor \a c to \c *this
391
+ * and returns a reference to \c *this.
392
+ * \sa prescale(Scalar)
393
+ */
394
+ template<typename Scalar, int Dim>
395
+ inline Transform<Scalar,Dim>& Transform<Scalar,Dim>::scale(Scalar s)
396
+ {
397
+ linear() *= s;
398
+ return *this;
399
+ }
400
+
401
+ /** Applies on the left the non uniform scale transformation represented
402
+ * by the vector \a other to \c *this and returns a reference to \c *this.
403
+ * \sa scale()
404
+ */
405
+ template<typename Scalar, int Dim>
406
+ template<typename OtherDerived>
407
+ Transform<Scalar,Dim>&
408
+ Transform<Scalar,Dim>::prescale(const MatrixBase<OtherDerived> &other)
409
+ {
410
+ EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))
411
+ m_matrix.template block<Dim,HDim>(0,0) = (other.asDiagonal() * m_matrix.template block<Dim,HDim>(0,0)).lazy();
412
+ return *this;
413
+ }
414
+
415
+ /** Applies on the left a uniform scale of a factor \a c to \c *this
416
+ * and returns a reference to \c *this.
417
+ * \sa scale(Scalar)
418
+ */
419
+ template<typename Scalar, int Dim>
420
+ inline Transform<Scalar,Dim>& Transform<Scalar,Dim>::prescale(Scalar s)
421
+ {
422
+ m_matrix.template corner<Dim,HDim>(TopLeft) *= s;
423
+ return *this;
424
+ }
425
+
426
+ /** Applies on the right the translation matrix represented by the vector \a other
427
+ * to \c *this and returns a reference to \c *this.
428
+ * \sa pretranslate()
429
+ */
430
+ template<typename Scalar, int Dim>
431
+ template<typename OtherDerived>
432
+ Transform<Scalar,Dim>&
433
+ Transform<Scalar,Dim>::translate(const MatrixBase<OtherDerived> &other)
434
+ {
435
+ EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))
436
+ translation() += linear() * other;
437
+ return *this;
438
+ }
439
+
440
+ /** Applies on the left the translation matrix represented by the vector \a other
441
+ * to \c *this and returns a reference to \c *this.
442
+ * \sa translate()
443
+ */
444
+ template<typename Scalar, int Dim>
445
+ template<typename OtherDerived>
446
+ Transform<Scalar,Dim>&
447
+ Transform<Scalar,Dim>::pretranslate(const MatrixBase<OtherDerived> &other)
448
+ {
449
+ EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))
450
+ translation() += other;
451
+ return *this;
452
+ }
453
+
454
+ /** Applies on the right the rotation represented by the rotation \a rotation
455
+ * to \c *this and returns a reference to \c *this.
456
+ *
457
+ * The template parameter \a RotationType is the type of the rotation which
458
+ * must be known by ei_toRotationMatrix<>.
459
+ *
460
+ * Natively supported types includes:
461
+ * - any scalar (2D),
462
+ * - a Dim x Dim matrix expression,
463
+ * - a Quaternion (3D),
464
+ * - a AngleAxis (3D)
465
+ *
466
+ * This mechanism is easily extendable to support user types such as Euler angles,
467
+ * or a pair of Quaternion for 4D rotations.
468
+ *
469
+ * \sa rotate(Scalar), class Quaternion, class AngleAxis, prerotate(RotationType)
470
+ */
471
+ template<typename Scalar, int Dim>
472
+ template<typename RotationType>
473
+ Transform<Scalar,Dim>&
474
+ Transform<Scalar,Dim>::rotate(const RotationType& rotation)
475
+ {
476
+ linear() *= ei_toRotationMatrix<Scalar,Dim>(rotation);
477
+ return *this;
478
+ }
479
+
480
+ /** Applies on the left the rotation represented by the rotation \a rotation
481
+ * to \c *this and returns a reference to \c *this.
482
+ *
483
+ * See rotate() for further details.
484
+ *
485
+ * \sa rotate()
486
+ */
487
+ template<typename Scalar, int Dim>
488
+ template<typename RotationType>
489
+ Transform<Scalar,Dim>&
490
+ Transform<Scalar,Dim>::prerotate(const RotationType& rotation)
491
+ {
492
+ m_matrix.template block<Dim,HDim>(0,0) = ei_toRotationMatrix<Scalar,Dim>(rotation)
493
+ * m_matrix.template block<Dim,HDim>(0,0);
494
+ return *this;
495
+ }
496
+
497
+ /** Applies on the right the shear transformation represented
498
+ * by the vector \a other to \c *this and returns a reference to \c *this.
499
+ * \warning 2D only.
500
+ * \sa preshear()
501
+ */
502
+ template<typename Scalar, int Dim>
503
+ Transform<Scalar,Dim>&
504
+ Transform<Scalar,Dim>::shear(Scalar sx, Scalar sy)
505
+ {
506
+ EIGEN_STATIC_ASSERT(int(Dim)==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
507
+ VectorType tmp = linear().col(0)*sy + linear().col(1);
508
+ linear() << linear().col(0) + linear().col(1)*sx, tmp;
509
+ return *this;
510
+ }
511
+
512
+ /** Applies on the left the shear transformation represented
513
+ * by the vector \a other to \c *this and returns a reference to \c *this.
514
+ * \warning 2D only.
515
+ * \sa shear()
516
+ */
517
+ template<typename Scalar, int Dim>
518
+ Transform<Scalar,Dim>&
519
+ Transform<Scalar,Dim>::preshear(Scalar sx, Scalar sy)
520
+ {
521
+ EIGEN_STATIC_ASSERT(int(Dim)==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
522
+ m_matrix.template block<Dim,HDim>(0,0) = LinearMatrixType(1, sx, sy, 1) * m_matrix.template block<Dim,HDim>(0,0);
523
+ return *this;
524
+ }
525
+
526
+ /******************************************************
527
+ *** Scaling, Translation and Rotation compatibility ***
528
+ ******************************************************/
529
+
530
+ template<typename Scalar, int Dim>
531
+ inline Transform<Scalar,Dim>& Transform<Scalar,Dim>::operator=(const TranslationType& t)
532
+ {
533
+ linear().setIdentity();
534
+ translation() = t.vector();
535
+ m_matrix.template block<1,Dim>(Dim,0).setZero();
536
+ m_matrix(Dim,Dim) = Scalar(1);
537
+ return *this;
538
+ }
539
+
540
+ template<typename Scalar, int Dim>
541
+ inline Transform<Scalar,Dim> Transform<Scalar,Dim>::operator*(const TranslationType& t) const
542
+ {
543
+ Transform res = *this;
544
+ res.translate(t.vector());
545
+ return res;
546
+ }
547
+
548
+ template<typename Scalar, int Dim>
549
+ inline Transform<Scalar,Dim>& Transform<Scalar,Dim>::operator=(const ScalingType& s)
550
+ {
551
+ m_matrix.setZero();
552
+ linear().diagonal() = s.coeffs();
553
+ m_matrix.coeffRef(Dim,Dim) = Scalar(1);
554
+ return *this;
555
+ }
556
+
557
+ template<typename Scalar, int Dim>
558
+ inline Transform<Scalar,Dim> Transform<Scalar,Dim>::operator*(const ScalingType& s) const
559
+ {
560
+ Transform res = *this;
561
+ res.scale(s.coeffs());
562
+ return res;
563
+ }
564
+
565
+ template<typename Scalar, int Dim>
566
+ template<typename Derived>
567
+ inline Transform<Scalar,Dim>& Transform<Scalar,Dim>::operator=(const RotationBase<Derived,Dim>& r)
568
+ {
569
+ linear() = ei_toRotationMatrix<Scalar,Dim>(r);
570
+ translation().setZero();
571
+ m_matrix.template block<1,Dim>(Dim,0).setZero();
572
+ m_matrix.coeffRef(Dim,Dim) = Scalar(1);
573
+ return *this;
574
+ }
575
+
576
+ template<typename Scalar, int Dim>
577
+ template<typename Derived>
578
+ inline Transform<Scalar,Dim> Transform<Scalar,Dim>::operator*(const RotationBase<Derived,Dim>& r) const
579
+ {
580
+ Transform res = *this;
581
+ res.rotate(r.derived());
582
+ return res;
583
+ }
584
+
585
+ /************************
586
+ *** Special functions ***
587
+ ************************/
588
+
589
+ /** \returns the rotation part of the transformation
590
+ * \nonstableyet
591
+ *
592
+ * \svd_module
593
+ *
594
+ * \sa computeRotationScaling(), computeScalingRotation(), class SVD
595
+ */
596
+ template<typename Scalar, int Dim>
597
+ typename Transform<Scalar,Dim>::LinearMatrixType
598
+ Transform<Scalar,Dim>::rotation() const
599
+ {
600
+ LinearMatrixType result;
601
+ computeRotationScaling(&result, (LinearMatrixType*)0);
602
+ return result;
603
+ }
604
+
605
+
606
+ /** decomposes the linear part of the transformation as a product rotation x scaling, the scaling being
607
+ * not necessarily positive.
608
+ *
609
+ * If either pointer is zero, the corresponding computation is skipped.
610
+ *
611
+ * \nonstableyet
612
+ *
613
+ * \svd_module
614
+ *
615
+ * \sa computeScalingRotation(), rotation(), class SVD
616
+ */
617
+ template<typename Scalar, int Dim>
618
+ template<typename RotationMatrixType, typename ScalingMatrixType>
619
+ void Transform<Scalar,Dim>::computeRotationScaling(RotationMatrixType *rotation, ScalingMatrixType *scaling) const
620
+ {
621
+ JacobiSVD<LinearMatrixType> svd(linear(), ComputeFullU|ComputeFullV);
622
+ Scalar x = (svd.matrixU() * svd.matrixV().adjoint()).determinant(); // so x has absolute value 1
623
+ Matrix<Scalar, Dim, 1> sv(svd.singularValues());
624
+ sv.coeffRef(0) *= x;
625
+ if(scaling)
626
+ {
627
+ scaling->noalias() = svd.matrixV() * sv.asDiagonal() * svd.matrixV().adjoint();
628
+ }
629
+ if(rotation)
630
+ {
631
+ LinearMatrixType m(svd.matrixU());
632
+ m.col(0) /= x;
633
+ rotation->noalias() = m * svd.matrixV().adjoint();
634
+ }
635
+ }
636
+
637
+ /** decomposes the linear part of the transformation as a product rotation x scaling, the scaling being
638
+ * not necessarily positive.
639
+ *
640
+ * If either pointer is zero, the corresponding computation is skipped.
641
+ *
642
+ * \nonstableyet
643
+ *
644
+ * \svd_module
645
+ *
646
+ * \sa computeRotationScaling(), rotation(), class SVD
647
+ */
648
+ template<typename Scalar, int Dim>
649
+ template<typename ScalingMatrixType, typename RotationMatrixType>
650
+ void Transform<Scalar,Dim>::computeScalingRotation(ScalingMatrixType *scaling, RotationMatrixType *rotation) const
651
+ {
652
+ JacobiSVD<LinearMatrixType> svd(linear(), ComputeFullU|ComputeFullV);
653
+ Scalar x = (svd.matrixU() * svd.matrixV().adjoint()).determinant(); // so x has absolute value 1
654
+ Matrix<Scalar, Dim, 1> sv(svd.singularValues());
655
+ sv.coeffRef(0) *= x;
656
+ if(scaling)
657
+ {
658
+ scaling->noalias() = svd.matrixU() * sv.asDiagonal() * svd.matrixU().adjoint();
659
+ }
660
+ if(rotation)
661
+ {
662
+ LinearMatrixType m(svd.matrixU());
663
+ m.col(0) /= x;
664
+ rotation->noalias() = m * svd.matrixV().adjoint();
665
+ }
666
+ }
667
+
668
+ /** Convenient method to set \c *this from a position, orientation and scale
669
+ * of a 3D object.
670
+ */
671
+ template<typename Scalar, int Dim>
672
+ template<typename PositionDerived, typename OrientationType, typename ScaleDerived>
673
+ Transform<Scalar,Dim>&
674
+ Transform<Scalar,Dim>::fromPositionOrientationScale(const MatrixBase<PositionDerived> &position,
675
+ const OrientationType& orientation, const MatrixBase<ScaleDerived> &scale)
676
+ {
677
+ linear() = ei_toRotationMatrix<Scalar,Dim>(orientation);
678
+ linear() *= scale.asDiagonal();
679
+ translation() = position;
680
+ m_matrix.template block<1,Dim>(Dim,0).setZero();
681
+ m_matrix(Dim,Dim) = Scalar(1);
682
+ return *this;
683
+ }
684
+
685
+ /** \nonstableyet
686
+ *
687
+ * \returns the inverse transformation matrix according to some given knowledge
688
+ * on \c *this.
689
+ *
690
+ * \param traits allows to optimize the inversion process when the transformion
691
+ * is known to be not a general transformation. The possible values are:
692
+ * - Projective if the transformation is not necessarily affine, i.e., if the
693
+ * last row is not guaranteed to be [0 ... 0 1]
694
+ * - Affine is the default, the last row is assumed to be [0 ... 0 1]
695
+ * - Isometry if the transformation is only a concatenations of translations
696
+ * and rotations.
697
+ *
698
+ * \warning unless \a traits is always set to NoShear or NoScaling, this function
699
+ * requires the generic inverse method of MatrixBase defined in the LU module. If
700
+ * you forget to include this module, then you will get hard to debug linking errors.
701
+ *
702
+ * \sa MatrixBase::inverse()
703
+ */
704
+ template<typename Scalar, int Dim>
705
+ inline const typename Transform<Scalar,Dim>::MatrixType
706
+ Transform<Scalar,Dim>::inverse(TransformTraits traits) const
707
+ {
708
+ if (traits == Projective)
709
+ {
710
+ return m_matrix.inverse();
711
+ }
712
+ else
713
+ {
714
+ MatrixType res;
715
+ if (traits == Affine)
716
+ {
717
+ res.template corner<Dim,Dim>(TopLeft) = linear().inverse();
718
+ }
719
+ else if (traits == Isometry)
720
+ {
721
+ res.template corner<Dim,Dim>(TopLeft) = linear().transpose();
722
+ }
723
+ else
724
+ {
725
+ ei_assert("invalid traits value in Transform::inverse()");
726
+ }
727
+ // translation and remaining parts
728
+ res.template corner<Dim,1>(TopRight) = - res.template corner<Dim,Dim>(TopLeft) * translation();
729
+ res.template corner<1,Dim>(BottomLeft).setZero();
730
+ res.coeffRef(Dim,Dim) = Scalar(1);
731
+ return res;
732
+ }
733
+ }
734
+
735
+ /*****************************************************
736
+ *** Specializations of operator* with a MatrixBase ***
737
+ *****************************************************/
738
+
739
+ template<typename Other, int Dim, int HDim>
740
+ struct ei_transform_product_impl<Other,Dim,HDim, HDim,HDim>
741
+ {
742
+ typedef Transform<typename Other::Scalar,Dim> TransformType;
743
+ typedef typename TransformType::MatrixType MatrixType;
744
+ typedef typename ProductReturnType<MatrixType,Other>::Type ResultType;
745
+ static ResultType run(const TransformType& tr, const Other& other)
746
+ { return tr.matrix() * other; }
747
+ };
748
+
749
+ template<typename Other, int Dim, int HDim>
750
+ struct ei_transform_product_impl<Other,Dim,HDim, Dim,Dim>
751
+ {
752
+ typedef Transform<typename Other::Scalar,Dim> TransformType;
753
+ typedef typename TransformType::MatrixType MatrixType;
754
+ typedef TransformType ResultType;
755
+ static ResultType run(const TransformType& tr, const Other& other)
756
+ {
757
+ TransformType res;
758
+ res.translation() = tr.translation();
759
+ res.matrix().row(Dim) = tr.matrix().row(Dim);
760
+ res.linear() = (tr.linear() * other).lazy();
761
+ return res;
762
+ }
763
+ };
764
+
765
+ template<typename Other, int Dim, int HDim>
766
+ struct ei_transform_product_impl<Other,Dim,HDim, HDim,1>
767
+ {
768
+ typedef Transform<typename Other::Scalar,Dim> TransformType;
769
+ typedef typename TransformType::MatrixType MatrixType;
770
+ typedef typename ProductReturnType<MatrixType,Other>::Type ResultType;
771
+ static ResultType run(const TransformType& tr, const Other& other)
772
+ { return tr.matrix() * other; }
773
+ };
774
+
775
+ template<typename Other, int Dim, int HDim>
776
+ struct ei_transform_product_impl<Other,Dim,HDim, Dim,1>
777
+ {
778
+ typedef typename Other::Scalar Scalar;
779
+ typedef Transform<Scalar,Dim> TransformType;
780
+ typedef Matrix<Scalar,Dim,1> ResultType;
781
+ static ResultType run(const TransformType& tr, const Other& other)
782
+ { return ((tr.linear() * other) + tr.translation())
783
+ * (Scalar(1) / ( (tr.matrix().template block<1,Dim>(Dim,0) * other).coeff(0) + tr.matrix().coeff(Dim,Dim))); }
784
+ };
785
+
786
+ } // end namespace Eigen