grid.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. function Grid(points) {
  2. var _cells = [];
  3. points.forEach(function(point) {
  4. var cellXY = this.point2CellXY(point),
  5. x = cellXY[0],
  6. y = cellXY[1];
  7. if (_cells[x] === undefined) {
  8. _cells[x] = [];
  9. }
  10. if (_cells[x][y] === undefined) {
  11. _cells[x][y] = [];
  12. }
  13. _cells[x][y].push(point);
  14. }, this);
  15. this.cellPoints = function(x, y) { // (Number, Number) -> Array
  16. return (_cells[x] !== undefined && _cells[x][y] !== undefined) ? _cells[x][y] : [];
  17. };
  18. this.removePoint = function(point) { // (Array) -> Array
  19. var cellXY = this.point2CellXY(point),
  20. cell = _cells[cellXY[0]][cellXY[1]],
  21. pointIdxInCell;
  22. for (var i = 0; i < cell.length; i++) {
  23. if (cell[i][0] === point[0] && cell[i][1] === point[1]) {
  24. pointIdxInCell = i;
  25. break;
  26. }
  27. }
  28. cell.splice(pointIdxInCell, 1);
  29. return cell;
  30. };
  31. }
  32. Grid.prototype = {
  33. point2CellXY: function(point) { // (Array) -> Array
  34. var x = parseInt(point[0] / Grid.CELL_SIZE),
  35. y = parseInt(point[1] / Grid.CELL_SIZE);
  36. return [x, y];
  37. },
  38. rangePoints: function(bbox) { // (Array) -> Array
  39. var tlCellXY = this.point2CellXY([bbox[0], bbox[1]]),
  40. brCellXY = this.point2CellXY([bbox[2], bbox[3]]),
  41. points = [];
  42. for (var x = tlCellXY[0]; x <= brCellXY[0]; x++) {
  43. for (var y = tlCellXY[1]; y <= brCellXY[1]; y++) {
  44. points = points.concat(this.cellPoints(x, y));
  45. }
  46. }
  47. return points;
  48. },
  49. addBorder2Bbox: function(bbox, border) { // (Array, Number) -> Array
  50. return [
  51. bbox[0] - (border * Grid.CELL_SIZE),
  52. bbox[1] - (border * Grid.CELL_SIZE),
  53. bbox[2] + (border * Grid.CELL_SIZE),
  54. bbox[3] + (border * Grid.CELL_SIZE)
  55. ];
  56. }
  57. };
  58. function grid(points) {
  59. return new Grid(points);
  60. }
  61. Grid.CELL_SIZE = 10;
  62. //module.exports = grid;