-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmath.js
More file actions
98 lines (86 loc) · 1.81 KB
/
math.js
File metadata and controls
98 lines (86 loc) · 1.81 KB
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
97
98
const cos = (t) => Math.cos(t*Math.PI/180);
const sin = (t) => Math.sin(t*Math.PI/180);
function dotProduct(vec1, vec2){
var r = 0;
var l = vec1.length;
for(var i=0; i<l; i++)
r += vec1[i]*vec2[i];
return r;
}
function col(mat, i){
return mat.map(d => d[i]);
}
function row(mat, i){
return mat[i];
}
function transpose(mat){
var m = [];
if(!mat.length) return m;
var l = mat[0].length;
for(var i=0; i<l; i++)
m.push(col(mat,i));
return m;
}
function matMultiply(mat1, mat2){
var r = [];
if(!mat2.length) return r;
for(var i=0; i<mat1.length; i++){
var temp = []
for(var j=0; j<mat2[0].length; j++)
temp.push(dotProduct(row(mat1,i),col(mat2,j)));
r.push(temp);
}
return r;
}
function crossProduct(vec1, vec2){
return matMultiply(transpose([vec2]),[vec1]);
}
function add(...mat){
if(!mat.length) return [];
var r = mat[0];
for(var k=1; k<mat.length; k++)
for(var i=0; i<r.length; i++)
for(var j=0; j<r[i].length; j++)
r[i][j] += mat[k][i][j];
return r;
}
function scalerProduct(s, mat){
if(!Array.isArray(mat)) return s*mat;
return mat.map(d => scalerProduct(s,d));
}
function productMatrix3(u,v,w){
return [
[0,-w,v],
[w,0,-u],
[-v,u,0]
];
}
function identityMatrix(n){
var temp = [];
for(var i=0; i<n; i++)
temp.push(0);
var r = [];
for(var i=0; i<n; i++)
r.push(temp.flat());
for(var i=0; i<n; i++)
r[i][i] = 1;
return r;
}
function rotationMatrix(u,v,w,t){
var l = Math.sqrt(u*u+v*v+w*w);
u /= l;
v /= l;
w /= l;
var c = cos(t);
var s = sin(t);
var vec = [u,v,w];
return add(scalerProduct(c,identityMatrix(3)), scalerProduct(s,productMatrix3(...vec)), scalerProduct(1-c,crossProduct(vec,vec)));
}
function transformationMatrix(u,v,w,t,x=0,y=0,z=0){
var r = rotationMatrix(u,v,w,t);
r[0].push(x);
r[1].push(y);
r[2].push(z);
r.push([0,0,0,1]);
return r;
}