{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-mpm-debugging/src/mpm-debugger/src/external/vector2.js"],"names":["Vector2","x","y","Error","Zero","One","XAxis","YAxis","fromAngle","theta","Math","cos","sin","prototype","copy","set","vector","setXY","clear","floor","floorSelf","frac","fracSelf","equals","notEquals","add","addSelf","weightedAddSelf","scalar","sub","subSelf","mulFloat","right","mulFloatSelf","divFloat","inv","divFloatSelf","mulVector","mulVectorSelf","divVector","divVectorSelf","positive","negative","length","sqrt","lengthSquared","distance","distanceSquared","normalize","invL","normalizedCopy","ret","dotProduct","getPerpendicular","getRightPerpendicular","getLeftPerpendicular","makePerpendicular","tempX","crossProduct","lerp","to","i","lerpSelf","slerp","rotate","co","si","rotateSelf","xx","getDirectedAngle","point","atan2","PI","reflectOnNormal","normal","newVector","toCartesian","toPolar","signum","sign","absolute","abs","toJson","resultJson","fromJson","vectorJson"],"mappings":"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","file":"vector2.js","sourcesContent":["\tvar Vector2 = function(x, y) {\n\t\tif(typeof y === \"undefined\")\n\t\t\tthrow Error(\"initialize Vector2 with less than 2 parameter\");\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t};\n\n\tVector2.Zero = new Vector2(0, 0);\n\tVector2.One = new Vector2(1, 1);\n\tVector2.XAxis = new Vector2(1, 0);\n\tVector2.YAxis = new Vector2(0, 1);\n\tVector2.fromAngle = function(theta) {\n\t\treturn new Vector2(Math.cos(theta), Math.sin(theta));\n\t};\n\t\n\tVector2.prototype.copy = function() {\n\t\treturn new Vector2(this.x, this.y);\n\t};\n\n\tVector2.prototype.set = function(vector) {\n\t\tthis.x = vector.x;\n\t\tthis.y = vector.y;\n\t\treturn this;\n\t};\n\n\tVector2.prototype.setXY = function(x, y) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\treturn this;\n\t};\n\n\tVector2.prototype.clear = function() {\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\t};\n\n\tVector2.prototype.floor = function() {\n\t\treturn new Vector2(\n\t\t\tMath.floor(this.x),\n\t\t\tMath.floor(this.y)\n\t\t);\n\t};\n\n\tVector2.prototype.floorSelf = function() {\n\t\tthis.x = Math.floor(this.x);\n\t\tthis.y = Math.floor(this.y);\n\t};\n\n\tVector2.prototype.frac = function() {\n\t\treturn new Vector2(\n\t\t\tthis.x - Math.floor(this.x),\n\t\t\tthis.y - Math.floor(this.y)\n\t\t);\n\t};\n\n\tVector2.prototype.fracSelf = function() {\n\t\tthis.x -= Math.floor(this.x);\n\t\tthis.y -= Math.floor(this.y);\n\t};\n\n\tVector2.prototype.equals = function(vector) {\n\t\treturn this.x == vector.x && this.y == vector.y;\n\t};\n\n\tVector2.prototype.notEquals = function(vector) {\n\t\treturn this.x != vector.x || this.y != vector.y;\n\t};\n\n\tVector2.prototype.add = function(vector) {\n\t\treturn new Vector2(\n\t\t\tthis.x + vector.x,\n\t\t\tthis.y + vector.y\n\t\t);\n\t};\n\tVector2.prototype.addSelf = function(vector) {\n\t\tthis.x += vector.x;\n\t\tthis.y += vector.y;\n\t\treturn this;\n\t};\n\t\t\n\tVector2.prototype.weightedAddSelf = function(vector, scalar) {\n\t\tthis.x += vector.x * scalar;\n\t\tthis.y += vector.y * scalar;\n\t\treturn this;\n\t};\n\t\t\n\tVector2.prototype.sub = function(vector) {\n\t\treturn new Vector2(\n\t\t\tthis.x - vector.x,\n\t\t\tthis.y - vector.y\n\t\t);\n\t};\n\tVector2.prototype.subSelf = function(vector) {\n\t\tthis.x -= vector.x;\n\t\tthis.y -= vector.y;\n\t\treturn this;\n\t};\n\t\t\n\t// scaling!\n\tVector2.prototype.mulFloat = function(right) {\n\t\treturn new Vector2(\n\t\t\tthis.x * right,\n\t\t\tthis.y * right\n\t\t);\n\t};\n\tVector2.prototype.mulFloatSelf = function(right) {\n\t\tthis.x *= right;\n\t\tthis.y *= right;\n\t\treturn this;\n\t};\n\t\t\n\tVector2.prototype.divFloat = function(right) {\n\t\tvar inv = 1.0 / right;\n\t\treturn new Vector2(\n\t\t\tthis.x * inv,\n\t\t\tthis.y * inv\n\t\t);\n\t};\n\tVector2.prototype.divFloatSelf = function(right) {\n\t\tthis.x /= right;\n\t\tthis.y /= right;\n\t\treturn this;\n\t};\n\n\t// per-element multiplication\n\tVector2.prototype.mulVector = function(right) {\n\t\treturn new Vector2(\n\t\t\tthis.x * right.x,\n\t\t\tthis.y * right.y\n\t\t);\n\t};\n\tVector2.prototype.mulVectorSelf = function(right) {\n\t\tthis.x *= right.x;\n\t\tthis.y *= right.y;\n\t\treturn this;\n\t};\n\n\tVector2.prototype.divVector = function(right) {\n\t\treturn new Vector2(\n\t\t\tthis.x / right.x,\n\t\t\tthis.y / right.y\n\t\t);\n\t};\n\tVector2.prototype.divVectorSelf = function(right) {\n\t\tthis.x /= right.x;\n\t\tthis.y /= right.y;\n\t\treturn this;\n\t};\n\n\tVector2.prototype.positive = function() { return this; };\n\tVector2.prototype.negative = function() {\n\t\treturn new Vector2(-this.x, -this.y);\n\t};\n\n\t// helpers\n\n\tVector2.prototype.length = function() {\n\t\treturn Math.sqrt(this.x*this.x + this.y*this.y);\n\t};\n\tVector2.prototype.lengthSquared = function() {\n\t\treturn this.x*this.x + this.y*this.y;\n\t};\n\tVector2.prototype.distance = function(right) {\n\t\tvar x = this.x - right.x;\n\t\tvar y = this.y - right.y;\n\t\treturn Math.sqrt(x*x + y*y);\n\t};\n\tVector2.prototype.distanceSquared = function(right) {\n\t\tvar x = this.x - right.x;\n\t\tvar y = this.y - right.y;\n\t\treturn x*x + y*y;\n\t};\n\tVector2.prototype.normalize = function() {\n\t\tvar length = Math.sqrt(this.x*this.x + this.y*this.y);\n\t\tif(length > 1e-08) {\n\t\t\tvar invL = 1.0 / length;\n\t\t\tthis.x *= invL;\n\t\t\tthis.y *= invL;\n\t\t}\n\t\treturn length;\n\t};\n\n\tVector2.prototype.normalizedCopy = function() {\n\t\tvar ret = this.copy();\n\t\tret.normalize();\n\t\treturn ret;\n\t};\n\n\tVector2.prototype.dotProduct = function(vector) {\n\t\treturn this.x*vector.x + this.y*vector.y;\n\t};\n\n\tVector2.prototype.getPerpendicular = function() {\n\t\treturn this.getRightPerpendicular();\n\t};\n\n\tVector2.prototype.getLeftPerpendicular = function() {\n\t\tvar x = this.y;\n\t\tvar y = -1 * this.x;\n\t\treturn new Vector2(x, y);\n\t};\n\n\tVector2.prototype.getRightPerpendicular = function() {\n\t\tvar x = -1 * this.y;\n\t\tvar y = this.x;\n\t\treturn new Vector2(x, y);\n\t};\n\n\tVector2.prototype.makePerpendicular = function() {\n\t\tvar tempX = this.x;\n\t\tthis.x = -this.y;\n\t\tthis.y = tempX;\n\t};\n\n\tVector2.prototype.crossProduct = function(vector) {\n\t\treturn this.x * vector.y + this.y * vector.x;\n\t};\n\n\tVector2.prototype.lerp = function(to, i) {\n\t\treturn this.add(to.sub(this).mulFloat(i));\n\t};\n\n\tVector2.prototype.lerpSelf = function(to, i) {\n\t\treturn this.weightedAddSelf(to.sub(this), i);\n\t};\n\n\tVector2.prototype.slerp = function(to, i) {\n\t\treturn this.add(to.sub(this).mulFloat(\n\t\t\t0.5 + (Math.sin((3.141592654 * i) - 1.570796) * 0.5)));\n\t};\n\n\tVector2.prototype.rotate = function(theta) {\n\t\tvar co = Math.cos(theta);\n\t\tvar si = Math.sin(theta);\n\t\treturn new Vector2(\n\t\t\tco * this.x - si * this.y,\n\t\t\tsi * this.x + co * this.y\n\t\t);\n\t};\n\n\tVector2.prototype.rotateSelf = function(theta) {\n\t\tvar co = Math.cos(theta);\n\t\tvar si = Math.sin(theta);\n\t\tvar xx = co * this.x - si * this.y;\n\t\tthis.y = si * this.x + co * this.y;\n\t\tthis.x = xx;\n\t};\n\t\n\t// get (signed and directional) angle between this and the given vector in degrees \n\tVector2.prototype.getDirectedAngle = function(point) {\n\t\treturn Math.atan2(this.crossProduct(point), this.dotProduct(point)) * 180 / Math.PI;\n\t};\n\n\tVector2.prototype.reflectOnNormal = function(normal) {\n\t\t//v' = 2 * (v . n) * n - v\n\t\tvar newVector =\n\t\t\tthis.sub(\n\t\t\t\tnormal\n\t\t\t\t.mulFloat(this.dotProduct(normal))\n\t\t\t\t.mulFloat(2)\n\t\t\t);\n\t\treturn newVector;\n\t\t\n\t};\n\n\tVector2.prototype.toCartesian = function() {\n\t\treturn new Vector2(\n\t\t\tthis.x * Math.cos(this.y),\n\t\t\tthis.x * Math.sin(this.y)\n\t\t);\n\t};\n\n\tVector2.prototype.toPolar = function() {\n\t\treturn new Vector2(\n\t\t\tMath.sqrt(this.x * this.x + this.y * this.y),\n\t\t\tMath.atan2(this.y, this.x)\n\t\t);\n\t};\n\n\tVector2.prototype.signum = function() {\n\t\treturn new Vector2(\n\t\t\tthis.x.sign(),\n\t\t\tthis.y.sign()\n\t\t);\n\t};\n\n\tVector2.prototype.absolute = function() {\n\t\treturn new Vector2(\n\t\t\tMath.abs(this.x),\n\t\t\tMath.abs(this.y)\n\t\t);\n\t};\n\n\n\tVector2.prototype.toJson = function() {\n\t\tvar resultJson = {\n\t\t\t\"x\": this.x,\n\t\t\t\"y\": this.y\n\t\t};\n\n\t\treturn resultJson;\n\t};\n\t\n\tVector2.fromJson = function(vectorJson) {\n\t\treturn new Vector2(vectorJson.x, vectorJson.y);\n\t};\n\t\n\texport default Vector2;\n"]}