ruby-eigen 0.0.9 → 0.0.10.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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