topical media & game development

talk show tell print

mobile-query-three-plugins-cannonjs-vendor-cannon.js-test-Mat3.js / js



  var C = require("../build/cannon");
  /*
   * Note that nothing is assumed about the storage of the matrix
   * 
   * 
   * 
   */
  exports.Mat3 = {
    
      "creation" : function(test) {
          test.expect(1);
      
          var m = new C.Mat3();
          
          var success = true;
          for( var c = 0 ; c < 3 ; c ++ )
              for( var r = 0 ; r < 3 ; r ++ )
                  success = success && ( m.e( r , c ) == 0 );
          
          test.ok( success ,  "creation without paramaters should return a null matrix");
          
          test.done();
      },
    
      "e" : function(test) {
          test.expect(2);
      
          var m = new C.Mat3();
          
          // row 1, column 2
          m.e( 1 , 2 , 5 );
          
          test.equal( m.e( 1 , 2 ) , 5 , "write and access");
          
          var success = true;
          for( var c = 0 ; c < 3 ; c ++ )
              for( var r = 0 ; r < 3 ; r ++ )
                  if( r != 1 || c != 2 ) 
                      success = success && ( m.e( r , c ) == 0 );
          
          test.ok( success ,  "write should not touch the others elements");
          
          test.done();
      },
    
      "identity" : function(test) {
          test.expect(9);
      
          var m = new C.Mat3();
     
          m.identity();
      
          for( var c = 0 ; c < 3 ; c ++ )
              for( var r = 0 ; r < 3 ; r ++ )
                  test.equal( m.e( r , c ) , ( r == c ) ? 1 : 0 , "cellule ( row : "+r+" column : "+c+" )  should be "+( c == r ? "1" : "0" ) );
          
          test.done();
      } ,
    
      "vmult" : function(test) {
          test.expect(1);
      
          var v = new C.Vec3( 2 , 3 , 7 );
          var m = new C.Mat3();
      
          /*
            set the matrix to
            | 1 2 3 |
            | 4 5 6 |
            | 7 8 9 |
  	*/
          for( var c = 0 ; c < 3 ; c ++ )
              for( var r = 0 ; r < 3 ; r ++ )
                  m.e( r , c , 1+r*3 + c );
          var t = m.vmult( v );
          
          test.ok( t.x == 29 && t.y == 65 && t.z == 101 ,  "Expected (29,65,101), got ("+t.toString()+"), while multiplying m="+m.toString()+" with "+v.toString());
          
          test.done();
      } ,
    
      "mmult" : function(test) {
          test.expect(1);
      
          var m1 = new C.Mat3();
          var m2 = new C.Mat3();
      
          
          
          /* set the matrix to
  	    * | 1 2 3 |
  	     * | 4 5 6 |
  	      * | 7 8 9 |
  	       */
          for( var c = 0 ; c < 3 ; c ++ )
              for( var r = 0 ; r < 3 ; r ++ )
                  m1.e( r , c , 1+r*3 + c );
          
          
          /* set the matrix to
  	    * | 5 2 4 |
  	     * | 4 5 1 |
  	      * | 1 8 0 |
  	       */
          m2.e( 0 , 0 , 5 );
          m2.e( 0 , 1 , 2 );
          m2.e( 0 , 2 , 4 );
          m2.e( 1 , 0 , 4 );
          m2.e( 1 , 1 , 5 );
          m2.e( 1 , 2 , 1 );
          m2.e( 2 , 0 , 1 );
          m2.e( 2 , 1 , 8 );
          m2.e( 2 , 2 , 0 );
          
          var m3 = m1.mmult( m2 );
          
          test.ok( m3.e( 0 , 0  ) == 16 
                   &&  m3.e( 0 , 1  ) == 36  
                   &&  m3.e( 0 , 2  ) == 6  
                   &&  m3.e( 1 , 0  ) == 46  
                   &&  m3.e( 1 , 1  ) == 81  
                   &&  m3.e( 1 , 2  ) == 21  
                   &&  m3.e( 2 , 0  ) == 76  
                   &&  m3.e( 2 , 1  ) == 126  
                   &&  m3.e( 2 , 2  ) == 36  ,  "calculating multiplication with another matrix");
          
          test.done();
      },
    
      "solve" : function(test) {
          
          test.expect(2);
          
          var m = new C.Mat3();
          
          var v = new C.Vec3( 2 , 3 , 7 );
          
          /* set the matrix to
  	    * | 5 2 4 |
  	     * | 4 5 1 |
  	      * | 1 8 0 |
  	       */
          m.e( 0 , 0 , 5 );
          m.e( 0 , 1 , 2 );
          m.e( 0 , 2 , 4 );
          m.e( 1 , 0 , 4 );
          m.e( 1 , 1 , 5 );
          m.e( 1 , 2 , 1 );
          m.e( 2 , 0 , 1 );
          m.e( 2 , 1 , 8 );
          m.e( 2 , 2 , 0 );
          
          
          var t = m.solve( v );
          
          var vv = m.vmult( t );
          
          test.ok( vv.almostEquals( v , 0.00001 ) ,  "solving Ax = b");
          
          
          var m1 = new C.Mat3();
          
          /* set the matrix to
  	    * | 1 2 3 |
  	     * | 4 5 6 |
  	      * | 7 8 9 |
  	       */
          for( var c = 0 ; c < 3 ; c ++ )
              for( var r = 0 ; r < 3 ; r ++ )
                  m1.e( r , c , 1+r*3 + c );
          
          var error = false;
          
          try{ 
              m1.solve( v );
          }catch(e){
              error = true
          }
          
          test.ok( error ,  "should rise an error if the system has no solutions");
          
          test.done();
          
      },
    
      "reverse" : function(test) {
          
          test.expect(2);
          
          var m = new C.Mat3();
          
          /* set the matrix to
  	    * | 5 2 4 |
  	     * | 4 5 1 |
  	      * | 1 8 0 |
  	       */
          m.e( 0 , 0 , 5 );
          m.e( 0 , 1 , 2 );
          m.e( 0 , 2 , 4 );
          m.e( 1 , 0 , 4 );
          m.e( 1 , 1 , 5 );
          m.e( 1 , 2 , 1 );
          m.e( 2 , 0 , 1 );
          m.e( 2 , 1 , 8 );
          m.e( 2 , 2 , 0 );
          
          
          var m2 = m.reverse();
          
          var m3 = m2.mmult( m );
          
          var success = true;
          for( var c = 0 ; c < 3 ; c ++ )
              for( var r = 0 ; r < 3 ; r ++ )
                  success = success && ( Math.abs( m3.e( r , c ) - ( c == r ? 1 : 0 ) ) < 0.00001 );
          
          test.ok( success ,  "inversing");
          
          
          var m1 = new C.Mat3();
          
          /* set the matrix to
  	    * | 1 2 3 |
  	     * | 4 5 6 |
  	      * | 7 8 9 |
  	       */
          for( var c = 0 ; c < 3 ; c ++ )
              for( var r = 0 ; r < 3 ; r ++ )
                  m1.e( r , c , 1+r*3 + c );
          
          var error = false;
          
          try{ 
              m1.reverse();
          }catch(e){
              error = true
          }
          
          test.ok( error ,  "should rise an error if the matrix is not inersible");
          
          test.done();
          
      },
  };


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.