diff --git a/css/index.scss b/css/index.scss index 42218be..0c62aea 100644 --- a/css/index.scss +++ b/css/index.scss @@ -29,7 +29,7 @@ } .hazard { - background: #f9f8f0; + // background: #f9f8f0; position: absolute; &::after { diff --git a/css/style.css b/css/style.css index e8c2a0e..00cb661 100644 --- a/css/style.css +++ b/css/style.css @@ -32,7 +32,6 @@ body { z-index: 0; } .hazard { - background: #f9f8f0; position: absolute; } .hazard::after { content: '\26A0'; diff --git a/js/animation.js b/js/animation.js index 343acdf..2c776fa 100644 --- a/js/animation.js +++ b/js/animation.js @@ -46,7 +46,8 @@ Animation.prototype.subscribeCount = function(count) { Animation.prototype.addHazards = function() { const bounds = this.container.getBoundingClientRect(); - const n = Random.num(1, 3); + // const n = Random.num(1, 3); + const n = 3 for (let i = 0; i < n; i++) { const w = Random.num(50, 200); const h = Random.num(50, 200); diff --git a/js/bundle.js b/js/bundle.js index 8b3c151..1805bd2 100644 --- a/js/bundle.js +++ b/js/bundle.js @@ -256,7 +256,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n}); /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 21);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _grid = __webpack_require__(/*! ./grid */ 84);\n\nvar _grid2 = _interopRequireDefault(_grid);\n\nvar _particle = __webpack_require__(/*! ./particle */ 86);\n\nvar _particle2 = _interopRequireDefault(_particle);\n\nvar _controls = __webpack_require__(/*! ./controls */ 14);\n\nvar _controls2 = _interopRequireDefault(_controls);\n\nvar _random = __webpack_require__(/*! ./random */ 33);\n\nvar _random2 = _interopRequireDefault(_random);\n\nvar _enums = __webpack_require__(/*! ./enums */ 22);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Animation(observables, id, showHazards) {\n this.id = id;\n this.observables = observables;\n this.particles = [];\n this.grid = new _grid2.default();\n this.fpsInterval = null;\n\n this.container = document.createElement('div');\n this.container.className = 'animationContainer';\n document.getElementById(id).appendChild(this.container);\n\n this.observables.count$.skip(1).subscribe(this.subscribeCount.bind(this));\n this.observables.animating$.subscribe(this.subscribeAnimating.bind(this));\n}\n\nAnimation.prototype.subscribeAnimating = function (isAnimating) {\n if (isAnimating === false) {\n clearInterval(this.fpsInterval);\n } else {\n var fps$ = this.observables.fps$;\n\n this.fpsInterval = setInterval(fps$.next.bind(fps$), 1000 / 32);\n }\n};\n\nAnimation.prototype.subscribeCount = function (count) {\n var bounds = this.container.getBoundingClientRect();\n\n while (this.particles.length > count) {\n var p = this.particles.pop();\n p.remove();\n }\n\n while (this.particles.length < count) {\n var _p = new _particle2.default(this.container, bounds, this.grid, this.observables);\n this.particles.push(_p);\n }\n};\n\nAnimation.prototype.addHazards = function () {\n var bounds = this.container.getBoundingClientRect();\n\n var n = _random2.default.num(1, 3);\n for (var i = 0; i < n; i++) {\n var w = _random2.default.num(50, 200);\n var h = _random2.default.num(50, 200);\n\n this.grid.setArea({\n x: _random2.default.num(0, bounds.width - w),\n y: _random2.default.num(0, bounds.height - h),\n w: w,\n h: h,\n type: _enums.ENTITIES.HAZARD\n }, this.container);\n }\n};\n\nexports.default = Animation;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvYW5pbWF0aW9uLmpzPzBiNTMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJ4LCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCBHcmlkIGZyb20gJy4vZ3JpZCc7XG5pbXBvcnQgUGFydGljbGUgZnJvbSAnLi9wYXJ0aWNsZSc7XG5pbXBvcnQgQ29udHJvbHMgZnJvbSAnLi9jb250cm9scyc7XG5pbXBvcnQgUmFuZG9tIGZyb20gJy4vcmFuZG9tJztcbmltcG9ydCB7IENPTlRST0xTLCBFTlRJVElFUyB9IGZyb20gJy4vZW51bXMnO1xuXG5mdW5jdGlvbiBBbmltYXRpb24ob2JzZXJ2YWJsZXMsIGlkLCBzaG93SGF6YXJkcykge1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLm9ic2VydmFibGVzID0gb2JzZXJ2YWJsZXM7XG4gICAgdGhpcy5wYXJ0aWNsZXMgPSBbXTtcbiAgICB0aGlzLmdyaWQgPSBuZXcgR3JpZCgpO1xuICAgIHRoaXMuZnBzSW50ZXJ2YWwgPSBudWxsO1xuXG4gICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSAnYW5pbWF0aW9uQ29udGFpbmVyJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIpO1xuXG4gICAgdGhpcy5vYnNlcnZhYmxlcy5jb3VudCQuc2tpcCgxKS5zdWJzY3JpYmUodGhpcy5zdWJzY3JpYmVDb3VudC5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLm9ic2VydmFibGVzLmFuaW1hdGluZyQuc3Vic2NyaWJlKHRoaXMuc3Vic2NyaWJlQW5pbWF0aW5nLmJpbmQodGhpcykpO1xufVxuXG5BbmltYXRpb24ucHJvdG90eXBlLnN1YnNjcmliZUFuaW1hdGluZyA9IGZ1bmN0aW9uKGlzQW5pbWF0aW5nKSB7XG4gICAgaWYgKGlzQW5pbWF0aW5nID09PSBmYWxzZSkge1xuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuZnBzSW50ZXJ2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHsgZnBzJCB9ID0gdGhpcy5vYnNlcnZhYmxlcztcbiAgICAgICAgdGhpcy5mcHNJbnRlcnZhbCA9IHNldEludGVydmFsKGZwcyQubmV4dC5iaW5kKGZwcyQpLCAxMDAwIC8gMzIpO1xuICAgIH1cbn1cblxuQW5pbWF0aW9uLnByb3RvdHlwZS5zdWJzY3JpYmVDb3VudCA9IGZ1bmN0aW9uKGNvdW50KSB7XG4gICAgY29uc3QgYm91bmRzID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICB3aGlsZSAodGhpcy5wYXJ0aWNsZXMubGVuZ3RoID4gY291bnQpIHtcbiAgICAgICAgY29uc3QgcCA9IHRoaXMucGFydGljbGVzLnBvcCgpO1xuICAgICAgICBwLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIHdoaWxlICh0aGlzLnBhcnRpY2xlcy5sZW5ndGggPCBjb3VudCkge1xuICAgICAgICBjb25zdCBwID0gbmV3IFBhcnRpY2xlKHRoaXMuY29udGFpbmVyLCBib3VuZHMsIHRoaXMuZ3JpZCwgdGhpcy5vYnNlcnZhYmxlcyk7XG4gICAgICAgIHRoaXMucGFydGljbGVzLnB1c2gocCk7XG4gICAgfVxufVxuXG5BbmltYXRpb24ucHJvdG90eXBlLmFkZEhhemFyZHMgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBib3VuZHMgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGNvbnN0IG4gPSBSYW5kb20ubnVtKDEsIDMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHcgPSBSYW5kb20ubnVtKDUwLCAyMDApO1xuICAgICAgICBjb25zdCBoID0gUmFuZG9tLm51bSg1MCwgMjAwKTtcblxuICAgICAgICB0aGlzLmdyaWQuc2V0QXJlYSh7XG4gICAgICAgICAgICB4OiBSYW5kb20ubnVtKDAsIGJvdW5kcy53aWR0aCAtIHcpLFxuICAgICAgICAgICAgeTogUmFuZG9tLm51bSgwLCBib3VuZHMuaGVpZ2h0IC0gaCksXG4gICAgICAgICAgICB3LFxuICAgICAgICAgICAgaCxcbiAgICAgICAgICAgIHR5cGU6IEVOVElUSUVTLkhBWkFSRFxuICAgICAgICB9LCB0aGlzLmNvbnRhaW5lcik7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBBbmltYXRpb247XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8ganMvYW5pbWF0aW9uLmpzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFPQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ=="); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 21);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _grid = __webpack_require__(/*! ./grid */ 84);\n\nvar _grid2 = _interopRequireDefault(_grid);\n\nvar _particle = __webpack_require__(/*! ./particle */ 86);\n\nvar _particle2 = _interopRequireDefault(_particle);\n\nvar _controls = __webpack_require__(/*! ./controls */ 14);\n\nvar _controls2 = _interopRequireDefault(_controls);\n\nvar _random = __webpack_require__(/*! ./random */ 33);\n\nvar _random2 = _interopRequireDefault(_random);\n\nvar _enums = __webpack_require__(/*! ./enums */ 22);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Animation(observables, id, showHazards) {\n this.id = id;\n this.observables = observables;\n this.particles = [];\n this.grid = new _grid2.default();\n this.fpsInterval = null;\n\n this.container = document.createElement('div');\n this.container.className = 'animationContainer';\n document.getElementById(id).appendChild(this.container);\n\n this.observables.count$.skip(1).subscribe(this.subscribeCount.bind(this));\n this.observables.animating$.subscribe(this.subscribeAnimating.bind(this));\n}\n\nAnimation.prototype.subscribeAnimating = function (isAnimating) {\n if (isAnimating === false) {\n clearInterval(this.fpsInterval);\n } else {\n var fps$ = this.observables.fps$;\n\n this.fpsInterval = setInterval(fps$.next.bind(fps$), 1000 / 32);\n }\n};\n\nAnimation.prototype.subscribeCount = function (count) {\n var bounds = this.container.getBoundingClientRect();\n\n while (this.particles.length > count) {\n var p = this.particles.pop();\n p.remove();\n }\n\n while (this.particles.length < count) {\n var _p = new _particle2.default(this.container, bounds, this.grid, this.observables);\n this.particles.push(_p);\n }\n};\n\nAnimation.prototype.addHazards = function () {\n var bounds = this.container.getBoundingClientRect();\n\n // const n = Random.num(1, 3);\n var n = 3;\n for (var i = 0; i < n; i++) {\n var w = _random2.default.num(50, 200);\n var h = _random2.default.num(50, 200);\n\n this.grid.setArea({\n x: _random2.default.num(0, bounds.width - w),\n y: _random2.default.num(0, bounds.height - h),\n w: w,\n h: h,\n type: _enums.ENTITIES.HAZARD\n }, this.container);\n }\n};\n\nexports.default = Animation;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvYW5pbWF0aW9uLmpzPzBiNTMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJ4LCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCBHcmlkIGZyb20gJy4vZ3JpZCc7XG5pbXBvcnQgUGFydGljbGUgZnJvbSAnLi9wYXJ0aWNsZSc7XG5pbXBvcnQgQ29udHJvbHMgZnJvbSAnLi9jb250cm9scyc7XG5pbXBvcnQgUmFuZG9tIGZyb20gJy4vcmFuZG9tJztcbmltcG9ydCB7IENPTlRST0xTLCBFTlRJVElFUyB9IGZyb20gJy4vZW51bXMnO1xuXG5mdW5jdGlvbiBBbmltYXRpb24ob2JzZXJ2YWJsZXMsIGlkLCBzaG93SGF6YXJkcykge1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLm9ic2VydmFibGVzID0gb2JzZXJ2YWJsZXM7XG4gICAgdGhpcy5wYXJ0aWNsZXMgPSBbXTtcbiAgICB0aGlzLmdyaWQgPSBuZXcgR3JpZCgpO1xuICAgIHRoaXMuZnBzSW50ZXJ2YWwgPSBudWxsO1xuXG4gICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSAnYW5pbWF0aW9uQ29udGFpbmVyJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIpO1xuXG4gICAgdGhpcy5vYnNlcnZhYmxlcy5jb3VudCQuc2tpcCgxKS5zdWJzY3JpYmUodGhpcy5zdWJzY3JpYmVDb3VudC5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLm9ic2VydmFibGVzLmFuaW1hdGluZyQuc3Vic2NyaWJlKHRoaXMuc3Vic2NyaWJlQW5pbWF0aW5nLmJpbmQodGhpcykpO1xufVxuXG5BbmltYXRpb24ucHJvdG90eXBlLnN1YnNjcmliZUFuaW1hdGluZyA9IGZ1bmN0aW9uKGlzQW5pbWF0aW5nKSB7XG4gICAgaWYgKGlzQW5pbWF0aW5nID09PSBmYWxzZSkge1xuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuZnBzSW50ZXJ2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHsgZnBzJCB9ID0gdGhpcy5vYnNlcnZhYmxlcztcbiAgICAgICAgdGhpcy5mcHNJbnRlcnZhbCA9IHNldEludGVydmFsKGZwcyQubmV4dC5iaW5kKGZwcyQpLCAxMDAwIC8gMzIpO1xuICAgIH1cbn1cblxuQW5pbWF0aW9uLnByb3RvdHlwZS5zdWJzY3JpYmVDb3VudCA9IGZ1bmN0aW9uKGNvdW50KSB7XG4gICAgY29uc3QgYm91bmRzID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICB3aGlsZSAodGhpcy5wYXJ0aWNsZXMubGVuZ3RoID4gY291bnQpIHtcbiAgICAgICAgY29uc3QgcCA9IHRoaXMucGFydGljbGVzLnBvcCgpO1xuICAgICAgICBwLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIHdoaWxlICh0aGlzLnBhcnRpY2xlcy5sZW5ndGggPCBjb3VudCkge1xuICAgICAgICBjb25zdCBwID0gbmV3IFBhcnRpY2xlKHRoaXMuY29udGFpbmVyLCBib3VuZHMsIHRoaXMuZ3JpZCwgdGhpcy5vYnNlcnZhYmxlcyk7XG4gICAgICAgIHRoaXMucGFydGljbGVzLnB1c2gocCk7XG4gICAgfVxufVxuXG5BbmltYXRpb24ucHJvdG90eXBlLmFkZEhhemFyZHMgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBib3VuZHMgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIC8vIGNvbnN0IG4gPSBSYW5kb20ubnVtKDEsIDMpO1xuICAgIGNvbnN0IG4gPSAzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgY29uc3QgdyA9IFJhbmRvbS5udW0oNTAsIDIwMCk7XG4gICAgICAgIGNvbnN0IGggPSBSYW5kb20ubnVtKDUwLCAyMDApO1xuXG4gICAgICAgIHRoaXMuZ3JpZC5zZXRBcmVhKHtcbiAgICAgICAgICAgIHg6IFJhbmRvbS5udW0oMCwgYm91bmRzLndpZHRoIC0gdyksXG4gICAgICAgICAgICB5OiBSYW5kb20ubnVtKDAsIGJvdW5kcy5oZWlnaHQgLSBoKSxcbiAgICAgICAgICAgIHcsXG4gICAgICAgICAgICBoLFxuICAgICAgICAgICAgdHlwZTogRU5USVRJRVMuSEFaQVJEXG4gICAgICAgIH0sIHRoaXMuY29udGFpbmVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFuaW1hdGlvbjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBqcy9hbmltYXRpb24uanMiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBT0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0="); /***/ }), /* 16 */ @@ -1078,7 +1078,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n}); /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = Grid;\nfunction Grid() {\n this.points = {};\n this.gridSize = 5;\n};\n\nGrid.prototype.getKey = function (_ref) {\n var x = _ref.x,\n y = _ref.y,\n type = _ref.type;\n\n var gridX = x - x % this.gridSize;\n var gridY = y - y % this.gridSize;\n\n return gridX + '-' + gridY + '-' + type;\n};\n\nGrid.prototype.setPoint = function (_ref2, value) {\n var x = _ref2.x,\n y = _ref2.y,\n type = _ref2.type;\n\n this.points[this.getKey({ x: x, y: y, type: type })] = value;\n};\n\nGrid.prototype.getPoint = function (_ref3) {\n var x = _ref3.x,\n y = _ref3.y,\n type = _ref3.type;\n\n return this.points[this.getKey({ x: x, y: y, type: type })];\n};\n\nGrid.prototype.deletePoint = function (_ref4) {\n var x = _ref4.x,\n y = _ref4.y,\n type = _ref4.type;\n\n delete this.points[this.getKey({ x: x, y: y, type: type })];\n};\n\nGrid.prototype.setArea = function (_ref5, container) {\n var x = _ref5.x,\n y = _ref5.y,\n w = _ref5.w,\n h = _ref5.h,\n type = _ref5.type;\n\n for (var i = x; i <= x + w; i += this.gridSize) {\n for (var j = y; j <= y + h; j += this.gridSize) {\n this.setPoint({ x: i, y: j, type: type }, true);\n }\n }\n\n var div = document.createElement('div');\n div.className = 'hazard';\n div.style.left = x + 'px';\n div.style.top = y + 'px';\n div.style.height = h + 'px';\n div.style.width = w + 'px';\n container.appendChild(div);\n\n for (var _i = x; _i <= x + w; _i += this.gridSize) {\n for (var _j = y; _j <= y + h; _j += this.gridSize) {\n var dot = document.createElement('dot');\n dot.className = 'hazard-dot';\n dot.style.left = _i - x + 'px';\n dot.style.top = _j - y + 'px';\n div.appendChild(dot);\n }\n }\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvZ3JpZC5qcz9lMjZjIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEdyaWQoKSB7XG4gICAgdGhpcy5wb2ludHMgPSB7fTtcbiAgICB0aGlzLmdyaWRTaXplID0gNTtcbn07XG5cbkdyaWQucHJvdG90eXBlLmdldEtleSA9IGZ1bmN0aW9uKHsgeCwgeSwgdHlwZSB9KSB7XG4gICAgY29uc3QgZ3JpZFggPSB4IC0geCAlIHRoaXMuZ3JpZFNpemU7XG4gICAgY29uc3QgZ3JpZFkgPSB5IC0geSAlIHRoaXMuZ3JpZFNpemU7XG5cbiAgICByZXR1cm4gYCR7Z3JpZFh9LSR7Z3JpZFl9LSR7dHlwZX1gO1xufVxuXG5HcmlkLnByb3RvdHlwZS5zZXRQb2ludCA9IGZ1bmN0aW9uKHsgeCwgeSwgdHlwZSB9LCB2YWx1ZSkge1xuICAgIHRoaXMucG9pbnRzW3RoaXMuZ2V0S2V5KHsgeCwgeSwgdHlwZSB9KV0gPSB2YWx1ZTtcbn07XG5cbkdyaWQucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24oeyB4LCB5LCB0eXBlIH0pIHtcbiAgICByZXR1cm4gdGhpcy5wb2ludHNbdGhpcy5nZXRLZXkoeyB4LCB5LCB0eXBlIH0pXTtcbn1cblxuR3JpZC5wcm90b3R5cGUuZGVsZXRlUG9pbnQgPSBmdW5jdGlvbih7IHgsIHksIHR5cGUgfSkge1xuICAgIGRlbGV0ZSB0aGlzLnBvaW50c1t0aGlzLmdldEtleSh7IHgsIHksIHR5cGUgfSldO1xufTtcblxuR3JpZC5wcm90b3R5cGUuc2V0QXJlYSA9IGZ1bmN0aW9uKHsgeCwgeSwgdywgaCwgdHlwZSB9LCBjb250YWluZXIpIHtcbiAgICBmb3IgKGxldCBpID0geDsgaSA8PSAoeCArIHcpOyBpICs9IHRoaXMuZ3JpZFNpemUpIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IHk7IGogPD0gKHkgKyBoKTsgaiArPSB0aGlzLmdyaWRTaXplKSB7XG4gICAgICAgICAgICB0aGlzLnNldFBvaW50KHsgeDogaSwgeTogaiwgdHlwZSB9LCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi5jbGFzc05hbWUgPSAnaGF6YXJkJztcbiAgICBkaXYuc3R5bGUubGVmdCA9IGAke3h9cHhgO1xuICAgIGRpdi5zdHlsZS50b3AgPSBgJHt5fXB4YDtcbiAgICBkaXYuc3R5bGUuaGVpZ2h0ID0gYCR7aH1weGA7XG4gICAgZGl2LnN0eWxlLndpZHRoID0gYCR7d31weGA7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGRpdik7XG5cbiAgICBmb3IgKGxldCBpID0geDsgaSA8PSAoeCArIHcpOyBpICs9IHRoaXMuZ3JpZFNpemUpIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IHk7IGogPD0gKHkgKyBoKTsgaiArPSB0aGlzLmdyaWRTaXplKSB7XG4gICAgICAgICAgICBjb25zdCBkb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkb3QnKTtcbiAgICAgICAgICAgIGRvdC5jbGFzc05hbWUgPSAnaGF6YXJkLWRvdCc7XG4gICAgICAgICAgICBkb3Quc3R5bGUubGVmdCA9IGAke2kgLSB4fXB4YDtcbiAgICAgICAgICAgIGRvdC5zdHlsZS50b3AgPSBgJHtqIC0geX1weGA7XG4gICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZG90KTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8ganMvZ3JpZC5qcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0="); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = Grid;\nfunction Grid() {\n this.points = {};\n this.gridSize = 5;\n};\n\nGrid.prototype.fitToGrid = function (n) {\n return n - n % this.gridSize;\n};\n\nGrid.prototype.getKey = function (_ref) {\n var x = _ref.x,\n y = _ref.y,\n type = _ref.type;\n\n var gridX = this.fitToGrid(x);\n var gridY = this.fitToGrid(y);\n\n return gridX + '-' + gridY + '-' + type;\n};\n\nGrid.prototype.setPoint = function (_ref2, value) {\n var x = _ref2.x,\n y = _ref2.y,\n type = _ref2.type;\n\n this.points[this.getKey({ x: x, y: y, type: type })] = value;\n};\n\nGrid.prototype.getPoint = function (_ref3) {\n var x = _ref3.x,\n y = _ref3.y,\n type = _ref3.type;\n\n return this.points[this.getKey({ x: x, y: y, type: type })];\n};\n\nGrid.prototype.deletePoint = function (_ref4) {\n var x = _ref4.x,\n y = _ref4.y,\n type = _ref4.type;\n\n delete this.points[this.getKey({ x: x, y: y, type: type })];\n};\n\nGrid.prototype.setArea = function (_ref5, container) {\n var x = _ref5.x,\n y = _ref5.y,\n w = _ref5.w,\n h = _ref5.h,\n type = _ref5.type;\n\n var xFit = this.fitToGrid(x);\n var yFit = this.fitToGrid(y);\n var wFit = this.fitToGrid(w);\n var hFit = this.fitToGrid(h);\n\n var div = document.createElement('div');\n div.className = 'hazard';\n div.style.left = xFit + 'px';\n div.style.width = wFit + 'px';\n div.style.top = yFit + 'px';\n div.style.height = hFit + 'px';\n container.appendChild(div);\n\n for (var i = xFit; i <= xFit + wFit; i += this.gridSize) {\n for (var j = yFit; j <= yFit + hFit; j += this.gridSize) {\n this.setPoint({ x: i, y: j, type: type }, true);\n\n var dot = document.createElement('dot');\n dot.className = 'hazard-dot';\n dot.style.left = i - xFit + 'px';\n dot.style.top = j - yFit + 'px';\n div.appendChild(dot);\n }\n }\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvZ3JpZC5qcz9lMjZjIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEdyaWQoKSB7XG4gICAgdGhpcy5wb2ludHMgPSB7fTtcbiAgICB0aGlzLmdyaWRTaXplID0gNTtcbn07XG5cbkdyaWQucHJvdG90eXBlLmZpdFRvR3JpZCA9IGZ1bmN0aW9uKG4pIHtcbiAgICByZXR1cm4gbiAtIG4gJSB0aGlzLmdyaWRTaXplO1xufVxuXG5HcmlkLnByb3RvdHlwZS5nZXRLZXkgPSBmdW5jdGlvbih7IHgsIHksIHR5cGUgfSkge1xuICAgIGNvbnN0IGdyaWRYID0gdGhpcy5maXRUb0dyaWQoeCk7XG4gICAgY29uc3QgZ3JpZFkgPSB0aGlzLmZpdFRvR3JpZCh5KTtcblxuICAgIHJldHVybiBgJHtncmlkWH0tJHtncmlkWX0tJHt0eXBlfWA7XG59XG5cbkdyaWQucHJvdG90eXBlLnNldFBvaW50ID0gZnVuY3Rpb24oeyB4LCB5LCB0eXBlIH0sIHZhbHVlKSB7XG4gICAgdGhpcy5wb2ludHNbdGhpcy5nZXRLZXkoeyB4LCB5LCB0eXBlIH0pXSA9IHZhbHVlO1xufTtcblxuR3JpZC5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbih7IHgsIHksIHR5cGUgfSkge1xuICAgIHJldHVybiB0aGlzLnBvaW50c1t0aGlzLmdldEtleSh7IHgsIHksIHR5cGUgfSldO1xufVxuXG5HcmlkLnByb3RvdHlwZS5kZWxldGVQb2ludCA9IGZ1bmN0aW9uKHsgeCwgeSwgdHlwZSB9KSB7XG4gICAgZGVsZXRlIHRoaXMucG9pbnRzW3RoaXMuZ2V0S2V5KHsgeCwgeSwgdHlwZSB9KV07XG59O1xuXG5HcmlkLnByb3RvdHlwZS5zZXRBcmVhID0gZnVuY3Rpb24oeyB4LCB5LCB3LCBoLCB0eXBlIH0sIGNvbnRhaW5lcikge1xuICAgIGNvbnN0IHhGaXQgPSB0aGlzLmZpdFRvR3JpZCh4KTtcbiAgICBjb25zdCB5Rml0ID0gdGhpcy5maXRUb0dyaWQoeSk7XG4gICAgY29uc3Qgd0ZpdCA9IHRoaXMuZml0VG9HcmlkKHcpO1xuICAgIGNvbnN0IGhGaXQgPSB0aGlzLmZpdFRvR3JpZChoKTtcblxuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi5jbGFzc05hbWUgPSAnaGF6YXJkJztcbiAgICBkaXYuc3R5bGUubGVmdCA9IGAke3hGaXR9cHhgO1xuICAgIGRpdi5zdHlsZS53aWR0aCA9IGAke3dGaXR9cHhgO1xuICAgIGRpdi5zdHlsZS50b3AgPSBgJHt5Rml0fXB4YDtcbiAgICBkaXYuc3R5bGUuaGVpZ2h0ID0gYCR7aEZpdH1weGA7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGRpdik7XG5cbiAgICBmb3IgKGxldCBpID0geEZpdDsgaSA8PSB4Rml0ICsgd0ZpdDsgaSArPSB0aGlzLmdyaWRTaXplKSB7XG4gICAgICAgIGZvciAobGV0IGogPSB5Rml0OyBqIDw9IHlGaXQgKyBoRml0OyBqICs9IHRoaXMuZ3JpZFNpemUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UG9pbnQoeyB4OiBpLCB5OiBqLCB0eXBlIH0sIHRydWUpO1xuXG4gICAgICAgICAgICBjb25zdCBkb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkb3QnKTtcbiAgICAgICAgICAgIGRvdC5jbGFzc05hbWUgPSAnaGF6YXJkLWRvdCc7XG4gICAgICAgICAgICBkb3Quc3R5bGUubGVmdCA9IGAke2kgLSB4Rml0fXB4YDtcbiAgICAgICAgICAgIGRvdC5zdHlsZS50b3AgPSBgJHtqIC0geUZpdH1weGA7XG4gICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZG90KTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8ganMvZ3JpZC5qcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9"); /***/ }), /* 85 */ @@ -1090,7 +1090,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n}); /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 21);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _animation1a = __webpack_require__(/*! ./animation1a */ 73);\n\nvar _animation1a2 = _interopRequireDefault(_animation1a);\n\nvar _animation1b = __webpack_require__(/*! ./animation1b */ 74);\n\nvar _animation1b2 = _interopRequireDefault(_animation1b);\n\nvar _animation2a = __webpack_require__(/*! ./animation2a */ 75);\n\nvar _animation2a2 = _interopRequireDefault(_animation2a);\n\nvar _animation2b = __webpack_require__(/*! ./animation2b */ 76);\n\nvar _animation2b2 = _interopRequireDefault(_animation2b);\n\nvar _animation3a = __webpack_require__(/*! ./animation3a */ 77);\n\nvar _animation3a2 = _interopRequireDefault(_animation3a);\n\nvar _animation3b = __webpack_require__(/*! ./animation3b */ 78);\n\nvar _animation3b2 = _interopRequireDefault(_animation3b);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n__webpack_require__(/*! ../css/reset.scss */ 82);\n__webpack_require__(/*! ../css/index.scss */ 80);\n__webpack_require__(/*! ../css/particle.scss */ 81);\n__webpack_require__(/*! ../css/controls.scss */ 79);\n\nwindow.addEventListener('load', function () {\n var destroy$ = new _rxjs2.default.BehaviorSubject(null);\n\n (0, _animation1a2.default)(destroy$);\n (0, _animation1b2.default)(destroy$);\n (0, _animation2a2.default)(destroy$);\n (0, _animation2b2.default)(destroy$);\n (0, _animation3a2.default)(destroy$);\n (0, _animation3b2.default)(destroy$);\n});\n\n// TODO remove bottom padding from Disqus\n// TODO fix \"hangup\" small radius evade bug\n// TODO don't load simulation until requested\n// TODO sort out particle nextframe\n// TODO abs positioning on controls elements so order doesn't matter\n// TODO BehaviorSubject listener on bounds change\n// TODO are vision grid nodes removed properly\n// TODO overlapping grid points\n// TODO grid touches\n\n// TODO ANIM1ab free movement\n\n// TODO ANIM3a streamline updateLeader\n// TODO ANIM3b separation\n// TODO ANIM3c alignment//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvaW5kZXguanM/NDJmNiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IEFuaW1hdGlvbjFhIGZyb20gJy4vYW5pbWF0aW9uMWEnO1xuaW1wb3J0IEFuaW1hdGlvbjFiIGZyb20gJy4vYW5pbWF0aW9uMWInO1xuaW1wb3J0IEFuaW1hdGlvbjJhIGZyb20gJy4vYW5pbWF0aW9uMmEnO1xuaW1wb3J0IEFuaW1hdGlvbjJiIGZyb20gJy4vYW5pbWF0aW9uMmInO1xuaW1wb3J0IEFuaW1hdGlvbjNhIGZyb20gJy4vYW5pbWF0aW9uM2EnO1xuaW1wb3J0IEFuaW1hdGlvbjNiIGZyb20gJy4vYW5pbWF0aW9uM2InO1xuXG5yZXF1aXJlKCcuLi9jc3MvcmVzZXQuc2NzcycpO1xucmVxdWlyZSgnLi4vY3NzL2luZGV4LnNjc3MnKTtcbnJlcXVpcmUoJy4uL2Nzcy9wYXJ0aWNsZS5zY3NzJyk7XG5yZXF1aXJlKCcuLi9jc3MvY29udHJvbHMuc2NzcycpO1xuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcbiAgICBjb25zdCBkZXN0cm95JCA9IG5ldyBSeC5CZWhhdmlvclN1YmplY3QobnVsbCk7XG5cbiAgICBBbmltYXRpb24xYShkZXN0cm95JCk7XG4gICAgQW5pbWF0aW9uMWIoZGVzdHJveSQpO1xuICAgIEFuaW1hdGlvbjJhKGRlc3Ryb3kkKTtcbiAgICBBbmltYXRpb24yYihkZXN0cm95JCk7XG4gICAgQW5pbWF0aW9uM2EoZGVzdHJveSQpO1xuICAgIEFuaW1hdGlvbjNiKGRlc3Ryb3kkKTtcbn0pO1xuXG4vLyBUT0RPIHJlbW92ZSBib3R0b20gcGFkZGluZyBmcm9tIERpc3F1c1xuLy8gVE9ETyBmaXggXCJoYW5ndXBcIiBzbWFsbCByYWRpdXMgZXZhZGUgYnVnXG4vLyBUT0RPIGRvbid0IGxvYWQgc2ltdWxhdGlvbiB1bnRpbCByZXF1ZXN0ZWRcbi8vIFRPRE8gc29ydCBvdXQgcGFydGljbGUgbmV4dGZyYW1lXG4vLyBUT0RPIGFicyBwb3NpdGlvbmluZyBvbiBjb250cm9scyBlbGVtZW50cyBzbyBvcmRlciBkb2Vzbid0IG1hdHRlclxuLy8gVE9ETyBCZWhhdmlvclN1YmplY3QgbGlzdGVuZXIgb24gYm91bmRzIGNoYW5nZVxuLy8gVE9ETyBhcmUgdmlzaW9uIGdyaWQgbm9kZXMgcmVtb3ZlZCBwcm9wZXJseVxuLy8gVE9ETyBvdmVybGFwcGluZyBncmlkIHBvaW50c1xuLy8gVE9ETyBncmlkIHRvdWNoZXNcblxuLy8gVE9ETyBBTklNMWFiIGZyZWUgbW92ZW1lbnRcblxuLy8gVE9ETyBBTklNM2Egc3RyZWFtbGluZSB1cGRhdGVMZWFkZXJcbi8vIFRPRE8gQU5JTTNiIHNlcGFyYXRpb25cbi8vIFRPRE8gQU5JTTNjIGFsaWdubWVudFxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGpzL2luZGV4LmpzIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0="); +eval("\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 21);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _animation1a = __webpack_require__(/*! ./animation1a */ 73);\n\nvar _animation1a2 = _interopRequireDefault(_animation1a);\n\nvar _animation1b = __webpack_require__(/*! ./animation1b */ 74);\n\nvar _animation1b2 = _interopRequireDefault(_animation1b);\n\nvar _animation2a = __webpack_require__(/*! ./animation2a */ 75);\n\nvar _animation2a2 = _interopRequireDefault(_animation2a);\n\nvar _animation2b = __webpack_require__(/*! ./animation2b */ 76);\n\nvar _animation2b2 = _interopRequireDefault(_animation2b);\n\nvar _animation3a = __webpack_require__(/*! ./animation3a */ 77);\n\nvar _animation3a2 = _interopRequireDefault(_animation3a);\n\nvar _animation3b = __webpack_require__(/*! ./animation3b */ 78);\n\nvar _animation3b2 = _interopRequireDefault(_animation3b);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n__webpack_require__(/*! ../css/reset.scss */ 82);\n__webpack_require__(/*! ../css/index.scss */ 80);\n__webpack_require__(/*! ../css/particle.scss */ 81);\n__webpack_require__(/*! ../css/controls.scss */ 79);\n\nwindow.addEventListener('load', function () {\n var destroy$ = new _rxjs2.default.BehaviorSubject(null);\n\n (0, _animation1a2.default)(destroy$);\n (0, _animation1b2.default)(destroy$);\n (0, _animation2a2.default)(destroy$);\n (0, _animation2b2.default)(destroy$);\n (0, _animation3a2.default)(destroy$);\n (0, _animation3b2.default)(destroy$);\n});\n\n// TODO remove bottom padding from Disqus\n// TODO fix \"hangup\" small radius evade bug\n// TODO sort out particle nextframe\n// TODO abs positioning on controls elements so order doesn't matter\n// TODO BehaviorSubject listener on bounds change\n// TODO are vision grid nodes removed properly\n// TODO overlapping grid points\n// TODO grid touches\n\n// TODO ANIM1ab free movement\n\n// TODO ANIM3a streamline updateLeader\n// TODO ANIM3b separation\n// TODO ANIM3c alignment//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvaW5kZXguanM/NDJmNiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IEFuaW1hdGlvbjFhIGZyb20gJy4vYW5pbWF0aW9uMWEnO1xuaW1wb3J0IEFuaW1hdGlvbjFiIGZyb20gJy4vYW5pbWF0aW9uMWInO1xuaW1wb3J0IEFuaW1hdGlvbjJhIGZyb20gJy4vYW5pbWF0aW9uMmEnO1xuaW1wb3J0IEFuaW1hdGlvbjJiIGZyb20gJy4vYW5pbWF0aW9uMmInO1xuaW1wb3J0IEFuaW1hdGlvbjNhIGZyb20gJy4vYW5pbWF0aW9uM2EnO1xuaW1wb3J0IEFuaW1hdGlvbjNiIGZyb20gJy4vYW5pbWF0aW9uM2InO1xuXG5yZXF1aXJlKCcuLi9jc3MvcmVzZXQuc2NzcycpO1xucmVxdWlyZSgnLi4vY3NzL2luZGV4LnNjc3MnKTtcbnJlcXVpcmUoJy4uL2Nzcy9wYXJ0aWNsZS5zY3NzJyk7XG5yZXF1aXJlKCcuLi9jc3MvY29udHJvbHMuc2NzcycpO1xuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcbiAgICBjb25zdCBkZXN0cm95JCA9IG5ldyBSeC5CZWhhdmlvclN1YmplY3QobnVsbCk7XG5cbiAgICBBbmltYXRpb24xYShkZXN0cm95JCk7XG4gICAgQW5pbWF0aW9uMWIoZGVzdHJveSQpO1xuICAgIEFuaW1hdGlvbjJhKGRlc3Ryb3kkKTtcbiAgICBBbmltYXRpb24yYihkZXN0cm95JCk7XG4gICAgQW5pbWF0aW9uM2EoZGVzdHJveSQpO1xuICAgIEFuaW1hdGlvbjNiKGRlc3Ryb3kkKTtcbn0pO1xuXG4vLyBUT0RPIHJlbW92ZSBib3R0b20gcGFkZGluZyBmcm9tIERpc3F1c1xuLy8gVE9ETyBmaXggXCJoYW5ndXBcIiBzbWFsbCByYWRpdXMgZXZhZGUgYnVnXG4vLyBUT0RPIHNvcnQgb3V0IHBhcnRpY2xlIG5leHRmcmFtZVxuLy8gVE9ETyBhYnMgcG9zaXRpb25pbmcgb24gY29udHJvbHMgZWxlbWVudHMgc28gb3JkZXIgZG9lc24ndCBtYXR0ZXJcbi8vIFRPRE8gQmVoYXZpb3JTdWJqZWN0IGxpc3RlbmVyIG9uIGJvdW5kcyBjaGFuZ2Vcbi8vIFRPRE8gYXJlIHZpc2lvbiBncmlkIG5vZGVzIHJlbW92ZWQgcHJvcGVybHlcbi8vIFRPRE8gb3ZlcmxhcHBpbmcgZ3JpZCBwb2ludHNcbi8vIFRPRE8gZ3JpZCB0b3VjaGVzXG5cbi8vIFRPRE8gQU5JTTFhYiBmcmVlIG1vdmVtZW50XG5cbi8vIFRPRE8gQU5JTTNhIHN0cmVhbWxpbmUgdXBkYXRlTGVhZGVyXG4vLyBUT0RPIEFOSU0zYiBzZXBhcmF0aW9uXG4vLyBUT0RPIEFOSU0zYyBhbGlnbm1lbnRcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBqcy9pbmRleC5qcyJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ=="); /***/ }), /* 86 */ diff --git a/js/grid.js b/js/grid.js index 062d3aa..4b2d6d6 100644 --- a/js/grid.js +++ b/js/grid.js @@ -3,9 +3,13 @@ export default function Grid() { this.gridSize = 5; }; +Grid.prototype.fitToGrid = function(n) { + return n - n % this.gridSize; +} + Grid.prototype.getKey = function({ x, y, type }) { - const gridX = x - x % this.gridSize; - const gridY = y - y % this.gridSize; + const gridX = this.fitToGrid(x); + const gridY = this.fitToGrid(y); return `${gridX}-${gridY}-${type}`; } @@ -23,26 +27,27 @@ Grid.prototype.deletePoint = function({ x, y, type }) { }; Grid.prototype.setArea = function({ x, y, w, h, type }, container) { - for (let i = x; i <= (x + w); i += this.gridSize) { - for (let j = y; j <= (y + h); j += this.gridSize) { - this.setPoint({ x: i, y: j, type }, true); - } - } + const xFit = this.fitToGrid(x); + const yFit = this.fitToGrid(y); + const wFit = this.fitToGrid(w); + const hFit = this.fitToGrid(h); const div = document.createElement('div'); div.className = 'hazard'; - div.style.left = `${x}px`; - div.style.top = `${y}px`; - div.style.height = `${h}px`; - div.style.width = `${w}px`; + div.style.left = `${xFit}px`; + div.style.width = `${wFit}px`; + div.style.top = `${yFit}px`; + div.style.height = `${hFit}px`; container.appendChild(div); - for (let i = x; i <= (x + w); i += this.gridSize) { - for (let j = y; j <= (y + h); j += this.gridSize) { + for (let i = xFit; i <= xFit + wFit; i += this.gridSize) { + for (let j = yFit; j <= yFit + hFit; j += this.gridSize) { + this.setPoint({ x: i, y: j, type }, true); + const dot = document.createElement('dot'); dot.className = 'hazard-dot'; - dot.style.left = `${i - x}px`; - dot.style.top = `${j - y}px`; + dot.style.left = `${i - xFit}px`; + dot.style.top = `${j - yFit}px`; div.appendChild(dot); } } diff --git a/js/index.js b/js/index.js index 01849e2..f691387 100644 --- a/js/index.js +++ b/js/index.js @@ -24,7 +24,6 @@ window.addEventListener('load', () => { // TODO remove bottom padding from Disqus // TODO fix "hangup" small radius evade bug -// TODO don't load simulation until requested // TODO sort out particle nextframe // TODO abs positioning on controls elements so order doesn't matter // TODO BehaviorSubject listener on bounds change