Example #1
0
Zone.prototype.sort = function sort() {
  if (!this._changed) return;
  this._changed = false;

  var misses = [];
  for (var i = 0; i < this.items.length - 1; i++) {
    var current = this.items[i],
        next = this.items[i + 1];

    if (Item.compare(current, next) > 0) {
      misses.push(next);
      this.items.splice(i + 1, 1);
      i--;
    }
  }

  if (misses.length > 100) {
    this.items = this.items.concat(misses);
    this.items.sort(Item.compare);
  } else {
    for (var i = 0; i < misses.length; i++) {
      this.insert(misses[i]);
    }
  }
};
Example #2
0
Zone.prototype.insert = function insert(item) {
  // Fast case
  if (this.items.length === 0) {
    this.items.push(item);
    return;
  }

  // Binary-search + insertion
  var i = 0,
      j = this.items.length - 1,
      middle = 0;

  while (i <= j) {
    middle = (i + j) >> 1;
    var cmp = Item.compare(item, this.items[middle]);

    if (cmp == 0) {
      break;
    } else if (cmp < 0) {
      j = middle - 1;
    } else {
      i = middle + 1;
    }
  }

  if (cmp > 0) {
    middle++;
  }

  // Insert
  this.items.splice(middle, 0, item);
};
Example #3
0
Zone.prototype.getItemAtPos = function getItemAtPos(x, y, z) {
  // Fast case
  if (this.items.length === 0) return false;

  // Binary-search
  var cell = {
        _sortId: -1,
        rx: x,
        ry: y,
        rz: z
      },
      i = 0,
      j = this.items.length - 1,
      middle = 0;

  while (i <= j) {
    middle = (i + j) >> 1;
    var cmp = Item.compare(cell, this.items[middle]);

    if (cmp == 0) {
      break;
    } else if (cmp < 0) {
      j = middle - 1;
    } else {
      i = middle + 1;
    }
  }

  if (cmp > 0) {
    middle++;
  }

  // Start searching from middle
  for (var i = middle; i < this.items.length; i++) {
    var item = this.items[i],
        cmp = Item.compare(cell, item);

    if (cmp > 0) break;
    if (round(x) === item.rx && round(y) === item.ry && round(z) === item.rz) {
      return item;
    }
  }

  return false;
};