PageRenderTime 51ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/test/test_RMtx4.rb

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