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...