{"version":3,"sources":["../src/Line.js"],"names":[],"mappings":"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","file":"Line.js","sourcesContent":["\"use strict\";\r\n\r\nimport { PRECISION } from \"./PRECISION\";\r\nimport { Vector } from \"./Vector\";\r\nimport { Matrix } from \"./Matrix\";\r\nimport { Plane } from \"./Plane\";\r\n\r\nexport class Line\r\n{\r\n constructor (anchor, direction)\r\n {\r\n this.setVectors(anchor, direction);\r\n }\r\n\r\n eql (line)\r\n {\r\n return (this.isParallelTo(line) && this.contains(line.anchor));\r\n }\r\n\r\n dup ()\r\n {\r\n return new Line(this.anchor, this.direction);\r\n }\r\n\r\n translate (vector)\r\n {\r\n var V = vector.elements || vector;\r\n return new Line([\r\n this.anchor.elements[0] + V[0],\r\n this.anchor.elements[1] + V[1],\r\n this.anchor.elements[2] + (V[2] || 0)\r\n ], this.direction);\r\n }\r\n\r\n isParallelTo (obj)\r\n {\r\n if (obj.normal || (obj.start && obj.end))\r\n {\r\n return obj.isParallelTo(this);\r\n }\r\n var theta = this.direction.angleFrom(obj.direction);\r\n return (Math.abs(theta) <= PRECISION || Math.abs(theta - Math.PI) <= PRECISION);\r\n }\r\n\r\n distanceFrom (obj)\r\n {\r\n if (obj.normal || (obj.start && obj.end))\r\n {\r\n return obj.distanceFrom(this);\r\n }\r\n if (obj.direction)\r\n {\r\n // obj is a line\r\n if (this.isParallelTo(obj))\r\n {\r\n return this.distanceFrom(obj.anchor);\r\n }\r\n var N = this.direction.cross(obj.direction).toUnitVector().elements;\r\n var A = this.anchor.elements, B = obj.anchor.elements;\r\n return Math.abs((A[0] - B[0]) * N[0] + (A[1] - B[1]) * N[1] + (A[2] - B[2]) * N[2]);\r\n }\r\n else\r\n {\r\n // obj is a point\r\n var P = obj.elements || obj;\r\n var A = this.anchor.elements, D = this.direction.elements;\r\n var PA1 = P[0] - A[0], PA2 = P[1] - A[1], PA3 = (P[2] || 0) - A[2];\r\n var modPA = Math.sqrt(PA1*PA1 + PA2*PA2 + PA3*PA3);\r\n if (modPA === 0)\r\n {\r\n return 0;\r\n }\r\n // Assumes direction vector is normalized\r\n var cosTheta = (PA1 * D[0] + PA2 * D[1] + PA3 * D[2]) / modPA;\r\n var sin2 = 1 - cosTheta*cosTheta;\r\n return Math.abs(modPA * Math.sqrt(sin2 < 0 ? 0 : sin2));\r\n }\r\n }\r\n\r\n contains (obj)\r\n {\r\n if (obj.start && obj.end)\r\n {\r\n return this.contains(obj.start) && this.contains(obj.end);\r\n }\r\n var dist = this.distanceFrom(obj);\r\n return (dist !== null && dist <= PRECISION);\r\n }\r\n\r\n positionOf (point)\r\n {\r\n if (!this.contains(point))\r\n {\r\n return null;\r\n }\r\n var P = point.elements || point;\r\n var A = this.anchor.elements, D = this.direction.elements;\r\n return (P[0] - A[0]) * D[0] + (P[1] - A[1]) * D[1] + ((P[2] || 0) - A[2]) * D[2];\r\n }\r\n\r\n liesIn (plane)\r\n {\r\n return plane.contains(this);\r\n }\r\n\r\n intersects (obj)\r\n {\r\n if (obj.normal)\r\n {\r\n return obj.intersects(this);\r\n }\r\n return (!this.isParallelTo(obj) && this.distanceFrom(obj) <= PRECISION);\r\n }\r\n\r\n intersectionWith (obj)\r\n {\r\n if (obj.normal || (obj.start && obj.end))\r\n {\r\n return obj.intersectionWith(this);\r\n }\r\n if (!this.intersects(obj))\r\n {\r\n return null;\r\n }\r\n var P = this.anchor.elements,\r\n X = this.direction.elements,\r\n Q = obj.anchor.elements,\r\n Y = obj.direction.elements;\r\n var X1 = X[0], X2 = X[1], X3 = X[2], Y1 = Y[0], Y2 = Y[1], Y3 = Y[2];\r\n var PsubQ1 = P[0] - Q[0], PsubQ2 = P[1] - Q[1], PsubQ3 = P[2] - Q[2];\r\n var XdotQsubP = - X1*PsubQ1 - X2*PsubQ2 - X3*PsubQ3;\r\n var YdotPsubQ = Y1*PsubQ1 + Y2*PsubQ2 + Y3*PsubQ3;\r\n var XdotX = X1*X1 + X2*X2 + X3*X3;\r\n var YdotY = Y1*Y1 + Y2*Y2 + Y3*Y3;\r\n var XdotY = X1*Y1 + X2*Y2 + X3*Y3;\r\n var k = (XdotQsubP * YdotY / XdotX + XdotY * YdotPsubQ) / (YdotY - XdotY * XdotY);\r\n return new Vector([P[0] + k*X1, P[1] + k*X2, P[2] + k*X3]);\r\n }\r\n\r\n pointClosestTo (obj)\r\n {\r\n if (obj.start && obj.end)\r\n {\r\n // obj is a line segment\r\n var P = obj.pointClosestTo(this);\r\n return (P === null) ? null : this.pointClosestTo(P);\r\n }\r\n else if (obj.direction)\r\n {\r\n // obj is a line\r\n if (this.intersects(obj))\r\n {\r\n return this.intersectionWith(obj);\r\n }\r\n if (this.isParallelTo(obj))\r\n {\r\n return null;\r\n }\r\n var D = this.direction.elements, E = obj.direction.elements;\r\n var D1 = D[0], D2 = D[1], D3 = D[2], E1 = E[0], E2 = E[1], E3 = E[2];\r\n // Create plane containing obj and the shared normal and intersect this\r\n // with it Thank you:\r\n // http://www.cgafaq.info/wiki/Line-line_distance\r\n var x = (D3 * E1 - D1 * E3), y = (D1 * E2 - D2 * E1), z = (D2 * E3 - D3 * E2);\r\n var N = [x * E3 - y * E2, y * E1 - z * E3, z * E2 - x * E1];\r\n var P = new Plane(obj.anchor, N);\r\n return P.intersectionWith(this);\r\n }\r\n else\r\n {\r\n // obj is a point\r\n var P = obj.elements || obj;\r\n if (this.contains(P))\r\n {\r\n return new Vector(P);\r\n }\r\n var A = this.anchor.elements, D = this.direction.elements;\r\n var D1 = D[0], D2 = D[1], D3 = D[2], A1 = A[0], A2 = A[1], A3 = A[2];\r\n var x = D1 * (P[1]-A2) - D2 * (P[0]-A1), y = D2 * ((P[2] || 0) - A3) - D3 * (P[1]-A2),\r\n z = D3 * (P[0]-A1) - D1 * ((P[2] || 0) - A3);\r\n var V = new Vector([D2 * x - D3 * z, D3 * y - D1 * x, D1 * z - D2 * y]);\r\n var k = this.distanceFrom(P) / V.modulus();\r\n return new Vector([\r\n P[0] + V.elements[0] * k,\r\n P[1] + V.elements[1] * k,\r\n (P[2] || 0) + V.elements[2] * k\r\n ]);\r\n }\r\n }\r\n\r\n // Returns a copy of the line rotated by t radians about the given line. Works\r\n // by finding the argument's closest point to this line's anchor point (call\r\n // this C) and rotating the anchor about C. Also rotates the line's direction\r\n // about the argument's. Be careful with this - the rotation axis' direction\r\n // affects the outcome!\r\n rotate (t, line)\r\n {\r\n // If we're working in 2D\r\n if (typeof(line.direction) === 'undefined')\r\n {\r\n line = new Line(line.to3D(), Vector.k);\r\n }\r\n var R = Matrix.Rotation(t, line.direction).elements;\r\n var C = line.pointClosestTo(this.anchor).elements;\r\n var A = this.anchor.elements, D = this.direction.elements;\r\n var C1 = C[0], C2 = C[1], C3 = C[2], A1 = A[0], A2 = A[1], A3 = A[2];\r\n var x = A1 - C1, y = A2 - C2, z = A3 - C3;\r\n return new Line\r\n (\r\n [\r\n C1 + R[0][0] * x + R[0][1] * y + R[0][2] * z,\r\n C2 + R[1][0] * x + R[1][1] * y + R[1][2] * z,\r\n C3 + R[2][0] * x + R[2][1] * y + R[2][2] * z\r\n ],\r\n [\r\n R[0][0] * D[0] + R[0][1] * D[1] + R[0][2] * D[2],\r\n R[1][0] * D[0] + R[1][1] * D[1] + R[1][2] * D[2],\r\n R[2][0] * D[0] + R[2][1] * D[1] + R[2][2] * D[2]\r\n ]\r\n );\r\n }\r\n\r\n reverse ()\r\n {\r\n return new Line(this.anchor, this.direction.x(-1));\r\n }\r\n\r\n reflectionIn (obj)\r\n {\r\n if (obj.normal)\r\n {\r\n // obj is a plane\r\n var A = this.anchor.elements, D = this.direction.elements;\r\n var A1 = A[0], A2 = A[1], A3 = A[2], D1 = D[0], D2 = D[1], D3 = D[2];\r\n var newA = this.anchor.reflectionIn(obj).elements;\r\n // Add the line's direction vector to its anchor, then mirror that in the plane\r\n var AD1 = A1 + D1, AD2 = A2 + D2, AD3 = A3 + D3;\r\n var Q = obj.pointClosestTo([AD1, AD2, AD3]).elements;\r\n var newD = [Q[0] + (Q[0] - AD1) - newA[0], Q[1] + (Q[1] - AD2) - newA[1], Q[2] + (Q[2] - AD3) - newA[2]];\r\n return new Line(newA, newD);\r\n }\r\n else if (obj.direction)\r\n {\r\n // obj is a line - reflection obtained by rotating PI radians about obj\r\n return this.rotate(Math.PI, obj);\r\n }\r\n else\r\n {\r\n // obj is a point - just reflect the line's anchor in it\r\n var P = obj.elements || obj;\r\n return new Line(this.anchor.reflectionIn([P[0], P[1], (P[2] || 0)]), this.direction);\r\n }\r\n }\r\n\r\n setVectors (anchor, direction)\r\n {\r\n // Need to do this so that line's properties are not references to the\r\n // arguments passed in\r\n anchor = new Vector(anchor);\r\n direction = new Vector(direction);\r\n if (anchor.elements.length === 2)\r\n {\r\n anchor.elements.push(0);\r\n }\r\n if (direction.elements.length === 2)\r\n {\r\n direction.elements.push(0);\r\n }\r\n if (anchor.elements.length > 3 || direction.elements.length > 3)\r\n {\r\n return null;\r\n }\r\n var mod = direction.modulus();\r\n if (mod === 0)\r\n {\r\n return null;\r\n }\r\n this.anchor = anchor;\r\n this.direction = new Vector([\r\n direction.elements[0] / mod,\r\n direction.elements[1] / mod,\r\n direction.elements[2] / mod\r\n ]);\r\n return this;\r\n }\r\n}\r\n\r\nLine.X = new Line(Vector.Zero(3), Vector.i);\r\nLine.Y = new Line(Vector.Zero(3), Vector.j);\r\nLine.Z = new Line(Vector.Zero(3), Vector.k);"]}