(function() { /** * Math utility. * @static * @constructor */ tracking.Math = {}; /** * Euclidean distance between two points P(x0, y0) and P(x1, y1). * @param {number} x0 Horizontal coordinate of P0. * @param {number} y0 Vertical coordinate of P0. * @param {number} x1 Horizontal coordinate of P1. * @param {number} y1 Vertical coordinate of P1. * @return {number} The euclidean distance. */ tracking.Math.distance = function(x0, y0, x1, y1) { var dx = x1 - x0; var dy = y1 - y0; return Math.sqrt(dx * dx + dy * dy); }; /** * Calculates the Hamming weight of a string, which is the number of symbols that are * different from the zero-symbol of the alphabet used. It is thus * equivalent to the Hamming distance from the all-zero string of the same * length. For the most typical case, a string of bits, this is the number * of 1's in the string. * * Example: * *
   *  Binary string     Hamming weight
   *   11101                 4
   *   11101010              5
   * 
* * @param {number} i Number that holds the binary string to extract the hamming weight. * @return {number} The hamming weight. */ tracking.Math.hammingWeight = function(i) { i = i - ((i >> 1) & 0x55555555); i = (i & 0x33333333) + ((i >> 2) & 0x33333333); return ((i + (i >> 4) & 0xF0F0F0F) * 0x1010101) >> 24; }; /** * Generates a random number between [a, b] interval. * @param {number} a * @param {number} b * @return {number} */ tracking.Math.uniformRandom = function(a, b) { return a + Math.random() * (b - a); }; /** * Tests if a rectangle intersects with another. * *
   *  x0y0 --------       x2y2 --------
   *      |       |           |       |
   *      -------- x1y1       -------- x3y3
   * 
* * @param {number} x0 Horizontal coordinate of P0. * @param {number} y0 Vertical coordinate of P0. * @param {number} x1 Horizontal coordinate of P1. * @param {number} y1 Vertical coordinate of P1. * @param {number} x2 Horizontal coordinate of P2. * @param {number} y2 Vertical coordinate of P2. * @param {number} x3 Horizontal coordinate of P3. * @param {number} y3 Vertical coordinate of P3. * @return {boolean} */ tracking.Math.intersectRect = function(x0, y0, x1, y1, x2, y2, x3, y3) { return !(x2 > x1 || x3 < x0 || y2 > y1 || y3 < y0); }; }());