(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:
*
* <pre>
* Binary string Hamming weight
* 11101 4
* 11101010 5
* </pre>
*
* @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.
*
* <pre>
* x0y0 -------- x2y2 --------
* | | | |
* -------- x1y1 -------- x3y3
* </pre>
*
* @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);
};
}());