JSFiddle - React, Tailwind, and code Playground
by cdaringe
JavaScript
var X_AXIS = 0;
var Y_AXIS = 1;
var Z_AXIS = 2;
var CLUSTER_ADJACENCY_DIRS = [
[X_AXIS, 1], [X_AXIS, -1],
[Y_AXIS, 1], [Y_AXIS, -1],
[Z_AXIS, 1], [Z_AXIS, -1],
];
var xArr = [ [[1, 1], [0, 0]], [[0, 0], [0, 1]]];
function findClusters(xArr) {
var clusters = {};
var clusterCount = 0;
var mg;
xArr.forEach(function(yArr, x) {
yArr.forEach(function(zArr, y) {
zArr.forEach(function(value, z) {
// console.log(x + ' ' + y + ' ' + z + ' - ' + value);
if (!Mass.isMasslike(value)) return;
if (Mass.isMass(value)) return;
mg = new MassGroup({
domain: xArr,
root: new Mass({ domain: xArr, x: x, y: y, z: z, value: value }),
});
xArr[x][y][z] = mg.root;
mg.clusterify();
clusters[clusterCount] = mg;
++clusterCount;
});
});
});
}
function MassGroup(conf) {
this.domain = conf.domain;
this.root = conf.root;
this.massNodes = [this.root];
}
MassGroup.prototype.clusterify = function() {
this.massNodes = [this.root];
this._clusterify(this.root);
};
MassGroup.prototype._clusterify = function (node) {
CLUSTER_ADJACENCY_DIRS.forEach(function _clusterChild(probeRequest) {
var massNode;
var massyCoords = node.probe.apply(node, probeRequest);
if (!massyCoords) return;
massNode = node.neighborToMass(massyCoords);
this.massNodes.push(massNode);
this._clusterify(massNode);
}.bind(this));
};
function Mass(conf) {
this.domain = conf.domain;
this.x = conf.x;
this.y = conf.y;
this.z = conf.z;
this.value = conf.value;
}
/**
* probe for uninstantiated mass
* @param {number} see X_/Y_/Z_AXIS constants
* @param {number} 1/-1
* @returns {object|undefined} probed coords
*/
Mass.prototype.probe = function(axis, dir) {
var coords = this.probeRequestToCoords.apply(this, arguments);
var massCandidate;
switch (axis) {
case X_AXIS:
if (coords.x < 0 || coords.x > this.domain.length) return;
massCandidate...