1
+ var round_tolerance = 0.00001 ;
2
+
1
3
// SET
2
4
PVector v = new PVector (0.0 , 0.0 , 0.0 );
3
5
v. set(20.0 , 30.0 , 40.0 );
@@ -14,24 +16,28 @@ _checkEqual(v.array(), [20.0, 30.0, 40.0]);
14
16
_checkEqual([v2. x, v2. y, v2. z], [10.0 , 30.0 , 40.0 ]);
15
17
16
18
// MAG
17
- _checkEqual(v. mag(), 53.851646 , 0.00001 );
19
+ float m = 53.851648 ;
20
+ _checkEqual(v. mag(), m, round_tolerance);
21
+
22
+ // MAGSQ
23
+ _checkEqual(v. magSq(), m* m, Math . sqrt(round_tolerance));
18
24
19
25
PVector v3 = new PVector (10 , 20 , 2 );
20
26
PVector v4 = v3. get();
21
27
22
28
// NORMALIZE
23
29
v3. normalize();
24
- _checkEqual([v3. x, v3. y, v3. z], [ 0.4454354 , 0.8908708 , 0.089087084 ], 0.00001 );
30
+ _checkEqual([v3. x, v3. y, v3. z], [ 0.4454354 , 0.8908708 , 0.089087084 ], round_tolerance );
25
31
26
32
// LIMIT
27
33
v4. limit(5 );
28
- _checkEqual([v4. x, v4. y, v4. z], [ 2.2271771 , 4.4543543 , 0.4454354 ], 0.00001 );
34
+ _checkEqual([v4. x, v4. y, v4. z], [ 2.2271771 , 4.4543543 , 0.4454354 ], round_tolerance );
29
35
30
36
// ANGLE BETWEEN
31
37
PVector v1 = new PVector (10 , 20 );
32
38
PVector v2 = new PVector (60 , 80 );
33
39
float a = PVector . angleBetween(v1, v2);
34
- _checkEqual(degrees (a), 10.304827 , 0.0001 );
40
+ _checkEqual(degrees (a), 10.304846 , round_tolerance );
35
41
36
42
// CROSS
37
43
PVector v1 = new PVector (10 , 20 , 2 );
@@ -48,7 +54,7 @@ _checkEqual(d, 2200.0);
48
54
PVector v1 = new PVector (10 , 20 , 0 );
49
55
PVector v2 = new PVector (60 , 80 , 0 );
50
56
float d = v1. dist(v2);
51
- _checkEqual(d, 78.10249 , 0.0001 );
57
+ _checkEqual(d, 78.10249 , round_tolerance );
52
58
53
59
// ADD
54
60
PVector v1, v2;
@@ -78,7 +84,7 @@ v2.div(v1);
78
84
79
85
_checkEqual(v2. x, 0.625 );
80
86
_checkEqual(v2. y, 2.5 );
81
- _checkEqual(v2. z, 0.6666667 , 0.00001 );
87
+ _checkEqual(v2. z, 0.6666667 , round_tolerance );
82
88
83
89
PVector v3 = PVector . div(v1, v2);
84
90
@@ -109,3 +115,125 @@ PVector v2 = new PVector();
109
115
v2. set(v1);
110
116
111
117
_checkEqual(v1. array(), v2. array());
118
+
119
+ // FROM ANGLE
120
+ PVector v1 = PVector . fromAngle(HALF_PI );
121
+ _checkEqual(v1. array(), [0 , 1 , 0 ], round_tolerance);
122
+
123
+ v1 = PVector . fromAngle(PI );
124
+ _checkEqual(v1. array(), [- 1 , 0 , 0 ], round_tolerance);
125
+
126
+ float over_root_2 = 1 . / Math . sqrt(2 );
127
+ PVector . fromAngle(PI / 4 , v1); // specifying target
128
+ _checkEqual(v1. array(), [over_root_2, over_root_2, 0 ], round_tolerance);
129
+
130
+ PVector v2 = PVector . fromAngle(3 * PI / 4 , null ); // should return new vector
131
+ _checkEqual(v2. array(), [- over_root_2, over_root_2, 0 ], round_tolerance);
132
+
133
+ // RANDOM2D
134
+ PVector v1 = PVector . random2D();
135
+ PVector v2 = PVector . random2D();
136
+ PVector v3 = new PVector ();
137
+ _checkEqual(v1. z, 0 );
138
+ _checkEqual(v2. z, 0 );
139
+ _checkNotEqual(v1. array(), v2. array());
140
+ _checkNotEqual(v1. array(), v3. array());
141
+ _checkNotEqual(v2. array(), v3. array());
142
+
143
+ PVector v4 = new PVector (v1. x, v1. y, v1. z);
144
+ PVector . random2D(v4); // pass in target
145
+ // should have changed from initial v1 values
146
+ _checkNotEqual(v1. array(), v4. array());
147
+
148
+ PVector v5 = PVector . random2D(null ); // should return new vector
149
+ _checkEqual(v5. z, 0 );
150
+ _checkNotEqual(v4. array(), v5. array());
151
+
152
+ // RANDOM3D
153
+ PVector v1 = PVector . random3D();
154
+ PVector v2 = PVector . random3D();
155
+ PVector v3 = new PVector ();
156
+ _checkNotEqual(v1. array(), v2. array());
157
+ _checkNotEqual(v1. array(), v3. array());
158
+ _checkNotEqual(v2. array(), v3. array());
159
+
160
+ PVector v4 = new PVector (v1. x, v1. y, v1. z);
161
+ PVector . random3D(v4); // pass in target
162
+ // should have changed from initial v1 values
163
+ _checkNotEqual(v1. array(), v4. array());
164
+
165
+ PVector v5 = PVector . random3D(null ); // should return new vector
166
+ _checkNotEqual(v4. array(), v5. array());
167
+
168
+ // LERP
169
+ PVector v1 = new PVector (10 , 20 , 30 );
170
+ PVector v2 = new PVector (20 , 30 , 40 );
171
+ PVector vlerp1 = PVector . lerp(v1, v2, 0 );
172
+ PVector vlerp2 = PVector . lerp(v1, v2, 0.5 );
173
+ PVector vlerp3 = PVector . lerp(v1, v2, 1 );
174
+ _checkEqual(vlerp1. array(), v1. array());
175
+ _checkEqual(vlerp2. array(), [15 , 25 , 35 ]);
176
+ _checkEqual(vlerp3. array(), v2. array());
177
+
178
+ // non-static version 1, another vector
179
+ v1. lerp(v2, 0.5 ); // changes v1
180
+ _checkEqual(vlerp2. array(), v1. array());
181
+
182
+ // non-static version 2, xyz values
183
+ PVector v3 = new PVector (- v2. x, - v2. y, - v2. z);
184
+ v3. lerp(v2. x, v2. y, v2. z, 0.5 );
185
+ _checkEqual(v3. array(), [0 , 0 , 0 ]);
186
+
187
+ // SETMAG
188
+ void setMagTest (PVector v , float m ) {
189
+ v. setMag(m);
190
+ _checkEqual(v. mag(), m, round_tolerance);
191
+ }
192
+ void setMagNoop (PVector v ) {
193
+ float [] a = v. array();
194
+ setMagTest(v, v. mag());
195
+ _checkEqual(a, v. array(), round_tolerance);
196
+ }
197
+ PVector v1 = new PVector (- 1 , 0 , 0 );
198
+ setMagTest(v1, 10 );
199
+ _checkEqual(v1. array(), [- 10 , 0 , 0 ]);
200
+
201
+ setMagNoop(new PVector (- 0.05 , 2013 , 2.718 ), 10 );
202
+ setMagNoop(new PVector (578 , 123 , 432 ));
203
+ setMagNoop(PVector . random3D());
204
+
205
+ // vector arg version
206
+ void setMagTest2 (PVector unused , PVector v , float m ) {
207
+ unused. setMag(v, m);
208
+ _checkEqual(v. mag(), m, round_tolerance);
209
+ }
210
+ setMagTest2(v1, new PVector (- 1 , - 1 , - 1 ), 1 );
211
+ setMagTest2(v1, new PVector (9812 , 38 , 1.65 ), 193 );
212
+ // according to p5 docs, giving setMag a null first argument should
213
+ // cause it to create a new vector. however, this will have a
214
+ // magnitude of 0, regardless of the second argument (this is even the
215
+ // case in p5). that's probably not correct, so no test for it.
216
+
217
+ // ROTATE
218
+ PVector v1 = new PVector (100 , 0 , 0 );
219
+ v1. rotate(HALF_PI );
220
+ _checkEqual(v1. array(), [0 , 100 , 0 ], round_tolerance);
221
+ v1. rotate(PI );
222
+ _checkEqual(v1. array(), [0 , - 100 , 0 ], round_tolerance);
223
+ v1. rotate(- 1.5 * PI );
224
+ _checkEqual(v1. array(), [100 , 0 , 0 ], round_tolerance);
225
+ v1. rotate(QUARTER_PI );
226
+ _checkEqual(v1. array(), [100 * over_root_2, 100 * over_root_2, 0 ], round_tolerance);
227
+
228
+ // HEADING
229
+ void headingTest (float angle ) {
230
+ // angle needs to be between [-PI, PI]. otherwise, the numerical
231
+ // values may be off by a multiple of 2PI.
232
+ PVector v = PVector . fromAngle(angle);
233
+ _checkEqual(v. heading(), angle, round_tolerance);
234
+ }
235
+ _checkEqual((new PVector (128 , 0 , 0 )). heading(), 0 );
236
+ _checkEqual((new PVector (0 , 0.1 , 0 )). heading(), HALF_PI );
237
+ headingTest(Math . random() * TWO_PI - PI );
238
+ headingTest(Math . random() * TWO_PI - PI );
239
+ headingTest(Math . random() * TWO_PI - PI );
0 commit comments