rmath3d 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,735 @@
1
+ class TC_RMtx4 < Minitest::Test
2
+
3
+ def setup
4
+ @tolerance = RMath3D::TOLERANCE
5
+ @mZero = RMtx4.new.setZero
6
+ @mIdentity = RMtx4.new.setIdentity
7
+ end
8
+
9
+ def teardown
10
+ end
11
+
12
+ def test_RMtx_initialize
13
+ m0 = RMtx4.new
14
+ for r in 0...4 do
15
+ for c in 0...4 do
16
+ assert_equal( 0.0, m0.getElement(r,c) )
17
+ end
18
+ end
19
+
20
+ m1 = RMtx4.new( 0, 1, 2, 3,
21
+ 4, 5, 6, 7,
22
+ 8, 9,10,11,
23
+ 12,13,14,15 )
24
+ assert_equal( 0, m1.getElement(0,0) )
25
+ assert_equal( 1, m1.getElement(0,1) )
26
+ assert_equal( 2, m1.getElement(0,2) )
27
+ assert_equal( 3, m1.getElement(0,3) )
28
+ assert_equal( 4, m1.getElement(1,0) )
29
+ assert_equal( 5, m1.getElement(1,1) )
30
+ assert_equal( 6, m1.getElement(1,2) )
31
+ assert_equal( 7, m1.getElement(1,3) )
32
+ assert_equal( 8, m1.getElement(2,0) )
33
+ assert_equal( 9, m1.getElement(2,1) )
34
+ assert_equal(10, m1.getElement(2,2) )
35
+ assert_equal(11, m1.getElement(2,3) )
36
+ assert_equal(12, m1.getElement(3,0) )
37
+ assert_equal(13, m1.getElement(3,1) )
38
+ assert_equal(14, m1.getElement(3,2) )
39
+ assert_equal(15, m1.getElement(3,3) )
40
+
41
+ m2 = RMtx4.new( m1 )
42
+ for r in 0...4 do
43
+ for c in 0...4 do
44
+ assert_equal( 4*r+c, m2.getElement(r,c) )
45
+ end
46
+ end
47
+ end
48
+
49
+ def test_to_s
50
+ assert_respond_to( @mZero, :to_s )
51
+ end
52
+
53
+ def test_coerce
54
+ assert_respond_to( @mZero, :coerce )
55
+ end
56
+
57
+ def test_setElements
58
+ @mZero.setElements( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 )
59
+ for r in 0...4 do
60
+ for c in 0...4 do
61
+ assert_equal( 4*r+c, @mZero.getElement(r,c) )
62
+ end
63
+ end
64
+ end
65
+
66
+ def test_setElement
67
+ for r in 0...4 do
68
+ for c in 0...4 do
69
+ @mZero.setElement( r, c, 4*r+c )
70
+ end
71
+ end
72
+ for r in 0...4 do
73
+ for c in 0...4 do
74
+ assert_equal( 4*r+c, @mZero.getElement(r,c) )
75
+ end
76
+ end
77
+
78
+ for r in 0...4 do
79
+ for c in 0...4 do
80
+ @mZero[ r, c ] = 4*c+r
81
+ end
82
+ end
83
+ for r in 0...4 do
84
+ for c in 0...4 do
85
+ assert_equal( 4*c+r, @mZero[r,c] )
86
+ end
87
+ end
88
+ end
89
+
90
+ def test_getElement
91
+ assert_respond_to( @mIdentity, :getElement )
92
+ for r in 0...4 do
93
+ for c in 0...4 do
94
+ e = @mIdentity.getElement( r, c )
95
+ if ( r == c )
96
+ assert_equal( 1.0, e )
97
+ else
98
+ assert_equal( 0.0, e )
99
+ end
100
+ end
101
+ end
102
+
103
+ for r in 0...4 do
104
+ for c in 0...4 do
105
+ e = @mIdentity[r, c]
106
+ if ( r == c )
107
+ assert_equal( 1.0, e )
108
+ else
109
+ assert_equal( 0.0, e )
110
+ end
111
+ end
112
+ end
113
+
114
+ mtx = RMtx4.new(1,2,3,4,
115
+ 5,6,7,8,
116
+ 9,10,11,12,
117
+ 13,14,15,16)
118
+ assert_equal( mtx.e00, 1 )
119
+ assert_equal( mtx.e01, 2 )
120
+ assert_equal( mtx.e02, 3 )
121
+ assert_equal( mtx.e03, 4 )
122
+ assert_equal( mtx.e10, 5 )
123
+ assert_equal( mtx.e11, 6 )
124
+ assert_equal( mtx.e12, 7 )
125
+ assert_equal( mtx.e13, 8 )
126
+ assert_equal( mtx.e20, 9 )
127
+ assert_equal( mtx.e21,10 )
128
+ assert_equal( mtx.e22,11 )
129
+ assert_equal( mtx.e23,12 )
130
+ assert_equal( mtx.e30,13 )
131
+ assert_equal( mtx.e31,14 )
132
+ assert_equal( mtx.e32,15 )
133
+ assert_equal( mtx.e33,16 )
134
+ end
135
+
136
+ def test_getRowColumn
137
+ mtx = RMtx4.new(1,2,3,4,
138
+ 5,6,7,8,
139
+ 9,10,11,12,
140
+ 13,14,15,16)
141
+
142
+ v = mtx.getRow(0)
143
+ assert_equal( v.x, 1 )
144
+ assert_equal( v.y, 2 )
145
+ assert_equal( v.z, 3 )
146
+ assert_equal( v.w, 4 )
147
+
148
+ v = mtx.getRow(1)
149
+ assert_equal( v.x, 5 )
150
+ assert_equal( v.y, 6 )
151
+ assert_equal( v.z, 7 )
152
+ assert_equal( v.w, 8 )
153
+
154
+ v = mtx.getRow(2)
155
+ assert_equal( v.x, 9 )
156
+ assert_equal( v.y, 10)
157
+ assert_equal( v.z, 11)
158
+ assert_equal( v.w, 12)
159
+
160
+ v = mtx.getRow(3)
161
+ assert_equal( v.x, 13)
162
+ assert_equal( v.y, 14)
163
+ assert_equal( v.z, 15)
164
+ assert_equal( v.w, 16)
165
+
166
+
167
+ v = mtx.getColumn(0)
168
+ assert_equal( v.x, 1 )
169
+ assert_equal( v.y, 5 )
170
+ assert_equal( v.z, 9 )
171
+ assert_equal( v.w, 13)
172
+
173
+ v = mtx.getColumn(1)
174
+ assert_equal( v.x, 2 )
175
+ assert_equal( v.y, 6 )
176
+ assert_equal( v.z, 10)
177
+ assert_equal( v.w, 14)
178
+
179
+ v = mtx.getColumn(2)
180
+ assert_equal( v.x, 3 )
181
+ assert_equal( v.y, 7 )
182
+ assert_equal( v.z, 11)
183
+ assert_equal( v.w, 15)
184
+
185
+ v = mtx.getColumn(3)
186
+ assert_equal( v.x, 4 )
187
+ assert_equal( v.y, 8 )
188
+ assert_equal( v.z, 12)
189
+ assert_equal( v.w, 16)
190
+ end
191
+
192
+ def test_setRowColumn
193
+ mtx = RMtx4.new
194
+
195
+ vr = [RVec4.new(1,2,3,4),RVec4.new(5,6,7,8),RVec4.new(9,10,11,12),RVec4.new(13,14,15,16)]
196
+ mtx.setRow(vr[0],0)
197
+ mtx.setRow(vr[1],1)
198
+ mtx.setRow(vr[2],2)
199
+ mtx.setRow(vr[3],3)
200
+ assert_equal( mtx.e00, 1 )
201
+ assert_equal( mtx.e01, 2 )
202
+ assert_equal( mtx.e02, 3 )
203
+ assert_equal( mtx.e03, 4 )
204
+ assert_equal( mtx.e10, 5 )
205
+ assert_equal( mtx.e11, 6 )
206
+ assert_equal( mtx.e12, 7 )
207
+ assert_equal( mtx.e13, 8 )
208
+ assert_equal( mtx.e20, 9 )
209
+ assert_equal( mtx.e21, 10)
210
+ assert_equal( mtx.e22, 11)
211
+ assert_equal( mtx.e23, 12)
212
+ assert_equal( mtx.e30, 13)
213
+ assert_equal( mtx.e31, 14)
214
+ assert_equal( mtx.e32, 15)
215
+ assert_equal( mtx.e33, 16)
216
+
217
+ vc = [RVec4.new(1,2,3,4),RVec4.new(5,6,7,8),RVec4.new(9,10,11,12),RVec4.new(13,14,15,16)]
218
+ mtx.setColumn(vc[0],0)
219
+ mtx.setColumn(vc[1],1)
220
+ mtx.setColumn(vc[2],2)
221
+ mtx.setColumn(vc[3],3)
222
+ assert_equal( mtx.e00, 1 )
223
+ assert_equal( mtx.e01, 5 )
224
+ assert_equal( mtx.e02, 9 )
225
+ assert_equal( mtx.e03, 13)
226
+ assert_equal( mtx.e10, 2 )
227
+ assert_equal( mtx.e11, 6 )
228
+ assert_equal( mtx.e12, 10)
229
+ assert_equal( mtx.e13, 14)
230
+ assert_equal( mtx.e20, 3 )
231
+ assert_equal( mtx.e21, 7 )
232
+ assert_equal( mtx.e22, 11)
233
+ assert_equal( mtx.e23, 15)
234
+ assert_equal( mtx.e30, 4 )
235
+ assert_equal( mtx.e31, 8 )
236
+ assert_equal( mtx.e32, 12)
237
+ assert_equal( mtx.e33, 16)
238
+ end
239
+
240
+ def test_getUpper3x3
241
+ m4 = RMtx4.new( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 )
242
+ m3 = m4.getUpper3x3
243
+ assert_equal( m3.e00, 0 )
244
+ assert_equal( m3.e01, 1 )
245
+ assert_equal( m3.e02, 2 )
246
+ assert_equal( m3.e10, 4 )
247
+ assert_equal( m3.e11, 5 )
248
+ assert_equal( m3.e12, 6 )
249
+ assert_equal( m3.e20, 8 )
250
+ assert_equal( m3.e21, 9 )
251
+ assert_equal( m3.e22, 10)
252
+ end
253
+
254
+ def test_setUpper3x3
255
+ m4 = RMtx4.new
256
+ m3 = RMtx3.new( 1, 2, 3, 4, 5, 6, 7, 8, 9 )
257
+ m4.setUpper3x3( m3 )
258
+ assert_equal( m4.e00, 1 )
259
+ assert_equal( m4.e01, 2 )
260
+ assert_equal( m4.e02, 3 )
261
+ assert_equal( m4.e10, 4 )
262
+ assert_equal( m4.e11, 5 )
263
+ assert_equal( m4.e12, 6 )
264
+ assert_equal( m4.e20, 7 )
265
+ assert_equal( m4.e21, 8 )
266
+ assert_equal( m4.e22, 9 )
267
+ end
268
+
269
+ def test_setZero
270
+ m = RMtx4.new( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 )
271
+ m.setZero
272
+ for r in 0...4 do
273
+ for c in 0...4 do
274
+ assert_equal( 0.0, m.getElement( r, c ) )
275
+ end
276
+ end
277
+ end
278
+
279
+ def test_setIdentity
280
+ m = RMtx4.new( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 )
281
+ m.setIdentity
282
+ for r in 0...4 do
283
+ for c in 0...4 do
284
+ e = @mIdentity.getElement( r, c )
285
+ if ( r == c )
286
+ assert_equal( 1.0, e )
287
+ else
288
+ assert_equal( 0.0, e )
289
+ end
290
+ end
291
+ end
292
+ end
293
+
294
+ def test_getDeterminant
295
+ m0 = RMtx4.new( -2, 2, -3, 2,
296
+ -1, 1, 3, -2,
297
+ 2, 0, -1, 1,
298
+ 1, 0, -2, 3 )
299
+ assert_in_delta( 27.0, m0.getDeterminant, @tolerance )
300
+ end
301
+
302
+ def test_transpose
303
+ m0 = RMtx4.new( -2, 2, -3, 2,
304
+ -1, 1, 3, -2,
305
+ 2, 0, -1, 1,
306
+ 1, 0, -2, 3 )
307
+
308
+ # RMtx4#getTransposed
309
+ m1 = m0.getTransposed
310
+ for r in 0...4 do
311
+ for c in 0...4 do
312
+ assert_equal( m0.getElement(c,r), m1.getElement(r,c) )
313
+ end
314
+ end
315
+
316
+ # RMtx4#transpose!
317
+ m0.transpose!
318
+ for r in 0...4 do
319
+ for c in 0...4 do
320
+ assert_equal( m0.getElement(r,c), m1.getElement(r,c) )
321
+ end
322
+ end
323
+ end
324
+
325
+ def test_inverse
326
+ m0 = RMtx4.new( -2, 2, -3, 2,
327
+ -1, 1, 3, -2,
328
+ 2, 0, -1, 1,
329
+ 1, 0, -2, 3 )
330
+
331
+ m0inv = RMtx4.new( -1, 2, 15, -3,
332
+ 8, 11, 15, -3,
333
+ -5, 10, -6, 12,
334
+ -3, 6, -9, 18 )
335
+ m0inv *= 1.0/27.0
336
+
337
+ # RMtx4#getInverse
338
+ m1 = m0.getInverse
339
+ for r in 0...4 do
340
+ for c in 0...4 do
341
+ assert_in_delta( m0inv.getElement(r,c), m1.getElement(r,c), @tolerance )
342
+ end
343
+ end
344
+
345
+ # RMtx3#invert!
346
+ m0.invert!
347
+ for r in 0...4 do
348
+ for c in 0...4 do
349
+ assert_in_delta( m0inv.getElement(r,c), m0.getElement(r,c), @tolerance )
350
+ end
351
+ end
352
+ end
353
+
354
+ def test_translation
355
+ m0 = RMtx4.new( 1.0, 0.0, 0.0, 10.0,
356
+ 0.0, 1.0, 0.0, 10.0,
357
+ 0.0, 0.0, 1.0, 10.0,
358
+ 0.0, 0.0, 0.0, 1.0 )
359
+ m1 = RMtx4.new.translation( 10.0, 10.0, 10.0 )
360
+ for r in 0...4 do
361
+ for c in 0...4 do
362
+ assert_in_delta( m0.getElement(r,c), m1.getElement(r,c), @tolerance )
363
+ end
364
+ end
365
+ end
366
+
367
+ def test_rotationX
368
+ m0 = RMtx4.new( 1.0, 0.0, 0.0, 0.0,
369
+ 0.0, Math::sqrt(2)/2, -Math::sqrt(2)/2, 0.0,
370
+ 0.0, Math::sqrt(2)/2, Math::sqrt(2)/2, 0.0,
371
+ 0.0, 0.0, 0.0, 1.0 )
372
+ m1 = RMtx4.new.rotationX( Math::PI/4.0 )
373
+
374
+ for r in 0...4 do
375
+ for c in 0...4 do
376
+ assert_in_delta( m0.getElement(r,c), m1.getElement(r,c), @tolerance )
377
+ end
378
+ end
379
+
380
+
381
+ m2 = RMtx4.new( 1.0, 0.0, 0.0, 0.0,
382
+ 0.0, 0.5, -Math::sqrt(3)/2, 0.0,
383
+ 0.0, Math::sqrt(3)/2, 0.5, 0.0,
384
+ 0.0, 0.0, 0.0, 1.0 )
385
+ m3 = RMtx4.new.rotationX( Math::PI/3.0 )
386
+
387
+ for r in 0...4 do
388
+ for c in 0...4 do
389
+ assert_in_delta( m2.getElement(r,c), m3.getElement(r,c), @tolerance )
390
+ end
391
+ end
392
+ end
393
+
394
+ def test_rotationY
395
+ m0 = RMtx4.new( Math::sqrt(2)/2, 0.0, Math::sqrt(2)/2, 0.0,
396
+ 0.0, 1.0, 0.0, 0.0,
397
+ -Math::sqrt(2)/2, 0.0, Math::sqrt(2)/2, 0.0,
398
+ 0.0, 0.0, 0.0, 1.0 )
399
+ m1 = RMtx4.new.rotationY( Math::PI/4.0 )
400
+
401
+ for r in 0...4 do
402
+ for c in 0...4 do
403
+ assert_in_delta( m0.getElement(r,c), m1.getElement(r,c), @tolerance )
404
+ end
405
+ end
406
+
407
+ m2 = RMtx4.new( 0.5, 0.0, Math::sqrt(3)/2, 0.0,
408
+ 0.0, 1.0, 0.0, 0.0,
409
+ -Math::sqrt(3)/2, 0.0, 0.5, 0.0,
410
+ 0.0, 0.0, 0.0, 1.0 )
411
+ m3 = RMtx4.new.rotationY( Math::PI/3.0 )
412
+
413
+ for r in 0...4 do
414
+ for c in 0...4 do
415
+ assert_in_delta( m2.getElement(r,c), m3.getElement(r,c), @tolerance )
416
+ end
417
+ end
418
+ end
419
+
420
+ def test_rotationZ
421
+ m0 = RMtx4.new( Math::sqrt(2)/2, -Math::sqrt(2)/2, 0.0, 0.0,
422
+ Math::sqrt(2)/2, Math::sqrt(2)/2, 0.0, 0.0,
423
+ 0.0, 0.0, 1.0, 0.0,
424
+ 0.0, 0.0, 0.0, 1.0 )
425
+ m1 = RMtx4.new.rotationZ( Math::PI/4.0 )
426
+
427
+ for r in 0...4 do
428
+ for c in 0...4 do
429
+ assert_in_delta( m0.getElement(r,c), m1.getElement(r,c), @tolerance )
430
+ end
431
+ end
432
+
433
+ m2 = RMtx4.new( 0.5, -Math::sqrt(3)/2, 0.0, 0.0,
434
+ Math::sqrt(3)/2, 0.5, 0.0, 0.0,
435
+ 0.0, 0.0, 1.0, 0.0,
436
+ 0.0, 0.0, 0.0, 1.0 )
437
+ m3 = RMtx4.new.rotationZ( Math::PI/3.0 )
438
+
439
+ for r in 0...4 do
440
+ for c in 0...4 do
441
+ assert_in_delta( m2.getElement(r,c), m3.getElement(r,c), @tolerance )
442
+ end
443
+ end
444
+ end
445
+
446
+ def test_rotationAxis
447
+ m0 = RMtx4.new( 0.5, -Math::sqrt(3)/2, 0.0, 0.0,
448
+ Math::sqrt(3)/2, 0.5, 0.0, 0.0,
449
+ 0.0, 0.0, 1.0, 0.0,
450
+ 0.0, 0.0, 0.0, 1.0 )
451
+ m1 = RMtx4.new.rotationAxis( RVec3.new(0,0,1), Math::PI/3.0 )
452
+
453
+ for r in 0...4 do
454
+ for c in 0...4 do
455
+ assert_in_delta( m0.getElement(r,c), m1.getElement(r,c), @tolerance )
456
+ end
457
+ end
458
+ end
459
+
460
+ def test_rotationQuaternion
461
+ q = RQuat.new.rotationAxis( RVec3.new(0,0,1), Math::PI/3.0 )
462
+ m0 = RMtx4.new( 0.5, -Math::sqrt(3)/2, 0.0, 0.0,
463
+ Math::sqrt(3)/2, 0.5, 0.0, 0.0,
464
+ 0.0, 0.0, 1.0, 0.0,
465
+ 0.0, 0.0, 0.0, 1.0 )
466
+ m1 = RMtx4.new.rotationQuaternion( q )
467
+
468
+ for r in 0...4 do
469
+ for c in 0...4 do
470
+ assert_in_delta( m0.getElement(r,c), m1.getElement(r,c), @tolerance )
471
+ end
472
+ end
473
+ end
474
+
475
+ def test_scaling
476
+ m0 = RMtx4.new( 10.0, 0.0, 0.0, 0.0,
477
+ 0.0, 20.0, 0.0, 0.0,
478
+ 0.0, 0.0, 30.0, 0.0,
479
+ 0.0, 0.0, 0.0, 1.0 )
480
+ m1 = RMtx4.new.scaling( 10.0, 20.0, 30.0 )
481
+ for r in 0...4 do
482
+ for c in 0...4 do
483
+ assert_in_delta( m0.getElement(r,c), m1.getElement(r,c), @tolerance )
484
+ end
485
+ end
486
+ end
487
+
488
+ def test_lookAtRH
489
+ pEye = RVec3.new( 10, 10, 10 )
490
+ vDir = ( pEye - RVec3.new(0,0,0) ).normalize! # staring at (0,0,0)
491
+ vUp = RVec3.new( 0, 1, 0 )
492
+ vRight = RVec3.cross( vUp, vDir ).normalize!
493
+ vUp = RVec3.cross( vDir, vRight ).normalize!
494
+
495
+ m0 = RMtx4.new( vRight.x, vRight.y, vRight.z, -RVec3.dot(pEye,vRight),
496
+ vUp.x, vUp.y, vUp.z, -RVec3.dot(pEye,vUp),
497
+ vDir.x, vDir.y, vDir.z, -RVec3.dot(pEye,vDir),
498
+ 0.0, 0.0, 0.0, 1.0 )
499
+
500
+ m1 = RMtx4.new.lookAtRH( RVec3.new(10,10,10), # posistion
501
+ RVec3.new(0,0,0), # at
502
+ RVec3.new(0,1,0) ) # up
503
+
504
+ for r in 0...4 do
505
+ for c in 0...4 do
506
+ assert_in_delta( m0.getElement(r,c), m1.getElement(r,c), @tolerance )
507
+ end
508
+ end
509
+ end
510
+
511
+ # http://pyopengl.sourceforge.net/documentation/manual/glFrustum.3G.html
512
+ # http://pyopengl.sourceforge.net/documentation/manual/gluPerspective.3G.html
513
+ def test_perspectiveRH
514
+ left = -640.0
515
+ right = 640.0
516
+ bottom = -360.0
517
+ top = 360.0
518
+ z_n = 1.0
519
+ z_f = 1000.0
520
+ width = right - left
521
+ height = top - bottom
522
+ aspect = width/height
523
+
524
+ # RMtx4#perspectiveRH
525
+ m0 = RMtx4.new( 2*z_n/width, 0.0, 0.0, 0.0,
526
+ 0.0, 2*z_n/height, 0.0, 0.0,
527
+ 0.0, 0.0, -(z_f+z_n)/(z_f-z_n), -2.0*z_f*z_n / (z_f-z_n),
528
+ 0.0, 0.0, -1.0, 0.0 )
529
+ m1 = RMtx4.new.perspectiveRH( width, height, z_n, z_f )
530
+
531
+ for r in 0...4 do
532
+ for c in 0...4 do
533
+ assert_in_delta( m0.getElement(r,c), m1.getElement(r,c), @tolerance )
534
+ end
535
+ end
536
+
537
+ # RMtx4#perspectiveFovRH
538
+
539
+ # [NOTE] tan(fovy/2) == (height/2)/z_n
540
+ fovy = 2.0 * Math::atan( (height/2.0) / z_n )
541
+ f = 1.0/Math::tan( fovy/2.0 )
542
+
543
+ m2 = RMtx4.new( f/aspect, 0.0, 0.0, 0.0,
544
+ 0.0, f, 0.0, 0.0,
545
+ 0.0, 0.0, (z_f+z_n)/(z_n-z_f), 2*z_f*z_n/(z_n-z_f),
546
+ 0.0, 0.0, -1.0, 0.0 )
547
+ m3 = RMtx4.new.perspectiveFovRH( fovy, aspect, z_n, z_f );
548
+
549
+ for r in 0...4 do
550
+ for c in 0...4 do
551
+ assert_in_delta( m2.getElement(r,c), m2.getElement(r,c), @tolerance )
552
+ end
553
+ end
554
+
555
+ # RMtx4#perspectiveOffCenterRH
556
+
557
+ a = (right+left)/(right-left)
558
+ b = (top+bottom)/(top-bottom)
559
+ c = -(z_f+z_n)/(z_f-z_n)
560
+ d = -2.0*z_f*z_n/(z_f-z_n)
561
+ m4 = RMtx4.new( 2*z_n/(right-left), 0.0, a, 0.0,
562
+ 0.0, 2*z_n/(top-bottom), b, 0.0,
563
+ 0.0, 0.0, c, d,
564
+ 0.0, 0.0, -1.0, 0.0 )
565
+
566
+ m5 = RMtx4.new.perspectiveOffCenterRH( left, right, bottom, top, z_n, z_f )
567
+
568
+ for r in 0...4 do
569
+ for c in 0...4 do
570
+ assert_in_delta( m4.getElement(r,c), m5.getElement(r,c), @tolerance )
571
+ end
572
+ end
573
+ end
574
+
575
+ # http://pyopengl.sourceforge.net/documentation/manual/glOrtho.3G.xml
576
+ def test_orthoRH
577
+ left = -640.0
578
+ right = 640.0
579
+ bottom = -360.0
580
+ top = 360.0
581
+ z_n = 1.0
582
+ z_f = 1000.0
583
+ width = right - left
584
+ height = top - bottom
585
+
586
+ # RMtx4#orthoRH
587
+ tx = (right+left)/width
588
+ ty = (top+bottom)/height
589
+ tz = (z_f+z_n)/(z_f-z_n)
590
+ m0 = RMtx4.new( 2.0/width, 0.0, 0.0, tx,
591
+ 0.0, 2.0/height, 0.0, ty,
592
+ 0.0, 0.0, -2.0/(z_f-z_n), tz,
593
+ 0.0, 0.0, 0.0, 1.0 )
594
+ m1 = RMtx4.new.orthoRH( width, height, z_n, z_f )
595
+
596
+ for r in 0...4 do
597
+ for c in 0...4 do
598
+ assert_in_delta( m0.getElement(r,c), m1.getElement(r,c), @tolerance )
599
+ end
600
+ end
601
+
602
+ # RMtx4#orthoOffCenterRH
603
+ tx = (right+left)/(right-left)
604
+ ty = (top+bottom)/(top-bottom)
605
+ tz = (z_f+z_n)/(z_f-z_n)
606
+ m2 = RMtx4.new( 2.0/(right-left), 0.0, 0.0, tx,
607
+ 0.0, 2.0/(top-bottom), 0.0, ty,
608
+ 0.0, 0.0, -2.0/(z_f-z_n), tz,
609
+ 0.0, 0.0, 0.0, 1.0 )
610
+ m3 = RMtx4.new.orthoOffCenterRH( left, right, bottom, top, z_n, z_f )
611
+
612
+ for r in 0...4 do
613
+ for c in 0...4 do
614
+ assert_in_delta( m2.getElement(r,c), m3.getElement(r,c), @tolerance )
615
+ end
616
+ end
617
+ end
618
+
619
+ def test_unary_operators
620
+ # RMtx4#+@
621
+ m0 = RMtx4.new( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 )
622
+ m1 = RMtx4.new( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 )
623
+ m2 = +m0
624
+
625
+ assert_same( m0, m2 )
626
+ assert( m1 == m2 )
627
+
628
+ for r in 0...4 do
629
+ for c in 0...4 do
630
+ assert_in_delta( 4*r+c, m2.getElement(r,c), @tolerance )
631
+ end
632
+ end
633
+
634
+ # RMtx4#-@
635
+ m2 = -m0
636
+ for r in 0...4 do
637
+ for c in 0...4 do
638
+ assert_in_delta( m0.getElement(r,c), -m2.getElement(r,c), @tolerance )
639
+ end
640
+ end
641
+ end
642
+
643
+ def test_binary_plus
644
+ m0 = RMtx4.new( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15 )
645
+ m1 = RMtx4.new(16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 )
646
+ m2 = RMtx4.new(16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46 )
647
+
648
+ # RMtx4#+
649
+ m3 = m0 + m1
650
+ for r in 0...4 do
651
+ for c in 0...4 do
652
+ assert_in_delta( m2.getElement(r,c), m3.getElement(r,c), @tolerance )
653
+ end
654
+ end
655
+
656
+ # RMtx4#add!
657
+ m0.add!( m1 )
658
+ for r in 0...4 do
659
+ for c in 0...4 do
660
+ assert_in_delta( m2.getElement(r,c), m0.getElement(r,c), @tolerance )
661
+ end
662
+ end
663
+ end
664
+
665
+ def test_binary_minus
666
+ m0 = RMtx4.new( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15 )
667
+ m1 = RMtx4.new(16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 )
668
+ m2 = RMtx4.new(-16,-16,-16,-16,-16,-16,-16,-16,-16,-16,-16,-16,-16,-16,-16,-16)
669
+
670
+ # RMtx4#-
671
+ m3 = m0 - m1
672
+ for r in 0...4 do
673
+ for c in 0...4 do
674
+ assert_in_delta( m2.getElement(r,c), m3.getElement(r,c), @tolerance )
675
+ end
676
+ end
677
+
678
+ # RMtx4#sub!
679
+ m0.sub!( m1 )
680
+ for r in 0...4 do
681
+ for c in 0...4 do
682
+ assert_in_delta( m2.getElement(r,c), m0.getElement(r,c), @tolerance )
683
+ end
684
+ end
685
+ end
686
+
687
+ def test_binary_mult
688
+ m0 = RMtx4.new( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15 )
689
+ m1 = RMtx4.new(16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 )
690
+ m0x1 = RMtx4.new( 152, 158, 164, 170, 504, 526, 548, 570, 856, 894, 932, 970, 1208, 1262, 1316, 1370 )
691
+ m1x0 = RMtx4.new( 440, 510, 580, 650, 536, 622, 708, 794, 632, 734, 836, 938, 728, 846, 964, 1082 )
692
+
693
+ # RMtx4#*
694
+ m2 = m0 * m1
695
+ for r in 0...4 do
696
+ for c in 0...4 do
697
+ assert_in_delta( m0x1.getElement(r,c), m2.getElement(r,c), @tolerance )
698
+ end
699
+ end
700
+
701
+ m2 = m1 * m0
702
+ for r in 0...4 do
703
+ for c in 0...4 do
704
+ assert_in_delta( m1x0.getElement(r,c), m2.getElement(r,c), @tolerance )
705
+ end
706
+ end
707
+
708
+ # RMtx4#mul!
709
+ m2 = RMtx4.new( m0 )
710
+ m2.mul!( m1 )
711
+ for r in 0...4 do
712
+ for c in 0...4 do
713
+ assert_in_delta( m0x1.getElement(r,c), m2.getElement(r,c), @tolerance )
714
+ end
715
+ end
716
+
717
+ m2 = RMtx4.new( m1 )
718
+ m2.mul!( m0 )
719
+ for r in 0...4 do
720
+ for c in 0...4 do
721
+ assert_in_delta( m1x0.getElement(r,c), m2.getElement(r,c), @tolerance )
722
+ end
723
+ end
724
+ end
725
+
726
+ def test_equality_operators
727
+ m0 = RMtx4.new( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15 )
728
+ m1 = RMtx4.new( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15 )
729
+ m2 = RMtx4.new(16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 )
730
+
731
+ assert( m0 == m1 )
732
+ assert( m0 != m2 )
733
+ end
734
+
735
+ end