HELLO·Android
系统源代码
IT资讯
技术文章
我的收藏
注册
登录
-
我收藏的文章
创建代码块
我的代码块
我的账号
Android 10
|
10.0.0_r6
下载
查看原文件
收藏
根目录
external
libxcam
xcore
vec_mat.h
/* * vec_mat.h - vector and matrix defination & calculation * * Copyright (c) 2017 Intel Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Author: Zong Wei
*/ #ifndef XCAM_VECTOR_MATRIX_H #define XCAM_VECTOR_MATRIX_H #include
#include
namespace XCam { #ifndef PI #define PI 3.14159265358979323846 #endif #ifndef FLT_EPSILON #define FLT_EPSILON 1.19209290e-07F // float #endif #ifndef DBL_EPSILON #define DBL_EPSILON 2.2204460492503131e-16 // double #endif #ifndef DEGREE_2_RADIANS #define DEGREE_2_RADIANS(x) (((x) * PI) / 180.0) #endif #ifndef RADIANS_2_DEGREE #define RADIANS_2_DEGREE(x) (((x) * 180.0) / PI) #endif #define XCAM_VECT2_OPERATOR_VECT2(op) \ Vector2
operator op (const Vector2
& b) const { \ return Vector2
(x op b.x, y op b.y); \ } \ Vector2
&operator op##= (const Vector2
& b) { \ x op##= b.x; y op##= b.y; return *this; \ } #define XCAM_VECT2_OPERATOR_SCALER(op) \ Vector2
operator op (const T& b) const { \ return Vector2
(x op b, y op b); \ } \ Vector2
&operator op##= (const T& b) { \ x op##= b; y op##= b; return *this; \ } template
class Vector2 { public: T x; T y; Vector2 () : x(0), y(0) {}; Vector2 (T _x, T _y) : x(_x), y(_y) {}; template
Vector2
convert_to () const { Vector2
ret((New)(this->x), (New)(this->y)); return ret; } Vector2
& operator = (const Vector2
& rhs) { x = rhs.x; y = rhs.y; return *this; } template
Vector2
& operator = (const Vector2
& rhs) { x = rhs.x; y = rhs.y; return *this; } Vector2
operator - () const { return Vector2
(-x, -y); } XCAM_VECT2_OPERATOR_VECT2 (+) XCAM_VECT2_OPERATOR_VECT2 (-) XCAM_VECT2_OPERATOR_VECT2 (*) XCAM_VECT2_OPERATOR_VECT2 ( / ) XCAM_VECT2_OPERATOR_SCALER (+) XCAM_VECT2_OPERATOR_SCALER (-) XCAM_VECT2_OPERATOR_SCALER (*) XCAM_VECT2_OPERATOR_SCALER ( / ) bool operator == (const Vector2
& rhs) const { return (x == rhs.x) && (y == rhs.y); } void reset () { this->x = (T) 0; this->y = (T) 0; } void set (T _x, T _y) { this->x = _x; this->y = _y; } T magnitude () const { return (T) sqrtf(x * x + y * y); } float distance (const Vector2
& vec) const { return sqrtf((vec.x - x) * (vec.x - x) + (vec.y - y) * (vec.y - y)); } T dot (const Vector2
& vec) const { return (x * vec.x + y * vec.y); } inline Vector2
lerp (T weight, const Vector2
& vec) const { return (*this) + (vec - (*this)) * weight; } }; template
class VectorN { public: VectorN (); VectorN (T x); VectorN (T x, T y); VectorN (T x, T y, T z); VectorN (T x, T y, T z, T w); VectorN (VectorN
vec3, T w); inline VectorN
& operator = (const VectorN
& rhs); inline VectorN
operator - () const; inline bool operator == (const VectorN
& rhs) const; inline T& operator [] (uint32_t index) { XCAM_ASSERT(index >= 0 && index < N); return data[index]; } inline const T& operator [] (uint32_t index) const { XCAM_ASSERT(index >= 0 && index < N); return data[index]; } inline VectorN
operator + (const T rhs) const; inline VectorN
operator - (const T rhs) const; inline VectorN
operator * (const T rhs) const; inline VectorN
operator / (const T rhs) const; inline VectorN
operator += (const T rhs); inline VectorN
operator -= (const T rhs); inline VectorN
operator *= (const T rhs); inline VectorN
operator /= (const T rhs); inline VectorN
operator + (const VectorN
& rhs) const; inline VectorN
operator - (const VectorN
& rhs) const; inline VectorN
operator * (const VectorN
& rhs) const; inline VectorN
operator / (const VectorN
& rhs) const; inline VectorN
operator += (const VectorN
& rhs); inline VectorN
operator -= (const VectorN
& rhs); inline VectorN
operator *= (const VectorN
& rhs); inline VectorN
operator /= (const VectorN
& rhs); template
inline VectorN
convert_to () const; inline void zeros (); inline void set (T x, T y); inline void set (T x, T y, T z); inline void set (T x, T y, T z, T w); inline T magnitude () const; inline float distance (const VectorN
& vec) const; inline T dot (const VectorN
& vec) const; inline VectorN
lerp (T weight, const VectorN
& vec) const; private: T data[N]; }; template
inline VectorN
::VectorN () { for (uint32_t i = 0; i < N; i++) { data[i] = 0; } } template
inline VectorN
::VectorN (T x) { data[0] = x; } template
inline VectorN
::VectorN (T x, T y) { if (N >= 2) { data[0] = x; data[1] = y; } } template
inline VectorN
::VectorN (T x, T y, T z) { if (N >= 3) { data[0] = x; data[1] = y; data[2] = z; } } template
inline VectorN
::VectorN (T x, T y, T z, T w) { if (N >= 4) { data[0] = x; data[1] = y; data[2] = z; data[3] = w; } } template
inline VectorN
::VectorN (VectorN
vec3, T w) { if (N >= 4) { data[0] = vec3.data[0]; data[1] = vec3.data[1]; data[2] = vec3.data[2]; data[3] = w; } } template
inline VectorN
& VectorN
::operator = (const VectorN
& rhs) { for (uint32_t i = 0; i < N; i++) { data[i] = rhs.data[i]; } return *this; } template
inline VectorN
VectorN
::operator - () const { for (uint32_t i = 0; i < N; i++) { data[i] = -data[i]; } return *this; } template
inline VectorN
VectorN
::operator + (const T rhs) const { VectorN
result; for (uint32_t i = 0; i < N; i++) { result.data[i] = data[i] + rhs; } return result; } template
inline VectorN
VectorN
::operator - (const T rhs) const { VectorN
result; for (uint32_t i = 0; i < N; i++) { result.data[i] = data[i] - rhs; } return result; } template
inline VectorN
VectorN
::operator * (const T rhs) const { VectorN
result; for (uint32_t i = 0; i < N; i++) { result.data[i] = data[i] * rhs; } return result; } template
inline VectorN
VectorN
::operator / (const T rhs) const { VectorN
result; for (uint32_t i = 0; i < N; i++) { result.data[i] = data[i] / rhs; } return result; } template
inline VectorN
VectorN
::operator += (const T rhs) { for (uint32_t i = 0; i < N; i++) { data[i] += rhs; } return *this; } template
inline VectorN
VectorN
::operator -= (const T rhs) { for (uint32_t i = 0; i < N; i++) { data[i] -= rhs; } return *this; } template
inline VectorN
VectorN
::operator *= (const T rhs) { for (uint32_t i = 0; i < N; i++) { data[i] *= rhs; } return *this; } template
inline VectorN
VectorN
::operator /= (const T rhs) { for (uint32_t i = 0; i < N; i++) { data[i] /= rhs; } return *this; } template
inline VectorN
VectorN
::operator + (const VectorN
& rhs) const { VectorN
result; for (uint32_t i = 0; i < N; i++) { result.data[i] = data[i] + rhs.data[i]; } return result; } template
inline VectorN
VectorN
::operator - (const VectorN
& rhs) const { VectorN
result; for (uint32_t i = 0; i < N; i++) { result.data[i] = data[i] - rhs.data[i]; } return result; } template
inline VectorN
VectorN
::operator * (const VectorN
& rhs) const { VectorN
result; for (uint32_t i = 0; i < N; i++) { result.data[i] = data[i] * rhs.data[i]; } return result; } template
inline VectorN
VectorN
::operator / (const VectorN
& rhs) const { VectorN
result; for (uint32_t i = 0; i < N; i++) { result.data[i] = data[i] / rhs.data[i]; } return result; } template
inline VectorN
VectorN
::operator += (const VectorN
& rhs) { for (uint32_t i = 0; i < N; i++) { data[i] += rhs.data[i]; } return *this; } template
inline VectorN
VectorN
::operator -= (const VectorN
& rhs) { for (uint32_t i = 0; i < N; i++) { data[i] -= rhs.data[i]; } return *this; } template
inline VectorN
VectorN
::operator *= (const VectorN
& rhs) { for (uint32_t i = 0; i < N; i++) { data[i] *= rhs.data[i]; } return *this; } template
inline VectorN
VectorN
::operator /= (const VectorN
& rhs) { for (uint32_t i = 0; i < N; i++) { data[i] /= rhs.data[i]; } return *this; } template
inline bool VectorN
::operator == (const VectorN
& rhs) const { for (uint32_t i = 0; i < N; i++) { if (data[i] != rhs[i]) { return false; } } return true; } template
template
VectorN
VectorN
::convert_to () const { VectorN
result; for (uint32_t i = 0; i < N; i++) { result[i] = (NEW)(this->data[i]); } return result; } template
inline void VectorN
::zeros () { for (uint32_t i = 0; i < N; i++) { data[i] = (T)(0); } } template
inline void VectorN
::set (T x, T y) { if (N >= 2) { data[0] = x; data[1] = y; } } template
inline void VectorN
::set (T x, T y, T z) { if (N >= 3) { data[0] = x; data[1] = y; data[2] = z; } } template
inline void VectorN
::set (T x, T y, T z, T w) { if (N >= 4) { data[0] - x; data[1] = y; data[2] = z; data[3] = w; } } template
inline T VectorN
::magnitude () const { T result = 0; for (uint32_t i = 0; i < N; i++) { result += (data[i] * data[i]); } return (T) sqrtf(result); } template
inline float VectorN
::distance (const VectorN
& vec) const { T result = 0; for (uint32_t i = 0; i < N; i++) { result += (vec.data[i] - data[i]) * (vec.data[i] - data[i]); } return sqrtf(result); } template
inline T VectorN
::dot (const VectorN
& vec) const { T result = 0; for (uint32_t i = 0; i < N; i++) { result += (vec.data[i] * data[i]); } return result; } template
inline VectorN
VectorN
::lerp (T weight, const VectorN
& vec) const { return (*this) + (vec - (*this)) * weight; } // NxN matrix in row major order template
class MatrixN { public: MatrixN (); MatrixN (VectorN
a, VectorN
b); MatrixN (VectorN
a, VectorN
b, VectorN
c); MatrixN (VectorN
a, VectorN
b, VectorN
c, VectorN
d); inline void zeros (); inline void eye (); inline T& at (uint32_t row, uint32_t col) { XCAM_ASSERT(row >= 0 && row < N); XCAM_ASSERT(col >= 0 && col < N); return data[row * N + col]; }; inline const T& at (uint32_t row, uint32_t col) const { XCAM_ASSERT(row >= 0 && row < N); XCAM_ASSERT(col >= 0 && col < N); return data[row * N + col]; }; inline T& operator () (uint32_t row, uint32_t col) { return at (row, col); }; inline const T& operator () (uint32_t row, uint32_t col) const { return at (row, col); }; inline MatrixN
& operator = (const MatrixN
& rhs); inline MatrixN
operator - () const; inline MatrixN
operator + (const MatrixN
& rhs) const; inline MatrixN
operator - (const MatrixN
& rhs) const; inline MatrixN
operator * (const T a) const; inline MatrixN
operator / (const T a) const; inline VectorN
operator * (const VectorN
& rhs) const; inline MatrixN
operator * (const MatrixN
& rhs) const; inline MatrixN
transpose (); inline MatrixN
inverse (); inline T trace (); private: inline MatrixN
inverse (const MatrixN
& mat); inline MatrixN
inverse (const MatrixN
& mat); inline MatrixN
inverse (const MatrixN
& mat); private: T data[N * N]; }; // NxN matrix in row major order template
MatrixN
::MatrixN () { eye (); } template
MatrixN
::MatrixN (VectorN
a, VectorN
b) { if (N == 2) { data[0] = a[0]; data[1] = a[1]; data[2] = b[0]; data[3] = b[1]; } else { eye (); } } template
MatrixN
::MatrixN (VectorN
a, VectorN
b, VectorN
c) { if (N == 3) { data[0] = a[0]; data[1] = a[1]; data[2] = a[2]; data[3] = b[0]; data[4] = b[1]; data[5] = b[2]; data[6] = c[0]; data[7] = c[1]; data[8] = c[2]; } else { eye (); } } template
MatrixN
::MatrixN (VectorN
a, VectorN
b, VectorN
c, VectorN
d) { if (N == 4) { data[0] = a[0]; data[1] = a[1]; data[2] = a[2]; data[3] = a[3]; data[4] = b[0]; data[5] = b[1]; data[6] = b[2]; data[7] = b[3]; data[8] = c[0]; data[9] = c[1]; data[10] = c[2]; data[11] = c[3]; data[12] = d[0]; data[13] = d[1]; data[14] = d[2]; data[15] = d[3]; } else { eye (); } } template
inline void MatrixN
::zeros () { for (uint32_t i = 0; i < N * N; i++) { data[i] = 0; } } template
inline void MatrixN
::eye () { zeros (); for (uint32_t i = 0; i < N; i++) { data[i * N + i] = 1; } } template
inline MatrixN
& MatrixN
::operator = (const MatrixN
& rhs) { for (uint32_t i = 0; i < N * N; i++) { data[i] = rhs.data[i]; } return *this; } template
inline MatrixN
MatrixN
::operator - () const { MatrixN
result; for (uint32_t i = 0; i < N * N; i++) { result.data[i] = -data[i]; } return result; } template
inline MatrixN
MatrixN
::operator + (const MatrixN
& rhs) const { MatrixN
result; for (uint32_t i = 0; i < N * N; i++) { result.data[i] = data[i] + rhs.data[i]; } return result; } template
inline MatrixN
MatrixN
::operator - (const MatrixN
& rhs) const { MatrixN
result; for (uint32_t i = 0; i < N * N; i++) { result.data[i] = data[i] - rhs.data[i]; } return result; } template
inline MatrixN
MatrixN
::operator * (const T a) const { MatrixN
result; for (uint32_t i = 0; i < N * N; i++) { result.data[i] = data[i] * a; } return result; } template
inline MatrixN
MatrixN
::operator / (const T a) const { MatrixN
result; for (uint32_t i = 0; i < N * N; i++) { result.data[i] = data[i] / a; } return result; } template