-
Notifications
You must be signed in to change notification settings - Fork 0
/
vector.js
123 lines (107 loc) · 2.33 KB
/
vector.js
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/**
* Euclidian vector
*
* @param values Array (optional)
*/
var Vector = function (values) {
var that = this;
(values || []).forEach(function (v) {
that.push(v);
});
/**
* addiert vektoren zum aktuellen Vektor. es dürfen auch mehr als 2 sein :P
*
* achtung -
* vektoren sind einfache arrays.
* sie dürfen nur aus numbers bestehen.
* alle inputvektoren müssen die gleiche zahl dimensionen haben.
*
* @param v Vector
* @return Vector
*/
this.add = function (v) {
var i,
l1 = v.length,
l2 = this.length,
res = [];
for (i = 0; i < l1 || i < l2; i += 1) {
res[i] = v[i] + this[i];
}
return new Vector(res);
};
/**
*
* @param v
* @return Vector
*/
this.diff = function (v) {
return this.add(v.invert());
};
/**
* attitude of points towards each other
* returns a unit vector that points from v to this vector
*
* @param v
* @return Vector
*/
this.attitude = function (v) {
return this.diff(v).toUnitVector();
};
/**
* invert vector
*
* @return Vector
*/
this.invert = function () {
return new Vector(this.map(function (v) {
return -v;
}));
};
/**
*
* @param scalar number
* @return Vector
*/
this.multiply = function (scalar) {
return new Vector(this.map(function (v) {
return v * scalar;
}));
};
/**
* rotates in the cartesian plane (first to coordinates ;P)
* @param rad
*/
this.rotateCartesian = function (rad) {
var
rotated = this.map(function (v) {return v;}),
x = rotated[0],
y = rotated[1];
rotated[0] = x * Math.cos(rad) - y * Math.sin(rad);
rotated[1] = x * Math.sin(rad) + y * Math.cos(rad);
return new Vector(rotated);
};
/**
* return vector length (as in "how long is this arrow")
* @return number
*/
this.norm = function () {
// note: the case to Number if, of course, not necessary
// its only there to appease intellij :P
return Math.sqrt(Number(this.reduce(function (prev, cur) {
return prev + Math.pow(cur, 2);
}, 0)));
};
/**
* reduce a vector to its unit vector
* @return Vector
*/
this.toUnitVector = function () {
// now for the unit vector. for that,
// calculate the value of the "diff" vector, and divide all dimensions by that value
var value = this.norm();
return new Vector(this.map(function (v) {
return v / value;
}));
};
};
Vector.prototype = [];