You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
quaggaJS/src/cluster.js

72 lines
2.0 KiB
JavaScript

/* jshint undef: true, unused: true, browser:true, devel: true */
/* global define, vec2 */
define(function() {
"use strict";
/**
* Creates a cluster for grouping similar orientations of datapoints
*/
var Cluster = {
create : function(point, threshold) {
var points = [], center = {
rad : 0,
vec : vec2.create([0, 0])
}, pointMap = {};
function init() {
add(point);
updateCenter();
}
function add(point) {
pointMap[point.id] = point;
points.push(point);
}
function updateCenter() {
var i, sum = 0;
for ( i = 0; i < points.length; i++) {
sum += points[i].rad;
}
center.rad = sum / points.length;
center.vec = vec2.create([Math.cos(center.rad), Math.sin(center.rad)]);
}
init();
return {
add : function(point) {
if (!pointMap[point.id]) {
add(point);
updateCenter();
}
},
fits : function(point) {
// check cosine similarity to center-angle
var similarity = Math.abs(vec2.dot(point.point.vec, center.vec));
if (similarity > threshold) {
return true;
}
return false;
},
getPoints : function() {
return points;
},
getCenter : function() {
return center;
}
};
},
createPoint : function(point, id, property) {
return {
rad : point[property],
point : point,
id : id
};
}
};
return (Cluster);
});