summaryrefslogtreecommitdiff
path: root/src/AltEst/algebra.h
blob: 382103e4cee6e520ecbeaaf0aec1443bc46f477c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
  algebra.h: This file contains a number of utilities useful for handling
  3D vectors

  This work is an adaptation from vvector.h, written by Linas Vepstras. The
  original code can be found at:

  https://github.com/markkilgard/glut/blob/master/lib/gle/vvector.h

  HISTORY:
  Written by Linas Vepstas, August 1991
  Added 2D code, March 1993
  Added Outer products, C++ proofed, Linas Vepstas October 1993
  Adapted for altitude estimation tasks by Juan Gallostra June 2018
  Separated .h, .cpp by Simon D. Levy July 2018
*/

#pragma once

//#include <cmath>
#include <math.h>

// Copy 3D vector
void copyVector(float b[3],float a[3]);


// Vector difference
void subtractVectors(float v21[3], float v2[3], float v1[3]);

// Vector sum
void sumVectors(float v21[3], float v2[3], float v1[3]);

// scalar times vector
void scaleVector(float c[3],float a, float b[3]);

// accumulate scaled vector
void accumulateScaledVector(float c[3], float a, float b[3]);

// Vector dot product
void dotProductVectors(float * c, float a[3], float b[3]);

// Vector length
void vectorLength(float * len, float a[3]);

// Normalize vector
void normalizeVector(float a[3]);

// 3D Vector cross product yeilding vector
void crossProductVectors(float c[3], float a[3], float b[3]);

// initialize matrix
void identityMatrix3x3(float m[3][3]);

// matrix copy
void copyMatrix3x3(float b[3][3], float a[3][3]);

// matrix transpose
void transposeMatrix3x3(float b[3][3], float a[3][3]);

// multiply matrix by scalar
void scaleMatrix3x3(float b[3][3], float s, float a[3][3]);

// multiply matrix by scalar and add result to another matrix
void scaleAndAccumulateMatrix3x3(float b[3][3], float s, float a[3][3]);

// matrix product
// c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y]
void matrixProduct3x3(float c[3][3], float a[3][3], float b[3][3]);

// matrix times vector
void matrixDotVector3x3(float p[3], float m[3][3], float v[3]);

// determinant of matrix
// Computes determinant of matrix m, returning d
void determinant3x3(float * d, float m[3][3]);

// adjoint of matrix
// Computes adjoint of matrix m, returning a
// (Note that adjoint is just the transpose of the cofactor matrix);
void adjoint3x3(float a[3][3], float m[3][3]);

// compute adjoint of matrix and scale
// Computes adjoint of matrix m, scales it by s, returning a
void scaleAdjoint3x3(float a[3][3], float s, float m[3][3]);

// inverse of matrix
// Compute inverse of matrix a, returning determinant m and
// inverse b
void invert3x3(float b[3][3], float a[3][3]);

// skew matrix from vector
void skew(float a[3][3], float v[3]);

void printMatrix3X3(float mmm[3][3]);

void vecPrint(float a[3]);