1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef UI_GFX_MATRIX3_F_H_
6 #define UI_GFX_MATRIX3_F_H_
8 #include "base/logging.h"
9 #include "ui/gfx/vector3d_f.h"
13 class UI_EXPORT Matrix3F
{
17 static Matrix3F
Zeros();
18 static Matrix3F
Ones();
19 static Matrix3F
Identity();
20 static Matrix3F
FromOuterProduct(const Vector3dF
& a
, const Vector3dF
& bt
);
22 bool IsEqual(const Matrix3F
& rhs
) const;
24 // Element-wise comparison with given precision.
25 bool IsNear(const Matrix3F
& rhs
, float precision
) const;
27 float get(int i
, int j
) const {
28 return data_
[MatrixToArrayCoords(i
, j
)];
31 void set(int i
, int j
, float v
) {
32 data_
[MatrixToArrayCoords(i
, j
)] = v
;
35 void set(float m00
, float m01
, float m02
,
36 float m10
, float m11
, float m12
,
37 float m20
, float m21
, float m22
) {
49 Vector3dF
get_column(int i
) const {
51 data_
[MatrixToArrayCoords(0, i
)],
52 data_
[MatrixToArrayCoords(1, i
)],
53 data_
[MatrixToArrayCoords(2, i
)]);
56 void set_column(int i
, const Vector3dF
& c
) {
57 data_
[MatrixToArrayCoords(0, i
)] = c
.x();
58 data_
[MatrixToArrayCoords(1, i
)] = c
.y();
59 data_
[MatrixToArrayCoords(2, i
)] = c
.z();
62 // Returns an inverse of this if the matrix is non-singular, zero (== Zero())
64 Matrix3F
Inverse() const;
66 // Value of the determinant of the matrix.
67 float Determinant() const;
69 // Trace (sum of diagonal elements) of the matrix.
71 return data_
[MatrixToArrayCoords(0, 0)] +
72 data_
[MatrixToArrayCoords(1, 1)] +
73 data_
[MatrixToArrayCoords(2, 2)];
76 // Compute eigenvalues and (optionally) normalized eigenvectors of
77 // a positive defnite matrix *this. Eigenvectors are computed only if
78 // non-null |eigenvectors| matrix is passed. If it is NULL, the routine
79 // will not attempt to compute eigenvectors but will still return eigenvalues
80 // if they can be computed.
81 // If eigenvalues cannot be computed (the matrix does not meet constraints)
82 // the 0-vector is returned. Note that to retrieve eigenvalues, the matrix
83 // only needs to be symmetric while eigenvectors require it to be
84 // positive-definite. Passing a non-positive definite matrix will result in
85 // NaNs in vectors which cannot be computed.
86 // Eigenvectors are placed as column in |eigenvectors| in order corresponding
88 Vector3dF
SolveEigenproblem(Matrix3F
* eigenvectors
) const;
91 Matrix3F(); // Uninitialized default.
93 static int MatrixToArrayCoords(int i
, int j
) {
94 DCHECK(i
>= 0 && i
< 3);
95 DCHECK(j
>= 0 && j
< 3);
102 inline bool operator==(const Matrix3F
& lhs
, const Matrix3F
& rhs
) {
103 return lhs
.IsEqual(rhs
);
108 #endif // UI_GFX_MATRIX3_F_H_